代码之家  ›  专栏  ›  技术社区  ›  jotasi

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

  •  1
  • jotasi  · 技术社区  · 7 年前

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

    0 回复  |  直到 7 年前
    推荐文章