我有一个snakemake管道在hpc集群上运行,使用slurm作为批处理系统。原则上,管道运行良好,但当snakemake提交的作业跨越多个节点时,我会遇到问题。在这种情况下,并非所有分配的CPU都计入
{threads}
参数,但仅限于在一个节点上分配的,而不考虑其他节点。
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个核。这对我来说很好,因为内核之间的通信是以一种不需要共享内存的方式处理的。但在这种情况下
{threads}
传递给shell命令的参数将是10,而不是20(如输出文件中所示)。更奇怪的是,snakemake打印的shell命令在所有情况下都显示为20。蛇形木柴也是。只显示作业日志文件和输出
threads
10岁。我做错什么了吗?有没有办法告诉snakemake使用作业的所有可用核心,或者
{threads}
参数仅用于共享内存机器上的线程?