如果一个延迟的对象使用了太多的内存,是否可以让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)
谢谢你的帮助
1条答案
按热度按时间s1ag04yj1#
如果函数引发MemoryError,那么可以使用标准的Python方法来检测它并返回不同的内容
然而,如果你的工作者因为内存使用而被完全杀死,你的函数将返回一个异常(通常是KilledWorker),你需要在返回值中检测到这一点。你可以使用client.submit API而不是delayed/dask.compute来获得每个元素状态的实时信息。