部分拟合是否在 sklearn.decomposition.IncrementalPCA 中并行运行?
Does partial fit runs in parallel in sklearn.decomposition.IncrementalPCA?
我关注了 Imanol Luengo's to build a partial fit and transform for 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 显示:
我在 of mine and I figured out this is not because of scikit-learn implementation fault but rather due to BLAS library (specifically OpenBLAS) used by numpy library, which is used in sklearn's IncrementalPCA function. OpenBLAS is set to use all available threads by default. Detailed information can be found 中寻找解决此问题的方法。
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
我关注了 Imanol Luengo's
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 显示:
我在
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