任务无法反序列化

时间:2019-05-15 17:22:38

标签: python spyder

我正在尝试评估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个时期。

4 个答案:

答案 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