Запустите множество подпроцессов на множество разных узлов HPC с помощью Joblib+Dask.

Я пытаюсь запустить программу на Python, которая в какой-то момент выполняет множество (тысячи) смущающе параллельных процессов, которые представляют собой вызовы подпроцессов для другого программного обеспечения. Я запускаю это в кластере slurm на многих разных узлах, каждый из которых имеет много ядер.

Я использовал mpi4py, но в коде была задержка, которая заставила меня перейти к работе с joblib. Joblib казался простым способом распараллелить эти вызовы подпроцессов. Чтобы запускать их на нескольких процессорах (каждый процессор имеет несколько ядер), я также обратился к dask из поиска в Интернете.

В настоящее время мой код выглядит примерно так:

from dask.distributed import Client,LocalCluster
cluster = LocalCluster()
print 'cluster', cluster
client = Client(cluster)
from sklearn.externals import joblib
...
def functionThatCallsSubprocessAndIsToBeParallelized(input):
    return subprocess.check_output("software call",stdin=input)

...
with joblib.parallel_backend('dask'):
    res = joblib.Parallel(n_jobs=-2,verbose=1)(map(joblib.delayed(functionThatCallsSubprocessAndIsToBeParallelized),my_input))

Я ожидаю, что это возьмет мое большое количество входных данных из my_input и вернет каждый результат в массиве в res. Я хочу использовать все узлы и их ядра в том, что я выделил в своем файле sbatch.

#!/bin/bash
...
#SBATCH --nodes=2

srun -n 64 python parallel.py

Любая помощь или совет будут оценены.


person sealpancake    schedule 02.04.2019    source источник


Ответы (1)


Вы можете заменить вызов LocalCluster (который использует только один компьютер) на dask-jobqueue или dask-mpi. Каждое из этих решений поможет вам развернуть Dask на многих машинах в среде HPC. После этого Joblib+Dask должен работать более плавно на таком количестве машин.

person MRocklin    schedule 09.04.2019