我必须在与部门其他人共享的计算服务器上定期运行作业,当我开始 10 个作业时,我真的希望它只占用 10 个内核,而不是更多;我不在乎每次运行单个内核是否需要更长的时间:我只是不希望它侵占其他人的领域,这将需要我放弃工作等等。我只想拥有 10 个实心核心,仅此而已。
我在 Redhat 上使用 Enthought 7.3-1,它基于 Python 2.7.3 和 numpy 1.6.1,但问题更笼统。
我必须在与部门其他人共享的计算服务器上定期运行作业,当我开始 10 个作业时,我真的希望它只占用 10 个内核,而不是更多;我不在乎每次运行单个内核是否需要更长的时间:我只是不希望它侵占其他人的领域,这将需要我放弃工作等等。我只想拥有 10 个实心核心,仅此而已。
我在 Redhat 上使用 Enthought 7.3-1,它基于 Python 2.7.3 和 numpy 1.6.1,但问题更笼统。
只希望这可以修复您可能使用的所有场景和系统。
numpy.__config__.show()
查看您使用的是 OpenBLAS 还是 MKL从现在开始,您可以通过几种方法来做到这一点。
2.1。终点路线export OPENBLAS_NUM_THREADS=1
或export 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 步将帮助您弄清楚这一点。
将MKL_NUM_THREADS
环境变量设置为 1。您可能已经猜到,该环境变量控制着作为 Enthoughtnumpy
构建的一部分包含的数学内核库的行为。
我只是在我的启动文件 .bash_profile 中使用export MKL_NUM_THREADS=1
. 您还应该能够从脚本内部执行此操作,以使其特定于进程。
如果您想动态设置线程数,而不是通过环境变量全局设置,您还可以执行以下操作:
import mkl
mkl.set_num_threads(2)
在 numpy 的更新版本中,我发现还需要设置NUMEXPR_NUM_THREADS=1
.
在我手中,没有设置就足够MKL_NUM_THREADS=1
了,但在某些情况下,您可能需要同时设置两者。
对我来说,解决方案很简单,因为我停止使用numpy.dot
:
import numpy as np
a = np.random.rand(1e6)
b = np.random.rand(1e6, 10)
# potentially uses multiple threads
dotted = np.dot(a, b)
# single-thread
summed = np.sum(a[:, np.newaxis] * b, axis=0)
assert np.all(dotted == summed)