Bash 每次运行一个样本的蛇击规则

Bash 每次运行一个样本的蛇击规则,bash,loops,gpu,snakemake,genome,Bash,Loops,Gpu,Snakemake,Genome,我正在创建一个Snakemake工作流,它将完成一些任务。由于这些工具在GPU上运行,它们通常一次只能处理一个样本,否则GPU将耗尽内存。然而,Snakemake一次将所有样本推送到Parabricks——似乎不知道GPU内存限制。一种解决方案是让Snakemake一次处理一个样本,因此问题是: 如何让Snakemake一次处理一个样本? 因为parabricks是一个许可产品(因此不一定是可复制的),我将展示一个我尝试运行的parabricks规则的示例(pbrun fastq2bam),以及

我正在创建一个Snakemake工作流,它将完成一些任务。由于这些工具在GPU上运行,它们通常一次只能处理一个样本,否则GPU将耗尽内存。然而,Snakemake一次将所有样本推送到Parabricks——似乎不知道GPU内存限制。一种解决方案是让Snakemake一次处理一个样本,因此问题是:

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

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

我的parabricks规则-pbrun fastq2bam 蛇形档案:

#使用通配符从fastq dir定义样本
SAMPLES,=glob_通配符(“../fastq/{sample}u 1.filt.fastq.gz”)
规则所有:
输入:
展开(“{sample}\u recalibrated.bam”,sample=SAMPLES)
规则pbrun_fq2bam:
输入:
R1=“../fastq/{sample}u 1.filt.fastq.gz”,
R2=“../fastq/{sample}\u 2.filt.fastq.gz”
输出:
bam=“{sample}\u已重新校准。bam”,
recal=“{sample}\u recal.txt”
外壳:
“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——使用conda
。/fastq/
目录中存在四个样本/外显子组时出错:

GPU-BWA内存
ProgressMeter读取对齐的碱基对
cudaSafeCall()在ParaBricks/src/samGenerator处失败。cu:782:内存不足
cudaSafeCall()在ParaBricks/src/samGenerator处失败。cu:782:内存不足
cudaSafeCall()在ParaBricks/src/chainGenerator处失败。cu:185:内存不足
cudaSafeCall()在ParaBricks/src/chainGenerator处失败。cu:185:内存不足
cudaSafeCall()在ParaBricks/src/chainGenerator处失败。cu:185:内存不足
cudaSafeCall()在ParaBricks/src/chainGenerator处失败。cu:183:内存不足
cudaSafeCall()在ParaBricks/src/chainGenerator处失败。cu:185:内存不足
cudaSafeCall()在ParaBricks/src/chainGenerator处失败。cu:183:内存不足
最小示例-fastqc 获取数据:

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

SAMPLES,=glob_通配符(“../fastq/{sample}u 1.filt.fastq.gz”)
规则所有:
输入:
展开([“{sample}u 1.filt_fastqc.html”、“{sample}u 2.filt_fastqc.html”],sample=SAMPLES),
展开([“{sample}u 1.filt_fastqc.zip”,“{sample}u 2.filt_fastqc.zip”],sample=SAMPLES)
规则fastqc:
输入:
R1=“../fastq/{sample}u 1.filt.fastq.gz”,
R2=“../fastq/{sample}\u 2.filt.fastq.gz”
输出:
html=[“{sample}u 1.filt_fastqc.html”、“{sample}u 2.filt_fastqc.html”],
zip=[“{sample}u 1.filt_fastqc.zip”、“{sample}u 2.filt_fastqc.zip”]
康达:
“fastqc.yaml”
外壳:
“fastqc{input.R1}{input.R2}--outdir。”
fastqc.yaml:

频道:
-比奥康达
-康达锻造厂
-默认值
依赖项:
-bioconda::fastqc=0.11.9
运行命令:

snakemake-j 32——使用conda

提前感谢您的指点

您可以尝试将
线程:32
添加到您的规则中,这样snakemake将在一次规则迭代/示例中使用所有给定的核心

记忆也可以用类似的东西来限制

resources:
    mem_mb=100

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

我想进一步讨论@jafors的答案。也许与其限制内存,不如做些什么,您可以制作一个gpu资源:

rule pbrun_fq2bam:
...
    resources:
        gpu=1
然后使用
--resources gpu=1运行snakemake


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

Nice!这确实更适合这个用例。感谢@Maarten vd Sande指出这个更简单的方法!它的工作和完美,将允许管道扩大时,更多的GPU是可用的!谢谢@jafors,这也是另一个很好的方法!在规则将用于分析WGS或WES数据或来自基因组大小非常可变的物种的WGS数据的情况下,实际设置内存限制可能比设置GPU的数量更有益。因为内存是这里的限制因素,所以在每个示例的内存使用量是可变的情况下,规则会更灵活。@LeahKemp知道您可以为一个规则设置多个资源。因此,没有什么可以阻止您使用线程,也可以使用mem_gb和gpu作为资源。