SnowflakeでNVIDIA Parabricksを使って高速ゲノミクス解析を実現する
バイオインフォマティシャンのkoreedaです。
次世代シーケンシングデータ(MGS)を解析して、ゲノム・遺伝子解析するのは、だいぶ一般的になってきました。NGSのデータは容量が大きく、要件によっては大量のNGSデータを処理するワークロードが必要になります。
しかしながら、スーパーコンピューターなど共同利用システムが発達しているアカデミア研究者とは違い、民間研究者は自前でコンピュートリソースを用意する必要があります。GPUを利用した解析をしたくなった場合、その第一選択肢としてクラウド利用が挙がってくるのではないでしょうか。
Snowflakeでは、Snowpark Container Service(SPCS)と呼ばれる、コンテナ環境のコンピュートリソースを簡便に用意する方法があります。本記事では、SPCSのGPUコンテナを活用してゲノム解析を高速化する方法について解説します。
はじめに
ゲノム解析の課題と解決策
シーケンシングコストの劇的な削減により、ゲノムデータは爆発的に増加し続けています。生物学的サンプルから抽出したDNAを配列決定し、ゲノムアセンブリを通じて得られる遺伝情報は、個別化医療から創薬まで幅広い分野に革命をもたらす可能性を秘めています。

Standard pipeline to extract variants from an individual's genome. Beatrice Branchini作 CC BY 4.0
解析に使用するfastqファイルは、DNAシーケンサーによって読み取られたDNA断片の配列情報を含むテキストファイルです。各ファイルには数千万から数億個の短い配列(通常100塩基程度)が記録されており、ファイルのサイズは約15-20GBに達します。

fastqファイルサンプル
しかし、従来のゲノム解析環境では複数の課題が存在していました。CPUベースの解析ツールは計算能力の限界に直面し、fastqファイルの解析には約30時間を要していました。また、オンプレミス環境では大容量データの移動コストが高く、GPUリソースの調達と管理も複雑でした。
NVIDIA Parabricksとは
この課題を解決するために登場したのがNVIDIA Parabricksです。元々はミシガン大学でMehrzad Samadi氏、Ankit Sethia氏、Scott Mahlke氏によって設立されたParabricks社の技術で、2020年にNVIDIAが買収し、現在は医療プラットフォーム「Clara」の一部として提供されています。
NVIDIA Parabricksは、従来のCPUベースのゲノム解析ツールが直面していた計算能力の限界を、GPU加速技術により根本的に解決します。GPUの数千の小さなコアが並列計算を可能にするアーキテクチャにより、何百万ものシーケンスリードの同時処理や統計解析が可能となり、従来のCPU環境と比較して約40倍の高速化を実現できるとされています。
具体的な性能として、公式ドキュメントによると、従来のCPUベースの手法では30時間かかる30x WGSのfastqデータの解析を、約45分で完了させることができます。
NVIDIA Parabricksの特徴は、単一のツールではなく、エンドツーエンドのワークフローを提供する包括的なスイートであることです。生殖細胞系列(Germline)解析や体細胞(Somatic)解析を含む、ゲノミクスにおける一般的な解析タスクのソフトウェアをサポートしています。

サポートしているゲノミクス解析などのパッケージ
Snowpark Container Serviceとの統合
NVIDIA Parabricksの性能を最大限に活用できるプラットフォームとして、私が注目しているのがSnowpark Container Serviceです。Snowflakeの統合プラットフォーム上でコンテナ化されたワークロードを実行できるサービスで、データの移動なしでゲノム解析の実行、1コマンドでGPU環境を構築できる簡便さが魅力です。
-- GPUコンピュートプールの作成(わずか1コマンド)
CREATE COMPUTE POOL IF NOT EXISTS GPU_POOL
MIN_NODES = 1
MAX_NODES = 1
INSTANCE_FAMILY = GPU_NV_S
AUTO_RESUME = TRUE
AUTO_SUSPEND_SECS = 300;
この組み合わせにより、個人のゲノムから集団研究まで、あらゆる規模のゲノムデータを迅速に解析できるようになると考えています。今回は、NVIDIA ParabricksとSnowpark Container Serviceを組み合わせた高速ゲノム解析を実際に試してみます。
今回実行するゲノム解析の概要
ゲノム解析が初めての方にも分かりやすいよう、今回実行する解析の流れを説明します。
ゲノム解析は、1000ピースのジグソーパズルを組み立てて、完成した絵から標準版との違いを見つける作業に似ています。

