【问题标题】:Can Snakemake parallelize the same rule both within and across nodes?Snakemake 可以在节点内和节点之间并行化相同的规则吗?
【发布时间】:2022-07-28 21:26:45
【问题描述】:

在使用集群执行时,我有一个关于 Snakemake 并行化的基本问题:来自同一规则的作业是否可以同时在一个节点内和多个节点之间并行化?

例如,假设我有 100 个 bwa mem 作业,并且我的集群有每个节点有 40 个核心。我可以每个节点运行 4 个 bwa mem,每个使用 10 个线程,然后让 Snakemake 提交 25 个单独的作业吗?本质上,我想在同一规则的节点内和节点之间进行并行化。

这是我当前的蛇文件:

SAMPLES, = glob_wildcards(\"fastqs/{id}.1.fq.gz\")
print(SAMPLES)

rule all:
        input:
                expand(\"results/{sample}.bam\", sample=SAMPLES)

rule bwa:
    resources:
        time=\"4:00:00\",
        partition=\"short-40core\"
    input:
        ref=\"/path/to/reference/genome.fa\",
        fwd=\"fastqs/{sample}.1.fq.gz\",
        rev=\"fastqs/{sample}.2.fq.gz\"
    output:
        bam=\"results/{sample}.bam\"
    log:
        \"results/logs/bwa/{sample}.log\"
    params:
        threads=10
    shell:
        \"bwa mem -t {params.threads} {input.ref} {input.fwd} {input.rev} 2> {log} | samtools view -bS - > {output.bam}\"

我已经使用以下命令运行它:

snakemake --cluster \"sbatch --partition={resources.partition}\" -s bwa_slurm_snakefile --jobs 25

使用此设置,我收到了 25 个作业,每个作业都提交到不同的节点。但是,每个节点只运行一个 bwa mem 进程(使用 10 个线程)。

是否有一些直接的方法来修改它,以便我可以在每个节点上运行 4 个不同的 bwa mem 作业(每个使用 10 个线程)?

谢谢!

戴夫

22 年 7 月 28 日编辑:

除了下面特洛伊的建议之外,我还找到了一种简单的方法来完成我想做的事情,只需遵循grouping documentation 的工作即可。

具体来说,我在执行 Snakemake 管道时做了以下操作:

snakemake --cluster \"sbatch --partition={resources.partition}\" -s bwa_slurm_snakefile --jobs 25 --groups bwa=group0 --group-components group0=4 --rerun-incomplete --cores 40

通过为 bwa 规则指定一个组 (\"group0\") 并设置 \"--group-components group0=4\",我能够对作业进行分组,以便在每个节点上进行 4 次 bwa 运行。

    标签: snakemake


    【解决方案1】:

    您可以尝试job grouping,但请注意,在提交这样的小组作业时,资源通常会汇总在一起。通常这不是想要的,但在你的情况下它似乎是正确的。

    相反,您可以使用另一个规则创建一个组作业,该规则以 4 个为一组为您进行分组。

    rule bwa_mem:
        group: 'bwa_batch'
        output: '{sample}.bam'
        ...
    
    def bwa_mem_batch(wildcards):
        # for wildcard.i, pick 4 bwa_mem outputs to put in this group
        return expand('{sample}.bam', sample=SAMPLES[i*4:i*4+4])
    
    rule bwa_mem_batch:
        input: bwa_mem_batch_input
        output: touch('flag_{i}')  # could be temp too
        group 'bwa_batch'
    

    消费规则必须为i in {0..len(SAMPLES)//4} 请求flag_{i}。通过集群集成,每个 slurm 作业获得 1 个 bwa_mem_batch 作业和 4 个 bwa_mem 作业,其中资源用于单个 bwa_mem 作业。这对于将多个作业批处理在一起以增加运行时间很有用。

    最后一点,这可能会满足您的需求,但我认为它不会帮助您解决 QOS 或其他工作配额问题。无论哪种方式,您都使用相同数量的 CPU 小时数。您可能正在排队等候更长因为调度程序无法一次找到 40 个线程给你,它本来可以给你几个 10 个线程作业。相反,请考虑优化您的资源价值以获得更高的效率,这可能会使您的工作更早地运行。

    【讨论】:

    • 谢谢,这很有帮助!我没有考虑拆分工作,直到多个规则,以便我可以使用分组功能。我会玩这个。关于你的最后一点,我的集群不允许多个用户同时在同一个节点上,所以从 QOS 和 Fairshare 的角度来看,我使用的是全节点,不管我是否有效地使用了所有的它的核心。这就是为什么我想尝试在我分配的每个节点上实际使用所有内核的原因之一。
    猜你喜欢
    • 1970-01-01
    • 2015-05-15
    • 1970-01-01
    • 2021-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-07
    相关资源
    最近更新 更多