在 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))
Run Code Online (Sandbox Code Playgroud)
每个作业的内存使用量可能从几百字节到大约 0.8 GB 不等。
在完美的世界中,我想给 joblib 一些总内存预算(例如“我希望 99% 确定所有工作进程的总内存使用量小于 8GB”),让 joblib 估计各个工作进程的内存使用量分布到目前为止它已经看到的作业,并使用它来动态调整工作池的大小。
不幸的是,似乎(?)当您调用 Parallel() 时,活动工作线程的数量是静态确定的。如果是这种情况,我可以使用 resource.getrusage() 从一些示例作业中计算出内存使用情况,自己估计分布,并使用固定上限。如果内存使用情况变化很大,那么这要么是危险的,要么是低效的。
如果我要并行化一个特定的函数,我只需对其进行分析即可完成。但是,对于我的应用程序,我不会提前知道该功能。
我不想重新发明这个轮子。所以,我的问题是:
joblib 是否支持此功能的任何部分?
还有其他(希望是简单的)工具吗?