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

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

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

記号

  • BB:GPU間を接続する通信路のGPUあたり片方向通信帯域幅
  • II:ノード間を接続する通信路のノードあたり片方向通信帯域幅
  • SS:集団通信を行うデータのサイズ(バイト)
  • NN:ベンチマークを行う総GPU数
    • PP:ノードあたりGPU数
    • QQ:ノード数
    • N=P×QN = P \times Q
  • TT:測定された集団通信の実行時間
  • DD:集団通信全体で転送されるべきデータの総量(バイト)
  • DInterD_\textrm{Inter}:ノード間で転送されるべきデータの総量(バイト)
  • DIntraD_\textrm{Intra}:ノード内で転送されるべきデータの総量(バイト)

基本的な考え方

NCCLベンチマークにおけるBusBWは以下の式によって求められます。

BusBW=DT×N\textrm{BusBW} = \frac{D}{T \times N}

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

BusBW=DT×N=S×2×(N1)T×N=1[GB]×2×(161)0.1[s]×16=19.375[GB/s]\textrm{BusBW} = \frac{D}{T \times N} = \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]}

この式で求められるBusBWは、 D/TD / Tによって複数GPUからなるシステム全体の総帯域幅を求め、 さらにNNで割ることによってGPUあたりの平均的な帯域幅を表していると解釈できます。

ある集団通信が完了するまでの理想的な時間を理想的な通信時間TIdealT_\textrm{Ideal}と呼ぶことにします。 すると、BusBWが達成可能な上限値(理想的な通信帯域幅)は、 BusBWを求める式のTTTIdealT_\textrm{Ideal}に置き換えた次の式で求められます。

理想的な通信帯域幅=DTIdeal×N\textrm{理想的な通信帯域幅} = \frac{D}{T_\textrm{Ideal} \times N}

この式もBusBWを求める式と同様に、 D/TIdealD / T_\textrm{Ideal}によって複数GPUからなるシステム全体の総帯域幅の上限を求め、 さらにNNで割ることによってGPUあたりの平均的な帯域幅の上限を表していると解釈できます。

ここで考えるTIdealT_\textrm{Ideal}はベンチマークの実行環境等によって変化します。 以降ではAIBoosterが仮定している環境におけるTIdealT_\textrm{Ideal}および理想的な通信帯域幅の推定方法を解説します。

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

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

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

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

TIdeal=DB×NT_\textrm{Ideal} = \frac{D}{B \times N}

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

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

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

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

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

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

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

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

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

ノード間通信の理想的な通信時間=DInterI×Q,ノード内通信の理想的な通信時間=DIntraB×N\textrm{ノード間通信の理想的な通信時間} = \frac{D_\textrm{Inter}}{I \times Q}, \\ \textrm{ノード内通信の理想的な通信時間} = \frac{D_\textrm{Intra}}{B \times N}

次に、DInter,DIntraD_\textrm{Inter}, D_\textrm{Intra}DDに占める割合について考えます。 NCCLが扱う集団通信は、あるGPUが通信対象のデータを自分以外のN1N - 1個のGPUとやり取りするという操作によって構成されます。 例えば、AllGatherでは各GPUがもつデータをそれぞれ自分以外のN1N - 1個のGPUに送信する必要があり、 BroadcastではルートとなるGPUがもつデータを他のN1N - 1個のGPUに送信する必要があります。 逆にReduceではルートとなるGPUは他のN1N - 1個のGPUがもつデータを受信する必要があります。 また、AllReduceはリダクションとブロードキャストに相当する操作を一体化した集団通信になりますので、このような操作を2セット分行う必要があります。 自分以外のN1N - 1個のGPUとデータをやり取りするという操作の中で必要なノード間通信、ノード内通信の回数を数えます。 ここでは仮に、あるGPUから他のN1N - 1個のGPUにデータを送信する操作を考えますが、受信の場合であっても同様です。 まず、送信元GPUと同じノードに属するGPUに対しては、ノード内通信のみによってデータを伝えられます。 一方、送信元GPUと異なるノードに属するGPUに対しては、ノードごとに一つのGPUに対してはノード間通信によってデータを伝え、 それ以外のGPUに対しては既にデータ受け取ったGPUからノード内通信を行うことでデータを伝えられます。 したがって、最低限行わなければならないノード間通信はQ1Q - 1回であり、 残りの(N1)(Q1)=NQ(N - 1) - (Q - 1) = N - Q回はノード内通信で済ませられます。 異なるノードのGPUに対して常にノード間通信を行うという方法も考えられますが、 ここではノード間通信は最低限にとどめるものと考えます。 したがって、DDに占めるDInterD_\textrm{Inter}DIntraD_\textrm{Intra}の割合はそれぞれ

DInter=D×Q1N1,DIntra=D×NQN1D_\textrm{Inter} = D \times \frac{Q - 1}{N - 1}, \\ D_\textrm{Intra} = D \times \frac{N - Q}{N - 1}

で表されます。 以上の式をTIdealT_\textrm{Ideal}の式に代入すると次の結果が得られます。

TIdeal=max(DInterI×Q,DIntraB×N)=max(D×(Q1)/(N1)I×Q,D×(NQ)/(N1)B×N)T_\textrm{Ideal} = \max\left( \frac{D_\textrm{Inter}}{I \times Q}, \frac{D_\textrm{Intra}}{B \times N} \right) \\ = \max\left( \frac{D \times (Q - 1) / (N - 1)}{I \times Q}, \frac{D \times (N - Q) / (N - 1)}{B \times N} \right)

この結果を理想的な通信帯域幅の推定式に代入して整理すると次に示す最終的な結果が得られます。

理想的な通信帯域幅=Dmax(D×(Q1)/(N1)I×Q,D×(NQ)/(N1)B×N)×N=min(I×(N1)×QN×(Q1),B×(N1)NQ)\textrm{理想的な通信帯域幅} = \frac{D} { \max\left( \displaystyle \frac{D \times (Q - 1) / (N - 1)}{I \times Q}, \frac{D \times (N - Q) / (N - 1)}{B \times N} \right) \times N } \\ = \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=8P = 8、ノード数Q=2Q = 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]}と推定されます。