我有一个使用Slurm作为批处理系统在hpc集群上运行的snakemake管道。原则上,管道运行良好,但是当蛇make提交的作业跨越多个节点时,我会遇到问题。在那种情况下,并非所有分配的CPU都计入{threads}
参数,而是仅计入一个节点上分配的CPU,而忽略其他节点。另一方面,squeue
表示请求了正确数量的核心。 {threads}
参数是否真的仅在共享内存计算机上的实际线程上下文中使用,或者我可以某种方式告诉snakemake从可用内核的意义上更深入地了解它?
为了举例,如果我有这样的管道:
pipeline.skmk
:
CLUSTER = json.load(open("cluster.json"))
rule sleep_test:
output:
"something_{number}"
threads: CLUSTER['sleep_test']['n']
log:
"logs/something_{number}"
shell:
"""
echo {output} > {log} && sleep 20 && echo {threads} > {output}
"""
rule gather:
input:
expand("something_{number}", number=[0, 1, 2, 3])
output:
"done.txt"
shell:
"""
touch {output}
"""
cluster.json
:
{
"__default__" :
{
"time" : "00:01:00",
"n" : 1,
"mem": "3G",
"output" : "logs/slurm/{rule}.{wildcards}.%j.out",
"error" : "logs/slurm/{rule}.{wildcards}.%j.err"
},
"sleep_test" :
{
"time" : "00:02:00",
"n" : 20,
"mem": "3G",
"output" : "logs/slurm/{rule}.{wildcards}.%j.out",
"error" : "logs/slurm/{rule}.{wildcards}.%j.err"
}
}
命令:
snakemake --snakefile pipeline.skmk --printshellcmds \
--directory "test" --cluster-config cluster.json --jobname "test.{jobid}" \
--cluster-status slurm_status.py \
--cluster "sbatch --parsable -n {cluster.n} -t {cluster.time} \
--error {cluster.error} --output {cluster.output}" \
done.txt
如果我现在在具有3个节点和30个内核的计算机上运行该计算机,则一项工作将被拆分为使用两个不同节点的10个内核。这对我来说很好,因为内核之间的通信以不需要共享内存的方式进行处理。但是在这种情况下,传递给shell命令的{threads}
参数将是10,而不是20(正如在输出文件中看到的那样)。为了使事情变得更怪异,snakemake打印的shell命令在所有情况下都为20。就像蛇形日志一样。仅作业日志文件和输出将threads
显示为10。我在这里做错什么了吗?有没有办法让snakemake使用作业的所有可用核心,或者{threads}
参数仅用于共享内存计算机上的线程?