为什么 Numpy 会干扰 Joblib 中的多处理核心分配?

Susan Sarandon
发布: 2024-10-30 19:58:30
原创
580 人浏览过

Why Does Numpy Interfere with Multiprocessing Core Assignment in Joblib?

Numpy 干扰多处理核心分配

使用 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 环境变量运行脚本:
OPENBLAS_MAIN_FREE=1 python myscript.py
登录后复制
  • 编译时:编译 OpenBLAS 时编辑 Makefile.rule 并添加以下行:
NO_AFFINITY=1
登录后复制

以上是为什么 Numpy 会干扰 Joblib 中的多处理核心分配?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责声明 Sitemap
PHP中文网:公益在线PHP培训,帮助PHP学习者快速成长!