大規模なニューラル ネットワーク PlatoBlockchain データ インテリジェンスをトレーニングするためのテクニック。垂直検索。あい。

大規模なニューラルネットワークをトレーニングするためのテクニック

大規模なニューラルネットワークをトレーニングするためのテクニック

大規模なニューラルネットワークは、AIの最近の多くの進歩の中核ですが、それらのトレーニングは、単一の同期計算を実行するためにGPUのクラスターを調整する必要がある、エンジニアリングと研究の難しい課題です。 クラスターとモデルのサイズが大きくなるにつれて、機械学習の実践者は、多くのGPUでモデルトレーニングを並列化するためのさまざまな手法を開発してきました。 一見、これらの並列処理手法を理解するのは困難に思えるかもしれませんが、計算の構造に関するいくつかの仮定だけで、これらの手法ははるかに明確になります。その時点で、ネットワークのようにAからBへの不透明なビットを往復しているだけです。パケットの周りのシャトルを切り替えます。

データの並列性

大規模なニューラルネットワークをトレーニングするためのテクニック

パイプラインの並列処理

大規模なニューラルネットワークをトレーニングするためのテクニック

テンソル並列処理

大規模なニューラルネットワークをトレーニングするためのテクニック

エキスパート並列処理

大規模なニューラルネットワークをトレーニングするためのテクニック

データの並列性

大規模なニューラルネットワークをトレーニングするためのテクニック

パイプラインの並列処理

大規模なニューラルネットワークをトレーニングするためのテクニック

テンソル並列処理

大規模なニューラルネットワークをトレーニングするためのテクニック

エキスパート並列処理

大規模なニューラルネットワークをトレーニングするためのテクニック

XNUMX層モデルでのさまざまな並列処理戦略の図。 各色はXNUMXつのレイヤーを表し、破線は異なるGPUを区切ります。

並列処理なし

ニューラル ネットワークのトレーニングは反復的なプロセスです。すべての反復で、モデルのパスフォワードを実行します。 データのバッチ内の各トレーニング例の出力を計算します。 その後、別のパスが進みます 後ろ向き レイヤーを介して、各パラメーターが最終出力にどの程度影響するかを計算することにより、 勾配 各パラメータに関して。 バッチ、パラメーター、およびパラメーターごとの最適化状態の平均勾配は、次のような最適化アルゴリズムに渡されます。 アダム、次の反復のパラメーター (データのパフォーマンスがわずかに向上するはずです) とパラメーターごとの新しい最適化状態を計算します。トレーニングがデータのバッチに対して反復されるにつれて、モデルは進化して、ますます正確な出力を生成します。

さまざまな並列処理手法により、このトレーニングプロセスがさまざまな次元にまたがってスライスされます。

  • データの並列処理-バッチのさまざまなサブセットをさまざまなGPUで実行します。
  • パイプラインの並列処理-モデルのさまざまなレイヤーをさまざまなGPUで実行します。
  • テンソル並列処理—行列の乗算などの単一の演算の計算を分割してGPU間で分割します。
  • Mixture-of-Experts-各レイヤーの一部のみで各例を処理します。

(この投稿では、ニューラル ネットワークのトレーニングに GPU を使用していることを前提としますが、他のものを使用する場合にも同じ考えが当てはまります。 ニューラルネットワークアクセラレータ.)

データの並列性

データ並列 トレーニングとは、同じパラメータを複数の GPU (「ワーカー」と呼ばれることが多い) にコピーし、同時に処理されるようにそれぞれに異なるサンプルを割り当てることを意味します。データ並列処理だけを行う場合でも、モデルが 1 つの GPU のメモリに収まる必要がありますが、パラメーターの重複したコピーを多数保存するという犠牲を払って、多くの GPU のコンピューティングを利用できます。そうは言っても、使用の合間にパラメータを CPU メモリに一時的にオフロードするなど、GPU で利用できる有効な RAM を増やす戦略はあります。

各データ並列ワーカーがパラメーターのコピーを更新するとき、各ワーカーが引き続き同様のパラメーターを持つように調整する必要があります。 最も簡単なアプローチは、ワーカー間の通信をブロックすることです。(1)各ワーカーの勾配を個別に計算します。 (2) 労働者全体の勾配を平均化する; (3)各ワーカーで同じ新しいパラメーターを個別に計算します。 ステップ(2)はブロッキング平均であり、かなりの量のデータ(ワーカーの数にパラメーターのサイズを掛けたものに比例)を転送する必要があり、トレーニングのスループットを損なう可能性があります。 いろいろあります 非同期同期スキーム このオーバーヘッドを取り除くために、しかしそれらは学習効率を傷つけます。 実際には、人々は一般的に同期アプローチに固執します。

パイプラインの並列処理

