Как исправить постоянно растущее использование памяти Ray?

Я начал использовать Ray для распределенного машинного обучения, и у меня уже есть некоторые проблемы. Использование памяти просто растет, пока программа не вылетит. Хотя я постоянно очищаю список, память как-то протекает. Есть идеи, почему?

Мои спецификации: Платформа ОС и распространение: Ubuntu 16.04 Ray, установленный из: двоичная версия 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()))

По прошествии некоторого времени я получаю это сообщение об ошибке:


person TRZUKLO    schedule 18.04.2019    source источник
comment
Я думаю, вы забыли включить сообщение об ошибке. Кроме того, что печатают ваши операторы печати? Длина списка увеличивается быстрее, чем он очищается? Некоторые вопросы / комментарии: 1) Вы видите, какой процесс использует всю память (например, через top). 2) Еще можно попробовать ray.init(object_store_memory=10**9). Однако я подозреваю, что это один из участников Python, который использует все больше и больше памяти. Я бы посоветовал взглянуть на временную шкалу Ray, чтобы убедиться, что она выглядит так, как ожидалось (документация на ray.readthedocs.io/en/latest/).   -  person Robert Nishihara    schedule 18.04.2019


Ответы (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 () и нехваткой памяти.

person Michael Wade    schedule 15.02.2020

Я подозреваю, что наша проблема может быть похожей.

Я кодирую в Spyder, который отображает процент используемой памяти в правом нижнем углу. Когда я каждый раз запускал один и тот же сценарий, я заметил, что процентное значение увеличивается с шагом 3% (исходя из имеющихся у меня 8 гигабайт ОЗУ). Это заставило меня задуматься, хранит ли Ray что-то вроде сеанса из-за приращений (каждое соответствует сеансу).

Оказывается, да. Быстрое решение - использовать

 ray.shutdown()

На этом сеанс заканчивается. Однако вам нужно снова вызвать ray.init(), если вы хотите его запустить. Кроме того, убедитесь, что вы разместили его в правильном месте, чтобы луч не заканчивался, пока он еще нужен.

Это решает проблему увеличения использования памяти при многократном запуске скрипта.

Я не очень хорошо знаю Рэя. Мне просто удобно пользоваться. С учетом сказанного у ray.init() есть различные аргументы, касающиеся своего рода рекламы. Я уверен, что должен быть способ заставить луч работать в одном сеансе с помощью одного из этих аргументов. Я еще не пробовал ничего из этого, и в результате это предположение. Возможно, ты сможешь в этом разобраться.

person Dylan Solms    schedule 07.09.2019