パイプライン並列(Pipeline Parallelism)とは、ニューラルネットワークのレイヤー(層)をグループに分割し、各グループを異なるGPUに配置して、パイプライン処理で学習を行う並列化手法です。モデル並列の一種で、モデルを縦方向(深さ方向)に分割します。
パイプライン並列の仕組み
例えば24層のTransformerモデルを4台のGPUで学習する場合、各GPUに6層ずつ配置します。GPU1が層1〜6の順伝播を完了すると、中間結果をGPU2に送り、GPU2が層7〜12を処理します。各GPUは前のGPUの出力を受け取って処理を進める「パイプライン」を形成します。
パイプラインバブルの問題
単純なパイプライン並列では、各GPUが前のGPUの出力を待つ間に待機時間(パイプラインバブル)が発生し、GPU利用率が低下します。これを解決するため、ミニバッチをさらに小さなマイクロバッチに分割して連続的に流す手法が使われます。GPipe、PipeDream、1F1Bスケジュールなどがバブルの削減に効果的です。
他の並列化との組み合わせ
パイプライン並列は通信量が比較的少ない(層間の活性化値のみ)ため、ノード間の通信に適しています。ノード内ではテンソル並列(NVLinkの高帯域を活用)、ノード間ではパイプライン並列、全体にデータ並列を適用する組み合わせが大規模学習では一般的です。