Snakemake обрабатывает большой рабочий процесс медленно из-за длительной последовательной проверки выполнения задания? ›100-кратное снижение скорости

Я работаю над довольно сложным процессом создания змейки, который порождает несколько сотен тысяч заданий. Все работает ... Рабочий процесс выполняется, DAG создается (благодаря новой реализации контрольной точки), но невыносимо медленно. Я думаю, что узкое место заключается в том, чтобы отмечать успешно выполненные задания, прежде чем переходить к следующему. Что еще более неприятно, он делает это последовательно для всех заданий, которые запускаются в пакете, а следующий пакет выполняется только тогда, когда все проверки успешны. Время выполнения каждого задания занимает около 1-2 секунд и выполняется параллельно (1 ядро ​​на задание), но snakemake затем циклически проходит проверку завершения задания по одной, занимая от 5 до 10 секунд на задание. Таким образом, весь процесс на каждую партию занимает минуты. См. Часть журнала ниже, в которой показаны разные временные метки последовательных заданий, выполняемых в одном пакете. Разница между отметками времени составляет около 11 секунд.

Finished job 42227. 5853 of 230419 steps (3%) done [Thu Feb 28 09:41:09 2019] Finished job 119645. 5854 of 230419 steps (3%) done [Thu Feb 28 09:41:21 2019] Finished job 161354. 5855 of 230419 steps (3%) done [Thu Feb 28 09:41:32 2019] Finished job 160224. 5856 of 230419 steps (3%) done [Thu Feb 28 09:41:42 2019] Finished job 197063. 5857 of 230419 steps (3%) done [Thu Feb 28 09:41:53 2019] Finished job 200063. 5858 of 230419 steps (3%) done [Thu Feb 28 09:42:04 2019] Finished job 45227. 5859 of 230419 steps (3%) done [Thu Feb 28 09:42:15 2019] Finished job 44097. 5860 of 230419 steps (3%) done [Thu Feb 28 09:42:26 2019] Finished job 5387. 5861 of 230419 steps (3%) done [Thu Feb 28 09:42:37 2019] Finished job 158354. 5862 of 230419 steps (3%) done [Thu Feb 28 09:42:48 2019]

Таким образом, для 20 параллельных процессов 2 секунды используются для вычислений, но затем он простаивает в течение 20x11 = 220 секунд, прежде чем продолжить обработку следующих 20 заданий.

В предыдущем прогоне у меня было около 200 тысяч + рабочих мест. Если я уменьшу масштаб, время между журналами станет намного короче:

Finished job 2630. 5 of 25857 steps (0.02%) done [Thu Feb 28 10:14:31 2019] Finished job 886. 6 of 25857 steps (0.02%) done [Thu Feb 28 10:14:31 2019] Finished job 9606. 7 of 25857 steps (0.03%) done [Thu Feb 28 10:14:31 2019] Finished job 4374. 8 of 25857 steps (0.03%) done [Thu Feb 28 10:14:32 2019] Finished job 6118. 9 of 25857 steps (0.03%) done [Thu Feb 28 10:14:32 2019] Finished job 7862. 10 of 25857 steps (0.04%) done [Thu Feb 28 10:14:32 2019] Finished job 278. 11 of 25857 steps (0.04%) done [Thu Feb 28 10:14:32 2019] Finished job 2022. 12 of 25857 steps (0.05%) done [Thu Feb 28 10:14:33 2019]

С 25K заданий время проверки теперь ‹1 секунда.

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

Я запускаю snakemake со следующими флагами: snakemake --keep-going --snakefile My.Snakefile --configfile config.yaml -j 23 --max-jobs-per-second 23

Я выполняю свой рабочий процесс локально на 24-ядерной системе с оперативной памятью 256 ГБ.

Любая помощь, чтобы ускорить процесс, была бы принята с благодарностью!

Джон


person John van Dam    schedule 28.02.2019    source источник
comment
по моему опыту snakemake плохо масштабируется до 10K рабочих мест и более, я пришел к выводу, что это врожденное ограничение, но разработчики snakemake могут предложить некоторые оптимизации   -  person Chris_Rands    schedule 28.02.2019
comment
У меня была такая же проблема twitter.com/yokofakun/status/891937697983602688, я переключился на следующий поток. io   -  person Pierre    schedule 28.02.2019
comment
примечание: для такого рода проблем вам следует спросить biostars.org или bioinformatics.stackexchange.com   -  person Pierre    schedule 28.02.2019
comment
Привет, Пьер, проблема, которую вы описываете в своем твите, кажется, решена или, по крайней мере, не является проблемой для меня. Шаг создания DAG для моего полного анализа (+ 500K заданий) занимает 2 минуты для запуска и примерно 15 минут после завершения первой контрольной точки и обновления DAG, что я считаю приемлемым с учетом сложности. Просто каждое задание требует 11 секунд на проверку правильности выполнения.   -  person John van Dam    schedule 28.02.2019


Ответы (1)


На данный момент я «решил» свою проблему, заменив в моем рабочем процессе «один ко многим к одному» вызовом GNU parallel.

Плюсы:

  • Нет проверки файлов, поэтому убрали накладные расходы snakemake
  • Убрана необходимость в контрольно-пропускных пунктах.
  • Упрощенный DAG

Минусы:

  • Нет проверки файлов, поэтому неудавшиеся задания труднее восстановить, и придется переделывать целые тяжелые вычислительные части рабочего процесса, а не только файлы, которые завершились ошибкой.
  • Нужно погрузиться в другие журналы, чтобы найти, что именно пошло не так.

Я предлагаю использовать параметр --halt с 'now, fail = 1' и параметр --joblog для параллельного поиска проблемных файлов.

На тестовом наборе я сократил время расчета с 4 часов до 15 минут.

Я по-прежнему считаю, что snakemake каким-то образом с этим справится, но мне нужно продолжать свой проект.

person John van Dam    schedule 05.03.2019
comment
Можете ли вы использовать --retry-failed для повторения неудачных заданий? - person Ole Tange; 18.03.2019
comment
Спасибо Оле! Это действительно очень полезно! Я нечасто использовал параллель, поэтому не знал этого варианта. - person John van Dam; 18.03.2019