Clara Parabricks: геномика на GPU

Задача страницы. Дать практический каркас запуска пайплайнов NGS‑геномики на облачных GPU (Clara Parabricks‑совместимые рецепты): архитектуры для одиночных образцов и массовых батчей, BYOL‑лицензирование, требования к дискам/кэшу, профили GPU, наблюдаемость (bases/reads per second, samples per day), экономика (Cost_per_sample) и устойчивость к прерываниям.

TL;DR

  • GPU‑ускорение NGS. Типовой конвейер FASTQ → BAM/CRAM → VCF/gVCF с выравнивателями/вариант‑коллерами переносится на GPU, повышая throughput и снижая стоимость на образец.
  • **Архитектуры. — Single‑node multi‑GPU: один образец на узле, шардинг по интервалам/хромосомам на несколько GPU. — Пул узлов: много независимых образцов → идеально для «1 процесс = 1 GPU». RDMA не критичен.
  • Диски/I/O. NVMe‑scratch обязателен: временные BAM/CRAM/индексы и сортировки; референсы/базы — «тёплое» хранилище; архив gVCF/VCF — «холодное». См. https://cloudcompute.ru/solutions/storage-data/
  • Interruptible‑паттерн. Делим пайплайн на короткие стадии/шарды с целевым чанком ≤ 120 с и ретраями (по интервалам/хромосомам, по чанкам чтений). См. https://cloudcompute.ru/solutions/interruptible-patterns/
  • BYOL‑лицензии. Bring‑Your‑Own‑License: сервер/файл лицензии как секрет, egress‑allow‑list, аудит checkout/check‑in.
  • Профили GPU. 24 ГБ (Compact) → мелкие/локальные пайплайны; 48 ГБ (Balanced) → стандарт WES/WGS; 80 ГБ (HQ) → 30× WGS/совместное коллирование и агрессивный параллелизм.
  • Наблюдаемость. bases_per_s, reads_per_s, samples_per_day, p50/p95 stage_time_seconds, gpu_utilization, io_read/write_mb_s. См. https://cloudcompute.ru/solutions/monitoring-logging/
  • Экономика. Cost_per_sample = (c_gpu * t_sample / 3600) / U * r + Storage_cost; сравниваем профили и режимы On‑Demand/Interruptible. См. https://cloudcompute.ru/solutions/cost-planner/

Сценарии

  • WGS/WES germline. От FQ до gVCF/VCF; при необходимости — joint‑calling по когорте (разделение по интервалам + merge).
  • Somatic (tumor/normal). Парные образцы, расширенные фильтры; повышенный I/O.
  • RNA‑seq. Выравнивание/квантование; пик на I/O и индексах.
  • Массовые батчи. Тысячи независимых образцов (скрининг/панели) — идеальны для Interruptible.
  • Гибриды. Отбор по VCF → MD‑симуляции/докинг (GROMACS/NAMD/AutoDock‑GPU). См. https://cloudcompute.ru/solutions/hpc/gromacs/ и https://cloudcompute.ru/solutions/hpc/autodock/

Архитектуры/пайплайны A) Single‑node multi‑GPU (один образец, шардинг по интервалам)

[FASTQ.gz] -> [Prefetch -> NVMe] -> [Align/Sort (GPU)] -> [MarkDup/BQSR (GPU)]
 | |
 [Shards by intervals] [Shards by intervals]
 /
 +--> [Call (GPU)] -> [gVCF/VCF -> Warm/Cold]

Ключи: NVMe для tmp и сортировок; шардинг по хромосомам/интервалам (каждый шард — независимая стадия); сбор и упорядочивание результатов.

B) Пул узлов (много образцов → много GPU)

[Samples Index] -> [Job Queue] -> [Worker Pool: GPU0..GPUK per node]
 | | |
 S1 S2 S3 (1 процесс = 1 GPU)

Ключи: обмен между задачами минимальный; сеть в основном под I/O; сквозной прогресс — через брокер очередей.

C) Interruptible‑паттерн (дробление на стадии/шарды)

