パイプライン並列って何?
モデル並列はモデルを層で切り、データが各カードを順番に流れます。問題は、ある瞬間に働いているのは1枚だけで、他は待っていること。パイプライン並列はこの「空転」を解消します。工場のラインのように、複数バッチを次々に流し込み、各カードは1バッチを終えた瞬間に次のバッチへ。デバイスの稼働率が大きく上がります。どう例えればいい?
自動車の組み立てライン1番の工程がシャーシを組んでいる間、2番は1台前のエンジンを載せ、3番はさらに前の車を塗装しています。どの工程も止まらず、完成車が次々にラインから出ます。
モデルの層が「工程」
別々の層を別々のGPUに置き、バッチ(サンプル)がラインを流れる「車」です。
何を解決するのか
「バブル」を減らす1バッチずつ流すと、前のカードが計算している間、後ろのカードは待ち、戻るときもまた待つ——この空き時間を「バブル」と呼びます。
次のバッチで隙間を埋める
データを小さなマイクロバッチに分け、首尾よく流せば、空き時間を後続のバッチが埋め、スループットが上がります。
代償とトレードオフ
メモリ使用が増える同時に複数バッチがライン上にあるため、各カードは複数バッチ分の中間状態を保持し、メモリ圧力が高まります。
スケジューリングが難しい
マイクロバッチをいくつに切るか、どう並べればラインを満たしつつメモリを壊さないか、考える必要があります。
大規模モデルでの位置づけ
パイプライン並列はモデル並列・データ並列と組み合わせて使われることが多く、超大規模モデル訓練の「合わせ技」のひとつです。数百・数千枚のGPUをできるだけ忙しく保ち、訓練速度をさらに引き上げます。まとめ:パイプライン並列は、モデルを工場のラインのように「止めずに」動かし、バッチを首尾よく流して待ち時間を埋める技術です。
コメント