dask, joblib, ipyparallel и другие планировщики для неприятно параллельных задач

Это более общий вопрос о том, как запускать «досадно параллельные» задачи с «планировщиками» Python в научной среде.

У меня есть код, представляющий собой гибрид Python / Cython / C (в этом примере я использую github.com/tardis-sn/tardis ... но у меня больше таких проблем для других кодов), который внутренне параллелен OpenMP. Он предоставляет единственную функцию, которая принимает словарь параметров и оценивает объект в течение нескольких сотен секунд на ~ 8 ядрах (result=fun(paramset, calibdata), где paramset - это dict, а result - объект (в основном коллекция массивов pandas и numpy), а calibdata - это предварительно загруженный фрейм данных / объект pandas). Он ведет журнал с использованием стандартной функции ведения журнала Python.

Мне нужна среда Python, которая может легко оценивать ~ 10-100 тыс. Наборов параметров с использованием fun в кластерной среде SLURM / TORQUE / .... В идеале эта структура будет автоматически порождать воркеров (при наличии нескольких ядер для каждого) и распределять наборы параметров между воркерами (разные наборы параметров занимают разное количество времени). Было бы неплохо видеть состояние (in_queue, работает, завершено, не удалось) для каждого из наборов параметров, а также журналы (если он не прошел, завершился или запущен).

Было бы неплохо, если бы он отслеживал, что закончено и что нужно сделать, чтобы я мог перезапустить это, если мои задачи планировщика не удались. Было бы неплохо, если бы он, казалось бы, интегрировался в ноутбук jupyter и запускался локально для тестирования.

Я пробовал dask, но это, похоже, не ставит задачи в очередь, а запускает их все сразу с client.map(fun, [list of parameter sets]). Может быть, есть инструменты получше, а может, это очень нишевая проблема. Мне также непонятно, в чем разница между dask, joblib и ipyparallel (быстро попробовав все три из них на разных этапах).

С радостью предоставлю дополнительную информацию, если что-то неясно.

ОБНОВЛЕНИЕ: так что dask, похоже, обеспечивает некоторые функции того, что мне нужно, но работать с параллельным кодом OpenMP в дополнение к dask непросто - см. issue https://github.com/dask/dask-jobqueue/issues/181


person Wolfgang Kerzendorf    schedule 31.01.2019    source источник