ステップ1: バラバラのDNA断片(FASTQ)
DNAシーケンサーから出力されるのは、「ATCG...」「GCTA...」のような数億個の短いDNA断片です。これらは数億個の短い断片として出力されます。
ステップ2: 組み立て完了(BAM)
参照ゲノムという「完成見本」を使って、バラバラの断片を正しい位置に配置し、整列済みゲノムデータを作成します。
ステップ3: 違いを発見(VCF)
整列済みのゲノムデータを標準版と比較して、個人固有の遺伝的違いを発見します。
- 位置123: A → G(変異)
- 位置456: 欠失
- 位置789: 挿入
具体例を上げると、あなたが本を読んでいるとします。
- 「...けるこ」「ことが」「がで」「でき」「きる...」のような短い文字列がランダムに数億個
- これらを正しく並べて「...できることができる...」という文章を復元
- 標準的な文章と比較して「『できる』が『できた』になっている」といった違いを発見
この違いが、病気のリスクや薬の効き方などの個人差につながる重要な情報となります。
使用するデータについて
参照ゲノム(GRCh38/hg38)
参照ゲノム(GRCh38/hg38)は、人間のDNAの標準的な設計図に相当するものです。人間のDNAは約31億個の塩基(A、T、G、C)で構成されていますが、個人差はわずか0.1%程度に過ぎません。このため、世界中の研究者が共通して使用できる「標準的な人間のDNA配列」として参照ゲノムが作成されています。
現在使用されているGRCh38(別名hg38)は2013年にリリースされた標準版で、世界中のゲノム研究において基準として採用されています。ゲノム解析では、この参照ゲノムを「標準的な人間の設計図」、個人のゲノムを「あなた固有の設計図」として捉え、両者を比較することで個人固有の遺伝的特徴を明らかにします。この比較作業により、病気のリスクや薬剤に対する応答性などの重要な情報を得ることができます。

