Большое потребление памяти параллельным модулем i Python - PullRequest
1 голос
/ 11 июля 2020

Я использую модуль ipyparallel для ускорения сравнения списков типа «все по всем», но у меня возникают проблемы с огромным потреблением памяти.

Вот упрощенная версия скрипта, который я запускаю:

Из сценария SLURM запустите кластер и запустите сценарий python

ipcluster start -n 20 --cluster-id="cluster-id-dummy" &
sleep 60
ipython /global/home/users/pierrj/git/python/dummy_ipython_parallel.py
ipcluster stop --cluster-id="cluster-id-dummy"

В python создайте два списка списков для упрощенного примера

import ipyparallel as ipp
from itertools import compress

list1 = [ [i, i, i] for i in range(4000000)]
list2 = [ [i, i, i] for i in range(2000000, 6000000)]

Затем определите мою функцию сравнения списков:

def loop(item):
    for i in range(len(list2)):
        if list2[i][0] == item[0]:
            return True
    return False

Затем подключитесь к моим двигателям i python, pu sh list2 к каждому из них и сопоставьте мою функцию:

rc = ipp.Client(profile='default', cluster_id = "cluster-id-dummy")
dview = rc[:]
dview.block = True
lview = rc.load_balanced_view()
lview.block = True
mydict = dict(list2 = list2)
dview.push(mydict)
trueorfalse = list(lview.map(loop, list1))

Как уже упоминалось , Я запускаю это в кластере с использованием SLURM и получаю данные об использовании памяти с помощью команды sacct. Вот использование памяти, которое я получаю для каждого из шагов:

Просто создаю два списка: 1,4 ГБ Создание двух списков и отправка их в 20 двигателей: 22,5 ГБ Все: 62,5 ГБ ++ (здесь я получить сбой OUT_OF_MEMORY)

Из-за запуска htop на узле во время выполнения задания кажется, что использование памяти медленно увеличивается с течением времени, пока не достигнет максимального объема памяти и произойдет сбой.

I просмотрел этот предыдущий поток и безуспешно реализовал несколько предложенных решений

Утечка памяти в модуле I Python .parallel?

Я попытался очистить представление с помощью каждый l oop:

def loop(item):
    lview.results.clear()
    for i in range(len(list2)):
        if list2[i][0] == item[0]:
            return True
    return False

Я попытался очистить клиента каждым l oop:

def loop(item):
    rc.purge_everything()
    for i in range(len(list2)):
        if list2[i][0] == item[0]:
            return True
    return False

И я попытался использовать флаги --nodb и --sqlitedb с ipcontroller и запустил мой кластер следующим образом:

ipcontroller --profile=pierrj --nodb --cluster-id='cluster-id-dummy' &
sleep 60
for (( i = 0 ; i < 20; i++)); do ipengine --profile=pierrj --cluster-id='cluster-id-dummy' & done
sleep 60
ipython /global/home/users/pierrj/git/python/dummy_ipython_parallel.py
ipcluster stop --cluster-id="cluster-id-dummy" --profile=pierrj

К сожалению, ничего из этого не помогло и привело к точно такой же ошибке нехватки памяти.

Любые советы или помощь были бы очень полезны получено!

...