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

#bash #loops #gpu #snakemake #genome

#bash #циклы #графический процессор #snakemake #геном

Вопрос:

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

Как мне заставить Snakemake обрабатывать по одному образцу за раз?

Поскольку parabricks является лицензионным продуктом (и, следовательно, не обязательно воспроизводимым), я покажу пример правила parabricks, которое я пытаюсь запустить (pbrun fastq2bam), а также минимальный воспроизводимый пример с использованием программного обеспечения с открытым исходным кодом (fastqc), с которым мы можем работать

Мое правило parabricks — 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/ каталоге присутствуют четыре образца / 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/
  

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
  

Выполнить команду:

 snakemake -j 32 --use-conda
  

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

Ответ №1:

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

 rule pbrun_fq2bam:
...
    resources:
        gpu=1
  

А затем запустите свой snakemake с --resources gpu=1

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

Комментарии:

1. Мило! Это действительно лучше подходит для конкретного варианта использования.

2. Спасибо @Maarten-vd-Sande за указание на этот гораздо более простой подход! Это работает безупречно и позволит конвейеру расширяться, когда будет доступно больше графических процессоров!

Ответ №2:

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

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

 resources:
    mem_mb=100
  

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

Комментарии:

1. Спасибо @jafors, это также был бы еще один отличный способ приблизиться к этому! На самом деле установка ограничений памяти может быть выгоднее, чем установка количества графических процессоров в случае, когда правило должно было использоваться для анализа данных WGS или WES или данных WGS от видов с геномами очень разных размеров. Поскольку ограничивающим фактором здесь является память, правило было бы более гибким в этих обстоятельствах, когда использование памяти для каждого образца было бы переменным.

2. @LeahKemp знайте, что для одного правила можно задать несколько ресурсов. Таким образом, ничто не мешает вам использовать потоки, а также mem_gb и gpu в качестве ресурсов.