运行 Snakemake 规则一次一个样本
Run Snakemake rule one sample at a time
我正在创建一个 Snakemake 工作流程,它将包含一些 tools in the nvidia clara parabricks pipelines。因为这些工具 运行 在 GPU 上,它们通常一次只能处理一个样本,否则 GPU 将 运行 内存不足。然而,Snakemake 一次将所有样本推送到 Parabricks - 似乎没有意识到 GPU 内存限制。一种解决方案是告诉 Snakemake 一次处理一个样本,因此问题是:
如何让 Snakemake 一次处理一个样本?
因为 parabricks 是许可产品(因此不一定可复制),我将展示我尝试 运行 (pb运行 fastq2bam ),以及我们可以使用的开源软件 (fastqc) 的最小可重现示例 on/from
我的 parabricks 规则 - pb运行 fastq2bam
蛇文件:
# 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/
目录中存在四个 samples/exomes 时出错:
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/
蛇文件:
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", "{sample}_2.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 将在一个规则 iteration/sample.
上使用所有给定的核心
内存也可以使用某物来限制。喜欢
resources:
mem_mb=100
在规则中,--resources mem_mb=100
在 snakemake 调用中。这会将规则限制为最多使用 100MB 内存。
我想扩展@jafors 的回答。可能比限制内存更好的做法是,您可以制作一个 gpu 资源:
rule pbrun_fq2bam:
...
resources:
gpu=1
然后 运行 你的 snakemake 与 --resources gpu=1
在这种情况下,您仍然可以将内存和线程用于其他规则,并且每个资源都描述了它是什么。
我正在创建一个 Snakemake 工作流程,它将包含一些 tools in the nvidia clara parabricks pipelines。因为这些工具 运行 在 GPU 上,它们通常一次只能处理一个样本,否则 GPU 将 运行 内存不足。然而,Snakemake 一次将所有样本推送到 Parabricks - 似乎没有意识到 GPU 内存限制。一种解决方案是告诉 Snakemake 一次处理一个样本,因此问题是:
如何让 Snakemake 一次处理一个样本?
因为 parabricks 是许可产品(因此不一定可复制),我将展示我尝试 运行 (pb运行 fastq2bam ),以及我们可以使用的开源软件 (fastqc) 的最小可重现示例 on/from
我的 parabricks 规则 - pb运行 fastq2bam
蛇文件:
# 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/
目录中存在四个 samples/exomes 时出错:
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/
蛇文件:
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", "{sample}_2.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 将在一个规则 iteration/sample.
内存也可以使用某物来限制。喜欢
resources:
mem_mb=100
在规则中,--resources mem_mb=100
在 snakemake 调用中。这会将规则限制为最多使用 100MB 内存。
我想扩展@jafors 的回答。可能比限制内存更好的做法是,您可以制作一个 gpu 资源:
rule pbrun_fq2bam:
...
resources:
gpu=1
然后 运行 你的 snakemake 与 --resources gpu=1
在这种情况下,您仍然可以将内存和线程用于其他规则,并且每个资源都描述了它是什么。