joblib を使用して CPU 集中型のループを並列化すると、すべてのワーカー プロセスが 1 つのコアに割り当てられるという問題が発生する場合があります。
この問題は、Numpy、Scipy、Pandas、Sklearn などの特定の Python モジュールのインポートに起因します。これらのモジュールはマルチスレッド OpenBLAS ライブラリにリンクしているため、コア アフィニティに干渉する可能性があります。
この問題を解決するには、次のコマンドを使用してタスク アフィニティをリセットできます。
<code class="python">os.system("taskset -p 0xff %d" % os.getpid())</code>
このコマンドは、現在のプロセスの利用可能なすべてのコアへのアフィニティをリセットします。回避策を含む例の更新バージョンは次のとおりです。
<code class="python">from joblib import Parallel, delayed import numpy as np import os def testfunc(data): # some very boneheaded CPU work for nn in xrange(1000): for ii in data[0, :]: for jj in data[1, :]: ii*jj def run(niter=10): data = (np.random.randn(2, 100) for ii in xrange(niter)) pool = Parallel(n_jobs=-1, verbose=1, pre_dispatch='all') # Reset task affinity os.system("taskset -p 0xff %d" % os.getpid()) results = pool(delayed(testfunc)(dd) for dd in data) if __name__ == '__main__': run()</code>
この回避策を適用した後、ワーカー プロセスは、並列化に利用可能なすべてのリソースを利用して、別のコアに割り当てられる必要があります。
回避策に加えて、次の方法を使用して OpenBLAS の CPU アフィニティ リセット動作を無効にすることもできます。
OPENBLAS_MAIN_FREE=1 python myscript.py
NO_AFFINITY=1
以上がNumpy が Joblib でのマルチプロセッシング コアの割り当てを妨げるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。