我正在尝试评估ANN。如果我使用n_jobs = 1
,我得到的准确性,但是,当我使用n_jobs = - 1
时,出现以下错误。
BrokenProcessPool: A task has failed to un-serialize. Please ensure that the arguments of the function are all picklable.
我尝试使用其他数字,但只有在我使用n_jobs = 1
这是我正在运行的代码:
accuracies = cross_val_score(estimator = classifier, X = X_train, y = y_train, cv = 10, n_jobs = -1)
这是我得到的错误:
Traceback (most recent call last):
File "<ipython-input-12-cc51c2d2980a>", line 1, in <module>
accuracies = cross_val_score(estimator = classifier, X = X_train,
y = y_train, cv = 10, n_jobs = -1)
File "C:\Users\javie\Anaconda3\lib\site-
packages\sklearn\model_selection\_validation.py", line 402, in
cross_val_score
error_score=error_score)
File "C:\Users\javie\Anaconda3\lib\site-
packages\sklearn\model_selection\_validation.py", line 240, in
cross_validate
for train, test in cv.split(X, y, groups))
File "C:\Users\javie\Anaconda3\lib\site-
packages\sklearn\externals\joblib\parallel.py", line 930, in __call__
self.retrieve()
File "C:\Users\javie\Anaconda3\lib\site-
packages\sklearn\externals\joblib\parallel.py", line 833, in retrieve
self._output.extend(job.get(timeout=self.timeout))
File "C:\Users\javie\Anaconda3\lib\site-
packages\sklearn\externals\joblib\_parallel_backends.py", line 521, in
wrap_future_result
return future.result(timeout=timeout)
File "C:\Users\javie\Anaconda3\lib\concurrent\futures\_base.py", line
432, in result
return self.__get_result()
File "C:\Users\javie\Anaconda3\lib\concurrent\futures\_base.py", line
384, in __get_result
raise self._exception
BrokenProcessPool: A task has failed to un-serialize. Please ensure that
the arguments of the function are all picklable.`
Spyder应该已经并行分析了每个批次,但是即使使用n_jobs = 1
,它也只能分析10个时期。
答案 0 :(得分:1)
我也收到此错误,但仅在Windows上。我正在使用joblib并行运行一个函数(称为func_x
)。该功能是从模块导入的,我们称其为module_a
。
module_a
还使用另一个模块func_y
中的函数(称为module_b
),该函数使用语法import module_b
导入。
我发现,如果我编辑module_a
并将导入行更改为from module_b import func_y
,就可以避免出现BrokenProcessPool错误。
我还必须从导入if __name__ == '__main__:'
的主脚本中删除module_a
。
我认为将模块导入命名空间的方式之间的细微差别决定了joblib是否可以对该模块进行腌制,以便在Windows中进行并行处理。
我希望这会有所帮助!
-
下面是一个最小的可重现示例:
原始main.py
from joblib import Parallel, delayed
import module_a
if __name__ == '__main__':
Parallel(n_jobs=4, verbose=3)(delayed(module_a.func_x)(i) for i in range(50))
原始module_a.py (在Windows上因BrokenProcessPool错误而失败;需要重新启动内核)
import module_b
def func_x(i):
j = i ** 3
k = module_b.func_y(j)
return k
编辑过的main.py
from joblib import Parallel, delayed
import module_a
Parallel(n_jobs=4, verbose=3)(delayed(module_a.func_x)(i) for i in range(50))
编辑的module_a.py (在Windows上成功)
from module_b import func_y # changed
def func_x(i):
j = i ** 3
k = func_y(j) # changed
return k
module_b.py
def func_y(m):
k = j ** 3
return k
答案 1 :(得分:0)
在Spyder的iPython控制台中使用多重处理时,总是会发生这种情况。一种解决方法是改为从命令行运行脚本。
答案 2 :(得分:0)
如果使用Spyder IDE,只需在设置中切换到外部终端(运行>在外部系统终端中执行)即可。
答案 3 :(得分:0)
只是为其他人发布此信息,以防万一。我今天在 Dask 阵列/集群上运行 GridSearchCV 时遇到了同样的问题。 Sklearn v.0.24
使用 joblib 上下文管理器解决此问题,如下所述:https://joblib.readthedocs.io/en/latest/parallel.html#thread-based-parallelism-vs-process-based-parallelism