У меня есть конвейер 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}
можно использовать только для потоков на компьютере с общей памятью?