Python:你如何阻止多线程的numpy?

Mas*_*ddy 47 python multithreading numpy

我知道这可能看起来像一个荒谬的问题,但我必须定期在计算服务器上运行工作,我与部门中的其他人分享,当我开始10个工作时,我真的希望它只需要10个核心而不是更多; 我不关心每次运行一个核心需要多长时间:我只是不希望它侵占其他人的领域,这需要我重新安排工作等等.我只想拥有10个实心核心,就是这样.

更具体地说,我在Redhat上使用Enthought 7.3-1,它基于Python 2.7.3和numpy 1.6.1,但问题更为笼统.我一直在谷歌搜索这个问题的某种答案几个小时无济于事,所以如果有人知道numpy的转换可以关闭多线程,请告诉我.

SAR*_*ose 29

只有希望这会修复您可能使用的所有方案和系统.

  1. 使用numpy.__config__.show(),看看你正在使用OpenBLAS或MKL

从这一点开始,有几种方法可以做到这一点.

2.1.终点路线export OPENBLAS_NUM_THREADS=1export MKL_NUM_THREADS=1

2.2(这是我的首选方式)在你的python脚本中import os添加行os.environ['OPENBLAS_NUM_THREADS'] = '1'os.environ['MKL_NUM_THREADS'] = '1'.

注意设置os.environ[VAR]线程数时必须是一个字符串!此外,您可能需要导入numpy/scipy 之前设置此环境变量.

除了openBLAS或MKL之外,还有其他选择,但第1步将帮助您解决这个问题.

  • 惊人的。当尝试使用 multiprocessing.Pool 并行化一批 fftpack+odeint 模拟时,这给了我高达 *600 倍的加速*!然而,甚至在我开始使用笔记本的多处理部分之前,加速就已经生效。OpenBLAS 线程的一些事情显然阻止了正确的矢量化。 (2认同)
  • 另一个令人惊奇的事情是,更改后 htop 报告的利用率实际上较低,因此看起来确实必须使用一些不同的代码路径;也许可以更好地利用我的 Xeon E5-1660v4 的矢量扩展。 (2认同)

Bi *_*ico 28

MKL_NUM_THREADS环境变量设置为1.您可能已经猜到,此环境变量控制数学内核库的行为,该库包含在Enthought numpy构建中.

我只是在我的启动文件.bash_profile中执行此操作export MKL_NUM_THREADS=1.您还应该能够从脚本内部执行此操作以使其特定于进程.


knu*_*nub 17

如果您想要动态设置线程数,而不是通过环境变量全局设置线程数,您还可以执行以下操作:

import mkl
mkl.set_num_threads(2)
Run Code Online (Sandbox Code Playgroud)

  • linux/OpenBLAS 怎么样? (4认同)

R_B*_*rie 9

我会留下这个作为对Bi Rico答案的评论,但我没有所需的特权.在numpy的最新版本中,我发现有必要设置NUMEXPR_NUM_THREADS = 1

在我手中,没有设置MKL_NUM_THREADS = 1就足够了,但在某些情况下你可能需要设置两者.

  • Fwiw,我需要设置`OMP_NUM_THREADS`(参见/sf/answers/2213560961/) (3认同)