RAY Python 框架内存不足

2024-04-18

我用 ray 创建了一个简单的远程函数,它占用的内存很少。然而,运行一小段时间后,内存稳步增加,并且出现 RayOutOfMemoryError 异常。

下面的代码是这个问题的一个非常简单的例子。 “result_transformed”numpy 数组被发送给工作人员,每个工作人员都可以对此进行处理。我的简化 calc_similarity 函数什么也不做,但它仍然耗尽内存。我在该方法中添加了更长的睡眠时间来模拟做更多的工作,但它最终会耗尽内存。

我正在 8 核 Intel 9900K、32GB RAM 和 Ubuntu 19.10 上运行 Python 是:英特尔 Python 发行版 3.7.4 numpy 是 1.17.4(使用 intel mkl)

import numpy as np
from time import sleep
import ray
import psutil

@ray.remote
def calc_similarity(sims, offset):
    # Fake some work for 100 ms.
    sleep(0.10)
    return True

if __name__ == "__main__":
    # Initialize RAY to use all of the processors.
    num_cpus = psutil.cpu_count(logical=False)
    ray.init(num_cpus=num_cpus)

    num_docs = 1000000
    num_dimensions = 300
    chunk_size = 128
    sim_pct = 0.82

    # Initialize the array
    index = np.random.random((num_docs, num_dimensions)).astype(dtype=np.float32)
    index_array = np.arange(num_docs).reshape(1, num_docs)
    index_array_id = ray.put(index_array)

    calc_results = []

    for count, start_doc_no in enumerate(range(0, num_docs, chunk_size)):
        size = min( chunk_size, num_docs - (start_doc_no) + 1 )
        # Get the query vector out of the index.
        query_vector = index[start_doc_no:start_doc_no+size]
        # Calculate the matrix multiplication.
        result_transformed = np.matmul(index, query_vector.T).T
        # Serialize the result matrix out for each client.
        result_id = ray.put(result_transformed)

        # Simulate multi-threading extracting the results of a cosine similarity calculation
        for offset in range(chunk_size):
            calc_results.append(calc_similarity.remote(sims=result_id, offset=offset ))
            # , index_array=index_array_id))
        res = ray.get(calc_results)
        calc_results.clear()

任何帮助/指导将不胜感激。


谢谢桑的回复。

问题是 gc 没有运行,因为在 32GB 系统上的内存耗尽之前尚未达到默认阈值。

对 ray.put(transformed_result) 的调用可能需要相当大的内存量(在示例中为 128 x 1,000,000),或者使用 float32 时大约需要 0.5 GB 内存。

为了解决这个问题,我创建了一个方法,该方法执行以下操作,我可以传入内存使用百分比阈值并强制调用垃圾收集:

def auto_garbage_collect(pct=80.0):
    if psutil.virtual_memory().percent >= pct:
        gc.collect()

在我的核心处理循环中频繁调用此方法可以解决内存不足的情况。

这种情况也可以通过修改垃圾收集中的阈值设置来解决。

gc.set_threshold()

这非常依赖于任务,并且取决于所使用的数据对象的大小,因此我认为第一种方法是更好的选择。

桑,感谢您的详细回复!这非常有帮助和启发。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

RAY Python 框架内存不足 的相关文章

随机推荐