在Python中,joblib为执行令人尴尬的并行执行提供了一个非常好的工具。我有点新手,我正在试图弄清楚如何处理可能受内存限制的工作。
例如,请考虑以下事项:
from joblib import Parallel, delayed
import numpy as np
num_workers=8
num_jobs=100
memory_range=1000
def my_function(x):
np.random.seed(x)
array_length=(np.random.randint(memory_range)+1)**3
big_list_of_numbers=np.random.uniform(array_length)
return(np.sum(big_list_of_numbers))
results=Parallel(n_jobs=num_workers)(delayed(my_function)(i) for i in range(num_jobs))
每个作业的内存使用量可能从几百字节到大约0.8 GB不等。
在一个完美的世界中,我想给joblib一些总内存预算(比如“我希望99%确定我所有工作人员的总内存使用量是<8GB”),有joblib估计的分布到目前为止已经看到的作业的内存使用情况,并使用它来动态调整工作池的大小。
不幸的是,似乎(?)调用Parallel()时,静态确定活动worker的数量。如果是这种情况,我可以使用resource.getrusage()来计算几个示例作业的内存使用情况,自己估算分布,并使用固定上限。如果内存使用率变化很大,那么这将是危险的或低效的。
如果我正在并行化一个特定的函数,我只想对它进行分析并完成。但是,对于我的申请,我不会事先知道这个功能。
我不想重新发明这个轮子。所以,我的问题是:
joblib是否支持此功能的任何部分?
是否有其他(希望是简单的)工具?