パイプライン並列学習

Pipeline Parallelism

パイプライン並列学習とは

パイプライン並列学習(Pipeline Parallelism)とは、深層学習モデルの層をグループに分割し、各グループを異なるGPUに配置して、データをパイプラインのように流して処理する分散学習の手法です。モデル並列の一形態であり、大規模モデルの学習においてGPUメモリの制約と計算効率のバランスを取る技術です。

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

パイプラインの仕組み

モデルの層を複数のステージに分割し、各ステージを異なるGPUに割り当てます。ミニバッチをさらに小さなマイクロバッチに分割し、各マイクロバッチをパイプラインに流します。GPU1がマイクロバッチ2を処理している間にGPU2がマイクロバッチ1を処理するというように、複数のGPUが同時に異なるマイクロバッチを処理します。

図:パイプライン並列のしくみ
1層を工程に分割GPUごとに担当を決める
▶
2データを小分けマイクロバッチ化
▶
3流れ作業で処理工場のラインのように
▶
4稼働率が上がる待ち時間を削減

バブル問題

パイプライン並列の最大の課題はパイプラインバブル(bubble)です。パイプラインの充填と排出の際にGPUがアイドル状態になる時間が発生します。GPipe、PipeDream、Interleaved 1F1Bなどのスケジューリング手法がバブルの最小化を目指しています。マイクロバッチ数を増やすことでバブルの割合を減らすことが可能です。

実用での位置づけ

パイプライン並列はノード間の通信量がテンソル並列より少ないため、ノード間の並列化に適しています。大規模学習では、ノード内でテンソル並列、ノード間でパイプライン並列とデータ並列を組み合わせた3D並列が標準的な構成となっています。