Я работаю над довольно сложным процессом создания змейки, который порождает несколько сотен тысяч заданий. Все работает ... Рабочий процесс выполняется, 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 ГБ.
Любая помощь, чтобы ускорить процесс, была бы принята с благодарностью!
Джон