パイプライン並列

Pipeline Parallelism

パイプライン並列(Pipeline Parallelism)とは、ニューラルネットワークのレイヤー(層)をグループに分割し、各グループを異なるGPUに配置して、パイプライン処理で学習を行う並列化手法です。モデル並列の一種で、モデルを縦方向(深さ方向)に分割します。

パイプライン並列の仕組み

例えば24層のTransformerモデルを4台のGPUで学習する場合、各GPUに6層ずつ配置します。GPU1が層1〜6の順伝播を完了すると、中間結果をGPU2に送り、GPU2が層7〜12を処理します。各GPUは前のGPUの出力を受け取って処理を進める「パイプライン」を形成します。

表:パイプライン並列の要点まとめ
ひとことで言うとモデルを工程に分け、流れ作業のように次々処理していく方式。
何がうれしいか単純なモデル並列で生じる「他のGPUの待ち時間」を減らせる。
注意点最初と最後に必ず待ちが生じる。ミニバッチをさらに細かく分けて緩和する。

パイプラインバブルの問題

単純なパイプライン並列では、各GPUが前のGPUの出力を待つ間に待機時間(パイプラインバブル)が発生し、GPU利用率が低下します。これを解決するため、ミニバッチをさらに小さなマイクロバッチに分割して連続的に流す手法が使われます。GPipe、PipeDream、1F1Bスケジュールなどがバブルの削減に効果的です。

図:パイプライン並列のしくみ
1層を工程に分割GPU1が前半、GPU2が後半
▶
2データを小分けマイクロバッチに分ける
▶
3流れ作業で処理工場のラインのように
▶
4待ち時間を削減各GPUが常に稼働

他の並列化との組み合わせ

パイプライン並列は通信量が比較的少ない(層間の活性化値のみ)ため、ノード間の通信に適しています。ノード内ではテンソル並列(NVLinkの高帯域を活用)、ノード間ではパイプライン並列、全体にデータ並列を適用する組み合わせが大規模学習では一般的です。