
こんにちは。SB C&S の村上です。
この記事ではNVIDIAの開発するGPU Direct Storageを紹介します。
GPUとストレージ間のデータの流れ
現在、AIの普及に伴い大容量のデータを取り扱う必要性が出てきました。中でもAIのモデルを作る段階(データの準備や学習)では膨大なデータをGPUで処理する必要があります。
ただし、GPUでデータを処理するためには、一度システムメモリを経由してGPU上にデータを展開する必要があります。
以下はローカルのNVMeおよび外部ストレージのデータをGPUに展開する流れのイメージ図となります。
- ①初めにCPUがデータの取得指示を行います
- ➁その後データはストレージからシステムメモリへ展開されます
- ③そしてシステムメモリからGPUへデータが転送されます
例えば、以下は100GBのデータをGPUへ展開する指示を行った際のログです。システムメモリを一度経由していることが確認できます。また、GPU上のデータをストレージへ保存する場合も、同様に一度システムメモリを経由します。
このように従来のデータ転送では、メモリ領域の圧迫やメモリ経由によるオーバーヘッドなどが発生していました。
これを解消することができる技術がGPU Direct Storageとなります。
GPU Direct Storageとは
GPU Direct Storage(GDS)は、GPUとストレージ間で直接データのやり取りを行う技術です。
前述の通り、従来のGPUへのデータ転送はシステムメモリに一度データをコピーする必要がありました。一方でGDSでは、システムメモリを経由することなく、直接データの転送を行います。
これにより大きく以下2つの利点があります。
- システムメモリのバッファ使用がなくなる
- メモリ領域および帯域の圧迫解消
- システムメモリへの書き込みによるオーバーヘッド削減
- 直接GPUとデータのやり取りを行うため高速化
以下は実際にGDSを使った場合の、GPUメモリへのデータの展開のログとなります。
システムメモリを経由せずに、直接GPUへデータの受け渡しが行われていることが確認できます。
GPU Direct Storageの主要コンポーネント
GDSを使う際に必要となるコンポーネントの紹介をします。
まずGDSならではの必須コンポーネントとして以下2つがあります。
- nvidia-fs
- GDSの仕組みを提供するカーネルモジュール
- cuFile API
- nvidia-fsとやり取りするためのAPIを提供
- NGCにあるコンテナイメージではインストール済みのものが多い
続いて以下は任意コンポーネントとなります。
- GDS用Pythonライブラリ
- GDSをPythonのプログラムから実行する際に利用
- GDS Tools
- GDSの環境確認・ベンチマーク・監視/ログ収集などを実施するCLIツール
なお、GDSを利用する際は対応しているファイルシステムおよびストレージを使う必要があります。
また、各種ストレージドライバなどもインストールが必要になります。
対応しているファイルシステム・ストレージは以下公式ドキュメントを参照ください
https://docs.nvidia.com/gpudirect-storage/release-notes/index.html#support-matrix
GPU Direct Storageの使い方
GDSを使う方法としては大きく以下の2パターンがあります。
- cuFile APIを実行するコード(C/C++)を書く
- GDS用ライブラリ経由でcuFile APIを実行
ここでは多くの方がまず利用されるライブラリ経由の方法を紹介します。
GDS用のライブラリの代表的なものとして、kvikIOと呼ばれるPythonライブラリがあります。kvikIOを用いるとGPUにデータを展開する際やGPUからデータを保存する際に、Pythonのコード内で簡単にcuFileAPI(GDSのAPI)を実行することができます。
例えば以下はGPUにデータを読み込む処理のサンプルコードとなります。左がGDS無し(従来)の呼び出しで、右がkvikIOを使ったGDSの実行コードです。基本的には、GPUとデータのやり取りを行うタイミングで呼び出すのみで、それ以外のデータ整形や学習などについては今まで通り行えばよいものとなります。
他にもGDS対応ライブラリがあるため、要件に応じて使い分けてください。
- GDS対応ライブラリ抜粋
- kvikIO: 代表的なPython用GDSライブラリ
- torch.cuda.gds: Pytorch標準のGDSライブラリ (本記事執筆時点ではプロトタイプ)
- RAPIDS cuDF: GPU上でpandas互換のDataFrame処理を行うライブラリ (内部でkvikIOを利用)
- NVIDIA DALI (Data Loading Library): GPUでデータ読み込み〜前処理を行うライブラリ (内部でkvikIOを利用)
GDS Toolsについて
GDSの実行環境の確認やベンチマーク、監視/ログ収集をするためのツールとしてGDS ToolsというCLI群も提供されています。
例えば、gdscheckではドライバなどの情報を確認してGDSが利用可能かを確認できます。以下は出力の一部ですが、NVMeとDDN EXAScalerのドライバがインストールされていることが確認できています。
また、gdsioではGDSのベンチマークを行うことができ、GDSの効果を確認できます。以下はいくつかの条件を指定して50Gのデータの転送を確認した結果です。スループットやかかった時間などを細かく確認できます。
以下はGDS Toolsの代表例となり、CLIからそれぞれ簡単に実行することができます。
- gdscheck: 環境確認ツール (セットアップできているか等)
- gdsio: ベンチマークツール
- gdsio_verify: データ整合性検証ツール (GDS経由でデータが壊れていないか)
- gds_stats: GPU単位でIO回数や帯域、レイテンシなどを表示
- gds_log_collection: サポート向けのログ収集
なお、GDS ToolsはCUDAのリポジトリからインストールする必要があります。
CUDA Toolkitアーカイブサイト:https://developer.nvidia.com/cuda-toolkit-archive
まとめ
本記事ではGPU Direct Storageを紹介しました。
AIモデルの開発では膨大なデータをGPUで取り扱うことが当たり前となり、その中でGPU Direct Storageを活用することで、より効率的にデータをGPU上で取り扱えるようになります。
別の記事にて実際にGDSを使う流れも紹介していますので、合わせてお読みいただけたらと思います。
GPU Direct Storageを使ったデータ転送の紹介
他のおすすめ記事はこちら
著者紹介
SB C&S株式会社
ICT事業本部 技術本部 技術統括部
第2技術部 1課
村上 正弥 - Seiya.Murakami -
VMware vExpert
