【发布时间】:2022-02-22 00:22:50
【问题描述】:
当我使用 sklearn RandomizedSearchCV 拟合模型时,我试图限制 CPU 的使用数量,但不知何故我一直在使用所有 CPU。根据Python scikit learn n_jobs 的回答,我看到在 scikit-learn 中,我们可以使用n_jobs 来控制所使用的 CPU 核心数。
n_jobs是一个整数,指定同时运行的worker的最大数量。如果给定 1,则根本不使用joblib并行度,这对于调试很有用。如果设置为 -1,则使用所有 CPU。
对于低于-1 的n_jobs,使用(n_cpus + 1 + n_jobs)。例如n_jobs=-2,除了一个以外的所有 CPU 都被使用。
但是当将n_jobs 设置为 -5 时,所有 CPU 仍会继续以 100% 运行。我查看了joblib 库以使用Parallel 和delayed。但是我所有的 CPU 仍然在继续使用。这是我尝试过的:
from sklearn.model_selection import RandomizedSearchCV
from joblib import Parallel,delayed
def rscv_l(model, param_grid, X_train, y_train):
rs_model = RandomizedSearchCV(model, param_grid, n_iter=10,
n_jobs=-5, verbose=2, cv=5,
scoring='r2')
rs_model.fit(X_train, y_train) # the cpu usage problem comes here
return rs_model
# Here my attempt to parallelize and set my function as iterable
results = Parallel( n_jobs = -5 )( delayed( rscv_l )( model,
param_grid,
X, y )
for X, y
in zip( [X_train],
[y_train] ) )
出了什么问题?
更新: 看着How do you stop numpy from multithreading?,我想我可能遇到了多线程问题。当我检查 numpy 配置时,我发现:
blas_mkl_info:
libraries = ['mkl_rt', 'pthread']
library_dirs = ['user/lib']
define_macros = [('SCIPY_MKL_H', None), ('HAVE_CBLAS', None)]
include_dirs = ['user/include']
blas_opt_info:
libraries = ['mkl_rt', 'pthread']
library_dirs = ['user/lib']
define_macros = [('SCIPY_MKL_H', None), ('HAVE_CBLAS', None)]
include_dirs = ['user/include']
lapack_mkl_info:
libraries = ['mkl_rt', 'pthread']
library_dirs = ['user/lib']
define_macros = [('SCIPY_MKL_H', None), ('HAVE_CBLAS', None)]
include_dirs = ['user/include']
lapack_opt_info:
libraries = ['mkl_rt', 'pthread']
library_dirs = ['user/lib']
define_macros = [('SCIPY_MKL_H', None), ('HAVE_CBLAS', None)]
include_dirs = ['user/include']
但提出的解决方案仍然对我不起作用:
import os
os.environ["OMP_NUM_THREADS"] = "4" # export OMP_NUM_THREADS=4
os.environ["OPENBLAS_NUM_THREADS"] = "4" # export OPENBLAS_NUM_THREADS=4
os.environ["MKL_NUM_THREADS"] = "6" # export MKL_NUM_THREADS=6
os.environ["VECLIB_MAXIMUM_THREADS"] = "4" # export VECLIB_MAXIMUM_THREADS=4
os.environ["NUMEXPR_NUM_THREADS"] = "6" # export NUMEXPR_NUM_THREADS=6
import numpy
from sklearn.model_selection import RandomizedSearchCV
这解决了我的问题: 感谢@user3666197 的回答,我决定限制整个脚本的cpu 数量,并简单地使用n_jobs 和一个正整数。这解决了我的 CPU 使用问题:
import os
n_jobs = 2 # The number of tasks to run in parallel
n_cpus = 2 # Number of CPUs assigned to this process
pid = os.getpid()
print("PID: %i" % pid)
# Control which CPUs are made available for this script
cpu_arg = ''.join([str(ci) + ',' for ci in list(range(n_cpus))])[:-1]
cmd = 'taskset -cp %s %i' % (cpu_arg, pid)
print("executing command '%s' ..." % cmd)
os.system(cmd)
# hyperparameter tunning
rs_model = RandomizedSearchCV(xgb, param_grid, n_iter=10,
n_jobs=n_jobs, verbose=2, cv= n_folds,
scoring='r2')
#model fitting
rs_model.fit(X_train,y_train)
【问题讨论】:
标签: python multithreading scikit-learn parallel-processing joblib