AI

AI推論ソフトTensorRT 11.0、GPU間通信を統合して複数GPUで実行

この記事のポイント

  1. 実現したこと

    Torch-TensorRTとの組み合わせで、PyTorchモデルを実行環境外の複数GPU推論向けに変換・配置できる。

  2. 実現の仕組み

    GPU間のデータ交換にNCCLの集合通信を使い、分割した計算の結果を受け渡す。

  3. 得られた結果

    Ring Attentionでは、キーと値をGPU間で順に渡し、全長のデータを各GPUに展開せずにAttentionを計算する。

  4. 従来との違い

    TensorRT 11.0の実行系に複数GPU推論が加わり、一つの層の重みをGPU間で分割する構成に対応した。

複数GPUで推論を分担し、キーと値のデータを巡回させるRing Attentionの概念図
AI生成画像

AI推論ソフトのTensorRT 11.0は、GPU間の集合通信を実行系に組み込み、複数GPUでの推論に対応した。モデルの重みを分ける方法に加え、長い入力系列を分けてAttentionを計算する方法も扱える。

複数GPUへの配置をTensorRTの実行系に組み込む

NVIDIAは、AI推論ソフトTensorRT 11.0に複数GPUでの推論機能を導入した。Torch-TensorRTと組み合わせると、PyTorchモデルをPyTorchの実行環境外で動かす形式に変換し、複数GPUへ配置できる。

複数GPUで一つの推論を進めるには、分割したデータや計算結果をGPU間で交換する必要がある。その受け渡しをTensorRTの実行系で扱うことが、今回の機能追加の中心となる。

NCCLの集合通信が分割した計算をつなぐ

GPU間通信にはNVIDIA Collective Communications Library(NCCL)を利用する。NCCLは接続構成に応じて通信経路を選び、TensorRTはその仕組みを複数GPUでの推論に使う。

対応する集合通信には、部分結果を集約するAllReduce、各GPUのデータを集めるAllGather、GPU間でデータを交換するAlltoAllなど、計8種類が含まれる。モデルや入力の分け方に合わせて、必要な受け渡しを推論処理へ組み込める。

層の重みを分けて部分結果を結合する

テンソル並列では、一つの層の重みを複数GPUに分ける。各GPUが担当部分の行列計算を行い、その部分結果を集合通信で結合して層の出力を得る。

一つのGPUのメモリーに層の重みが収まらない場合、この分割によってGPUごとの重みの保持量を減らせる。TensorRTの複数GPU推論は、こうした層内部の分割を実行するための通信を扱う。

入力系列を分けて長いAttentionを処理する

コンテキスト並列では、層の重みではなく入力系列をGPU間で分割する。各GPUは担当する系列の一部分を処理し、Attentionで系列全体を参照するために必要なデータを集合通信で受け取る。

AllGather KV方式では、各GPUが担当するクエリに対して、ほかのGPUが保持するキーと値を集めて計算する。これにより、クエリ側の計算を分担しながら、各GPUが系列全体を参照できる。

キーと値の渡し方で通信とメモリー使用量が変わる

Ring Attentionは、キーと値をGPU間で環状に流し、各GPUが担当するクエリの計算を進める。オンラインsoftmaxを用いるため、系列全体のキーと値を各GPU上に展開する必要がない。

別の方式であるDeepSpeed Ulyssesは、系列を分けた後、Attentionの計算前にクエリ、キー、値をAlltoAllで交換する。TensorRTが対応する集合通信は、このように異なるデータの分割・交換方式を支える。