如何正确定义跨多个节点的作业的线程数?

时间:2019-02-12 08:57:55

标签: slurm snakemake

我有一个使用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}参数仅用于共享内存计算机上的线程?

0 个答案:

没有答案