メインコンテンツまでスキップ
バージョン: v2506

NCCLの理想的な通信帯域幅の推定方法

PyTorch版NCCLベンチマークの結果には理想的な通信帯域幅および、現在の通信帯域幅が理想的な通信帯域幅に対してどの程度の効率を達成しているか表示されます。 本ドキュメントは理想的な通信帯域幅の推定手法の概要について説明します。

記号

  • B`B`:GPU間を接続する通信路のGPUあたり片方向通信帯域幅
  • I`I`:ノード間を接続する通信路のノードあたり片方向通信帯域幅
  • S`S`:集団通信を行うデータのサイズ(バイト)
  • N`N`:ベンチマークを行う総GPU数
    • P`P`:ノードあたりGPU数
    • Q`Q`:ノード数
    • N=P×Q`N = P×Q`
  • T`T`:測定された集団通信の実行時間

基本的な考え方

NCCLベンチマークにおけるバス帯域幅(BusBW)は以下の式で定義されます。

BusBW=転送されるべきデータの総量T×N\textrm{BusBW} = \frac{\textrm{転送されるべきデータの総量}}{T \times N}

転送されるべきデータの総量の求め方はNVIDIAのNCCL Testsのドキュメントをご覧ください。 例えば、1ノード8GPUのノードを4ノード使用して1GBのデータをAllReduce通信するのに0.1秒かかったのであれば、BusBWは以下のとおり計算されます。

BusBW=S×2×(N1)T×N=1[GB]×2×(161)0.1[s]×16=19.375[GB/s]\textrm{BusBW} = \frac{S \times 2 \times (N - 1)}{T \times N} = \frac{1 \textrm{[GB]} \times 2 \times (16 - 1)}{0.1 \textrm{[s]} \times 16} = 19.375 \textrm{[GB/s]}

理想的な通信帯域幅は、 測定された実行時間T`T`をプログラムの実行環境と集団通信の種類によって決まる理想的な通信時間TIdeal`T_\textrm{Ideal}`に置き換えた次の式で 推定されます。

理想的な通信帯域幅=転送されるべきデータの総量TIdeal×N\textrm{理想的な通信帯域幅} = \frac{\textrm{転送されるべきデータの総量}}{T_\textrm{Ideal} \times N}

理想的な通信帯域幅は基本的にはベンチマークの実行環境(通信ハードウェアや実行プロセスのマッピング)によって定まり、 通信の種類や通信対象とするデータの型、データサイズなどの実行時パラメータには依存しません。 しかしながら、通信の種類やデータの型によって利用可能なネットワークの機能が変化する場合があり、 そのような場合には同じ実行環境であっても理想的な通信帯域幅が実行時パラメータによって変化します。

シングルノード実行時の推定方法

ベンチマークをシングルノードで実行するとき、理想的な通信帯域幅は以下の仮定のもとで推定されます。

  • 各GPUはB`B`の速度でノード内の他のGPUに対して送信と受信が同時に実行可能である
  • ノード内の各GPUはフルバイセクションバンド幅の同一ネットワークに接続されている
  • 各GPUが接続されるネットワークは通信のみを行う(in-network computationを実行しない)
  • 通信以外にかかる時間は無視できるほど短い(例:AllReduce通信における演算時間)

このような仮定のもとでは、N`N`個のGPUはいずれも常にB`B`の速度でデータを送受信可能ですので、 理想的な通信時間TIdeal`T_\textrm{Ideal}`は次の式で表されます。

TIdeal=転送されるべきデータの総量B×NT_\textrm{Ideal} = \frac{\textrm{転送されるべきデータの総量}}{B \times N}

これを前節で示した理想的な通信帯域幅の推定式に代入することで次に示すシングルノード実行時の理想敵な通信帯域幅の評価が得られます。

理想的な通信帯域幅=B\textrm{理想的な通信帯域幅} = B

例えば、B=450[GB/s]`B = 450 \textrm{[GB/s]}`で同時に送受信可能なGPUをフルバイセクションバンド幅のネットワークに接続した環境でベンチマークをシングルノード実行すると、 GPU数によらず理想的な通信帯域幅は450[GB/s]`450 \textrm{[GB/s]}`と推定されます。

マルチノード実行時の推定方法

ベンチマークをマルチノードで実行するとき、理想的な通信帯域幅は以下の仮定のもとで推定されます。

  • シングルノードでの仮定を満たしている
  • 各ノードはI`I`の速度で他のノードに対して送信と受信が同時に実行可能である
  • 各ノードはフルバイセクションバンド幅のノード間ネットワークに接続されている
  • 各ノードが接続されるネットワークは通信のみを行う(in-network computationを実行しない)
  • ノード内のGPU間通信とノード間の通信はそれぞれ独立しており、互いの通信性能に干渉しない

このような仮定のもとでは、ノード間通信にかかる時間とノード内通信にかかる時間は独立していますので、 それらのより長い時間が集団通信全体の実行時間になると考えられます。 したがって、理想的な通信時間TIdeal`T_\textrm{Ideal}`は次の式で表されます。

TIdeal=max(ノード間通信の理想的な通信時間,ノード内通信の理想的な通信時間)T_\textrm{Ideal} = \max(\textrm{ノード間通信の理想的な通信時間}, \textrm{ノード内通信の理想的な通信時間})

ノード間およびノード内の理想的な通信時間は、それぞれで転送されるべきデータの総量を帯域幅で割った値となりますので、 それぞれ以下のとおり表されます。

ノード間通信の理想的な通信時間=ノード間で転送されるべきデータの総量I×Q,ノード内通信の理想的な通信時間=ノード内で転送されるべきデータの総量B×P\textrm{ノード間通信の理想的な通信時間} = \frac{\textrm{ノード間で転送されるべきデータの総量}}{I \times Q}, \\ \textrm{ノード内通信の理想的な通信時間} = \frac{\textrm{ノード内で転送されるべきデータの総量}}{B \times P}

一方、ノード間およびノード内で転送されるべきデータの総量は、それぞれ

ノード間で転送されるべきデータの総量=集団通信全体で転送されるべきデータの総量×Q1N1,ノード内で転送されるべきデータの総量=集団通信全体で転送されるべきデータの総量×NQN1\textrm{ノード間で転送されるべきデータの総量} = \textrm{集団通信全体で転送されるべきデータの総量} \times \frac{Q - 1}{N - 1}, \\ \textrm{ノード内で転送されるべきデータの総量} = \textrm{集団通信全体で転送されるべきデータの総量} \times \frac{N - Q}{N - 1}

で表されます。 以上の式を理想的な通信帯域幅の推定式に代入して整理すると次の結果が得られます。

理想的な通信帯域幅=min(I×(N1)×QN×(Q1),B×(N1)NQ)\textrm{理想的な通信帯域幅} = \min\left(\frac{I \times (N - 1) \times Q}{N \times (Q - 1)}, \frac{B \times (N - 1)}{N - Q} \right)

例えば、GPU間の接続がB=450[GB/s]`B = 450 \textrm{[GB/s]}`、ノード間の接続がI=100[GB/s]`I = 100 \textrm{[GB/s]}`、 ノードあたりGPU数P=8`P = 8`、ノード数Q=2`Q = 2`の環境で集団通信を実行するとき、 理想的な通信帯域幅はmin(187.5,482.1)[GB/s]=187.5[GB/s]`\min(187.5, 482.1) \textrm{[GB/s]} = 187.5 \textrm{[GB/s]}`と推定されます。