使用 joblib 并行化 CPU 密集型循环时,可能会遇到所有工作进程都分配给单个核心的问题,从而导致没有任何性能提升。
此问题源于某些 Python 模块的导入,例如 Numpy、Scipy、Pandas 和 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中文网其他相关文章!