딥러닝이 왜 변이를 부르나요
지난 편들의 GATK4 Best Practices는 수십 년의 확률 통계 위에서 정련된 파이프라인입니다. 그런데 2018년 Google Health가 완전히 다른 접근을 발표했습니다. DeepVariant — 변이 콜링을 이미지 분류 문제로 재정의한 도구입니다.
핵심 아이디어를 한 문장으로.
pileup을 이미지로 렌더링한 뒤 CNN에게 "이 이미지에 있는 변이가 뭐야?" 물어본다.
이게 왜 잘 작동하는지, 어떤 상황에서 유리한지, 왜 GATK와 병존하는지 봅시다.
Pileup 이미지 — 리드를 그림으로
특정 위치 주변의 pileup을 이렇게 시각화합니다.
- 세로: 리드 (한 리드 = 한 줄).
- 가로: 참조 위치.
- 픽셀의 채널: R = 염기 종류(A/C/G/T), G = base quality, B = 스트랜드.
이 이미지가 대략 100×221 픽셀 3채널. 참조와 리드가 다른 위치는 R 채널이 다른 색으로 나타납니다. 헤테로 SNP는 절반 리드가 대안 염기, 나머지가 참조. 인델이 있으면 특정 위치에서 리드가 밀리거나 삽입 채널이 나타납니다.
CNN에게는 이 그림이 곧 정답 라벨(no variant / SNP het / SNP hom / INDEL het / INDEL hom)이 붙은 학습 데이터입니다.
세 단계 워크플로
DeepVariant는 항상 세 단계로 돕니다.
1단계: make_examples
BAM을 스캔하며 후보 변이 위치를 검출하고, 각 위치에 pileup 이미지를 생성합니다.
docker run --rm -v $(pwd):/data google/deepvariant:latest \ /opt/deepvariant/bin/make_examples \ --mode=calling \ --ref=/data/hg38.fa \ --reads=/data/S1.bam \ --examples=/data/S1_examples.gz이 단계에서 후보 위치는 GATK의 active region과 유사한 방식으로 찾습니다.
2단계: call_variants
각 pileup 이미지를 pretrained CNN(Inception 계열)에 통과시켜 클래스 확률을 얻습니다.
docker run ... /opt/deepvariant/bin/call_variants \ --outfile=/data/S1_cvo.tfrecord.gz \ --examples=/data/S1_examples.gz \ --checkpoint=/opt/models/wgs/model.ckpt--checkpoint가 훈련된 모델. Google이 공개한 모델이 셋 있습니다.
- WGS: 인간 whole genome.
- WES: 인간 whole exome.
- PACBIO / ONT: 롱리드 전용.
라이브러리 유형에 맞는 모델을 골라야 합니다.
3단계: postprocess_variants
CNN 출력을 VCF로 변환.
docker run ... /opt/deepvariant/bin/postprocess_variants \ --ref=/data/hg38.fa \ --infile=/data/S1_cvo.tfrecord.gz \ --outfile=/data/S1.vcf.gz이 세 단계가 표준. 대부분 사용자는 세 단계를 감싸는 스크립트 run_deepvariant를 씁니다.
통합 실행 — run_deepvariant
docker run --rm \ -v $(pwd):/data \ google/deepvariant:latest \ /opt/deepvariant/bin/run_deepvariant \ --model_type=WGS \ --ref=/data/hg38.fa \ --reads=/data/S1.bam \ --output_vcf=/data/S1.vcf.gz \ --output_gvcf=/data/S1.g.vcf.gz \ --num_shards=16세 단계가 자동. 결과 VCF와 GVCF가 나옵니다.
GATK vs DeepVariant — 언제 무엇을?
여러 벤치마크(precisionFDA, GA4GH)에서 최근의 감각.
| 조건 | 승자 |
|---|---|
| 인간 표준 Illumina WGS/WES SNP | DeepVariant 근소 우위 (F1 0.996 vs 0.994) |
| 인간 표준 Illumina 인델 | DeepVariant 명확 우위 |
| PacBio HiFi 롱리드 | DeepVariant 명확 우위 (GATK는 롱리드 미최적) |
| 드문 인구 변이 (아프리카 · 아시아 diversity) | GATK Best Practices (안정성) |
| 소수 샘플 · WES | GATK Best Practices (재현성) |
| 비인간 종 | GATK Best Practices (DeepVariant는 인간 훈련) |
| 재현성 요구 임상 진단 | GATK Best Practices (설명 가능성) |
즉 인간 표준 라이브러리 + 최대 감도가 필요할 때 DeepVariant가 강하고, 그 외 대부분은 GATK가 여전히 표준입니다. 둘을 병렬 실행해 합집합(더 넓은 감도)을 쓰는 파이프라인(예: DeepVariant-GATK ensemble)도 있습니다.
왜 딥러닝이 잘 작동하나요
세 가지 이유가 있습니다.
1. End-to-end 학습
GATK는 여러 통계 모델(BQSR, PairHMM, VQSR)을 사람이 설계한 사슬로 이어붙였습니다. DeepVariant는 make_examples가 후보를 만든 뒤 CNN 하나가 판단을 종결합니다. 각 단계의 손실이 누적되지 않습니다.
2. 다양한 특징 자동 학습
CNN은 사람이 지정하지 않은 특징(예: 인접 위치 상관, 스트랜드 편향 패턴, 반복 서열 근처의 정렬 노이즈)을 자동으로 학습합니다. 사람이 QD·FS·MQ 같은 지표를 손으로 설계할 필요가 없습니다.
3. 대규모 훈련 데이터
Google은 GIAB(NIST Genome in a Bottle) 참 세트 + 자체 대규모 시퀀싱으로 CNN을 훈련했습니다. 이 데이터 규모가 통계 접근이 도달하기 어려운 감도를 만들어냅니다.
Kaggle T4에서 소형 실습
인간 전체 게놈은 무겁고, chr22 정도로 축소해서 Kaggle에서 GPU T4로 돌려볼 수 있습니다. Kaggle Docker에 Google DeepVariant 이미지를 pull.
!docker pull google/deepvariant:latest!docker run --rm -v /kaggle:/data google/deepvariant:latest \ /opt/deepvariant/bin/run_deepvariant \ --model_type=WGS \ --ref=/data/hg38_chr22.fa \ --reads=/data/chr22_sample.bam \ --output_vcf=/data/chr22.vcf.gz \ --num_shards=4Kaggle T4 (16GB VRAM)로 chr22 한 샘플이 20~40분. Colab 무료 T4는 12GB라 shards를 줄여야 합니다.
PacBio HiFi에서의 대약진
DeepVariant가 가장 빛나는 지점이 롱리드(PacBio HiFi, ONT)입니다. 롱리드는 리드가 10~30kb라 하나가 여러 변이를 담고 있습니다. 이 문맥을 CNN이 자연스럽게 학습합니다.
- Illumina 짧은리드 SNP F1: 0.996 (GATK ≈ DeepVariant)
- PacBio HiFi SNP F1: 0.999 (GATK 0.98) — DeepVariant 극단 우위
- PacBio HiFi 인델 F1: 0.998 (GATK 0.90)
PacBio HiFi 시대에 DeepVariant가 새 표준이 되어가는 중입니다.
손 계산 — CNN이 실제로 하는 판단
가상 pileup 이미지 (chr17:41197000, BRCA1 근처)에서 CNN이 이렇게 판단한다고 가정합시다.
- 입력: 100×221 3채널 pileup 이미지.
- 출력 로짓: [no_variant: 0.02, het_SNP: 0.94, hom_SNP: 0.03, het_INDEL: 0.005, hom_INDEL: 0.005]
- 결정: het_SNP (확률 94%).
- VCF 기록: GT=0/1, GQ=−10 log10(0.06) = 12.
이 판단이 GATK의 Bayes 결정과 상당히 유사한 결과를 냅니다. 차이는 특징 설계자가 사람이 아니라 학습된 CNN 필터라는 점.
DeepVariant의 약점
만능은 아닙니다.
- 훈련 데이터 편향: 주로 유럽계 참 세트로 훈련. 아프리카·아시아 다양성 표본에서는 감도가 다소 떨어질 수 있음.
- 설명 가능성 낮음: "왜 이 위치를 SNP로 콜했나요?"에 대한 답이 CNN 활성이라 임상 리포트에는 불편.
- 훈련되지 않은 라이브러리에서 fallback 열세: 특수 assay (UMI, low-input)에서는 재훈련 필요.
- 비인간 종 미지원: 인간·마우스 훈련 모델만 공개. 다른 종은 커스텀 훈련.
Nextflow에서 통합
nf-core/sarek 파이프라인이 GATK4와 DeepVariant를 모두 지원합니다. Nextflow 명령 하나로 둘 다 돌리고 벤치마크할 수 있습니다.
nextflow run nf-core/sarek --input samplesheet.csv \ --tools deepvariant,haplotypecaller \ --genome GATK.GRCh38두 결과 VCF를 비교하면 각 도구의 감도 특성을 직접 볼 수 있습니다.
CS 매핑
- CNN 이미지 분류: DryBench "CNN 이미지 분류" 편(
cnn-image-classification) 참고. - End-to-end 학습: 손실이 하나로 흐름 → 모든 파라미터가 함께 최적화.
- 전이 학습: pretrained checkpoint(WGS/WES)를 그대로 씀. 소규모 데이터로 재훈련도 가능.
마무리
DeepVariant는 변이 콜링에서 딥러닝이 어떻게 자리를 잡았는지 보여주는 대표 사례입니다. GATK의 자리를 뺏은 게 아니라 특정 조건(롱리드, 최대 감도)에서 새 표준으로 자리잡았습니다. 다음 편(S13)에서 대안 콜러(Strelka2, FreeBayes)를 비교해 콜러 벤치마크 감을 마무리합니다.
더 깊게 파고 싶다면
- Poplin R. et al. (2018), A universal SNP and small-indel variant caller using deep neural networks. Nature Biotechnology 36:983. DeepVariant 원 논문.
- DeepVariant GitHub (https://github.com/google/deepvariant): 모델·훈련 데이터 카탈로그.
- GIAB (Genome in a Bottle) 공식 (https://www.nist.gov/programs-projects/genome-bottle): 벤치마크 참 세트.
- PrecisionFDA Truth Challenge (https://precision.fda.gov/): 콜러 벤치마크 대회 결과.
- Google Health Blog — DeepVariant Improvements: 모델 개선 이력.
pileup을 이미지로 보는 관점이 신선하다면, 이 접근을 다른 문제(SV 검출, 아이소폼 콜링)로 확장하는 후속 연구를 찾아보세요. 다음 편에서 대안 콜러로 갑시다.