【问题标题】:Parallel execution of a snakemake rule with same input and a range of values for a single parameter并行执行具有相同输入和单个参数值范围的蛇形规则
【发布时间】:2019-01-29 14:12:33
【问题描述】:

我正在将一个 bash 脚本转换为 snakemake,并且我想并行化我之前使用 for 循环处理的一个步骤。我遇到的问题是,snakemake 最终尝试使用所有参数运行一个进程并失败,而不是运行并行进程。

我的原始 bash 脚本针对参数 K 的一系列值多次运行一个程序。

for num in {1..3}
do
  structure.py -K $num --input=fileprefix --output=fileprefix
done

有多个以fileprefix 开头的输入文件。每次运行有两个主要输出,例如对于 K=1,它们是 fileprefix.1.meanPfileprefix.1.meanQ。我的配置和snakemake文件如下。

配置:

cat config.yaml

infile: fileprefix
K:
  - 1
  - 2
  - 3

蛇人:

configfile: 'config.yaml'

rule all:
    input:
        expand("output/{sample}.{K}.{ext}",
            sample = config['infile'],
            K = config['K'],
            ext = ['meanQ', 'meanP'])

rule structure:
    output:
        "output/{sample}.{K}.meanQ",
        "output/{sample}.{K}.meanP"
    params:
        prefix = config['infile'],
        K = config['K']
    threads: 3
    shell:
        """
        structure.py -K {params.K} \
        --input=output/{params.prefix} \
        --output=output/{params.prefix}
        """

这是用snakemake --cores 3 执行的。当我只使用一个线程时,问题仍然存在。

我希望每个 K 值都有上述输出,但运行失败并出现以下错误:

RuleException:
CalledProcessError in line 84 of Snakefile:
Command ' set -euo pipefail;  structure.py -K 1 2 3 --input=output/fileprefix \
--output=output/fileprefix ' returned non-zero exit status 2.
  File "Snakefile", line 84, in __rule_Structure
  File "snake/lib/python3.6/concurrent/futures/thread.py", line 56, in run

当我将 K 设置为单个值(例如 K = ['1'])时,一切正常。所以问题似乎是 {params.K} 在执行 shell 命令时被扩展为 K 的所有值。我今天开始自学snakemake,效果非常好,但我遇到了麻烦。

【问题讨论】:

  • 不会影响我的问题,但在 params 中应该是 prefix = config['infile'] 而不是 prefix = config['invcf']
  • 可以编辑您的问题以进行更正(我认为可以多次修改)。

标签: snakemake


【解决方案1】:

您需要从通配符中检索-K 的参数,而不是从配置文件中。配置文件将简单地返回您的可能值列表,它是一个普通的 Python 字典。

configfile: 'config.yaml'

rule all:
    input:
        expand("output/{sample}.{K}.{ext}",
               sample = config['infile'],
               K = config['K'],
               ext = ['meanQ', 'meanP'])

rule structure:
    output:
        "output/{sample}.{K}.meanQ",
        "output/{sample}.{K}.meanP"
    params:
        prefix = config['invcf'],
        K = config['K']
    threads: 3
    shell:
        "structure.py -K {wildcards.K} "
        "--input=output/{params.prefix} "
        "--output=output/{params.prefix}"

请注意,这里还有更多需要改进的地方。例如,规则structure 没有定义任何输入文件,尽管它使用了一个。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-14
    • 1970-01-01
    • 1970-01-01
    • 2021-10-25
    • 2022-12-20
    • 1970-01-01
    相关资源
    最近更新 更多