[英]How to immediately submit all Snakemake jobs to slurm cluster
我正在使用snakemake
构建一个可以在 SLURM 集群上运行的变体调用管道。 集群有登录节点和计算节点。 任何真正的计算都应该以srun
或sbatch
作业的形式在计算节点上完成。 作业的运行时间限制为 48 小时。 我的问题是,处理很多样本,尤其是在队列繁忙的情况下,处理每个样本的所有规则需要超过 48 小时。 传统的snakemake
集群执行snakemake
留下一个主线程运行,该线程仅在所有规则的依赖项运行完毕后才将规则提交到队列。 我应该在计算节点上运行这个主程序,所以这将我的整个管道的运行时间限制为 48 小时。
我知道 SLURM 作业有依赖指令,告诉作业等待运行,直到其他作业完成。 由于snakemake
工作流是一个 DAG,是否可以一次提交所有作业,每个作业的依赖项都由 DAG 的规则依赖项定义? 提交所有作业后,主线程将完成,绕过 48 小时限制。 这是否可能与snakemake
,如果是这样,它是如何工作的? 我找到了--immediate-submit
命令行选项,但我不确定这是否具有我正在寻找的行为以及如何使用该命令,因为我的集群在作业完成后打印Submitted batch job [id]
提交到队列,而不仅仅是作业 ID。
不幸的是,立即提交不能开箱即用,但需要进行一些调整才能工作。 这是因为作业之间的依赖关系在集群系统之间传递的方式不同。 不久前,我遇到了同样的问题。 正如立即提交文档所说:
立即将所有作业提交到集群,而不是等待当前的输入文件。 这将失败,除非您让集群知道作业依赖关系,例如通过: $ snakemake –cluster 'sbatch –dependency {dependencies}。 假设您的提交脚本(此处为 sbatch)将生成的作业 ID 输出到第一个 stdout 行,{dependencies} 将填充此作业所依赖的以空格分隔的作业 ID。
所以问题是sbatch
不会将生成的作业 id 输出到第一个 stdout 行。 但是,我们可以使用我们自己的 shell 脚本来规避这一点:
parseJobID.sh:
#!/bin/bash
# helper script that parses slurm output for the job ID,
# and feeds it to back to snakemake/slurm for dependencies.
# This is required when you want to use the snakemake --immediate-submit option
if [[ "Submitted batch job" =~ "$@" ]]; then
echo -n ""
else
deplist=$(grep -Eo '[0-9]{1,10}' <<< "$@" | tr '\n' ',' | sed 's/.$//')
echo -n "--dependency=aftercorr:$deplist"
fi;
并确保使用chmod +x parseJobID.sh
授予脚本执行权限。
然后我们可以像这样调用立即提交:
snakemake --cluster 'sbatch $(./parseJobID.sh {dependencies})' --jobs 100 --notemp --immediate-submit
请注意,这将同时提交最多 100 个作业。 您可以将其增加或减少到您喜欢的任何数量,但要知道大多数集群系统不允许每个用户同时处理超过 1000 个作业。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.