今天在跑代码的时候又遇到一个问题。parallel·并行程序出现错误。
具体错误如下:
sklearn.externals.joblib.my_exceptions.JoblibValueError: JoblibValueError
既然是并行出错了,那我就查看有问题的代码行。代码如下:
# 这个是要并行执行的函数
def accumulate_prediction(predict, X, out,proba ,i): # all_proba (sub concatenated),predict (whole predict concatenated)
print(i)
prediction = predict(X, check_input=False)
nSamples=X.shape[0]
sub = np.subtract(prediction[:, 0], prediction[:, 1]).reshape(nSamples, 1)
if i == 0:
proba[0]+=prediction
out[0]+=sub
else:
out[0] = np.concatenate((out[0], sub), axis=1)
proba[0] = np.concatenate((proba[0], prediction), axis=1)
-----------------------------------------------------------------------------------------
#下面是并行代码的执行处
n_jobs, _, _ = _partition_estimators(self.n_estimators, self.n_jobs)
all_proba = [np.zeros((X.shape[0], j), dtype=np.float64) for j in np.atleast_1d(1)]
predict = [np.zeros((X.shape[0], j), dtype=np.float64) for j in np.atleast_1d(self.n_classes_)]
# 并行代码
Parallel(n_jobs=n_jobs, verbose=self.verbose, backend="threading")(
delayed(accumulate_prediction)(e.predict_proba, X, all_proba, predict, i)
for i, e in enumerate(self.estimators_, start=0)
)
需要并行执行的代码accumulate_prediction(predict, X, out,proba ,i)每次对传入的数组进行操作预测操作,并对预测的结果进行处理,在这个函数中,数组out,proba的容量会一直增加。这是基本情况。
后来百度了一下解决方案,还到 joblib 的github上提问,才发现。joblib的Parallel对于并行执行函数的参数过大时,且n_jobs>1时,会出现并行执行的结果出错,我的代码执行是依赖于这个函数中i的执行顺序的,所以,我的程序就华丽丽的抛出了错误。
思考:最开始写这个并行的代码是为了加快速度,但是我这个情况不适用啊,所以还是退而求其次,近似串行执行吧。
解决办法:将并行程序的n_jobs设置为1,问题就解决了。
self.n_jobs=1
n_jobs, _, _ = _partition_estimators(self.n_estimators, self.n_jobs)
have a nice day!