【发布时间】:2021-12-28 03:55:35
【问题描述】:
我正在尝试在具有多个 CPU 的机器上运行来自 scikit-learn 的 ElasticNet function。但是,我需要 ElasticNet 拟合仅使用一个 CPU,因为我需要在剩余的 CPU 上并行运行其他拟合例程。每当包含ElasticNet 的线程开始拟合时,它就会迅速接管所有CPU 上的任何空闲空间,而不仅仅是它所调用的那个。因为其他代码例程已经在这些机器上运行,ElasticNet 超额订阅了机器并大大减慢了一切,包括它自己。我需要这些例程并行运行,所以我不能只提前连续运行ElasticNet fit。
与sklearn 中的其他回归函数(线性、逻辑...)不同,ElasticNet 没有 n_jobs 参数。读取the documentation,似乎ElasticNet 默认为joblib.parallel_backend 中指定的n_jobs,而joblib.parallel_backend 本身默认为n_jobs=-1,这是所有可用的CPU。
我正在尝试找出在parallel_backend 中指定n_jobs 的正确方法,以便它将覆盖ElasticNet 的默认值。以下是更改 n_jobs 的三项尝试,但目前尚未奏效。
尝试 1
from joblib import parallel_backend
from sklearn.linear_model import ElasticNet
with parallel_backend('loky', n_jobs=1):
model = ElasticNet(alpha=alpha, l1_ratio=l1_ratio, fit_intercept=False,
normalize=False, copy_X=True, max_iter=10000, tol=10,
random_state=42, precompute=False, warm_start=False,
positive=False, selection='cyclic')
model.fit(predictors, response)
尝试 2
from sklearn.utils import parallel_backend
from sklearn.linear_model import ElasticNet
with parallel_backend('loky', n_jobs=1):
model = ElasticNet(alpha=alpha, l1_ratio=l1_ratio, fit_intercept=False,
normalize=False, copy_X=True, max_iter=10000, tol=10,
random_state=42, precompute=False, warm_start=False,
positive=False, selection='cyclic')
model.fit(predictors, response)
尝试 1 和尝试 2 都没有抛出任何错误,而且似乎也没有改变 n_jobs 使用每个可用 CPU 的默认值。 ElasticNet 仍然接管所有 CPU 上的所有可用 CPU 空间,并迅速超额订阅机器。
尝试 3
这是我第一次直接使用joblib,所以我一直在阅读the documentation 关于joblib 的并行化。大多数放在parallel_backend 容器中的示例例程都以Parallel() helper class 开头。
根据示例,我通过以下方式修改了尝试 1:
from joblib import parallel_backend
from sklearn.linear_model import ElasticNet
with parallel_backend('loky', n_jobs=1):
model = ElasticNet(alpha=alpha, l1_ratio=l1_ratio, fit_intercept=False,
normalize=False, copy_X=True, max_iter=10000, tol=10,
random_state=42, precompute=False, warm_start=False,
positive=False, selection='cyclic')
Parallel(n_jobs=1)(model.fit(predictors, response))
但是在运行尝试 3 时,我收到以下错误消息:
TypeError: 'ElasticNet' object is not iterable
有谁知道如何为sklearn的ElasticNet设置n_jobs=1?必须有某种方法可以做到这一点,因为ElasticNetCV 有n_jobs 作为可能的参数。非常感谢您提供任何帮助!
【问题讨论】:
-
here 接受的答案可以帮助吗?
-
谢谢阿米奥拉!我想不出一种设置全局变量的方法,因为我在所有机器上都运行 python,而且我不想强制这些作业只在一台机器上连续运行。
标签: python scikit-learn parallel-processing joblib lasso-regression