【问题标题】:dask-worker memory kept between tasks任务之间保存的 dask-worker 内存
【发布时间】:2019-05-23 03:47:49
【问题描述】:

简介

我正在使用 dask.distributed 并行化一些代码(令人尴尬的并行任务)。

  • 我有一个路径列表,指向我分散给工作人员的不同图像。
  • 每个工作人员加载和过滤图像(3D 堆栈)并运行一些过滤。使用 scipy 进行 3D 过滤可以节省中间输出。
  • 每个过滤后的图像都以 npy 和/或 png 格式保存在磁盘上。
  • 我在集群上运行之前在本地进行测试,我的设置是:

.

from dask.distributed import Client, LocalCluster
cluster = LocalCluster(n_workers=2, threads_per_worker=1,memory_limit =8e9)
client = Client(cluster)

问题:

  • 当我只处理两个图像(1 个图像/worker)时,一切都很好
  • 当我为每个工作人员分散多个图像时,我会收到此警告,其中进程内存值会增加。

.

distributed.worker - WARNING - Memory use is high but worker has no data to store to disk.
Perhaps some other process is leaking memory?  Process memory: 6.21 GB -- Worker memory limit: 8.00 GB

建议工作人员使用的部分 RAM 在不同文件之间不是freed(我猜是剩余的过滤中间体......)

问题

有没有办法在开始处理下一张图像之前释放工作人员的内存?我必须在运行任务之间运行garbage collector 循环吗?

编辑

我在 worker 运行的函数末尾添加了 gc.collect() 调用,但没有消除警告。

非常感谢您的帮助!

【问题讨论】:

  • 你解决了这个问题吗?
  • 不,还是个问题
  • 我猜还是没有解决办法?

标签: python parallel-processing dask dask-distributed


【解决方案1】:

只要客户端持有分布式值的引用计数,集群就不会从内存中清除它。这在Managing Memory 文档中进行了阐述,特别是“清除数据”部分。

【讨论】:

    【解决方案2】:

    “内存使用率很高”错误消息可能指向一些潜在的罪魁祸首。我发现其中一位核心 Dask 维护人员的 this article 有助于诊断和解决问题。

    快速总结:

    1. 将数据分成更小的块。
    2. 通过 Worker Plugin 手动触发垃圾回收和/或调整 Worker 上的 gc 设置(op 已尝试但不起作用;无论如何我都会为其他读者提供)
    3. 使用 malloc_trim 修剪内存(尤其是在处理非 NumPy 数据或小 NumPy 块时)

    确保您可以在计算运行时看到 Dask Dashboard,以确定哪种方法有效。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-05-24
      • 2018-09-17
      • 2018-02-02
      • 2013-07-13
      • 2013-12-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多