[FASTQ] -> [Stage A: Align (≤120 s per shard)] -> [Stage B: Sort/MarkDup (≤120 s per shard)]
 -> [Stage C: BQSR (≤120 s per shard)] -> [Stage D: Call (≤120 s per shard)] -> [Merge/Index]

Ключи: каждая стадия идемпотентна; прервалось — переиграть только упавший шард; NVMe‑кэш не вычищается до публикации.

Профили GPU/VRAM/относительная скорость

**Профиль** **VRAM** **Типовые задачи** **Режим** **Отн. throughput (≈)** **Примечания**
**24 ГБ (Compact)** 24 ГБ Малые панели/локальные пайплайны, тесты Interruptible / On‑Demand 1.0 Плотность ↑ с MIG: https://cloudcompute.ru/solutions/mig/
**48 ГБ (Balanced)** 48 ГБ Стандарт WES/WGS, умеренный параллелизм Оба 1.5–1.8 Базовый профиль для лабораторий/потоков
**80 ГБ (HQ)** 80 ГБ 30× WGS, joint‑calling, агрессивный шардинг Оба 2.2–2.6 Лучший запас VRAM/кэша на GPU

Относительные индексы; фактический выигрыш зависит от глубины покрытия, параметров фильтров и дисковой подсистемы.

Конфиги и скелеты

1) YAML‑спека задания образца

job:
 name: "parabricks_sample_001"
 mode: "interruptible" # on-demand | interruptible
 gpu_profile: "48GB-Balanced" # 24GB-Compact | 48GB-Balanced | 80GB-HQ
 chunk_seconds: 120
 retries: 3
 input:
 fastq_r1: "s3://warm/samples/001_R1.fastq.gz"
 fastq_r2: "s3://warm/samples/001_R2.fastq.gz"
 reference: "s3://warm/ref/hg/GRCh38/"
 known_sites: ["s3://warm/ref/dbsnp.vcf.gz","s3://warm/ref/known_indels.vcf.gz"]
 sample_id: "001"
 pipeline:
 align_sort: { enable: true }
 markdup_bqsr: { enable: true }
 germline_call: { enable: true, emit_gvcf: true }
 output:
 dir: "s3://cold/results/sample_001/"
 hooks:
 on_start: ["python /scripts/prefetch_nvme.py"]
 on_stage: ["python /scripts/register_stage.py"]
 on_failure: ["python /scripts/requeue.py --backoff"]

2) Одноузловой запуск (multi‑GPU), концепт CLI

# Предзагрузка на NVMe
rclone copy s3:warm/samples/001_R{1,2}.fastq.gz /nvme/samples/
rclone copy s3:warm/ref/hg/GRCh38/ /nvme/ref/ --copy-links
# Выровнять + отсортировать (GPU)
pbrun fq2bam --ref /nvme/ref/GRCh38.fa 
 --in-fq /nvme/samples/001_R1.fastq.gz /nvme/samples/001_R2.fastq.gz 
 --out-bam /nvme/work/001.sorted.bam --rg-id 001 --sample-id 001
# MarkDuplicates + BQSR (GPU)
pbrun bqsr --in-bam /nvme/work/001.sorted.bam --ref /nvme/ref/GRCh38.fa 
 --knownSites /nvme/ref/dbsnp.vcf.gz --out-recal /nvme/work/001.recal.table
pbrun applybqsr --in-bam /nvme/work/001.sorted.bam --ref /nvme/ref/GRCh38.fa 
 --in-recal /nvme/work/001.recal.table --out-bam /nvme/work/001.recal.bam
# Germline call (GPU), gVCF
pbrun haplotypecaller --ref /nvme/ref/GRCh38.fa 
 --in-bam /nvme/work/001.recal.bam --emit-ref-confidence GVCF 
 --out-variants /nvme/out/001.g.vcf.gz
# Публикация
rclone copy /nvme/out/ s3:cold/results/sample_001/

Названия утилит/флагов — ориентировочные для GPU‑пайплайна; подставьте фактические команды вашей сборки.

3) Nextflow (скелет) — оркестрация стадий и шардов

