Это более общий вопрос о том, как запускать «досадно параллельные» задачи с «планировщиками» 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