【发布时间】:2019-04-18 13:16:59
【问题描述】:
我的主要问题是here。由于还没有人给出解决方案,我决定找到一种解决方法。我正在寻找一种方法来使用 python 代码限制 python 脚本 CPU 使用率(不是优先级,而是 CPU 内核的数量)。我知道我可以使用多处理库(池等)来做到这一点,但我不是使用多处理运行它的人。所以,我不知道该怎么做。我也可以通过终端执行此操作,但此脚本正在由另一个脚本导入。不幸的是,我没有通过终端调用它的奢侈。
tl;dr:如何限制 python 脚本的 CPU 使用率(核心数),该脚本正在由另一个脚本导入,我什至不知道它为什么并行运行,没有通过终端运行它。请检查下面的代码sn-p。
导致问题的代码sn-p:
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 更新了代码 sn-p。似乎什么都没有改变。而且我还想指出一点:我不想在多个内核上运行这段代码。这条线 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)
更新:因此,我尝试在导入 numpy 之前在我的代码中使用 this 设置 blas 线程,但它(再次)不起作用。还有其他建议吗?最新阶段的代码可以在下面找到。
致谢: @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)
【问题讨论】:
-
你不能用
nice运行程序来解决这个问题吗?我猜这才是你真正想要的? -
nice不是关于更改工作的优先级吗?我正在寻找一种方法来更改 CPU 内核的数量。 -
Pool 在这里帮不了你。
sklearn建立在numpy之上,GIL-通过其数学库释放多线程。 Pool 的processes-参数仅控制创建了多少工作进程,它不会对您的函数执行任何核心使用限制。您需要限制的是numpy使用的线程数。
标签: python python-3.x unix multiprocessing python-multiprocessing