# NVIDIA DALI(Data Loading Library)
複雑・重量なデータ前処理をアクセラレーションするNVIDIAのライブラリ。処理をGPUへ移すか、最適化されたC++で書かれたCPUコードを使うことで、データ処理を高速化する。JPEGデコードやランダムクロップ・リサイズ・正規化のような拡張(augmentation)処理をすべてGPU上で行えるため、画像・動画データのデコード/拡張がGPUアクセラレーションから恩恵を受けやすいワークロードで特に有用である(Source: [[@2025__OReilly__AI Systems Performance Engineering - Chapter 5 GPU-Based Storage IO Optimizations]] §Multimodal Data Processing with NVIDIA DALI)。
## 設計
- DALIパイプラインは`nvidia.dali.pipeline.Pipeline`をサブクラス化し、`define_graph()`内でデータソースとCPU/GPUオペレータを宣言する静的グラフとして定義される。実行・プリフェッチ・スレッド管理はDALIが内部の専用スレッドプールとキューで担う。
- 分類・物体検出・セグメンテーション等の一般的ワークロード向けに、GPU上で画像・動画をデコードする構築済みパイプラインを提供し、GPUのメディアアクセラレーションハードウェアを活用する。
## 効果と注意点
- 入力律速(input-bound)なワークロード(モデル学習等)ではDALI統合がスループットを大きく改善しうる。ただし学習ループ自体への統合が必要で、一定の複雑性と学習コストを伴う。
- 効果は「DALIをどこに配置するか」に強く依存する。DALIをJPEG展開のみに使い、その後すぐ生ピクセルをCPUへ戻して拡張・collationを行うと、余分なホスト-デバイス-ホストコピーが発生し、DALI導入の性能上の利得を相殺しうる。
- より良いアプローチは、GPUフレンドリーな前処理オペレーションを特定し、GPUベースの前処理計算グラフへ直接融合(fuse)することである。TorchVisionやTensorRT等の既存CUDAベースライブラリ、あるいはカスタムCUDAカーネルを用いることで、CPU-GPU間のデータ往復を避けられる。
- 実例として、画像・動画を読み込み拡張を行い物体検出モデルを学習するパイプラインで、CPU使用率が800%(8コアフル稼働)でもGPUが時折ストールする状況において、DALI導入によりCPU使用率を200%(2コア、ファイル読み取りのみ)まで下げ、GPUが画像・動画デコードを計算と並行して実行できるようになった例が挙げられている。
- 実運用ではCPU専用パイプライン、DALI有効化パイプライン、完全融合GPUグラフ実装の3者をエンドツーエンドでベンチマークし、モデル・データセットに応じた最適解を判断すべきとされる。(Source: [[@2025__OReilly__AI Systems Performance Engineering - Chapter 5 GPU-Based Storage IO Optimizations]] §Multimodal Data Processing with NVIDIA DALI)
## 関連
- [[wiki/entities/AI Systems Performance Engineering|AI Systems Performance Engineering]] — 本ページの一次ソースの書籍
- [[@2025__OReilly__AI Systems Performance Engineering - Chapter 5 GPU-Based Storage IO Optimizations]]
## 出典
- [[@2025__OReilly__AI Systems Performance Engineering - Chapter 5 GPU-Based Storage IO Optimizations]](§Multimodal Data Processing with NVIDIA DALI)