F26 다음 문제 — 환경은 고정했는데, 순서는 누가 관리하나
F26에서 Pixi·uv로 의존성 지옥을 벗어났습니다. 그런데 실제 바이오인포매틱스 작업은 도구 하나로 끝나지 않습니다. FASTQ 정렬(S03) → 중복 제거(S05) → 변이 호출(S07) → 필터링(S09)까지, 여러 도구를 정해진 순서로 이어 붙여야 합니다. 이걸 매번 쉘 스크립트로 순서대로 실행하다가, 세 번째 단계에서 서버가 죽어 처음부터 다시 돌린 경험이 다들 한 번쯤 있을 것입니다. Snakemake(2012~)는 이 문제를 "순서를 직접 지정하지 말고, 파일 이름 패턴으로 추론시키자"는 발상으로 풉니다.
원리 — 명령이 아니라 결과물로 파이프라인을 정의하기
절차적 스크립트의 근본적 취약함
쉘 스크립트로 파이프라인을 짜면 각 단계가 순서대로 실행되도록 우리가 직접 순서를 명시해야 합니다. 중간에 실패하면 어디까지 끝났는지 수동으로 확인하고, 성공한 단계를 건너뛰도록 스크립트를 다시 편집해야 합니다.
Snakemake의 rule — 입력·출력으로 정의하는 단위 작업
Snakemake는 각 작업 단계를 명령 순서가 아니라 입력 파일과 출력 파일의 관계로 정의합니다.
# Snakefile 예시rule align: input: r1="reads/{sample}_R1.fastq.gz", r2="reads/{sample}_R2.fastq.gz", ref="ref/genome.fa" output: "aligned/{sample}.bam" shell: "bwa mem {input.ref} {input.r1} {input.r2} | samtools sort -o {output}"
rule mark_duplicates: input: "aligned/{sample}.bam" output: "dedup/{sample}.bam" shell: "gatk MarkDuplicates -I {input} -O {output} -M {output}.metrics.txt"여기서 {sample}은 **와일드카드(wildcard)**로, 특정 샘플 이름 하나를 하드코딩하지 않고 파일명 패턴으로부터 자동으로 채워집니다. mark_duplicates 규칙의 입력이 align 규칙의 출력과 이름이 일치하므로, Snakemake는 두 규칙을 명시적으로 연결하지 않아도 의존 관계를 스스로 추론합니다.
DAG(방향성 비순환 그래프) 구성과 위상 정렬
Snakemake는 최종 목표 파일(target)에서 거꾸로 거슬러 올라가며, 어떤 규칙들이 어떤 순서로 필요한지 **방향성 비순환 그래프(Directed Acyclic Graph, DAG)**를 구성합니다.
DAG가 한번 구성되면, 서로 의존하지 않는 규칙들(예: 서로 다른 샘플의 정렬)은 병렬로 실행할 수 있습니다.
손 계산 예제: 재실행 범위 좁히기
10개 샘플에 대해 정렬(align) → 중복제거(dedup) → 변이호출(call) 3단계 파이프라인을 돌렸다고 합시다. 전체 작업 수는
모든 샘플의 정렬과 나머지 9개 샘플의 후속 단계가 이미 끝난 뒤, 8번째 샘플의 dedup 출력만 디스크 오류로 사라졌다고 합시다. Snakemake는 파일 상태와 DAG를 대조해 이미 완료된 28개 작업은 건너뛰고, 해당 샘플의 누락 단계와 그 downstream 작업만 다시 실행합니다.
전체를 처음부터 다시 돌리는 것과 비교하면 15배 적은 작업만 재실행하면 됩니다. 이것이 절차적 쉘 스크립트 대비 Snakemake가 주는 가장 실무적인 이득입니다.
실습: Snakemake로 3단계 미니 파이프라인 돌리기
# SageMaker Studio Lab, 신용카드 없이 가입 가능. Snakemake는 pip/conda로 설치합니다.pip install snakemake
# Snakefile이 있는 디렉터리에서 목표 파일을 지정해 실행합니다.# -n(dry-run)으로 먼저 실행 계획(DAG)만 확인하는 것이 안전합니다.snakemake -n --cores 4 dedup/sample01.bam
# DAG를 이미지로 시각화 (graphviz 필요)snakemake --dag dedup/sample01.bam | dot -Tpng > dag.png
# 실제 실행. --cores로 병렬 작업 수를 지정합니다.snakemake --cores 4 dedup/sample01.bam dedup/sample02.bam-n(dry-run) 옵션으로 먼저 DAG와 실행 순서를 확인하는 습관은, 대규모 데이터셋에 실수로 잘못된 규칙을 돌려 시간을 낭비하는 것을 막아줍니다.
CS 매핑
- DAG와 위상 정렬: Snakemake의 실행 계획 수립은 자료구조·알고리즘 수업에서 배우는 방향성 비순환 그래프의 위상 정렬(topological sort)을 그대로 실무 파이프라인에 적용한 사례입니다.
- make 빌드 시스템의 계보: 입력·출력 파일 관계로 작업을 정의하고 타임스탬프로 재실행 여부를 판단하는 방식은, C/C++ 컴파일에 쓰이는
make의 핵심 아이디어를 바이오인포매틱스 도메인에 이식한 것입니다. - 선언적(declarative) vs 명령적(imperative) 프로그래밍: "어떻게 할지"(쉘 스크립트 순서)가 아니라 "무엇이 필요한지"(입출력 관계)를 기술하는 Snakemake의 방식은 SQL이나 Terraform 같은 선언적 도구의 설계 철학과 같습니다.
자주 만나는 결함
- 와일드카드 패턴의 모호성 방치: 파일명 패턴이 여러 규칙과 동시에 매칭될 수 있으면 Snakemake가 어떤 규칙을 써야 할지 판단하지 못해 오류를 냅니다. 규칙별 출력 패턴이 서로 겹치지 않도록 설계해야 합니다.
- 타임스탬프 갱신을 재실행 트리거로 오인: 파일 내용이 바뀌지 않았어도 타임스탬프만 최신으로 바뀌면(예: 파일을 복사) Snakemake는 재실행이 필요하다고 판단할 수 있습니다. 필요하면
--touch옵션으로 타임스탬프만 갱신하는 것이 안전합니다.
더 깊게 파고 싶다면
본문은 BPD 연구진이 직접 재구성한 서술입니다. 원 논문과 공식 자료로 심화해봅시다.
- Snakemake 원 논문: Köster & Rahmann (2012), Snakemake — a scalable bioinformatics workflow engine, Bioinformatics 28(19).
- Snakemake 공식 문서: 튜토리얼과 wildcard·rule 문법 레퍼런스.
- EMBL-EBI Training — Snakemake 과정: 공식 실습 자료.
다음 편(F28)에서는 Snakemake와 철학은 비슷하지만 데이터 흐름 자체를 1급 객체로 다루는 Nextflow DSL2를 살펴봅니다.