在 `sklearn` 分类器中调用 `scipy.optimize.minimize` 会使它在并行作业中中断
Calling `scipy.optimize.minimize` inside an `sklearn` classifier makes it break in a parallel job
我 运行 陷入无声崩溃,我将其归因于破坏线程安全。
这是发生的事情的详细信息。首先,我定义了一个自定义 sklearn
估计器,它在拟合时使用 scipy.optimize
,类似于:
class CustomClassifier(BaseEstimator, ClassifierMixin):
...
def fit(self, X, y=None):
...
#optimizes with respect to some metric by using scipy.optimize.minimize
...
return self
...
下游,我运行对其性能进行了交叉验证的测量,看起来像:
cv_errors = cross_val_score( CustomClassifier(), X, y, n_jobs=-1)
cross_val_score
是 sklearn
开箱即用的功能,n_jobs=-1
意味着我要求它在尽可能多的可用内核上并行化。
输出是我的cv_errors
是一个NaN
的数组。在进行了一些错误追踪之后,我注意到设置 n_jobs=1
为我提供了一个由错误填充的数组,正如预期的那样。看起来并行化步骤加上 scipy.optimize.minimize
的使用是罪魁祸首。
有没有办法让它并行工作?
我想我找到了解决办法:
with parallel_backend('multiprocessing'):
cv_errors = cross_val_score( CustomClassifier(), X, y, n_jobs=-1, error_score='raise')
这里似乎很安全。如果有人解释了幕后发生的事情,以及为什么 'locky' 后端中断而 'multiprocessing' 没有中断,我正在倾听。此外,设置 error_score='raise'
意味着崩溃不会被静音。
我 运行 陷入无声崩溃,我将其归因于破坏线程安全。
这是发生的事情的详细信息。首先,我定义了一个自定义 sklearn
估计器,它在拟合时使用 scipy.optimize
,类似于:
class CustomClassifier(BaseEstimator, ClassifierMixin):
...
def fit(self, X, y=None):
...
#optimizes with respect to some metric by using scipy.optimize.minimize
...
return self
...
下游,我运行对其性能进行了交叉验证的测量,看起来像:
cv_errors = cross_val_score( CustomClassifier(), X, y, n_jobs=-1)
cross_val_score
是 sklearn
开箱即用的功能,n_jobs=-1
意味着我要求它在尽可能多的可用内核上并行化。
输出是我的cv_errors
是一个NaN
的数组。在进行了一些错误追踪之后,我注意到设置 n_jobs=1
为我提供了一个由错误填充的数组,正如预期的那样。看起来并行化步骤加上 scipy.optimize.minimize
的使用是罪魁祸首。
有没有办法让它并行工作?
我想我找到了解决办法:
with parallel_backend('multiprocessing'):
cv_errors = cross_val_score( CustomClassifier(), X, y, n_jobs=-1, error_score='raise')
这里似乎很安全。如果有人解释了幕后发生的事情,以及为什么 'locky' 后端中断而 'multiprocessing' 没有中断,我正在倾听。此外,设置 error_score='raise'
意味着崩溃不会被静音。