如何修复/调试 scikit learn 中引发的这个多进程终止工作错误

Posted

技术标签:

【中文标题】如何修复/调试 scikit learn 中引发的这个多进程终止工作错误【英文标题】:How do I fix/debug this Multi-Process terminated worker error thrown in scikit learn 【发布时间】:2019-06-05 22:56:03 【问题描述】:

我最近设置了一台新机器,以帮助减少拟合模型和数据处理的运行时间。

我做了一些初步的基准测试,一切都很顺利,但是当我尝试在 scikit learn 中启用多进程工作者时遇到了障碍。

我已将错误简化为与我的原始代码无关,因为我在不同的机器和 VM 上启用了此功能而没有问题。

我还进行了内存分配检查,以确保我的机器没有用完可用的 RAM。我有 16gb 的 RAM,所以应该没有问题,但我留下了测试的输出,以防我错过了一些东西。

鉴于附近的回溯错误,我可以告诉我的操作系统正在杀死它,但对于我的生活,我无法弄清楚为什么。据我所知,我的代码仅在仅使用单个 CPU 内核时才会运行。

我运行的是 Windows 10、AMD ryzen 7 2700x、16GB RAM

代码

import sklearn
import numpy as np
import tracemalloc
import time


from sklearn.model_selection import cross_val_score
from numpy.random import randn
from sklearn.linear_model import Ridge


##################### memory allocation snapshot

tracemalloc.start()

start_time = time.time()
snapshot1 = tracemalloc.take_snapshot()

###################### model

X = randn(815000, 100)
y = randn(815000, 1)
mod = Ridge()
sc = cross_val_score(mod, X, y,verbose =10, n_jobs=3)

################### Second memory allocation snapshot

snapshot2 = tracemalloc.take_snapshot()
top_stats = snapshot2.compare_to(snapshot1, 'lineno')

print("[ Top 10 ]")
for stat in top_stats[:5]:
print(stat)

由此得出的预期结果非常明显,只是拟合模型的返回分数。

错误输出

[Parallel(n_jobs=3)]: Using backend LokyBackend with 3 concurrent workers.
[Parallel(n_jobs=3)]: Done   3 out of   3 | elapsed:    0.2s remaining:    0.0s
---------------------------------------------------------------------------
TerminatedWorkerError                     Traceback (most recent call last)
<ipython-input-18-b2bdfd425f82> in <module>
     16 y = randn(815000, 1)
     17 mod = Ridge()
---> 18 sc = cross_val_score(mod, X, y,verbose =10, n_jobs=3)

..........

TerminatedWorkerError: A worker process managed by the executor was unexpectedly terminated. 
This could be caused by a segmentation fault while calling the function or by an excessive memory usage causing the Operating System to kill the worker.

内存输出

[ Top 5 ]
<ipython-input-18-b2bdfd425f82>:15: size=622 MiB (+622 MiB), count=3 (+3), average=207 MiB
<ipython-input-18-b2bdfd425f82>:16: size=6367 KiB (+6367 KiB), count=3 (+3), average=2122 KiB
~python37\lib\inspect.py:732: size=37.2 KiB (+26.2 KiB), count=596 (+419), average=64 B
~python37\lib\site-packages\sklearn\externals\joblib\numpy_pickle.py:292: size=7072 B (+3808 B), count=13 (+7), average=544 B
~python37\lib\pickle.py:549: size=5728 B (+3408 B), count=14 (+8), average=409 B

【问题讨论】:

【参考方案1】:

我发现我的 scipy 模块与我的 windows 10 C++ 可再发行版本不兼容。

我所做的只是下载最新的 Visual Studio 并安装“单个组件”部分中列出的 C++ 可再发行更新。

安装后,我重新启动计算机并运行。

import scipy
scipy.test()

一旦它实际运行,我尝试了上面的代码块并修复了它。

我认为这归结为使用全新版本的 python 和 scipy 安装旧版本的 windows 10

这需要很长时间来解决和调试。希望对您有所帮助。

【讨论】:

我在基于 Debian 的 GCP 服务器上遇到了类似的错误。 TerminatedWorkerError: A worker process managed by the executor was unexpectedly terminated. This could be caused by a segmentation fault while calling the function or by an excessive memory usage causing the Operating System to kill the worker. The exit codes of the workers are SIGABRT(-6)知道如何解决这个问题吗? 不幸的是,由于情况和错误几乎相同,这并没有解决我的问题;虽然当我消除 n_jobs 参数时,错误并没有出现(训练模型只需要很长时间)。

以上是关于如何修复/调试 scikit learn 中引发的这个多进程终止工作错误的主要内容,如果未能解决你的问题,请参考以下文章

如何修复我在 scikit-learn 中的线性回归中遇到的错误

如何修复 scikit-learn 中的令牌模式?

你能修复 scikit learn 分类器中的假阴性率吗

Scikit-Learn 的 Pipeline:传递了一个稀疏矩阵,但需要密集数据

可以在 scikit-learn 中修改/修剪学习的树吗?

为啥 scikit-learn 中的 TfidfVectorizer 会显示这种行为?