gpt4 book ai didi

python - 如何限制没有终端或多处理库的 python 脚本使用的 CPU 数量?

转载 作者:行者123 更新时间:2023-12-01 08:00:45 54 4
gpt4 key购买 nike

我的主要问题是发出here 。由于还没有人给出解决方案,我决定寻找一种解决方法。我正在寻找一种使用 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)

版本:

  • Python 3.6
  • joblib 0.13.2
  • scikit-learn 0.20.2
  • numpy 1.16.2

更新:不起作用。感谢您的澄清@Darkonaut。可悲的是,我已经知道这是行不通的,而且我已经在问题标题上明确说明了,但我猜人们不会阅读。我想我做错了。我已经根据 @Ben Chaliah Ayoub answer 更新了代码片段。似乎什么都没有改变。我还想指出一点:我并不想在多个内核上运行此代码。此行 transformer.partial_fit(X[:100, :]) 在多个核心上运行(出于某种原因),并且它没有 n_jobs 或任何内容。另请注意,我的第一个示例和原始代码未使用池或类似的东西进行初始化。我无法首先设置核心数(因为没有这样的地方)。但现在它有了一个位置,但它仍然在多个核心上运行。您可以自己测试一下。 (下面的代码)这就是我寻找解决方法的原因。

from sklearn.datasets import load_digits
from sklearn.decomposition import IncrementalPCA
import numpy as np
from multiprocessing import Pool, cpu_count
def run_this():
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)
#This is the exact same example taken from sckitlearn's IncrementalPCA website.
transformer = IncrementalPCA(n_components=7, batch_size=200)
transformer.partial_fit(X[:100, :])
X_transformed = transformer.fit_transform(X)
print(X_transformed.shape)
pool= Pool(processes=1)
pool.apply(run_this)

更新:因此,我尝试使用 this 设置 blas 线程。在导入 numpy 之前在我的代码中,但它(再次)不起作用。还有其他建议吗?最新阶段的代码可以在下面找到。

鸣谢:@Amir

from sklearn.datasets import load_digits
from sklearn.decomposition import IncrementalPCA
import os
os.environ["OMP_NUM_THREADS"] = "1" # export OMP_NUM_THREADS=1
os.environ["OPENBLAS_NUM_THREADS"] = "1" # export OPENBLAS_NUM_THREADS=1
os.environ["MKL_NUM_THREADS"] = "1" # export MKL_NUM_THREADS=1
os.environ["VECLIB_MAXIMUM_THREADS"] = "1" # export VECLIB_MAXIMUM_THREADS=1
os.environ["NUMEXPR_NUM_THREADS"] = "1" # export NUMEXPR_NUM_THREADS=1

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)

transformer.partial_fit(X[:100, :])

X_transformed = transformer.fit_transform(X)

print(X_transformed.shape)

最佳答案

I am looking for a way to limit a python scripts CPU usage (not priority but the number of CPU cores) with python code.

使用 taskset 运行您的应用程序或numactl .

例如,要使您的应用程序仅使用前 4 个 CPU,请执行以下操作:

taskset --cpu-list 0-3 <app>
<小时/>

但是,这些工具限制进程使用特定的 CPU,而不是使用的 CPU 总数。为了获得最佳结果,它们要求将这些 CPU 与操作系统进程调度程序隔离,以便调度程序不会在这些 CPU 上运行任何其他进程。否则,如果指定的 CPU 当前正在运行其他线程,而其他 CPU 处于空闲状态,则您的线程将无法在其他空闲 CPU 上运行,并且必须为这些特定 CPU 排队,这是不理想的。

使用cgroups,您可以限制进程/线程使用可用CPU资源的特定部分,而不限制于特定CPU,但cgroups设置并不那么简单。

关于python - 如何限制没有终端或多处理库的 python 脚本使用的 CPU 数量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55746872/

54 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com