我知道这可能看起来像一个荒谬的问题,但我必须定期在计算服务器上运行工作,我与部门中的其他人分享,当我开始10个工作时,我真的希望它只需要10个核心而不是更多; 我不关心每次运行一个核心需要多长时间:我只是不希望它侵占其他人的领域,这需要我重新安排工作等等.我只想拥有10个实心核心,就是这样.
更具体地说,我在Redhat上使用Enthought 7.3-1,它基于Python 2.7.3和numpy 1.6.1,但问题更为笼统.我一直在谷歌搜索这个问题的某种答案几个小时无济于事,所以如果有人知道numpy的转换可以关闭多线程,请告诉我.
当使用 numpy 计算A @ a其中A是随机 N × N 矩阵并且 a 是具有 N 个随机元素的向量时,计算时间在 N=100 时会跳跃一个数量级。这有什么特别的原因吗?作为比较,在CPU上使用torch进行相同的操作有更逐渐的增加
用 python3.10 和 3.9 和 3.7 尝试过,具有相同的行为
\n用于生成绘图的 numpy 部分的代码:
\nimport numpy as np\nfrom tqdm.notebook import tqdm\nimport pandas as pd\nimport time\nimport sys\n\ndef sym(A):\n return .5 * (A + A.T)\n\nresults = []\nfor n in tqdm(range(2, 500)):\n for trial_idx in range(10):\n A = sym(np.random.randn(n, n))\n a = np.random.randn(n) \n \n t = time.time()\n for i in range(1000):\n A @ a\n …Run Code Online (Sandbox Code Playgroud) 我正在运行一个用Python实现并使用NumPy的算法.算法中计算成本最高的部分涉及求解一组线性系统(即调用numpy.linalg.solve().我想出了这个小基准:
import numpy as np
import time
# Create two large random matrices
a = np.random.randn(5000, 5000)
b = np.random.randn(5000, 5000)
t1 = time.time()
# That's the expensive call:
np.linalg.solve(a, b)
print time.time() - t1
Run Code Online (Sandbox Code Playgroud)
我一直在运行:
sysctl -n machdep.cpu.brand_string给我Intel(R)Core(TM)i7-4750HQ CPU @ 2.00GHz)c3.xlarge实例,具有4个vCPU.亚马逊宣称它们为"高频英特尔至强E5-2680 v2(Ivy Bridge)处理器"底线:
我也在其他基于OpenBLAS/Intel MKL的设置上尝试过它,运行时总是与我在EC2实例上得到的(模块化硬件配置)相当.
任何人都可以解释为什么Mac(使用Accelerate Framework)的性能提高了4倍?下面提供了有关NumPy/BLAS设置的更多详细信息.
numpy.show_config() 给我:
atlas_threads_info:
NOT AVAILABLE
blas_opt_info:
extra_link_args = ['-Wl,-framework', '-Wl,Accelerate']
extra_compile_args …Run Code Online (Sandbox Code Playgroud) 我的主要问题是在这里发布。由于还没有人给出解决方案,我决定找到一种解决方法。我正在寻找一种使用python 代码限制 python 脚本 CPU 使用率(不是优先级,而是 CPU 内核数)的方法。我知道我可以使用多处理库(池等)来做到这一点,但我不是使用多处理运行它的人。所以,我不知道该怎么做。而且我也可以通过终端来做到这一点,但是这个脚本是由另一个脚本导入的。不幸的是,我没有通过终端调用它的奢侈。
tl; dr:如何限制由另一个脚本导入的 python 脚本的CPU 使用率(核心数),我什至不知道为什么它并行运行,而不是通过终端运行它。请检查下面的代码片段。
导致问题的代码片段:
from sklearn.datasets import load_digits
from sklearn.decomposition import IncrementalPCA
import numpy as np
X, _ = load_digits(return_X_y=True)
#Copy-paste and increase the size of the dataset to see the behavior at htop.
for _ in range(8):
X = np.vstack((X, X))
print(X.shape)
transformer = IncrementalPCA(n_components=7, batch_size=200)
#PARTIAL FIT RUNS IN PARALLEL! GOD WHY?
---------------------------------------
transformer.partial_fit(X[:100, :])
---------------------------------------
X_transformed = transformer.fit_transform(X)
print(X_transformed.shape)
Run Code Online (Sandbox Code Playgroud)
版本:
python unix multiprocessing python-3.x python-multiprocessing
每次调用 R 都会创建 63 个子进程
Rscript --vanilla -e 'Sys.sleep(5)' & pstree -p $! | grep -c '{R}'
# 63
Run Code Online (Sandbox Code Playgroud)
哪里pstree看起来像这样
R(2562809)???{R}(2562818)
??{R}(2562819)
...
??{R}(2562878)
??{R}(2562879)
??{R}(2562880)
Run Code Online (Sandbox Code Playgroud)
这是预期的行为吗?
这是一台带有 debian 9.3、R 3.4.3、blas 3.7.0 和 openmp 2.0.2 的 72 核机器
dpkg-query -l '*blas*' 'r-base' '*lapack*' '*openmp*'|grep ^ii
ii libblas-common 3.7.0-2 amd64 Dependency package for all BLAS implementations
ii libblas-dev 3.7.0-2 amd64 Basic Linear Algebra Subroutines 3, static library
ii libblas3 3.7.0-2 amd64 Basic Linear Algebra Reference implementations, shared library
ii …Run Code Online (Sandbox Code Playgroud) 我正在使用 scipy 最小化函数。它调用的函数是用 Cython 编译的,并且具有我编写的底层 C++ 实现,但这并不重要。由于某种原因,当我运行程序时,它会创建尽可能多的线程来填充我的所有 CPU。例如,如果我运行 top,我会看到 800% 的 cpu 正在被使用,或者在 htop 上,我可以看到 8 个单独的处理器正在被使用,而我只创建了要在一个处理器上运行的程序。我认为 scipy 甚至没有并行处理功能,而且我找不到任何与此相关的文档。可能发生什么情况,有什么方法可以控制它吗?
在执行脚本期间查看资源监视器,我注意到我的 PC 的所有核心都在工作,即使我没有实现任何形式的多处理。numpy为了查明原因,我发现使用's matmult(或者如下例中的二元运算符@)时代码是并行的。
import numpy as np
A = np.random.rand(10,500)
B = np.random.rand(500,50000)
while True:
_ = A @ B
Run Code Online (Sandbox Code Playgroud)
看看这个问题,看起来原因是numpy调用了BLAS/LAPACK确实并行的例程。
尽管我的代码运行得更快并且使用了所有可用资源,这很好,但当我在PBS队列管理器管理的共享集群上提交代码时,这给我带来了麻烦。与集群 IT 经理一起,我们注意到,即使我在集群节点上请求 N 个 CPU,numpy仍然会产生与该节点上的 CPU 数量相等的线程数。
这导致节点过载,因为我使用的 CPU 数量多于分配给我的 CPU 数量。
有没有办法“控制”这种行为并告诉numpy它可以使用多少个CPU?
python ×5
numpy ×4
blas ×2
amazon-ec2 ×1
lapack ×1
openblas ×1
python-3.x ×1
r ×1
scipy ×1
unix ×1