由于工作完成的冗长顺序检查,Snakemake 处理大型工作流很慢? >100 倍减速
Snakemake processing large workflow slow due to lengthy sequential checking of job completion? >100x speed reduction
我正在研究一个相当复杂的 snakemake 工作流程,它产生了数十万个工作岗位。一切正常......工作流执行,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 个作业。
在上面的 运行 中,我有大约 20 万个工作岗位。如果我缩小日志之间的时间变得更短:
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 秒。
我希望我在这里遗漏了一个论点或一些参数,但我担心它可能是不重要的。
I 运行 带有以下标志的 snakemake:
snakemake --keep-going --snakefile My.Snakefile --configfile config.yaml -j 23 --max-jobs-per-second 23
我运行在具有 256 GB 内存的 24 核系统上本地化我的工作流。
任何有助于加快速度的帮助都将不胜感激!
约翰
我现在 'solved' 我的问题是用调用 GNU 并行替换我工作流程的 "one to many to one" 部分。
专业人士:
- 没有文件检查,因此删除了 snakemake 开销
- 删除了检查点的必要性
- 简化的 DAG
缺点:
- 没有文件检查,因此失败的作业不太容易检索,并且必须重做工作流的整个计算量大的部分,而不仅仅是失败的文件。
- 需要深入查看其他日志才能找出到底出了什么问题。
我建议将 --halt 选项与 'now,fail=1' 一起使用,并将 --joblog 选项用于并行捕获有问题的文件。
在测试集上,我将计算时间从 4 小时减少到 15 分钟。
我仍然觉得 snakemake 应该能够以某种方式处理这个问题,但我需要继续我的项目。
我正在研究一个相当复杂的 snakemake 工作流程,它产生了数十万个工作岗位。一切正常......工作流执行,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 个作业。
在上面的 运行 中,我有大约 20 万个工作岗位。如果我缩小日志之间的时间变得更短:
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 秒。
我希望我在这里遗漏了一个论点或一些参数,但我担心它可能是不重要的。
I 运行 带有以下标志的 snakemake: snakemake --keep-going --snakefile My.Snakefile --configfile config.yaml -j 23 --max-jobs-per-second 23
我运行在具有 256 GB 内存的 24 核系统上本地化我的工作流。
任何有助于加快速度的帮助都将不胜感激!
约翰
我现在 'solved' 我的问题是用调用 GNU 并行替换我工作流程的 "one to many to one" 部分。
专业人士:
- 没有文件检查,因此删除了 snakemake 开销
- 删除了检查点的必要性
- 简化的 DAG
缺点:
- 没有文件检查,因此失败的作业不太容易检索,并且必须重做工作流的整个计算量大的部分,而不仅仅是失败的文件。
- 需要深入查看其他日志才能找出到底出了什么问题。
我建议将 --halt 选项与 'now,fail=1' 一起使用,并将 --joblog 选项用于并行捕获有问题的文件。
在测试集上,我将计算时间从 4 小时减少到 15 分钟。
我仍然觉得 snakemake 应该能够以某种方式处理这个问题,但我需要继续我的项目。