Запускайте правило Snakemake по одному образцу за раз

Я создаю рабочий процесс Snakemake, который завершит некоторые из инструменты в конвейерах nvidia clara parabricks. Поскольку эти инструменты работают на графических процессорах, они обычно могут обрабатывать только одну выборку за раз, в противном случае графическому процессору не хватит памяти. Однако Snakemake отправляет все сэмплы в Parabricks одновременно, по-видимому, не подозревая об ограничениях памяти графического процессора. Одним из решений было бы сказать 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}"

Команда Run:

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", "{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

Команда Run:

snakemake -j 32 --use-conda

Заранее спасибо за любые указатели !!


person Leah Kemp    schedule 04.09.2020    source источник


Ответы (2)


Я хотел бы подробнее рассказать об ответе @jafors. Наверное, что лучше сделать вместо ограничения памяти, можно сделать ресурс gpu:

rule pbrun_fq2bam:
...
    resources:
        gpu=1

А затем запустите создателя змеи с --resources gpu=1

В этом случае вы все равно можете использовать память и потоки для других правил, и каждый ресурс описывает, что это такое.

person Maarten-vd-Sande    schedule 04.09.2020
comment
Отлично! Это действительно лучше подходит для варианта использования. - person jafors; 04.09.2020
comment
Спасибо @ Maarten-vd-Sande за указание на этот гораздо более простой подход! Он работает и отлично и позволит конвейеру масштабироваться, когда будет доступно больше графических процессоров! - person Leah Kemp; 07.09.2020

Вы можете попробовать добавить threads: 32 в свое правило, чтобы snakemake использовал все заданные ядра в одной итерации / выборке правила.

Память также можно ограничить с помощью sth. нравиться

resources:
    mem_mb=100

в правиле и --resources mem_mb=100 в вызове snakemake. Это ограничит использование правилом не более 100 МБ памяти.

person jafors    schedule 04.09.2020
comment
Спасибо @jafors, это тоже был бы еще один отличный способ подойти к этому! На самом деле установка пределов памяти может быть полезна по сравнению с установкой количества графических процессоров в случае, когда правило будет использоваться для анализа данных WGS или WES или данных WGS от видов с геномами очень переменных размеров. Поскольку память здесь является ограничивающим фактором, правило было бы более гибким в этих обстоятельствах, когда использование памяти на выборку было бы переменным. - person Leah Kemp; 07.09.2020
comment
@LeahKemp знает, что вы можете установить несколько ресурсов для одного правила. Так что ничто не мешает вам использовать потоки, но также и mem_gb, и gpu в качестве ресурсов. - person Maarten-vd-Sande; 07.09.2020