python 如果一个延迟的对象使用了太多的内存,是否可以让Dask返回一个默认值?

xdnvmnnf  于 2023-03-28  发布在  Python
关注(0)|答案(1)|浏览(101)

如果一个延迟的对象使用了太多的内存,是否可以让Dask返回一个默认值?
我想在大型数据集上并行评估一系列机器学习管道。我在一个循环中这样做,在这个循环中我生成模型/管道,然后评估它们。
这就是我执行并行化的方式:

for i in range(10):
   pipeline_list = generate_next_pipelines()
   scores = dask.compute(*[dask.delayed(fit_and_score)(pipeline, X, y) for pipeline in pipeline_list])
   # save/print scores

我还得到了关于非托管内存使用率高的错误。是否有一个步骤我错过了,要么减少内存使用和/或释放未释放的内存更频繁?
我通过将LocalCluster设置为系统的最大内存来增加内存限制。这允许代码运行,但如果任务请求的内存超过可用内存,整个脚本就会崩溃。我希望Dasks在给定的worker超出内存限制时返回默认值,例如“Not enough RAM”。

cluster = LocalCluster(n_workers=n_jobs, 
                       threads_per_worker=1,
                       memory_limit='64GB')
client = Client(cluster)

谢谢你的帮助

s1ag04yj

s1ag04yj1#

如果函数引发MemoryError,那么可以使用标准的Python方法来检测它并返回不同的内容

@dask.delayed
def func_or(pipeline, X, y):
    try:
         return fit_and_score(pipeline, X, y)
    except MemoryError:
         return alternate_thing

然而,如果你的工作者因为内存使用而被完全杀死,你的函数将返回一个异常(通常是KilledWorker),你需要在返回值中检测到这一点。你可以使用client.submit API而不是delayed/dask.compute来获得每个元素状态的实时信息。

相关问题