Распараллеливание циклов for в Python с использованием joblib & SLURM - PullRequest
0 голосов
/ 20 апреля 2019

У меня есть список из 100 кортежей tuplelist, которые служат входами для внешней функции.Внешняя функция возвращает значение, и это значение добавляется в массив следующим образом (MainFile.py):

from ExternalPythonFile import ExternalFunction

valuelist = []
for a,b in tuplelist:
    value = ExternalFunction(a,b)
    # more functions here
    valuelist.append(value)
print(len(valuelist))

Выход для print(len(valuelist)) при использовании вышеуказанного цикла for равен (100,).

Теперь, поскольку порядок кортежей и способ их добавления не имеют значения в моем случае, я хотел распараллелить цикл for, поскольку для обработки 100 кортежей потребуется ~ 10 минут, и яожидая масштабировать это число.Я попробовал реализацию Joblib ниже (MainFileJoblib.py):

from ExternalPythonFile import ExternalFunction
from joblib import Parallel, delayed, parallel_backend
import multiprocessing

valuelist = []

def TupleFunction(a,b):
        value = ExternalFunction(a,b)
        # more functions here
        valuelist.append(value)

with parallel_backend('multiprocessing'):
    Parallel(n_jobs=10)(delayed(TupleFunction)(a,b) for a,b in tuplelist)

print(len(valuelist))

Я выполняю все это на вычислительном кластере Unix, но время выполнения все равно было примерно таким же: ~ 8 мин.Вывод также был неверным, он напечатал (0,).

Глядя на htop Я обнаружил, что на самом деле используется 10 ядер, но каждое ядро ​​используется только на 20%.

Iтакже попытался запустить реализацию joblib через SLURM:

srun --ntasks=1 --ncpus-per-task=10 python3 MainFileJoblib.py

, которая была определенно быстрее примерно через ~ 2 мин, но опять же это дало неправильный результат (0,).

Что лучшеспособ распараллелить оригинальный цикл for?

...