【发布时间】:2016-09-29 11:05:00
【问题描述】:
我需要一些帮助来准确了解我所做的事情/为什么我的代码没有像我预期的那样运行。
我已经开始使用 joblib 来尝试通过并行运行(大)循环来加速我的代码。
我是这样使用它的:
from joblib import Parallel, delayed
def frame(indeces, image_pad, m):
XY_Patches = np.float32(image_pad[indeces[0]:indeces[0]+m, indeces[1]:indeces[1]+m, indeces[2]])
XZ_Patches = np.float32(image_pad[indeces[0]:indeces[0]+m, indeces[1], indeces[2]:indeces[2]+m])
YZ_Patches = np.float32(image_pad[indeces[0], indeces[1]:indeces[1]+m, indeces[2]:indeces[2]+m])
return XY_Patches, XZ_Patches, YZ_Patches
def Patch_triplanar_para(image_path, patch_size):
Image, Label, indeces = Sampling(image_path)
n = (patch_size -1)/2
m = patch_size
image_pad = np.pad(Image, pad_width=n, mode='constant', constant_values = 0)
A = Parallel(n_jobs= 1)(delayed(frame)(i, image_pad, m) for i in indeces)
A = np.array(A)
Label = np.float32(Label.reshape(len(Label), 1))
R, T, Y = np.hsplit(A, 3)
return R, T, Y, Label
我一直在试验“n_jobs”,希望增加它会加快我的功能。但是,当我增加 n_jobs 时,事情会明显变慢。在没有“并行”的情况下运行此代码时,事情会变慢,直到我将作业数量从 1 增加。
为什么会这样?我知道我运行的作业越多,脚本越快?我用错了吗?
谢谢!
【问题讨论】:
-
首先,您运行此程序的计算机中有多少个 CPU 或内核?其次,
n_jobs设置并发运行作业的最大数量。你试过n_jobs=-1吗?这应该使用您计算机中的所有 CPU。第三,你的 for 循环的indeces有多大? -
我有 24 个内核和大量内存。 indeces 大约有 10,000 个条目,因此认为这将是并行化的一件好事。我可以试试 n_jobs=-1 并报告。
-
是的。我可以想象,如果你将 n_jobs 从 1 增加到最大值(n_jobs=23,njobs = -1),那么你将达到一个点,在这个点上,增加这个数字将涉及更多开销,因此你必须找到一个最佳点。当然,如果你可以使用 backend="threading" 可能会更好,但你必须尝试。
-
那么,我想推荐这篇 SO 帖子 http://stackoverflow.com/questions/21027477/joblib-parallel-multiple-cpus-slower-than-single,它有很好的答案,其中一个直接来自 joblib 作者,虽然可能已经过时了......
标签: python numpy parallel-processing joblib