Я пытаюсь запустить программу на 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
Буду признателен за любую помощь или совет.