多处理核心亲和性问题
在某些情况下,导入 NumPy 库并尝试使用 joblib 模块并行化 CPU 密集型循环时,可以观察到分配给循环的工作进程都局限于单个核心,从而阻碍了性能提升。
这个问题是由于 NumPy 和底层 OpenBLAS 库之间的交互而产生的,这些库经常被使用用于多线程操作。默认情况下,这些库可能会干扰核心亲和性设置,导致所有工作进程被分配到同一核心。
解决方案:重置任务亲和性
简单的方法解决方案是在导入受影响的模块后使用 os.system() 函数重置任务关联性。通过执行命令 os.system("taskset -p 0xff %d" % os.getpid()),核心亲和力被重置,允许工作进程分布在所有可用核心上。
禁用 OpenBLAS CPU 关联性重置
或者,可以在运行时或构建时禁用 OpenBLAS 的 CPU 关联性重置行为。在运行时,将环境变量 OPENBLAS_MAIN_FREE 设置为 1 可防止库调整核心关联性。或者,在 OpenBLAS 编译过程中,将 NO_AFFINITY=1 添加到 Makefile.rule 会永久禁用此行为。
以上是为什么我的 Joblib Workers 在导入 NumPy 后卡在一个核心上?的详细内容。更多信息请关注PHP中文网其他相关文章!