如何在Snakemake工作流中配置分组作业串行执行?
问题描述
我需要批量处理大量短作业来减少集群排队等待时间:每个作业运行仅约1分钟,资源需求固定为1 CPU、1GB内存。在繁忙集群中提交数千个这类作业效率极低——每个作业启动要花数分钟,实际运行却不到1分钟。我希望申请一次节点预留来运行约20个这类作业,集群管理员也不想因为大量短作业排队给Slurm调度器造成压力。
示例工作流
rule trim_primers: input: forward = "input/{run_pe}-{sample_pe}_R1.fastq.gz", reverse = "input/{run_pe}-{sample_pe}_R2.fastq.gz" output: forward_trimmed="output/v3v4_trimmed/{run_pe}-{sample_pe}_R1.trimmed.fastq.gz", reverse_trimmed="output/v3v4_trimmed/{run_pe}-{sample_pe}_R2.trimmed.fastq.gz" resources: cpus_per_task=1, mem_mb=1000, runtime="30m", slurm_partition="short" shell: ... rule map_reads: input: forward = "output/v3v4_trimmed/{run_pe}-{sample_pe}_R1.trimmed.fastq.gz", reverse = "output/v3v4_trimmed/{run_pe}-{sample_pe}_R2.trimmed.fastq.gz" output: forward_trimmed="output/mapped/{run_pe}-{sample_pe}_mapped.bam", reverse_trimmed="output/mapped/{run_pe}-{sample_pe}_mapped.bam" resources: cpus_per_task=8, mem_mb=16000, runtime="8h", slurm_partition="short" shell: ...
当前分组尝试及问题
使用Snakemake分组特性时执行命令:
snakemake \ --groups trim_primers=group_trim_primers \ --group-components group_trim_primers=20
根据文档描述:
Snakemake will request resources for groups by summing across jobs that can be run in parallel
当前行为是Snakemake会申请20 CPU、20GB内存的节点,并行运行组内所有作业,但我期望的是在同一节点上仅用1 CPU和1GB内存,串行运行这20个作业——即同一节点内,20个作业依次执行,共享单CPU单内存资源。
请问是否可以不借助Python包装规则实现批量处理,直接配置Snakemake分组让作业串行执行?
解决方案
可以直接通过Snakemake的分组配置结合资源限制实现,无需额外编写Python包装规则,核心是两个关键参数的组合:
- 命令行直接配置
执行以下命令即可实现需求:
snakemake \ --groups trim_primers=group_trim_primers \ --group-components group_trim_primers=20 \ --group-resources group_trim_primers:cpus_per_task=1 group_trim_primers:mem_mb=1000 \ --max-jobs-per-group group_trim_primers=1
参数说明:
--group-resources:强制覆盖组的资源请求,将总资源指定为1 CPU、1GB内存,替代默认的按并行作业求和逻辑--max-jobs-per-group:限制组内同时运行的作业数为1,确保20个作业在同一节点上串行执行
- 配置文件持久化配置
如果不想每次命令行输入参数,可以将配置写入config.yaml:
groups: trim_primers: group_trim_primers group_components: group_trim_primers: 20 group_resources: group_trim_primers: cpus_per_task: 1 mem_mb: 1000 max_jobs_per_group: group_trim_primers: 1
运行时只需执行:
snakemake --configfile config.yaml
这样配置后,Snakemake会为group_trim_primers申请符合资源要求的节点,然后在该节点上依次串行执行20个trim_primers作业,既减少了集群排队次数,也符合管理员对调度器压力的要求。
内容的提问来源于stack exchange,提问作者elsherbini
相关产品推荐
相关产品推荐

