- DeepSeek V3/R1で使用していた戦略とコード
- DualPipe : 計算と通信のオーバーラップのための双方向パイプライン並列化アルゴリズム
- EPLB: Expert-Parallel ロードバランサー
- Profile-Data: DeepSeekインフラのデータプロファイリングにより、計算と通信のオーバーラップを分析
- Expert Parallelism(EP)では、異なるエキスパート(experts)を各GPUに割り当てる
- しかし、エキスパートごとに作業量が異なる可能性があるため、GPU間の負荷を均等に調整することが重要
- DeepSeek-V3では、冗長エキスパート(redundant experts) 戦略を用いて高負荷のエキスパートを複製し、それをGPUに効率よく配置して負荷分散を実現
- また、グループ制限エキスパートルーティング(group-limited expert routing) を活用し、同じグループのエキスパートをできるだけ同一ノードに配置することで、ノード間のデータ転送を最小化
- これを再現およびデプロイしやすくするため、
eplb.pyでEP負荷分散アルゴリズムをオープンソースとして提供
- このアルゴリズムは、予測されたエキスパート負荷に基づいて、バランスの取れたエキスパート複製および配置計画を計算
- ただし、エキスパート負荷を予測する具体的な方法は当該リポジトリの範囲外であり、一般的には過去の統計を用いた移動平均方式がよく使われる
- 負荷分散アルゴリズムは2つのポリシーを提供し、それぞれ異なる状況で使用される。
- 階層型負荷分散(Hierarchical Load Balancing)
- サーバーノード数がエキスパートグループ数を割り切れる場合、階層型負荷分散 ポリシーを使用してグループ制限エキスパートルーティングを最適化
- まず、エキスパートグループを均等にノードへ配置し、ノード間の負荷を均等に調整
- その後、各ノード内でエキスパートを複製
- 最後に、複製されたエキスパートを個別GPUに配置してGPU間の負荷分散を行う
- このポリシーは、エキスパート並列規模が小さい プリフィル(prefilling)段階 で使用可能
- グローバル負荷分散(Global Load Balancing)
- それ以外の場合は、グローバル負荷分散 ポリシーを用いて、エキスパートグループに関係なくグローバルにエキスパートを複製し、これを個別GPUに配置
- このポリシーは、エキスパート並列規模が大きい デコーディング(decoding)段階 に適している。
- DeepSeekの学習および推論フレームワークからプロファイリングデータを公開し、コミュニティが通信・計算オーバーラップ戦略と低レベル実装の詳細をよりよく理解できるよう支援
- このプロファイリングデータは PyTorch Profiler を使用して収集されており、ダウンロード後は Chrome では
chrome://tracing、Edge では edge://tracing で可視化可能
- また、実験では バランスの取れたMoEルーティング戦略 をシミュレーションしてプロファイリングを実施
- 学習(Training)
- 学習プロファイルデータは DualPipe における順伝播および逆伝播チャンクのオーバーラップ戦略を示している
- 各チャンクは 4つのMoE(Mixture of Experts)レイヤー を含み、DeepSeek-V3の事前学習設定と一致する並列構成を持つ:
- 推論(Inference)
- プリフィル(Prefilling)
- この段階では 2つのマイクロバッチ を活用して、計算と all-to-all 通信をオーバーラップ
- また、attention演算負荷を2つのマイクロバッチ間で均等に分配 し、同一プロンプトを複数のマイクロバッチに分割できるようにする
- デコーディング(Decoding)
- デコーディングでもプリフィルと同様に、2つのマイクロバッチを使用して計算と all-to-all 通信をオーバーラップ
- ただし、デコーディングでは all-to-all 通信が GPU SMを占有しない → RDMAメッセージ送信後にGPU SMを解放 し、計算終了後に通信完了を待機する方式で動作
- より詳しい all-to-all 実装情報は DeepEP で確認可能
まだコメントはありません。