使用joblib 並行化CPU 密集型循環時,可能會遇到所有工作進程都分配給單一核心的問題,從而導致沒有任何性能提升。
此問題源自於某些 Python 模組的導入,例如 Numpy、Scipy、熊貓和 Sklearn。這些模組連結到多執行緒 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中文網其他相關文章!