パイプライン並列 トレーニングでは、モデルのシーケンシャルチャンクをGPU間で分割します。 各GPUはパラメーターのごく一部しか保持しないため、同じモデルがGPUごとに消費するメモリは比例して少なくなります。

大きなモデルを連続したレイヤーのチャンクに分割するのは簡単です。 ただし、レイヤーの入力と出力の間には順次依存関係があるため、単純な実装では、ワーカーが前のマシンからの出力が入力として使用されるのを待つ間、大量のアイドル時間が発生する可能性があります。 これらの待機時間チャンクは「バブル」と呼ばれ、アイドリングマシンで実行できる計算を無駄にします。

大規模なニューラルネットワークをトレーニングするためのテクニック フォワード
大規模なニューラルネットワークをトレーニングするためのテクニック 後ろ向き
大規模なニューラルネットワークをトレーニングするためのテクニック グラデーションの更新
大規模なニューラルネットワークをトレーニングするためのテクニック アイドル
大規模なニューラルネットワークをトレーニングするためのテクニック

モデルがレイヤーごとに4つのパーティションに垂直に分割されている単純なパイプライン並列設定の図。 ワーカー1はネットワークの最初のレイヤー(入力に最も近い)のモデルパラメーターをホストし、ワーカー4はレイヤー4(出力に最も近い)をホストします。 「F」、「B」、および「U」は、それぞれ順方向、逆方向、および更新操作を表します。 下付き文字は、操作が実行されるワーカーを示します。 順次依存関係があるため、データは一度にXNUMX人のワーカーによって処理され、アイドル時間の大きな「バブル」が発生します。

データ並列処理のアイデアを再利用して、各ワーカーが一度にデータ要素のサブセットのみを処理するようにすることでバブルのコストを削減し、新しい計算と待機時間を巧みにオーバーラップさせることができます。 中心的なアイデアは、XNUMXつのバッチを複数のマイクロバッチに分割することです。 各マイクロバッチの処理は比例して高速である必要があり、各ワーカーは利用可能になるとすぐに次のマイクロバッチの作業を開始するため、パイプラインの実行が迅速化されます。 十分なマイクロバッチがあれば、ほとんどの場合、ステップの開始時と終了時に最小限の気泡で作業者を利用できます。 勾配はマイクロバッチ全体で平均化され、パラメーターの更新は、すべてのマイクロバッチが完了した後にのみ行われます。

モデルが分割されるワーカーの数は、一般に次のように知られています。 パイプラインの深さ.

フォワードパスの間、ワーカーはレイヤーのチャンクの出力(アクティベーションと呼ばれる)を次のワーカーに送信するだけで済みます。 バックワードパス中は、これらのアクティベーションのグラデーションのみを前のワーカーに送信します。 これらのパスをスケジュールする方法と、マイクロバッチ全体の勾配を集約する方法については、大きな設計スペースがあります。 Gパイプ 各ワーカーが順方向と逆方向のパスを連続して処理し、最後に複数のマイクロバッチからの勾配を同期的に集約します。 夢物語 代わりに、各ワーカーが順方向パスと逆方向パスを交互に処理するようにスケジュールします。

大規模なニューラルネットワークをトレーニングするためのテクニック フォワード
大規模なニューラルネットワークをトレーニングするためのテクニック 後ろ向き
大規模なニューラルネットワークをトレーニングするためのテクニック アップデイト
大規模なニューラルネットワークをトレーニングするためのテクニック アイドル
Gパイプ

大規模なニューラルネットワークをトレーニングするためのテクニック

夢物語

大規模なニューラルネットワークをトレーニングするためのテクニック

バッチごとに4つのマイクロバッチを使用したGPipeとPipeDreamのパイプラインスキームの比較。 マイクロバッチ1〜8は、XNUMXつの連続するデータバッチに対応します。 画像の「(number)」は、どのマイクロバッチで操作が実行されるかを示し、下付き文字はワーカーIDを示します。 PipeDreamは、古いパラメーターを使用していくつかの計算を実行することにより、より効率的になることに注意してください。

テンソル並列処理

パイプライン並列処理では、モデルがレイヤーごとに「垂直に」分割されます。レイヤー内の特定の操作を「水平に」分割することもできます。これは通常、 テンソル平行 トレーニング。 多くの最新モデル( トランスフォーマー)、計算のボトルネックは、アクティベーションバッチマトリックスに大きな重みマトリックスを掛けることです。 行列乗算 行と列のペア間のドット積として考えることができます。異なる GPU で独立したドット積を計算したり、異なる GPU で各ドット積の一部を計算して結果を合計したりすることが可能です。どちらの戦略でも、重み行列を均等なサイズの「シャード」にスライスし、各シャードを別の GPU でホストし、そのシャードを使用して行列積全体の関連部分を計算してから、後で通信して結果を組み合わせることができます。

