NIG Supercomputer

Parabricksを用いたfq2bamの実行

NVIDIA Parabricksの公式のチュートリアル ( https://docs.nvidia.com/clara/parabricks/latest/tutorials/fq2bam_tutorial.html ) では、fq2bamはParabricsのDockerコンテナを用いて以下のように実行するように書かれています。

 docker run \
      --gpus all \
      --rm \
      --volume $(pwd):/workdir \
      --volume $(pwd):/outputdir \
    nvcr.io/nvidia/clara/clara-parabricks:4.5.1-1 \
    pbrun fq2bam \
      --ref /workdir/parabricks_sample/Ref/Homo_sapiens_assembly38.fasta \
      --in-fq /workdir/parabricks_sample/Data/sample_1.fq.gz /workdir/parabricks_sample/Data/sample_2.fq.gz \
      --out-bam /outputdir/fq2bam_output.bam

これに対応するapptainerでの呼び出し方は以下のようになります。

apptainer exec \
  --nv \
  --bind "$(pwd)":/workdir \
  --bind "$(pwd)":/outputdir \
  clara-parabricks.sif \
  pbrun fq2bam \
    --ref /workdir/parabricks_sample/Ref/Homo_sapiens_assembly38.fasta \
    --in-fq /workdir/parabricks_sample/Data/sample_1.fq.gz /workdir/parabricks_sample/Data/sample_2.fq.gz \
    --out-bam /outputdir/fq2bam_output.bam
    --num-gpus 8

これを遺伝研スパコンのGPUノード上で実行するには、slurmを介してジョブを投入する必要があります。

slurm sbatchコマンドによるジョブの実行

slurmのバッチジョブとしてparabricksのfq2bamを実行するために、以下のようなジョブスクリプト(run_fq2bam.sh)を作成します。

Info

この例ではGPUは1本だけ使うように指定しています。

#!/bin/bash
#SBATCH --job-name=fq2bam
#SBATCH --output=fq2bam_%j.out
#SBATCH --error=fq2bam_%j.err
#SBATCH --partition=l40s
#SBATCH --account=l40s
#SBATCH --gres=gpu:1
#SBATCH --ntasks=1
#SBATCH --cpus-per-task=16
#SBATCH --mem=94G
#SBATCH --time=01:00:00


apptainer exec \
  --nv \
  --bind "$(pwd)":/workdir \
  --bind "$(pwd)":/outputdir \
  clara-parabricks.sif \
  pbrun fq2bam \
    --ref /workdir/parabricks_sample/Ref/Homo_sapiens_assembly38.fasta \
    --in-fq /workdir/parabricks_sample/Data/sample_1.fq.gz /workdir/parabricks_sample/Data/sample_2.fq.gz \
    --out-bam /outputdir/fq2bam_output.bam \
    --num-gpus 1

このジョブスクリプトを以下のようにsbatchコマンドから呼よぶと実行されます。

sbatch run_fq2bam.sh
ジョブスクリプトで指定するリソース量の目安

使用するGPU数と、L40S計算ノード(アクセラレータ最適化ノードType 2)で指定するパラメータの対応について以下の表にまとめました。 (あくまで目安なので、ジョブが入りにくいようなら適宜調整してください。)

GPU数 アクセラレータ最適化ノード Type 2 (L40Sノード)での推奨指定 ParabricksのSystem Requirements
CPUスレッド数
(`--cpus-per-task`)
CPU RAM
(`--mem`)
(参考)CPUコア数 CPUスレッド数 CPU RAM
1 16 94GB 8 --- ---
2 32 188GB 16 24 100GB
4 64 376GB 32 32 196GB
8 128 752GB 64 48 392GB

Parabricksの公式ドキュメント https://docs.nvidia.com/clara/parabricks/4.5.1/gettingstarted/installationrequirements.html によると 必要なリソース量は以下のとおり。

System Requirements:

  • A 2 GPU system should have at least 100GB CPU RAM and at least 24 CPU threads.
  • A 4 GPU system should have at least 196GB CPU RAM and at least 32 CPU threads.
  • A 8 GPU system should have at least 392GB CPU RAM and at least 48 CPU threads.

ここでthreadsとはCPUの物理コア数ではなく、CPUのハイパースレッディング機能をONにしたときの論理スレッド数であることに注意。 たとえばL40S計算ノード(アクセラレータ最適化ノードType 2)では、1ノードあたりCPU物理コア数64なので論理スレッド数はその2倍、ノードあたり128threads存在する。

実際の実行結果は以下のとおり。

$ sbatch run_fq2bam.sh
Submitted batch job 741068
you-pg@at022vm02:~/workdir003 (2025-07-12 00:32:19)
$ squeue
             JOBID PARTITION     NAME     USER ST       TIME  NODES NODELIST(REASON)
            741068      l40s   fq2bam      you  R       0:03      1 l40s-02

終了時の出力は以下のとおり。

$ cat fq2bam_741068.out 

[Parabricks Options Mesg]: Checking argument compatibility
[Parabricks Options Mesg]: Set --bwa-options="-K #" to produce compatible pair-ended results with previous versions of
fq2bam or BWA MEM.
[Parabricks Options Mesg]: Automatically generating ID prefix
[Parabricks Options Mesg]: Read group created for /workdir/parabricks_sample/Data/sample_1.fq.gz and
/workdir/parabricks_sample/Data/sample_2.fq.gz
[Parabricks Options Mesg]: @RG\tID:HK3TJBCX2.1\tLB:lib1\tPL:bar\tSM:sample\tPU:HK3TJBCX2.1
Please visit https://docs.nvidia.com/clara/#parabricks for detailed documentation


you-pg@at022vm02:~/workdir003 (2025-07-12 00:35:23)
$ cat fq2bam_741068.err
[PB Info 2025-Jul-12 00:32:23] ------------------------------------------------------------------------------
[PB Info 2025-Jul-12 00:32:23] ||                 Parabricks accelerated Genomics Pipeline                 ||
[PB Info 2025-Jul-12 00:32:23] ||                              Version 4.5.1-1                             ||
[PB Info 2025-Jul-12 00:32:23] ||                      GPU-PBBWA mem, Sorting Phase-I                      ||
[PB Info 2025-Jul-12 00:32:23] ------------------------------------------------------------------------------
[PB Info 2025-Jul-12 00:32:23] Mode = pair-ended-gpu
[PB Info 2025-Jul-12 00:32:23] Running with 1 GPU(s), using 4 stream(s) per device with 16 worker threads per GPU
[PB Info 2025-Jul-12 00:32:33] # 10  0  0  0  0   0 pool:  0 0 bases/GPU/minute: 0.0 
[PB Info 2025-Jul-12 00:32:43] # 10 12  2  4  0   0 pool:  1 354330711 bases/GPU/minute: 2125984266.0 
[PB Info 2025-Jul-12 00:32:53] # 10 10  4  2  0   0 pool:  3 942362178 bases/GPU/minute: 3528188802.0 
[PB Info 2025-Jul-12 00:33:03] # 10 12  2  4  0   0 pool:  1 1643474682 bases/GPU/minute: 4206675024.0 
[PB Info 2025-Jul-12 00:33:13] # 10 10  4  2  0   0 pool:  3 2435060043 bases/GPU/minute: 4749512166.0 
[PB Info 2025-Jul-12 00:33:23] # 10 11  3  3  0   0 pool:  2 3241717297 bases/GPU/minute: 4839943524.0 
[PB Info 2025-Jul-12 00:33:33] # 10 10  4  2  0   0 pool:  3 4040834355 bases/GPU/minute: 4794702348.0 
[PB Info 2025-Jul-12 00:33:43] # 10 10  4  2  0   0 pool:  3 4817334089 bases/GPU/minute: 4658998404.0 
[PB Info 2025-Jul-12 00:33:53] # 10 10  4  2  0   0 pool:  3 5631531253 bases/GPU/minute: 4885182984.0 
[PB Info 2025-Jul-12 00:33:56] Time spent reading: 9.243947 seconds
[PB Info 2025-Jul-12 00:34:03] Rate stats (based on sampling every 10 seconds):
	min rate: 0.0 bases/GPU/minute
	max rate: 4885182984.0 bases/GPU/minute
	avg rate: 3754354168.7 bases/GPU/minute
[PB Info 2025-Jul-12 00:34:03] Time spent monitoring (multiple of 10): 100.625
[PB Info 2025-Jul-12 00:34:03] bwalib run finished in 99.909 seconds
[PB Info 2025-Jul-12 00:34:03] ------------------------------------------------------------------------------
[PB Info 2025-Jul-12 00:34:03] ||        Program:                    GPU-PBBWA mem, Sorting Phase-I        ||
[PB Info 2025-Jul-12 00:34:03] ||        Version:                                           4.5.1-1        ||
[PB Info 2025-Jul-12 00:34:03] ||        Start Time:                       Sat Jul 12 00:32:23 2025        ||
[PB Info 2025-Jul-12 00:34:03] ||        End Time:                         Sat Jul 12 00:34:03 2025        ||
[PB Info 2025-Jul-12 00:34:03] ||        Total Time:                            1 minute 40 seconds        ||
[PB Info 2025-Jul-12 00:34:03] ------------------------------------------------------------------------------
[PB Info 2025-Jul-12 00:34:06] ------------------------------------------------------------------------------
[PB Info 2025-Jul-12 00:34:06] ||                 Parabricks accelerated Genomics Pipeline                 ||
[PB Info 2025-Jul-12 00:34:06] ||                              Version 4.5.1-1                             ||
[PB Info 2025-Jul-12 00:34:06] ||                             Sorting Phase-II                             ||
[PB Info 2025-Jul-12 00:34:06] ------------------------------------------------------------------------------
[PB Info 2025-Jul-12 00:34:06] progressMeter - Percentage
[PB Info 2025-Jul-12 00:34:06] 0.0
[PB Info 2025-Jul-12 00:34:11] Sorting and Marking: 5.001 seconds
[PB Info 2025-Jul-12 00:34:11] ------------------------------------------------------------------------------
[PB Info 2025-Jul-12 00:34:11] ||        Program:                                  Sorting Phase-II        ||
[PB Info 2025-Jul-12 00:34:11] ||        Version:                                           4.5.1-1        ||
[PB Info 2025-Jul-12 00:34:11] ||        Start Time:                       Sat Jul 12 00:34:06 2025        ||
[PB Info 2025-Jul-12 00:34:11] ||        End Time:                         Sat Jul 12 00:34:11 2025        ||
[PB Info 2025-Jul-12 00:34:11] ||        Total Time:                                      5 seconds        ||
[PB Info 2025-Jul-12 00:34:11] ------------------------------------------------------------------------------
[PB Info 2025-Jul-12 00:34:11] ------------------------------------------------------------------------------
[PB Info 2025-Jul-12 00:34:11] ||                 Parabricks accelerated Genomics Pipeline                 ||
[PB Info 2025-Jul-12 00:34:11] ||                              Version 4.5.1-1                             ||
[PB Info 2025-Jul-12 00:34:11] ||                         Marking Duplicates, BQSR                         ||
[PB Info 2025-Jul-12 00:34:11] ------------------------------------------------------------------------------
[PB Info 2025-Jul-12 00:34:12] Using PBBinBamFile for BAM writing
[PB Info 2025-Jul-12 00:34:12] progressMeter -	Percentage
[PB Info 2025-Jul-12 00:34:22] 30.3
[PB Info 2025-Jul-12 00:34:32] 57.8
[PB Info 2025-Jul-12 00:34:42] 84.2
[PB Info 2025-Jul-12 00:34:52] 100.0
[PB Info 2025-Jul-12 00:34:52] BQSR and writing final BAM:  40.108 seconds
[PB Info 2025-Jul-12 00:34:52] ------------------------------------------------------------------------------
[PB Info 2025-Jul-12 00:34:52] ||        Program:                          Marking Duplicates, BQSR        ||
[PB Info 2025-Jul-12 00:34:52] ||        Version:                                           4.5.1-1        ||
[PB Info 2025-Jul-12 00:34:52] ||        Start Time:                       Sat Jul 12 00:34:11 2025        ||
[PB Info 2025-Jul-12 00:34:52] ||        End Time:                         Sat Jul 12 00:34:52 2025        ||
[PB Info 2025-Jul-12 00:34:52] ||        Total Time:                                     41 seconds        ||
[PB Info 2025-Jul-12 00:34:52] ------------------------------------------------------------------------------
you-pg@at022vm02:~/workdir003 (2025-07-12 00:35:26)
$ 

`Set --bwa-options="-K #" to produce compatible pair-ended results with previous versions of ...`について
[Parabricks Options Mesg]: Set --bwa-options="-K #" to produce compatible pair-ended results with previous versions of
fq2bam or BWA MEM.

Parabricks の fq2bam は BWA MEM の GPU 実装(bwa-mem-gpu)を内部で使用しており、従来の BWA MEM の出力と完全に一致させるには、同じ -K オプションが必要です。 Parabricks ではこの互換性のために --bwa-options="-K <NUM>" を渡せるようにしており、メッセージとしてそれが表示されます。

次のようなケースでは 明示的に指定した方がよいです:

  • 従来の BWA MEM を使っていた解析パイプラインと同じ結果を再現したいとき
  • 異なるツールやワークフロー間で出力の差異をなくしたいとき
  • ソート順の違いが後続処理(特に比較やバイナリ検証)に影響する場合
pbrun fq2bam \
  --ref /workdir/ref.fa \
  --in-fq sample_1.fq.gz sample_2.fq.gz \
  --out-bam out.bam \
  --num-gpus 1 \
  --bwa-options="-K 10000000"

ローカルストレージ(SSD)へのデータのステージング

データをローカルストレージに置くと、処理速度が向上します。

これを行うにはデータをローカルストレージにコピーするジョブ、実際の解析を行うジョブ、ローカルストレージ上のデータを削除するジョブを作り、 順に実行するとよいです。

その際に、すべての計算ノードから見えている共有ストレージではなく、特定の計算ノードからしか見えないローカルストレージを使っているため、 ジョブがその特定の計算ストレージ上で動作するように指定する必要があります。

これは以下の手順で実現できます。

ステージング用ジョブスクリプトの作成

以下のジョブスクリプト(stage_fq2bam.sh)は、Parabricksのチュートリアルで配られているデータが入っているparabricks_sampleディレクトリを、 計算ノードのローカルストレージにコピーします。

#!/bin/bash
#SBATCH --job-name=stage_fq2bam
#SBATCH --output=stage_fq2bam_%j.out
#SBATCH --error=stage_fq2bam_%j.err
#SBATCH --partition=l40s
#SBATCH --account=l40s
#SBATCH --time=00:20:00


LOCAL_BASE=/data1/$USER/workdir
mkdir -p "$LOCAL_BASE"
cp -r "$SLURM_SUBMIT_DIR/parabricks_sample" "$LOCAL_BASE/"

解析実行用ジョブスクリプトの作成

以下の内容でrun_fq2bam.shジョブスクリプトを作成します。 INPUT_DIR, OUTPUT_DIRにローカルストレージを指定しているところがこれまでとの違いとなります。

#!/bin/bash
#SBATCH --job-name=run_fq2bam
#SBATCH --output=run_fq2bam_%j.out
#SBATCH --error=run_fq2bam_%j.err
#SBATCH --partition=l40s
#SBATCH --account=l40s
#SBATCH --gres=gpu:1
#SBATCH --cpus-per-task=16
#SBATCH --mem=94G
#SBATCH --time=01:00:00

LOCAL_BASE=/data1/$USER/workdir
INPUT_DIR=$LOCAL_BASE/parabricks_sample
OUTPUT_DIR=$LOCAL_BASE/results

mkdir -p "$OUTPUT_DIR"
cd "$SLURM_SUBMIT_DIR"

apptainer exec \
  --nv \
  --bind "$INPUT_DIR":/workdir/parabricks_sample \
  --bind "$OUTPUT_DIR":/outputdir \
  clara-parabricks.sif \
  pbrun fq2bam \
    --ref /workdir/parabricks_sample/Ref/Homo_sapiens_assembly38.fasta \
    --in-fq /workdir/parabricks_sample/Data/sample_1.fq.gz /workdir/parabricks_sample/Data/sample_2.fq.gz \
    --out-bam /outputdir/fq2bam_output.bam \
    --num-gpus 1

# Optionally copy result to submit directory
cp "$OUTPUT_DIR/fq2bam_output.bam" "$SLURM_SUBMIT_DIR/"

ローカルストレージのクリーンアップ用ジョブスクリプトの作成

以下のジョブスクリプト(clean_fq2bam.sh)を作成します。 これは、計算ノードのローカルストレージに作成したworkdirを削除します。

#!/bin/bash
#SBATCH --job-name=clean_fq2bam
#SBATCH --output=clean_fq2bam_%j.out
#SBATCH --error=clean_fq2bam_%j.err
#SBATCH --partition=l40s
#SBATCH --account=l40s
#SBATCH --time=00:05:00

rm -rf /data1/$USER/workdir
# rm -rf /data1/$USER

ステージング、実行、クリーンアップ

以下のシェルスクリプト(run_fq2bam_with_local_staging.sh)を作って実行します。

このシェルスクリプトは3つのジョブをslurmに投入します。 その際、これらのジョブに依存関係(--dependency)が指定されているため、 ステージングのジョブ(jid1)が終了したら、解析のジョブの実行が始まり、 解析のジョブ(jid2)が終了したらクリーンアップのジョブの実行が開始されます。

計算ノードのローカルストレージデータをステージングするのだから、これら3つのジョブが同じ計算ノード上で実行されなければなりません。 そのためにsbatchコマンドの--nodelistオプションにより特定の計算ノード名を指定しています。 (この計算ノードが空いていないとジョブは流れないことに注意が必要です。)

NODE=l40s-02

jid1=$(sbatch --nodelist=$NODE stage_fq2bam.sh | awk '{print $4}')
jid2=$(sbatch --nodelist=$NODE --dependency=afterok:$jid1 run_fq2bam.sh | awk '{print $4}')
sbatch --nodelist=$NODE --dependency=afterok:$jid2 clean_fq2bam.sh

これを以下のように実行します。

bash run_fq2bam_with_local_staging.sh

実行状態の確認の例

以下の実行例は、ジョブは3つ投入されており、ステージング中なので解析とクリーンアップのジョブは依存関係により待たされていることを示しています。

you-pg@at022vm02:~/workdir003 (2025-07-12 08:42:00)
$ squeue
             JOBID PARTITION     NAME     USER ST       TIME  NODES NODELIST(REASON)
            754966      l40s run_fq2b oogasawa PD       0:00      1 (Dependency)
            754967      l40s clean_fq oogasawa PD       0:00      1 (Dependency)
            754965      l40s stage_fq oogasawa  R       0:04      1 l40s-02

GPUノードのローカルストレージの内容の確認

ジョブを投入しているノードがat022vm02で、実行しているノードがl40s-02なのだから、GPUノードのローカルストレージの状態を確認するにはsbatchsrunを使う必要があります。

sbatchによる方法

確認ジョブスクリプト(例:check_cleanup.sh)を用意

#!/bin/bash
#SBATCH --job-name=check_cleanup
#SBATCH --output=check_cleanup_%j.out
#SBATCH --error=check_cleanup_%j.err
#SBATCH --partition=l40s
#SBATCH --account=l40s
#SBATCH --time=00:05:00

tree /data1/$USER/workdir

このジョブスクリプトは /data1/<ユーザー名>/workdir が存在するかどうかを確認します。

投入コマンド

sbatch --nodlist=l40s-02 check_cleanup.sh

ジョブの標準出力(check_cleanup_<jobid>.out)を確認:

cat check_cleanup_*.out

srunによる方法

srunコマンドを使うとインタラクティブに確認することもできます:

srun --partition=l40s --account=l40s --nodelist=l40s-02 --pty bash

その後、ログイン先で:

tree /data1/$USER/workdir

必要に応じてローカルストレージ上のデータを削除

rm -Rf /data1/$USER/workdir

シェルからexitを実行するとsrunで開始されたインタラクティブジョブが終了します。