局部拟合是否在sklearn.decomposition.IncrementalPCA中并行运行?

时间:2019-04-05 09:08:42

标签: scikit-learn python-multiprocessing pca

我遵循Imanol Luengoanswer构建sklearn.decomposition.IncrementalPCA的局部拟合和变换。但是由于某种原因,它看起来(从htop来看)最大程度地使用了所有CPU内核。我找不到n_jobs参数,也找不到与多处理有关的任何东西。我的问题是:如果这是这些功能的默认行为,那么如何设置CPU的数量以及在哪里可以找到有关它的信息?如果没有,显然我在代码的前面部分做错了。

PS:我需要限制CPU内核的数量,因为在服务器上使用所有内核会给其他人带来很多麻烦。

其他信息和调试代码: 因此,已经有一段时间了,我仍然无法弄清楚这种现象的原因或如何限制一次使用的CPU内核数量。我决定提供一个示例代码对其进行测试。请注意,此代码段摘自sklearn's website。唯一的不同是增加了数据集的大小,因此可以轻松看到行为。

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)
transformer.partial_fit(X[:100, :])
X_transformed = transformer.fit_transform(X)

print(X_transformed.shape)

输出为:

(460032, 64)
(460032, 7)

Process finished with exit code 0

并且htop显示: htop shows...

1 个答案:

答案 0 :(得分:0)

我一直在我的another post中寻找解决此问题的方法,但我发现这不是由于scikit-learn实现错误,而是由于numpy库使用了BLAS库(特别是OpenBLAS),在sklearn的IncrementalPCA功能中使用。默认情况下,OpenBLAS设置为使用所有可用线程。可以找到详细信息here

TL:DR通过在导入numpy或任何使用以下代码导入numpy的库之前设置BLAS环境变量来解决该问题。可以找到详细信息here

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