如何解决Snakemake 在开始下一个并行作业之前等待完成所有并行作业
我编写了 Snakemake 规则,它运行 Muscle(MSA 工具)来计算目录中所有文件的多序列比对 (MSA)。该任务非常并行,因为不同的文件不相互依赖。问题是,Snakemake 在 n 个“批次”中运行此规则,其中 n 是作为参数提供给 Snakemake 的核心:
snakemake -j 4 msa
。
Snakemake 开始时并行运行 4 个作业,它会等到每个作业都完成后才开始新的“批处理”4 个作业。这会浪费 CPU 时间,因为输入文件的大小差异很大,而且它们的 MSA 计算时间可能从几秒到几分钟不等。导致以下执行流程:
job1|----- |job5|----- |...|->
job2|--- |job6|-------- |...|->
job3|----------------|job7|-- |...|->
job4|- |job8|----------|...|->
我如何告诉 Snakemake 真正并行化作业?
CLUSTER_IDS,= glob_wildcards(os.path.join(WORK_DIR,"fasta","{id}.fasta"))
rule msa:
input:
expand(os.path.join(WORK_DIR,"msa","{id}.afa"),id=CLUSTER_IDS)
rule:
input:
os.path.join(WORK_DIR,"{id}.fasta")
output:
os.path.join(WORK_DIR,"{id}.afa")
shell:
"{MUSCLE_PATH}/muscle3.8.31_i86darwin64 -in {input} -out {output}"
解决方法
您使用的是哪个蛇形版本。我很确定这是因为 -j
和 --cores
标志的工作方式最近发生了变化。
每个“作业”是否在 1 个线程上运行?
我可以建议在您的规则中使用 threads:
指令,您可以在其中指定规则 1 线程,如下所示:
rule:
input:
os.path.join(WORK_DIR,"fasta","{id}.fasta")
output:
os.path.join(WORK_DIR,"msa","{id}.afa")
threads:
1
shell:
"{MUSCLE_PATH}/muscle3.8.31_i86darwin64 -in {input} -out {output}"
然后你可以使用以下命令运行snakemake:
snakemake --cores 4
现在它最多应该运行四个规则/作业,但一完成就会开始一个新的。
它可能也适用于 -j
,但我认为将作业和核心/流程分开是更好的做法,这也是这些选项最近变化背后的动机。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。