微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

不负责任的 Dask 内存使用

如何解决不负责任的 Dask 内存使用

我正在深入研究 dask 并且(大部分)对它感到满意。但是,我无法理解以下场景中发生了什么。 TBH,我确定过去曾有人问过这样的问题,但是搜索了一段时间后,我似乎找不到真正一针见血的问题。所以我们来了!

在下面的代码中,您可以看到一个简单的 Python 函数,上面有一个 dask-delayed 装饰器。在我的实际用例场景中,这将是一个“黑匣子”类型的函数,我不在乎会发生什么,只要它保持 4 GB 的内存预算并最终返回一个 Pandas 数据帧。在这种情况下,我特别选择了值 N=1.5e8,因为这会导致总内存占用接近 2.2 GB(很大,但仍在预算范围内)。最后,当将此文件作为脚本执行时,我有一个“数据管道”,它只是为一些 ID 运行黑盒函数,最后建立一个结果数据帧(然后我可以用它做更多的事情)

执行此操作时会出现令人困惑的部分。我可以看到一次只执行了两个函数调用(这是我所期望的),但我收到警告消息 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: 3.16 GiB -- Worker memory limit: 3.73 GiB,此后不久脚本过早退出。这个内存使用来自哪里?请注意,如果我增加 memory_limit="8GB"(实际上比我的计算机更多),那么脚本运行良好,我的打印语句通知我数据帧确实只使用了 2.2 GB 的内存

请帮助我理解这种行为,并希望实现一种更安全的内存方法

非常感谢!

顺便说一句:

  • 如果有帮助,我使用的是 python 3.8.8、dask 2021.4.0 和分布式 2021.4.0
  • 我还在 Linux (Ubuntu) 机器和 Mac M1 上确认了这种行为。它们都表现出相同的行为,尽管 Mac M1 因相同的原因而失败,但内存使用量要少得多(N=3e7,或大约 500 MB)

import time

import pandas as pd
import numpy as np
from dask.distributed import LocalCluster,Client
import dask


@dask.delayed
def do_pandas_thing(id):
    print(f"STARTING: {id}")
    N = 1.5e8
    df = pd.DataFrame({"a": np.arange(N),"b": np.arange(N)})

    print(
        f"df memory usage {df.memory_usage().sum()/(2**30):.3f} GB",)

    # Simulate a "long" computation
    time.sleep(5)

    return df.iloc[[-1]]  # return the last row


if __name__ == "__main__":
    cluster = LocalCluster(
        n_workers=2,memory_limit="4GB",threads_per_worker=1,processes=True,)
    client = Client(cluster)

    # Evaluate "black Box" functions with pandas inside
    results = []
    for i in range(10):
        results.append(do_pandas_thing(i))

    # compute
    r = dask.compute(results)[0]

    print(pd.concat(r,ignore_index=True))

解决方法

我无法在以下版本中重现警告/错误:

  • pandas=1.2.4
  • dask=2021.4.1
  • python=3.8.8

当对象大小增加时,进程确实会因内存而崩溃,但最好让工作负载占可用内存的一小部分:

简单地说,我们在 2011 年没有考虑分析 100 GB 或 1 TB 的数据集。如今,我对 Pandas 的经验法则是,您的 RAM 应该是数据集大小的 5 到 10 倍.所以如果你有一个 10 GB 的数据集,如果你想避免内存管理问题,你真的应该有大约 64 GB 的 RAM,最好是 128 GB。对于希望能够分析其计算机 RAM 大小 2 到 3 倍的数据集的用户来说,这令人震惊。

source

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。