params.sample_id = '001'
params.fastq_r1 = '/nvme/samples/001_R1.fastq.gz'
params.fastq_r2 = '/nvme/samples/001_R2.fastq.gz'
params.ref = '/nvme/ref/GRCh38.fa'
process ALIGN_SORT {
 tag "${params.sample_id}"
 executor 'local'
 cpus 8
 container 'registry.local/parabricks:latest'
 accelerator 1
 input: val(id) from Channel.value(params.sample_id)
 """
 pbrun fq2bam --ref ${params.ref} --in-fq ${params.fastq_r1} ${params.fastq_r2} 
 --out-bam /nvme/work/${params.sample_id}.sorted.bam --rg-id ${params.sample_id} --sample-id ${params.sample_id}
 """
}
process CALL {
 tag "${params.sample_id}"
 container 'registry.local/parabricks:latest'
 accelerator 1
 input: path(bam) from ALIGN_SORT.out.collect()
 """
 pbrun haplotypecaller --ref ${params.ref} --in-bam ${bam} --emit-ref-confidence GVCF 
 --out-variants /nvme/out/${params.sample_id}.g.vcf.gz
 """
}

4) Docker Compose — пул воркеров

services:
 pbricks-broker:
 image: registry.local/pb-broker:latest
 environment:
 - POLICY_CHUNK_SECONDS=120
 - POLICY_RETRIES=3
 networks: [genomics-net]
 worker-a:
 image: registry.local/parabricks:latest
 deploy:
 resources:
 reservations:
 devices: [{ capabilities: ["gpu"] }]
 volumes:
 - /nvme:/nvme
 command: ["bash","-lc","/opt/run_sample.sh /nvme/job.yaml"]
 networks: [genomics-net]
 worker-b:
 image: registry.local/parabricks:latest
 deploy:
 resources:
 reservations:
 devices: [{ capabilities: ["gpu"] }]
 volumes:
 - /nvme:/nvme
 command: ["bash","-lc","/opt/run_sample.sh /nvme/job.yaml"]
 networks: [genomics-net]
networks:
 genomics-net: {}

5) Лицензии (BYOL) как секрет

# Пример секрета и переменных окружения
services:
 worker:
 image: registry.local/parabricks:latest
 environment:
 - LICENSE_MODE=byol
 - LICENSE_FILE=/run/secrets/pb_license.dat # или адрес лиценз-сервера
 secrets:
 - pb_license
secrets:
 pb_license:
 file: ./secrets/pb_license.dat

6) SSE‑прогресс для панели

from fastapi import FastAPI
from fastapi.responses import StreamingResponse
import json, time, random
app = FastAPI()
def stream():
 bases = 0
 while True:
 bases += random.randint(5, 20) * 10**6
 payload = {"bases_per_s": 3.2e6, "reads_per_s": 4.5e4, "processed_bases": bases, "gpu_utilization": 0.82}
 yield f"data: {json.dumps(payload)}nn"
 time.sleep(1)
