Snakemake集群模式下如何为不同rule自定义SLURM的CPU、内存等资源
解决方案
你当前的提交命令固定调用cluster配置中的n/m参数,所以规则内定义的threads/mem_mb不会生效,可通过以下两种常用方式实现需求:
方法1:修改cluster.yml覆盖指定规则资源
适合少数高资源规则的场景,无需改动Snakefile,仅需在cluster.yml的默认配置下单独加高资源规则的配置即可,其余规则默认走最小资源配置:
__default__: partition: 'standard' group: 'mygroup' M: 'myemail@gmail.com' time: '24:00:00' n: "1" # 调整为你需要的最小默认核心数 m: '1gb' # 调整为你需要的最小默认内存 o: 'out/{rule}.{wildcards}.out' e: 'err/{rule}.{wildcards}.err' N: "1" # 单独配置高资源规则的参数,参数会覆盖默认配置 alignment: # 替换为你自己的高资源规则名 n: "16" m: '32gb' time: '48:00:00' # 也可单独修改该规则的运行时长、分区等其他参数
方法2:提交命令直接调用rule的threads/resources参数
如果你希望资源定义直接写在Snakefile的规则内,可修改提交命令的参数引用逻辑,直接读取规则内的配置:
- 先在Snakefile中定义规则的资源参数,同时在开头设置全局默认资源:
# Snakefile开头加全局默认资源,无特殊配置的规则统一用最小资源 set_threads(1) set_resources(mem_mb=1024) # 高资源规则单独定义参数 rule bwa_align: threads: 16 resources: mem_mb = 32768 input: ... output: ... shell: ...
- 修改运行命令,将
{cluster.n}替换为{threads}、{cluster.m}替换为{resources.mem_mb}:
snakemake --cluster "sbatch -A {cluster.group} -p {cluster.partition} -n {threads} -t {cluster.time} -N {cluster.N} --mem={resources.mem_mb} -e {cluster.e} -o {cluster.o}" --cluster-config config/cluster.yml -j 30 --latency-wait 30
注意事项
- 若同时使用cluster.yml规则级配置和命令行调用rule参数,cluster.yml的优先级更高,可覆盖rule内的定义
- 内存单位要对应:如果规则内的
mem_mb以MB为单位,sbatch的--mem参数直接接数字会默认识别为MB,无需额外加单位,避免换算错误
内容的提问来源于stack exchange,提问作者Matt Miller
相关产品推荐
相关产品推荐

