一次运行Snakemake规则一个样本

问题描述

我正在创建一个Snakemake工作流程,它将包装一些tools in the nvidia clara parabricks pipelines。由于这些工具在GPU上运行,因此通常一次只能处理一个样本,否则GPU会耗尽内存。但是,Snakemake一次将所有样本推送到Parabricks-似乎没有意识到GPU内存限制。一种解决方案是告诉Snakemake一次处理一个样本,因此出现问题:

如何让Snakemake一次处理一个样品?

由于parabricks是一种许可产品(因此不一定可复制),因此我将展示我尝试运行的parabricks规则的示例(pbrun fastq2bam),以及使用开源软件进行复制的最小示例(fastqc),我们可以在

上进行操作

我的高空跳伞规则-pbrun fastq2bam

Snakefile:

# Define samples from fastq dir using wildcards
SAMPLES,= glob_wildcards("../fastq/{sample}_1.filt.fastq.gz")

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

rule pbrun_fq2bam:
    input:
        R1 = "../fastq/{sample}_1.filt.fastq.gz",R2 = "../fastq/{sample}_2.filt.fastq.gz"
    output:
        bam = "{sample}_recalibrated.bam",recal = "{sample}_recal.txt"
    shell:
        "pbrun fq2bam --ref human_g1k_v37_decoy.fasta --in-fq {input.R1} {input.R2} --kNownSites dbsnp_138.b37.vcf --out-bam {output.bam} --out-recal {output.recal}"

运行命令:

snakemake -j 32 --use-conda

../fastq/目录中存在四个样本/外显子组时出错:

GPU-BWA mem
ProgressMeter   Reads           Base Pairs Aligned
cudaSafeCall() Failed at ParaBricks/src/samGenerator.cu:782 : out of memory
cudaSafeCall() Failed at ParaBricks/src/samGenerator.cu:782 : out of memory
cudaSafeCall() Failed at ParaBricks/src/chainGenerator.cu:185 : out of memory
cudaSafeCall() Failed at ParaBricks/src/chainGenerator.cu:185 : out of memory
cudaSafeCall() Failed at ParaBricks/src/chainGenerator.cu:185 : out of memory
cudaSafeCall() Failed at ParaBricks/src/chainGenerator.cu:183 : out of memory
cudaSafeCall() Failed at ParaBricks/src/chainGenerator.cu:185 : out of memory
cudaSafeCall() Failed at ParaBricks/src/chainGenerator.cu:183 : out of memory

最小示例-fastqc

获取数据:

mkdir ../fastq/
gsutil cp -r gs://genomics-public-data/gatk-examples/example1/NA19913/* ../fastq/

Snakefile:

SAMPLES,= glob_wildcards("../fastq/{sample}_1.filt.fastq.gz")

rule all:
    input:
        expand(["{sample}_1.filt_fastqc.html","{sample}_2.filt_fastqc.html"],sample = SAMPLES),expand(["{sample}_1.filt_fastqc.zip","{sample}_2.filt_fastqc.zip"],sample = SAMPLES)

rule fastqc:
    input:
        R1 = "../fastq/{sample}_1.filt.fastq.gz",R2 = "../fastq/{sample}_2.filt.fastq.gz"
    output:
        html = ["{sample}_1.filt_fastqc.html",zip = ["{sample}_1.filt_fastqc.zip","{sample}_2.filt_fastqc.zip"]
    conda:
        "fastqc.yaml"
    shell:
        "fastqc {input.R1} {input.R2} --outdir ."

fastqc.yaml:

channels:
  - bioconda
  - conda-forge
  - defaults
dependencies:
  - bioconda::fastqc =0.11.9

运行命令:

snakemake -j 32 --use-conda

在此先感谢任何指针!

解决方法

您可以尝试在规则中添加threads: 32,以便snakemake将在一个规则迭代/样本中使用所有给定的内核。

也可以使用sth限制内存。喜欢

resources:
    mem_mb=100

(在规则中)和--resources mem_mb=100(在snakemake调用中)。这将限制该规则最多使用100MB内存。

,

我想扩展@jafors的答案。也许最好做些什么而不是限制内存,您可以创建一个gpu资源:

rule pbrun_fq2bam:
...
    resources:
        gpu=1

然后使用--resources gpu=1

运行您的makenmake

在这种情况下,您仍然可以将内存和线程用于其他规则,并且每个资源都说明了它是什么。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...