Как правильно определить количество потоков для заданий, охватывающих несколько узлов? - PullRequest
0 голосов
/ 12 февраля 2019

У меня есть конвейер snakemake, работающий на кластере hpc, использующий slurm в качестве пакетной системы.В принципе, конвейер работает нормально, но у меня возникают проблемы, когда задание, переданное snakemake, охватывает несколько узлов.В этом случае не все выделенные ЦП учитываются в параметре {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}, который передается команде оболочки, будет 10, а не 20 (как видно из выходных файлов).Чтобы сделать вещи более странными, команда shell, напечатанная snakemake, говорит 20 во всех случаях.Как и журнал змеиный.Только журналы заданий и выходные данные показывают threads как 10. Я что-то здесь не так делаю?Есть ли способ заставить snakemake использовать все доступные ядра задания или параметр {threads} можно использовать только для потоков на компьютере с общей памятью?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...