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