一例です メガトロンLM、Transformer のセルフアテンション層と MLP 層内で行列の乗算を並列化します。 PTD-P テンソル、データ、パイプラインの並列処理を使用します。 そのパイプラインスケジュールは、各デバイスに複数の非連続層を割り当て、ネットワーク通信の増加を犠牲にしてバブルのオーバーヘッドを削減します。

ネットワークへの入力は、相互通信に比べて高度な並列計算を使用して、次元全体で並列化できる場合があります。 シーケンスの並列処理 これはそのようなアイデアのXNUMXつであり、入力シーケンスが時間全体で複数のサブ例に分割され、より詳細なサイズの例で計算を進めることができるため、ピークメモリ消費量が比例して減少します。

専門家の混合(MoE)

専門家の混合(MoE) このアプローチでは、ネットワークのごく一部のみが、任意のXNUMXつの入力の出力を計算するために使用されます。 アプローチの例のXNUMXつは、重みのセットを多数持つことであり、ネットワークは、推論時にゲーティングメカニズムを介して使用するセットを選択できます。 これにより、計算コストを増やすことなく、より多くのパラメータを使用できます。 ネットワークが各専門家に専門的な計算とスキルを割り当てることを学習することを期待して、重みの各セットは「専門家」と呼ばれます。 さまざまなエキスパートをさまざまなGPUでホストできるため、モデルに使用されるGPUの数を明確にスケールアップできます。

大規模なニューラルネットワークをトレーニングするためのテクニック

専門家の混合(MoE)レイヤーの図。 のうち2つだけ n 専門家はゲーティングネットワークによって選ばれます。 (から適応された画像: Shazeer et al。、2017)

GSハード MoEトランスフォーマーを最大600億のパラメーターにスケーリングし、MoEレイヤーのみが複数のTPUデバイスに分割され、他のレイヤーが完全に複製されるスキームを使用します。 スイッチトランスフォーマー XNUMXつの入力をXNUMX人のエキスパートにルーティングすることにより、モデルサイズを数兆のパラメーターにスケーリングします。

その他のメモリ節約設計

ますます大規模なニューラルネットワークのトレーニングをより扱いやすくするための計算戦略は他にもたくさんあります。 例えば:

  • グラデーションを計算するには、元のアクティベーションを保存しておく必要があります。これにより、デバイスのRAMが大量に消費される可能性があります。 チェックポイント (アクティベーション再計算とも呼ばれます)は、アクティベーションのサブセットを格納し、バックワードパス中に中間のサブセットをジャストインタイムで再計算します。 これにより、多くのメモリが節約されますが、最大でXNUMXつの追加のフルフォワードパスの計算コストがかかります。 コンピューティングコストとメモリコストの間で継続的にトレードオフすることもできます。 選択的アクティベーション再計算、これは、保存に比較的費用がかかるが計算に費用がかからないアクティベーションのサブセットをチェックポイントします。

  • 混合精密トレーニング 低精度の数値を使用してモデルをトレーニングすることです(最も一般的には FP16)。 最新のアクセラレータは、精度の低い数値ではるかに高いFLOPカウントに達する可能性があり、デバイスのRAMも節約できます。 適切な注意を払えば、結果のモデルはほとんど精度を失う可能性があります。

  • オフロード 未使用のデータをCPUまたはさまざまなデバイス間で一時的にオフロードし、後で必要に応じて読み戻すことです。 ナイーブな実装ではトレーニングが大幅に遅くなりますが、高度な実装ではデータがプリフェッチされるため、デバイスはデータを待機する必要がありません。 このアイデアのXNUMXつの実装は ゼロ これは、パラメーター、グラデーション、およびオプティマイザーの状態を使用可能なすべてのハードウェアに分割し、必要に応じてそれらを具体化します。

  • メモリ効率の高いオプティマイザ オプティマイザによって維持される実行状態のメモリ使用量を削減することが提案されています。、 といった アダファクター.

  • 圧縮 また、ネットワークに中間結果を保存するために使用することもできます。 例えば、 要旨 バックワードパス用に保存されたアクティベーションを圧縮します。 DALL・E グラデーションを同期する前に、グラデーションを圧縮します。


OpenAI では、基盤となるインフラストラクチャから現実世界の問題への展開に至るまで、大規模なモデルのトレーニングと改善を行っています。この投稿のアイデア (特にスケーリング チームと応用研究チームに関連するアイデア) を実践したい場合は、私たちがサポートします。 雇用!


謝辞
ドラフトに関するフィードバックをくださった Nikolas Tezak、Sam Altman、Daniel Gackle、Ilya Sutskever、Steven Adler に感謝します。コミュニケーションとデザインについては、Justin Jay Wang、Bianca Martin、Steve Dowling に感謝します。

タイムスタンプ:

より多くの OpenAI