62

我必须在与部门其他人共享的计算服务器上定期运行作业,当我开始 10 个作业时,我真的希望它只占用 10 个内核,而不是更多;我不在乎每次运行单个内核是否需要更长的时间:我只是不希望它侵占其他人的领域,这将需要我放弃工作等等。我只想拥有 10 个实心核心,仅此而已。

我在 Redhat 上使用 Enthought 7.3-1,它基于 Python 2.7.3 和 numpy 1.6.1,但问题更笼统。

4

5 回答 5

50

只希望这可以修复您可能使用的所有场景和系统。

  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 步将帮助您弄清楚这一点。

于 2018-02-07T13:54:56.850 回答
40

MKL_NUM_THREADS环境变量设置为 1。您可能已经猜到,该环境变量控制着作为 Enthoughtnumpy构建的一部分包含的数学内核库的行为。

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

于 2013-06-11T22:30:19.143 回答
20

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

import mkl
mkl.set_num_threads(2)
于 2016-10-26T07:16:32.740 回答
12

在 numpy 的更新版本中,我发现还需要设置NUMEXPR_NUM_THREADS=1.

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

于 2014-02-10T09:41:48.307 回答
-9

对我来说,解决方案很简单,因为我停止使用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)
于 2015-08-11T11:15:15.440 回答