Вызовите множество подпроцессов на множество различных узлов в HPC, используя Joblib + Dask - PullRequest
1 голос
/ 03 апреля 2019

Я пытаюсь запустить программу на 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

Буду признателен за любую помощь или совет.

1 Ответ

0 голосов
/ 09 апреля 2019

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

...