如何解决不断增长的ray内存使用问题?

时间:2019-04-18 15:34:40

标签: python memory ray

我开始使用ray进行分布式机器学习,我已经遇到了一些问题。 直到程序崩溃,内存使用率一直在增长。尽管我不断清除列表,但内存以某种方式泄漏。知道为什么吗?

我的规格: 操作系统平台和发行版:Ubuntu 16.04 从以下位置安装Ray: 射线版本:0.6.5 Python版本:3.6.8

我已经尝试使用实验队列而不是DataServer类,但是问题仍然相同。

import numpy as np
import ray
import time
ray.init(redis_max_memory=100000000)


@ray.remote
class Runner():
    def __init__(self, dataList):
        self.run(dataList)

    def run(self,dataList):
        while True:
            dataList.put.remote(np.ones(10))

@ray.remote
class Optimizer():
    def __init__(self, dataList):
        self.optimize(dataList)

    def optimize(self,dataList):
        while True:
            dataList.pop.remote()

@ray.remote
class DataServer():
    def __init__(self):
        self.dataList= []

    def put(self,data):
        self.dataList.append(data)

    def pop(self):
        if len(self.dataList) !=0:
            return self.dataList.pop()
    def get_size(self):
        return len(self.dataList)


dataServer = DataServer.remote()
runner = Runner.remote(dataServer)
optimizer1 = Optimizer.remote(dataServer)
optimizer2 = Optimizer.remote(dataServer)

while True:
    time.sleep(1)
    print(ray.get(dataServer.get_size.remote()))

运行一段时间后,我收到此错误消息:

2 个答案:

答案 0 :(得分:2)

我知道这个问题很古老,但是为了帮助其他人,我认为我会以我所学到的来回应:

我最近遇到了一个类似的问题,发现如果您经常放置大对象(ray.put()),则需要手动调整它们被python垃圾收集器使用的阈值,或者调用gc.collect ()定期。我实现了一种方法,该方法检查已使用的内存量,然后调用垃圾回收器。

问题在于默认阈值基于对象的数量,但是如果您放置大对象,则在内存用完之前,可能永远不会调用gc。我的实用方法如下:

def auto_garbage_collect(pct=80.0):
    """
    auto_garbage_collection - Call the garbage collection if memory used is greater than 80% of total available memory.
                              This is called to deal with an issue in Ray not freeing up used memory.

        pct - Default value of 80%.  Amount of memory in use that triggers the garbage collection call.
    """
    if psutil.virtual_memory().percent >= pct:
        gc.collect()
    return

调用此方法可以解决与通过ray.put()推送大对象并用完内存有关的问题。

答案 1 :(得分:1)

我怀疑我们的问题可能相似。

我在Spyder中编写代码,该代码显示了右下角使用的内存百分比。每次运行相同的程序时,我注意到该百分比值以3%的增量增加(基于我拥有的8 gig RAM)。这让我想知道ray是否由于增量而存储了类似会话的内容(每个对应一个会话)。

事实证明确实如此。快速解决方法是使用

 ray.shutdown()

这将结束会话。但是,如果要运行它,则需要再次调用ray.init()。另外,请确保将其放置在正确的位置,以免在仍然需要时不发出光线。

这解决了多次运行脚本会增加内存使用量的问题。

我不太了解雷。我只是觉得使用方便。如此说来,ray.init()有各种各样的论点,涉及到各种类型的广告。我确信必须有一种方法可以通过这些参数之一使ray在同一会话上运行。我还没有尝试过任何尝试,因此是推测。也许您可以找出答案。