2026年11月15日(日) 記事を探す決算カレンダー広告掲載このサイトについて
トップ › 仕組み
仕組み

パイプライン並列とは 層の並びをGPUに割り振る流れ作業、Llama 3は16段に分割

パイプライン並列は、モデルの層を前後の区間に分けてGPUに割り振り、工場の流れ作業のように学習させる方法です。メタはLlama 3 405Bの学習で、モデルを16の区間に分けました。

ポイント
  • パイプライン並列は、モデルの層の並びを区間に分け、それぞれを別のGPUに受け持たせる方法です。
  • データを小さな束(マイクロバッチ)に分けて次々に流し、GPUが同時に働けるようにします。
  • 流れ始めと終わりにGPUが手持ちぶさたになる時間を「バブル(泡)」と呼び、減らす工夫が続いています。
  • グーグルの研究者は2018年のGPipeで、60億個の重みの翻訳モデルを学習しました。

言語モデルは、同じ形の層を何十、何百と積み重ねた構造です。パイプライン並列では、この層の並びを前から順にいくつかの区間(ステージ)に分け、区間ごとに別のGPUを割り当てます。データは1つ目のGPUから2つ目、3つ目へと渡っていきます。

小分けにして流す

データを丸ごと1回で流すと、2つ目のGPUは1つ目の計算が終わるまで待つしかありません。そこで、データを小さな束(マイクロバッチ)に分けます。1つ目のGPUが最初の束を渡したら、すぐ次の束に取りかかります。工場の流れ作業と同じで、しばらくすると全GPUが同時に別々の束を処理する状態になります。

ただ、流し始めは後ろのGPUが待ち、流し終わりは前のGPUが待ちます。この空き時間がバブルです。メタの論文は、バブルの比率を「(区間の数−1)÷(1つのGPUが受け持つ区間の数×束の数)」と示しています。

バブルの比率の例(メタの論文の式で計算)
区間の数1つのGPUが受け持つ区間束の数バブルの比率(計算)
41837.5%
42818.75%
41329.4%

束を増やすか、1つのGPUに飛び飛びの区間を複数受け持たせる(インターリーブ)と、バブルは小さくなります。

GPipeから始まった

グーグルの研究者が2018年に公表した「GPipe」は、層の並びとして書けるモデルなら何でも複数の半導体に分けられる仕組みでした。論文の要旨によると、5億5,700万個の重みの画像認識のモデルを学習し、画像分類の試験で84.4%の正解率を出しました。100を超える言語を扱う128層・60億個の重みの翻訳モデルも学習しています。分ける数を増やしても、速さはほぼ比例して伸びたとしています。

Llama 3での工夫

メタはLlama 3 405Bの学習で、パイプライン並列の数を16にしました。論文は、既存のやり方の3つの問題を挙げています。束の数が区間の数で割り切れる必要があったこと、最初の区間にメモリが偏ること、最後の区間に損失の計算が集中することです。

メタは、1つのGPUが続けて処理する束の数を自由に変えられるよう組み直しました。最初と最後の区間からは層を1つずつ減らし、負荷をならしました。区間の間のデータの受け渡しは、計算と並行して進める形に変えています。これらの工夫で、8,000語の長さの文章を、途中結果を捨てて計算し直す節約の手段(活性化チェックポイント)を使わずに学習できたといいます。

PyTorchの側の改良もあります。2026年10月28日の2.15版では、受け取り用のメモリを必要な直前にだけ確保するなど、パイプライン並列のメモリの使い方を減らしました。

関連する用語

  • マイクロバッチ:データを小分けにした束。
  • バブル:パイプラインの始めと終わりに出るGPUの空き時間。
  • テンソル並列:層の中の行列を割る、別の分け方。
  • 活性化チェックポイント:途中の結果を捨て、必要な時に計算し直してメモリを節約する方法。

Llama 3の学習では、パイプライン並列とデータ並列は複数段のネットワークをまたいで通信し、遅れは数十マイクロ秒に達しました。

この記事は公開資料をもとに作成しています。売買をすすめるものではありません。誤りを見つけたら訂正します(編集方針)。

関連する記事