参照ゲノム(GRCh38/hg38)の成り立ちと役割
解析するゲノムサンプル(NA12878)
今回の解析では、標準サンプルとしてNA12878を使用します。NA12878は、ゲノム解析分野において世界的に認知された標準サンプルであり、アメリカ・ユタ州のモルモン系家系(CEU集団)に属するヨーロッパ系女性のゲノムデータです。このサンプルは、米国の技術研究所(NIST)が主導するGenome in a Bottle(GIAB)プロジェクトにより品質が保証されており、HG001という識別子でも知られています。
環境構築
データの準備
必要なファイルをダウンロードします。
まず、参照ゲノムファイルをBroad/GATKのResource Bundleから取得します。
# 参照ゲノムファイルのダウンロード
curl -o Homo_sapiens_assembly38.fasta \
"https://storage.googleapis.com/genomics-public-data/resources/broad/hg38/v0/Homo_sapiens_assembly38.fasta"
# BWAインデックスファイルも取得
curl -o Homo_sapiens_assembly38.fasta.64.bwt \
"https://storage.googleapis.com/genomics-public-data/resources/broad/hg38/v0/Homo_sapiens_assembly38.fasta.64.bwt"
続いて、GIAB(Genome in a Bottle)からNA12878のペアエンドFASTQファイルを取得します。
# NA12878 R1ファイル
curl -o NA12878_1.fastq.gz \
"https://ftp.1000genomes.ebi.ac.uk/vol1/ftp/phase3/data/NA12878/sequence_read/SRR622461_1.fastq.gz"
# NA12878 R2ファイル
curl -o NA12878_2.fastq.gz \
"https://ftp.1000genomes.ebi.ac.uk/vol1/ftp/phase3/data/NA12878/sequence_read/SRR622461_2.fastq.gz"
次に、ダウンロードしたファイルをSnowflakeにアップロードするためのステージを作成します。
-- 参照ゲノム用ステージ
CREATE STAGE IF NOT EXISTS BIOINFORMATICS.PARABRICKS.GENOME_STAGE
DIRECTORY = (ENABLE = TRUE);
-- 結果出力用ステージ
CREATE STAGE IF NOT EXISTS BIOINFORMATICS.PARABRICKS.RESULT_STAGE
DIRECTORY = (ENABLE = TRUE);
ステージ作成後、Snowflake CLIを使用して各ファイルをアップロードします。
# 参照ゲノムファイルのアップロード
snow stage copy Homo_sapiens_assembly38.fasta @BIOINFORMATICS.PARABRICKS.GENOME_STAGE/ref/
snow stage copy Homo_sapiens_assembly38.fasta.fai @BIOINFORMATICS.PARABRICKS.GENOME_STAGE/ref/
snow stage copy Homo_sapiens_assembly38.dict @BIOINFORMATICS.PARABRICKS.GENOME_STAGE/ref/
# BWAインデックスファイルのアップロード
snow stage copy Homo_sapiens_assembly38.fasta.64.* @BIOINFORMATICS.PARABRICKS.GENOME_STAGE/ref/
# FASTQファイルのアップロード(軽量版を使用)
snow stage copy NA12878_1_100k.fastq.gz @BIOINFORMATICS.PARABRICKS.GENOME_STAGE/fastq/
snow stage copy NA12878_2_100k.fastq.gz @BIOINFORMATICS.PARABRICKS.GENOME_STAGE/fastq/
NVIDIA Parabricks Job Serviceの実行
ここからが本格的なゲノム解析の開始です。「DNA断片パズルを超高速で組み立てる作業」 を、SnowflakeのGPU環境で実行します。
コンテナイメージの準備
まず、NVIDIA ParabricksのDockerイメージをSnowflakeのイメージリポジトリにプッシュします。
# NVIDIA Parabricksイメージをpull
docker pull nvcr.io/nvidia/clara/clara-parabricks:4.5.1-1
# Snowflakeのイメージリポジトリ用にタグ付け
docker tag nvcr.io/nvidia/clara/clara-parabricks:4.5.1-1 \
<your-org>-<your-account>.registry.snowflakecomputing.com/bioinformatics/parabricks/parabricks:4.5.1-1
# Snowflakeにログイン(事前にSnow CLIで認証が必要)
docker login <your-org>-<your-account>.registry.snowflakecomputing.com
# Snowflakeのイメージリポジトリにpush
docker push <your-org>-<your-account>.registry.snowflakecomputing.com/bioinformatics/parabricks/parabricks:4.5.1-1
GPU環境の準備とJob Service実行
GPU対応のコンピュートプールとログ収集用のイベントテーブルを作成し、NVIDIA Parabricksを実行します。
-- GPU対応コンピュートプール
CREATE COMPUTE POOL GPU_POOL
MIN_NODES = 1
MAX_NODES = 1
INSTANCE_FAMILY = GPU_NV_S
AUTO_RESUME = TRUE
AUTO_SUSPEND_SECS = 300;
-- ジョブログ収集用のイベントテーブル作成
CREATE EVENT TABLE IF NOT EXISTS TUTORIAL_DB.DATA_SCHEMA.JOB_EVENTS;
-- アカウントレベルのイベントテーブルとして設定
ALTER ACCOUNT SET EVENT_TABLE = TUTORIAL_DB.DATA_SCHEMA.JOB_EVENTS;
Job Service仕様
以下のJob Service仕様でNVIDIA Parabricksを実行します。
EXECUTE JOB SERVICE IN COMPUTE POOL GPU_POOL
NAME = CLARA_PARABRICKS_WGS_NA12878_100K
FROM SPECIFICATION $$
spec:
containers:
- name: parabricks
image: /BIOINFORMATICS/PARABRICKS/PARABRICKS/parabricks:4.5.1-1
resources:
requests:
cpu: 6
memory: 24Gi
nvidia.com/gpu: 1
limits:
cpu: 6
memory: 24Gi
nvidia.com/gpu: 1
env:
SAMPLE: "NA12878_100k"
THREADS: "6"
volumeMounts:
- name: inputs
mountPath: /mnt/inputs
- name: outputs
mountPath: /mnt/outputs
- name: work
mountPath: /mnt/work
command:
- /bin/bash
- -lc
- |
set -euo pipefail
echo "Running NVIDIA Parabricks for SAMPLE=${SAMPLE}"
nvidia-smi || true
# fq2bam: FASTQからBAMへの変換とアライメント
# --low-memory オプションで16GB GPUに対応(A10Gの23GBで実行可能)
pbrun fq2bam \
--ref /mnt/inputs/ref/Homo_sapiens_assembly38.fasta \
--in-fq /mnt/inputs/fastq/NA12878_1_100k.fastq.gz /mnt/inputs/fastq/NA12878_2_100k.fastq.gz \
--out-bam /mnt/work/${SAMPLE}.bam \
--tmp-dir /mnt/work/tmp \
--low-memory
# haplotypecaller: バリアントコール(gVCF形式)
# --htvc-low-memory オプションで16GB GPUに対応
pbrun haplotypecaller \
--ref /mnt/inputs/ref/Homo_sapiens_assembly38.fasta \
--in-bam /mnt/work/${SAMPLE}.bam \
--out-variants /mnt/work/${SAMPLE}.g.vcf.gz \
--gvcf \
--htvc-low-memory
# 成果物を出力ステージへコピー
cp -v /mnt/work/${SAMPLE}.bam /mnt/outputs/
cp -v /mnt/work/${SAMPLE}.g.vcf.gz* /mnt/outputs/
volumes:
- name: inputs
source: "@BIOINFORMATICS.PARABRICKS.GENOME_STAGE"
- name: outputs
source: "@BIOINFORMATICS.PARABRICKS.RESULT_STAGE"
- name: work
source: block
size: 500Gi
logExporters:
eventTableConfig:
logLevel: INFO
$$;
使用したpbrunコマンドの解説
上記のJob Serviceで実行している2つのpbrunコマンドについて、各オプションの意味を解説します。
pbrun fq2bam のオプション
このコマンドは、FASTQファイル(DNA断片データ)を参照ゲノムにアライメントし、BAMファイル(整列済みデータ)を生成します。従来はBWA + SAMtools + GATKという複数ステップが必要でしたが、pbrun fq2bamはこれらを1コマンドで実行します。
使用オプション:
| オプション | 説明 |
|---|---|
--ref |
参照ゲノムファイル(FASTA形式)のパス。人間の標準的なDNA配列(GRCh38/hg38)を指定します。 |
--in-fq |
入力FASTQファイル。ペアエンド(2つのファイル)を空白区切りで指定します。 |
--out-bam |
出力BAMファイルのパス。アライメント結果が保存されます。 |
--tmp-dir |
一時ファイルの保存先ディレクトリ。大容量のワークスペースが必要です。 |
--low-memory |
メモリ使用量を削減するオプション。デフォルトは24GB必要ですが、このオプションで16GB GPUでも動作可能になります。GPU_NV_S(A10G, 23GB VRAM)では必須です。 |
pbrun haplotypecaller のオプション
このコマンドは、アライメント済みBAMファイルから遺伝的変異(バリアント)を検出します。GATK HaplotypeCallerのGPU加速版です。
使用オプション:
| オプション | 説明 |
|---|---|
--ref |
参照ゲノムファイル(FASTA形式)のパス。fq2bamと同じファイルを使用します。 |
--in-bam |
入力BAMファイル。pbrun fq2bamで生成したファイルを指定します。 |
--out-variants |
出力VCF/gVCFファイルのパス。検出された変異情報が保存されます。 |
--gvcf |
gVCF(Genomic VCF)形式で出力するオプション。変異がない位置の情報も含むため、複数サンプルの統合解析に適しています。 |
--htvc-low-memory |
HaplotypeCaller用のメモリ削減オプション。デフォルトは18GB必要ですが、このオプションで16GB GPUでも動作可能になります。GPU_NV_S(A10G, 23GB VRAM)では必須です。 |
実行結果とログの確認
ジョブが正常に完了すると、以下のメッセージが表示されます。
Job CLARA_PARABRICKS_WGS_NA12878_100K completed successfully with status: DONE.
生成されたファイルの確認
LIST @BIOINFORMATICS.PARABRICKS.RESULT_STAGE;
出力例。
+-------------------------------+----------+-------------------------------+-------------------------------+
| name | size | md5 | last_modified |
|-------------------------------+----------+-------------------------------+-------------------------------|
| result_stage/NA12878_100k.bam | 17032195 | 3757f97fed68b66e9b78926c74aa8 | Sat, 11 Oct 2025 04:54:29 GMT |
| | | 60c-2 | |
| result_stage/NA12878_100k.g.v | 3385125 | 69bf436b543ca2848f13d6646bbd8 | Sat, 11 Oct 2025 04:54:30 GMT |
| cf.gz | | bff | |
| result_stage/NA12878_100k.g.v | 51385 | 3cb1c382c9a2788beca246808c48d | Sat, 11 Oct 2025 04:54:30 GMT |
| cf.gz.tbi | | 752 | |
+-------------------------------+----------+-------------------------------+-------------------------------+
処理ログの確認
イベントテーブルからジョブの詳細ログを確認できます。
SELECT TIMESTAMP, VALUE
FROM TUTORIAL_DB.DATA_SCHEMA.JOB_EVENTS
WHERE RESOURCE_ATTRIBUTES:"snow.service.name" = 'CLARA_PARABRICKS_WGS_NA12878_100K'
ORDER BY TIMESTAMP DESC
LIMIT 20;
主要なログ出力。
2025-10-11T04:54:29 | "'/mnt/work/NA12878_100k.bam' -> '/mnt/outputs/NA12878_100k.bam'"
2025-10-11T04:54:29 | "'/mnt/work/NA12878_100k.g.vcf.gz' -> '/mnt/outputs/NA12878_100k.g.vcf.gz'"
2025-10-11T04:54:28 | "Variant caller done, total time: 1.2 min"
2025-10-11T04:54:27 | "|| Total Time: 1 minute 9 seconds ||"
2025-10-11T04:54:27 | "|| Program: GPU-GATK4 HaplotypeCaller ||"
2025-10-11T04:53:18 | "|| Parabricks accelerated Genomics Pipeline ||"
処理時間の実測値
軽量データセット(10万リード)での処理時間。
- fq2bam(アライメント): 約1分9秒
- haplotypecaller(バリアントコール): 約1分12秒
- 合計処理時間: 約2分30秒
GPU使用状況。
NVIDIA A10G (23GB VRAM)
Driver Version: 570.133.20
CUDA Version: 12.9
GPU使用率: 実行中は常時GPU活用
終わりに
いかがだったでしょうか?
今回は、SnowflakeのJob Service機能を活用してNVIDIA Parabricksによる高速ゲノム解析を実現する方法を紹介しました。従来のオンプレミス環境と比較して約40倍の高速化を実現できる一方で、クラウドベースの柔軟性とスケーラビリティも享受できます。
個人的には、データの移動コストを最小限に抑えながら、GPUの計算能力を活用できる点が非常に魅力的だと感じています。特に大規模なゲノムデータセットを扱う研究機関や製薬企業にとって、コスト効率と処理速度の両立は重要な課題であり、この組み合わせは有力な解決策になるでしょう。
ゲノム解析の民主化とクラウド化が進む中で、SnowflakeとNVIDIA Parabricksの組み合わせは今後さらに注目される技術スタックになるでしょう。
最後まで読んでいただき、ありがとうございました!
トラブルシューティング
最後に私が遭遇したエラーについてのトラブルシュート方法をご紹介します。
よくある問題と解決方法
1. リソース不足エラー
Invalid spec: invalid value 16 for 'containers[0].requests.cpu'.
Requirement exceeds compute pool instance capacity 6.
解決方法: CPUとメモリの要求値をコンピュートプールの容量以下に調整します。
2. ファイルパスエラー
[Parabricks Options Error]: Input file /mnt/inputs/fastq/NA12878_R1.fastq.gz not found.
解決方法: ファイル名を実際にアップロードしたものと一致させます(NA12878_1.fastq.gzなど)。
3. GPUメモリ不足エラー
cudaSafeCall() failed: out of memory
解決方法: --low-memoryオプションを追加します。
# fq2bamに追加
pbrun fq2bam --low-memory ...
# haplotypecallerに追加
pbrun haplotypecaller --htvc-low-memory ...
4. FASTQファイルフォーマットエラー
Improperly formatted FASTQ file. ID line did not start with '@'
解決方法: ファイルが破損している可能性があります。再ダウンロードまたは軽量版を作成します。
# 軽量版を作成して動作確認
gzcat NA12878_1.fastq.gz | head -n 400000 | gzip > NA12878_1_100k.fastq.gz
gzcat NA12878_2.fastq.gz | head -n 400000 | gzip > NA12878_2_100k.fastq.gz
ログの確認方法
イベントテーブルからJob Serviceのログを確認できます。
-- ジョブの詳細ログを確認
SELECT
TIMESTAMP,
VALUE
FROM TUTORIAL_DB.DATA_SCHEMA.JOB_EVENTS
WHERE RESOURCE_ATTRIBUTES:"snow.service.name" = 'CLARA_PARABRICKS_WGS_NA12878_100K'
ORDER BY TIMESTAMP DESC
LIMIT 100;
-- プラットフォームイベント(コンテナステータス変更)を確認
SELECT
TIMESTAMP,
RESOURCE_ATTRIBUTES:"snow.service.name"::STRING AS SERVICE_NAME,
RECORD:"name"::STRING AS EVENT_NAME,
RECORD:"severity_text"::STRING AS SEVERITY,
VALUE:"status"::STRING AS STATUS,
VALUE:"message"::STRING AS MESSAGE
FROM TUTORIAL_DB.DATA_SCHEMA.JOB_EVENTS
WHERE RESOURCE_ATTRIBUTES:"snow.service.name" = 'CLARA_PARABRICKS_WGS_NA12878_100K'
AND RECORD_TYPE = 'EVENT'
AND SCOPE:"name" = 'snow.spcs.platform'
ORDER BY TIMESTAMP DESC;
参考文献
Snowflake データクラウドのユーザ会 SnowVillage のメンバーで運営しています。 Publication参加方法はこちらをご参照ください。 zenn.dev/dataheroes/articles/db5da0959b4bdd
Discussion