web-dev-qa-db-ja.com

multiprocessing.dummy in Pythonは100%CPUを利用していません

Pythonで機械学習プロジェクトを行っているので、プログラムで使用している並列予測関数を実行する必要があります。

from multiprocessing.dummy import Pool
from multiprocessing import cpu_count


def multi_predict(X, predict, *args, **kwargs):
    pool = Pool(cpu_count())
    results = pool.map(predict, X)
    pool.close()
    pool.join()
    return results

問題は、すべてのCPUが20〜40%(合計で100%)でしかロードされないことです。酸洗機能のマルチプロセッシングモジュールに問題があるため、multiprocessing.dummyを使用します。

34
Demyanov

multiprocessing.dummy を使用する場合、プロセスではなくスレッドを使用しています。

multiprocessing.dummymultiprocessingのAPIを複製しますが、threadingモジュールのラッパーにすぎません。

つまり、 グローバルインタープリターロック(GIL) によって制限されており、一度に実際にCPUにバインドされた操作を実行できるスレッドは1つだけです。これにより、CPUを十分に活用できなくなります。使用可能なすべてのコアで完全な並列処理が必要な場合は、multiprocessing.Poolでヒットしているピクルスの問題に対処する必要があります。

並列化する必要がある作業がIOバインドされている場合、またはGILを解放するC拡張機能を利用する場合、multiprocessing.dummyは依然として有用であることに注意してください。ただし、純粋なPythonコードの場合は、multiprocessingが必要です。

64
dano