【问题标题】:Running parallel instances of a single job/rule on Snakemake在 Snakemake 上运行单个作业/规则的并行实例
【发布时间】:2018-06-25 14:02:37
【问题描述】:

这里是没有经验、自学成才的“编码员”,所以请理解:]

我正在尝试学习和使用 Snakemake 来构建我的分析管道。不幸的是,我无法同时运行单个作业/规则的多个实例。我的工作站不是计算集群,所以我不能使用这个选项。我找了几个小时的答案,但要么没有,要么我知识渊博,无法理解。 那么:有没有办法同时运行单个作业/规则的多个实例?

如果你想要一个具体的例子:

假设我想使用 fastqc 工具分析一组 4 个 .fastq 文件。于是我输入了一个命令:

time snakemake -j 32

然后运行我的代码,即:

SAMPLES, = glob_wildcards("{x}.fastq.gz")

rule Raw_Fastqc:
    input:
            expand("{x}.fastq.gz", x=SAMPLES)
    output:
            expand("./{x}_fastqc.zip", x=SAMPLES),
            expand("./{x}_fastqc.html", x=SAMPLES)
    shell:
            "fastqc {input}"

我希望snakemake 在 32 个线程上运行尽可能多的 fastqc 实例(如此轻松地同时运行我的所有 4 个输入文件)。事实上。此命令大约需要 12 分钟才能完成。同时,从snakemake内部利用GNU并行

shell:
    "parallel fastqc ::: {input}"

我在 3 分钟内得到结果。显然这里有一些尚未开发的潜力。

谢谢!

【问题讨论】:

  • 类似问题:stackoverflow.com/q/50828233/1878788。这似乎是一个常见的陷阱。
  • 是的,我看到了这个话题,但是我错误地认为我的问题不同,因为我没有使用计算集群。因此复制问题。干杯!

标签: snakemake


【解决方案1】:

如果我没记错的话,fastqc 会分别处理每个 fastq 文件,因此您的实现没有利用蛇形的并行化特性。这可以通过defining the targets 完成,如下所示,使用rule all

from pathlib import Path

SAMPLES = [Path(f).name.replace('.fastq.gz', '')  for f in glob_wildcards("{x}.fastq.gz") ]

rule all:
    input:
        expand("./{sample_name}_fastqc.{ext}", 
                        sample_name=SAMPLES, ext=['zip', 'html'])

rule Raw_Fastqc:
    input:
            "{x}.fastq.gz", x=SAMPLES
    output:
            "./{x}_fastqc.zip", x=SAMPLES,
            "./{x}_fastqc.html", x=SAMPLES
    shell:
            "fastqc {input}"

【讨论】:

  • 谢谢!你是绝对正确的!虽然我没有使用您提供的确切代码,但当我包含“全部”规则并从后续规则中删除“扩展”时,并行处理确实有效。现在唯一的问题是,我不明白为什么蛇人会这样。也许你可以给我指点适当的教程/手册(如果在snakemake.readthedocs.io 解释,我看不到或理解它......)?
  • @AdrianS85 Snakemake 将通过并行运行规则的多个实例(即“作业”)进行并行化(通配符的不同值,由其输出确定)。当您使用expand 时,您“使用/解析”通配符。一条规则的输出是 expand 上的 x 通配符表示:“一个作业将输出多个文件”,而不是“一个作业将输出与给定值 x 对应的文件”。典型的做法是有一个all“驱动规则”,它的输入中有一个expand,只是说“最后,我想要所有这些文件”和一个“驱动规则”,与输出中的通配符。
  • @AdrianS85 我试图在这里开发这些解释:bitbucket.org/snakemake/snakemake/pull-requests/307/… 希望这最终会集成到官方文档中并得到改进。
【解决方案2】:

要添加到上面 JeeYem 的答案,您还可以使用每个规则的 'threads' property 定义为每个作业保留的资源数量,如下所示:

rule Raw_Fastqc:
input:
        "{x}.fastq.gz", x=SAMPLES
output:
        "./{x}_fastqc.zip", x=SAMPLES,
        "./{x}_fastqc.html", x=SAMPLES
threads: 4
shell:
        "fastqc --threads {threads} {input}"

因为 fastqc 本身可以为每个任务使用多个线程,所以您甚至可以通过 parallel 实现获得额外的加速。

然后,Snakemake 将自动分配尽可能多的作业,以适应顶级调用提供的总线程数:

例如,snakemake -j 32 最多可以执行 8 个 Raw_Fastqc 规则实例。

【讨论】:

  • 感谢您的提示!不幸的是,我认为它不适用于fastqc 在snakemake 并行化工作之后,我尝试将--threads 4 添加到shell: "fastqc",但它并没有加快执行速度。
猜你喜欢
  • 2021-02-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-03
相关资源
最近更新 更多