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-сервер