自己写
训练並行の理由#
単一の GPU 計算には限界があり、複数の GPU を並行処理することで、トレーニング効率を向上させます。
训练并行の次元#
データ並行(DP)#
mp_size = 1、batch = 64、dp_size = 4 の場合
1 つのバッチを 4 つに分割し、それぞれの部分で 16 サンプルを処理します。各部分には完全なモデルパラメータがあります。
パラメータの更新は、4 つの部分の平均 Loss を合計し、その後にパラメータを更新します(実際には 1 つのバッチの Loss の平均 * 学習率)。
各バッチの計算が終わるたびにモデルパラメータの同期が必要です。
モデル並行(MP)#
mp_size = 4、batch = 64、dp_size = 1 の場合
各部分で完全なバッチのデータを計算する必要があり、各部分には 4 分の 1 のモデルパラメータしかありません。それぞれの部分の重みを更新し、前向き計算と逆向き計算の際にも通信が必要です。
MP にはグローバルパラメータの一貫性の要求はなく、各ランクのパラメータは元々異なるため、同期更新は必要ありません。
MP&DP#
実際のアプリケーションでは、MP と DP を一緒に使用できますが、上記のルールを守る必要があります。
GPT 写
训练并行のまとめ:DP / MP / DP+MP#
1. なぜトレーニング並行が必要なのか?#
単一の GPU のメモリと計算能力には限界があり、大規模な深層学習モデルを支えるのが難しいです。
複数の GPU を使用することで:
-
計算負荷を分散する
-
訓練可能なモデルの規模を拡大する
-
トレーニング速度を向上させる
深層学習のトレーニングの並行処理は一般的に 2 つのカテゴリに分けられます:
-
データ並行(Data Parallel, DP)
-
モデル並行(Model Parallel, MP)
これらは混合並行(DP + MP)として組み合わせることもできます。
2. データ並行(DP)#
仮定:
-
dp_size = 4
-
mp_size = 1
-
batch = 64
データ並行は 1 つのバッチを複数のサブバッチに分割します:
-
GPU0:16 サンプル
-
GPU1:16 サンプル
-
GPU2:16 サンプル
-
GPU3:16 サンプル
各 GPU は完全なモデルパラメータを保持しています。
各 GPU はローカルサンプルの勾配を独立して計算します:
g0 = ∇θ L0
g1 = ∇θ L1
g2 = ∇θ L2
g3 = ∇θ L3
その後、Allreduce (sum) を通じて勾配を同期します:
g_global = g0 + g1 + g2 + g3
最終的に dp_size で割って平均勾配を得ます:
g_avg = g_global / 4
各 GPU は同じ勾配を使用してパラメータを更新します:
θ ← θ - lr * g_avg
したがって、DP の本質は:
-
データの分割
-
勾配の同期
-
パラメータの一貫性の保持
3. モデル並行(MP)#
仮定:
-
mp_size = 4
-
dp_size = 1
-
batch = 64
モデル並行はモデルパラメータを特定の次元で異なる GPU に分割します。
例えば全結合層の重み:
W = [ W0 | W1 | W2 | W3 ]
各 GPU は完全なバッチの入力 X(64 × d_in)を見ます。
各 GPU は自分の行列乗算を実行します:
GPU0: Y0 = X @ W0
GPU1: Y1 = X @ W1
GPU2: Y2 = X @ W2
GPU3: Y3 = X @ W3
完全な出力は結合されます:
Y = [Y0 | Y1 | Y2 | Y3]
したがって、前向き伝播は Allgather を通じて出力を結合する必要があります。
逆伝播#
各 GPU は自分が担当する勾配を計算します:
dW_i = X^T @ dY_i
しかし、入力勾配 dX はすべての GPU の寄与を合計する必要があります:
dX = dX0 + dX1 + dX2 + dX3
したがって、Allreduce (sum) が必要です。
モデル並行の核心思想#
MP はモデルを分割して独立にトレーニングするのではなく:
複数の GPU が協力して 1 回の前向きと逆向き伝播を完了し、活性化と勾配を同期する必要があります。
次のものを使用しなければなりません:
-
Allgather(活性化の結合)
-
Allreduce(入力勾配の合計)
-
ReduceScatter(Megatron-LM の最適化)
MP の特徴#
-
パラメータの分割
-
データの完全性(各 GPU は全バッチを見ます)
-
各 GPU は自分のパラメータの断片のみを更新します
-
パラメータは元々異なるため、一貫性を保つ必要はありません
-
しかし、活性化 / 勾配は通信して同期する必要があります
4. 混合並行(DP + MP)#
実際の大規模モデルのトレーニングでは通常 DP と MP を同時に使用します。
GPU クラスターの構造は 2D グリッドと見なすことができます:
-
行:DP グループ(異なるデータを処理)
-
列:MP グループ(モデルの分割)
通信モード:
-
DP 次元:勾配の同期(Allreduce)
-
MP 次元:協力計算(Allgather / Allreduce / ReduceScatter)
DP+MP は GPT-3、PaLM、Megatron-LM などの大規模モデルのトレーニングの核心です。
5. まとめ#
データ並行(DP)#
-
データの分割
-
モデルの複製
-
勾配の同期
-
パラメータの一貫性
モデル並行(MP)#
-
モデルの分割
-
データの完全性
-
活性化 / 勾配の通信
-
パラメータの断片の独立更新
DP + MP#
-
2 次元並行モード
-
大規模モデルのトレーニングの基礎