@app.get("/events")
def events(): return StreamingResponse(stream(), media_type="text/event-stream")
``` **Наблюдаемость/метрики/алерты**

Опорные хабы:[ https://cloudcompute.ru/solutions/monitoring-logging/](https://cloudcompute.ru/solutions/monitoring-logging/?utm_source=chatgpt.com) и[ https://cloudcompute.ru/solutions/llm-inference/observability/](https://cloudcompute.ru/solutions/llm-inference/observability/?utm_source=chatgpt.com)

**Пайплайн‑метрики:**

- Throughput: bases\_per\_s, reads\_per\_s, samples\_per\_day, p50/p95 stage\_time\_seconds{align,sort,bqsr,call}.
- Качество: alignment\_rate, dup\_rate, on\_target\_% (панели), базовые QC‑показатели стадий.
- GPU: gpu\_utilization, gpu\_memory\_used\_bytes, sm\_occupancy, gpu\_power\_watts.
- I/O: io\_read\_mb\_s, io\_write\_mb\_s, nvme\_usage\_bytes, cache\_hit\_ratio{tier="nvme"}.
- Очереди: job\_queue\_depth, samples\_inflight, retry\_total.

**Алерты:**

- Падение bases\_per\_s/рост p95 stage\_time\_seconds > X% к эталону.
- gpu\_utilization < 60% при глубокой очереди → узкое место I/O/слишком мелкие чанки.
- nvme\_usage\_bytes > 85% → авто‑drain/cleanup tmp/интермедиатов.
- Всплеск retry\_total → проблемы с входами/лицензиями/каналом к лиценз‑серверу.
- Качество: alignment\_rate ниже порога → неверная сборка/референс/адаптеры.

## **Экономика и формулы**

См.[ https://cloudcompute.ru/solutions/cost-planner/](https://cloudcompute.ru/solutions/cost-planner/?utm_source=chatgpt.com) и <https://cloudcompute.ru/solutions/throughput-vs-latency/>

**Стоимость образца:**

Cost\_per\_sample = (c\_gpu \* t\_sample / 3600) / U \* r + Storage\_cost

где t\_sample — суммарное время стадий (align/sort/bqsr/call), U — целевая загрузка GPU, r — retry‑factor (Interruptible).

**Пропускная способность пула:**

Samples\_per\_day ≈ (N\_gpu \* Work\_hours \* U) / (t\_sample / 3600)

**NVMe‑требования (оценка):**

Scratch\_needed ≈ k\_align \* Size\_FASTQ + k\_sort \* Size\_BAM + k\_call \* Size\_gVCF

c коэффициентами k\_\* из профиля вашего пайплайна (учитывают сортировки/индексы/интермедиаты).

**Сравнение профилей:**

ΔCost = Cost\_per\_sample(24GB) - Cost\_per\_sample(48GB)

Выбираем профиль с минимальным Cost\_per\_sample при выполнении SLA (например, samples\_per\_day и p95 stage\_time\_seconds).

## **BYOL‑лицензирование и политики**

См.[ https://cloudcompute.ru/solutions/security/](https://cloudcompute.ru/solutions/security/?utm_source=chatgpt.com)

- **BYOL.** Лицензия подключается как файл‑секрет или адрес лиценз‑сервера.
- **Секреты.** Хранятся в секрет‑хранилище; доступ только воркерам; запрет логирования переменных.
- **Сеть.** egress‑allow‑list до лиценз‑сервера; retry‑политика при недоступности; кэширование токенов, если разрешено.
- **Аудит.** Логирование checkout/check‑in в обезличенном виде, без утечки ключей.
- **Ретеншн.** Логи стадий и временные BAM/CRAM — автоочистка; публикуем только gVCF/VCF + минимальные QC.

**Траблшутинг (симптом → причина → решение)**

<table><tbody><tr><td>**Симптом**

</td><td>**Возможная причина**

</td><td>**Решение**

</td></tr><tr><td>Низкий bases\_per\_s при высокой очереди

</td><td>Узкое место I/O/холодный NVMe

</td><td>Префетч на NVMe, увеличить параллелизм, уменьшить мелкие чанки

</td></tr><tr><td>Ошибки лицензии

</td><td>Нет доступа к серверу/неверный секрет

</td><td>Проверить egress/секрет; резервный сервер; экспоненциальный backoff

</td></tr><tr><td>Несовпадение сборки/индексов

</td><td>Референс/индексы не синхронны

</td><td>Унифицировать версии; валидатор на старте; хранить ref в «тёплом» бакете

</td></tr><tr><td>OOM VRAM на стадии

</td><td>Завышенный параллелизм/размер чанка

</td><td>Уменьшить число шардов/одновременных задач; перейти на 48–80 ГБ

</td></tr><tr><td>BAM/CRAM повреждён

</td><td>Обрыв записи/мало места

</td><td>Контроль nvme\_usage\_bytes; достаточный purge tmp; перегенерация из FASTQ

</td></tr><tr><td>Разные результаты между узлами

</td><td>Разные версии контейнера/референса

</td><td>Единый контейнер/референс; зафиксированные версии; smoke‑образец

</td></tr><tr><td>«Пиление» времени стадий

</td><td>Фоновая конкуренция по диску/сети

</td><td>Выделенный NVMe, лимитировать фоновые задачи, pinned memory

</td></tr></tbody></table>

## **Как запустить в cloudcompute.ru**

1. **Шаблон**:[ https://cloudcompute.ru/solutions/templates/](https://cloudcompute.ru/solutions/templates/?utm_source=chatgpt.com)
 - «Clara Parabricks (GPU workers)» — единый контейнер + пул воркеров/брокер очередей.
 - Массовые батчи — очереди с шардингом; одиночный образец — single‑node multi‑GPU.
2. **Профиль GPU**: 24/48/80 ГБ по таблице; WGS 30× и joint‑calling — 80 ГБ (HQ).
3. **Режим**:
 
 - SLA‑критичные запуски — **On‑Demand**;
 - Поточные кампании — **Interruptible** (чанк ≤ 120 с, ретраи). См. <https://cloudcompute.ru/solutions/interruptible-patterns/>
4. **Хранилище**: референсы/базы — «тёплое»; временные — **NVMe**; итог — «холодное». См.[ https://cloudcompute.ru/solutions/storage-data/](https://cloudcompute.ru/solutions/storage-data/?utm_source=chatgpt.com)
5. **Оркестрация/CI**: зафиксированные версии контейнера/референсов; smoke‑образец до масштабирования. См. <https://cloudcompute.ru/solutions/containers-ci-cd/>
6. **Наблюдаемость**: дашборды bases\_per\_s/reads\_per\_s/samples\_per\_day, GPU/I‑O, алерты p95. См.[ https://cloudcompute.ru/solutions/monitoring-logging/](https://cloudcompute.ru/solutions/monitoring-logging/?utm_source=chatgpt.com)

**Чек‑лист перед продом**

- Контейнер и референсы зафиксированы; smoke‑образец проходит детерминированно.
- NVMe‑scratch подключён; оценена формула **Scratch\_needed**; автоочистка включена.
- Шардирование по стадиям/интервалам настроено; **чанк ≤ 120 с**; ретраи/backoff активны.
- BYOL‑секреты и egress‑allow‑list настроены; аудит checkout/check‑in включён.
- Метрики и алерты заведены: bases\_per\_s, p95 stage\_time\_seconds, gpu\_utilization, io\_\*.
- Экономика: посчитаны Cost\_per\_sample и Samples\_per\_day по выбранному профилю.
- Политики безопасности/ретенции применены; публикация — только итоговых артефактов (gVCF/VCF/QC).

**Навигация**

- Хаб HPC: <https://cloudcompute.ru/solutions/hpc/>
- Родственные задачи:
 
 - GROMACS: <https://cloudcompute.ru/solutions/hpc/gromacs/>
 - NAMD/AMBER: <https://cloudcompute.ru/solutions/hpc/namd/>
 - AutoDock‑GPU: <https://cloudcompute.ru/solutions/hpc/autodock/>
- Сквозные материалы:
 
 - Multi‑GPU/топологии:[ https://cloudcompute.ru/solutions/multi-gpu/](https://cloudcompute.ru/solutions/multi-gpu/?utm_source=chatgpt.com) • MIG: <https://cloudcompute.ru/solutions/mig/>
 - Данные и хранение:[ https://cloudcompute.ru/solutions/storage-data/](https://cloudcompute.ru/solutions/storage-data/?utm_source=chatgpt.com)
 - Контейнеры и CI/CD: <https://cloudcompute.ru/solutions/containers-ci-cd/>
 - Мониторинг/логи:[ https://cloudcompute.ru/solutions/monitoring-logging/](https://cloudcompute.ru/solutions/monitoring-logging/?utm_source=chatgpt.com)
 - Наблюдаемость:[ https://cloudcompute.ru/solutions/llm-inference/observability/](https://cloudcompute.ru/solutions/llm-inference/observability/?utm_source=chatgpt.com)
 - Оптимизация вычислений:[ https://cloudcompute.ru/solutions/performance-tuning/](https://cloudcompute.ru/solutions/performance-tuning/?utm_source=chatgpt.com) • <https://cloudcompute.ru/solutions/throughput-vs-latency/>
 - Interruptible‑паттерны: <https://cloudcompute.ru/solutions/interruptible-patterns/>

Готовы запустить?

Запустить GPU-сервер