Scikit learn 部分拟合是否在sklearn.decomposition.IncrementalPCA中并行运行?

Scikit learn 部分拟合是否在sklearn.decomposition.IncrementalPCA中并行运行?,scikit-learn,python-multiprocessing,pca,Scikit Learn,Python Multiprocessing,Pca,我遵循的是建立一个局部拟合和变换。但由于某些原因,它看起来(从htop)最多使用所有CPU核。我既找不到n_jobs参数,也找不到与多处理相关的任何内容。我的问题是:如果这是这些函数的默认行为,我如何设置CPU的数量以及在哪里可以找到有关它的信息?如果不是,很明显我在代码的前几节中做了一些错误的事情 PS:我需要限制CPU内核的数量,因为在服务器中使用所有内核会给其他人带来很多麻烦 其他信息和调试代码: 所以,已经有一段时间了,我仍然无法找出这种行为的原因,或者如何限制一次使用的CPU内核数量。

我遵循的是建立一个局部拟合和变换。但由于某些原因,它看起来(从htop)最多使用所有CPU核。我既找不到n_jobs参数,也找不到与多处理相关的任何内容。我的问题是:如果这是这些函数的默认行为,我如何设置CPU的数量以及在哪里可以找到有关它的信息?如果不是,很明显我在代码的前几节中做了一些错误的事情

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

其他信息和调试代码: 所以,已经有一段时间了,我仍然无法找出这种行为的原因,或者如何限制一次使用的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)
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显示:

我一直在寻找解决这个问题的方法,我发现这不是因为scikit learn实现错误,而是因为numpy library使用的BLAS库(特别是OpenBLAS),它用于sklearn的IncrementalPCA函数。默认情况下,OpenBLAS设置为使用所有可用线程。详细信息可以找到

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


我一直在寻找解决这个问题的方法,我发现这不是因为scikit学习实现错误,而是因为numpy库使用的BLAS库(特别是OpenBLAS),它用于sklearn的IncrementalPCA函数。默认情况下,OpenBLAS设置为使用所有可用线程。详细信息可以找到

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

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