ホームページ > 記事 > テクノロジー周辺機器 > OpenAI: 大規模なニューラル ネットワークをトレーニングするための 4 つの基本的な方法
この記事は Lei Feng.com から転載されたものです。転載する必要がある場合は、Lei Feng.com の公式 Web サイトにアクセスして許可を申請してください。
大規模ニューラル ネットワークは、現在の人工知能分野で注目されているトピックの 1 つです。では、大規模なモデルをトレーニングするにはどうすればよいでしょうか?
最近、大規模事前トレーニング モデル GPT-3 を発表した OpenAI は、GPU に基づいたメモリ節約型の 4 つの並列トレーニング方法を紹介するブログ投稿を公開しました。
# 注: 3 層モデルのさまざまな並列戦略。各色は 1 つの層を表し、点線は異なる層を区切ります。 GPU。
「データ並列トレーニング」とは、同じパラメータを複数の GPU (「ワーカー」と呼ばれることが多い) にコピーすることを意味します。そして同時に処理するために各 GPU に異なるサンプルを割り当てます。
データ並列処理だけを行う場合、モデルを 1 つの GPU メモリに適合させる必要がありますが、計算に複数の GPU を利用する場合、パラメータの複数のコピーを保存するコストがかかります。ただし、そうは言っても、使用の合間にパラメータを CPU メモリに一時的にオフロードするなど、GPU で利用できる有効な RAM を増やす戦略はあります。
各データ パラレル ワーカーがパラメーターのコピーを更新するとき、各ワーカーが引き続き同様のパラメーターを保持できるように相互に調整する必要があります。最も簡単な方法は、ワーカー間に「通信のブロック」を導入することです:
##ステップ 1: 各ワーカーの勾配を個別に計算します;
ステップ 2 : 異なるワーカーの勾配を平均します;
ステップ 3: 各ワーカーで同じ新しいパラメータを独立して計算します。
ステップ 2 は、大量のデータ (ワーカー数とパラメータ サイズの積に比例) の転送を必要とするブロッキング平均であり、トレーニングのスループットに悪影響を与える可能性があります。この損失を排除できるさまざまな非同期同期スキームがありますが、学習効率が犠牲になるため、実際には、一般に同期方式に固執します。
パイプライン並列トレーニングでは、研究者はモデルの連続ブロックを GPU に分割し、各 GPU はわずかに小さいパラメータのセットが保存されるため、同じモデルに対して各 GPU が比例して消費するメモリが少なくなります。
大規模なモデルを連続したレイヤーのチャンクに分割するのは簡単ですが、レイヤーの入力と出力の間には連続した依存関係があるため、ワーカーは前のマシンの出力を待ちます。単純な実行を入力として使用すると、大量のアイドル時間が発生する可能性があります。これらの待機時間のブロックは「バブル」と呼ばれ、アイドル状態のマシンによって完了する可能性がある無駄な計算です。
#キャプション: モデルが垂直に 4 つのパーティションに分割されている単純なパイプライン並列セットアップの図。ワーカー 1 はレイヤー 1 (入力に最も近い) のモデル パラメーターをホストし、ワーカー 4 はレイヤー 4 (出力に最も近い) をホストします。 「F」、「B」、および「U」は、それぞれ順方向、逆方向、および更新操作を表します。添え字は、操作を実行するワーカーを示します。逐次的な依存関係により、データは一度に 1 人のワーカーによって処理され、その結果、大きなアイドル時間の「バブル」が発生します。 データ並列処理の考え方を再利用して、各ワーカーが一度にデータ要素のサブセットのみを処理できるようにすることで、タイム バブルの生成コストを削減し、新しい計算を待機時間と巧みにオーバーラップさせることができます。中心的なアイデアは、バッチを複数のマイクロバッチに分割することで、各マイクロバッチの処理が比例して速くなり、次のマイクロバッチが利用可能になるとすぐに各ワーカーが作業を開始するため、パイプラインの実装が高速化されるというものです。十分なマイクロバッチがあれば、ステップの開始時と終了時の「バブル」を最小限に抑えながら、ワーカーをほとんどの時間で利用できます。勾配はマイクロバッチ全体で平均化され、パラメーターはすべてのマイクロバッチが完了した後にのみ更新されます。 モデルに分割されたワーカーの数は、「パイプラインの深さ」と呼ばれることがよくあります。 前方パス中、ワーカーはレイヤー ブロックの出力 (「アクティブ化」と呼ばれる) のみを次のワーカーに送信します。逆方向パス中は、アクティブ化されたグラデーションのみを送信します。前のワーカーに送信されます。これらのチャネルを配置する方法と、マイクロバッチ全体の勾配を集約する方法には、大きな設計余地があります。たとえば、GPipe メソッドでは、各ワーカー プロセスが継続的に前方および後方パスを実行し、最後に複数のマイクロバッチからの勾配を同期的に集計しますが、PipeDream では、各ワーカーが前方パスと後方パスを交互に処理するように調整されます。 注: GPipe と PipeDream パイプライン ソリューションの比較では、各バッチで 4 つのマイクロプロセッサ バッチが使用されます。マイクロバッチ 1 ~ 8 は、連続する 2 つのデータ バッチに対応します。図中の「番号」はどのマイクロバッチを操作するかを示し、添え字はワーカーIDを示します。 PipeDream は、古いパラメーターを使用して一部の計算を実行することで、より高い効率を実現していることに注意してください。 パイプライン並列処理は、モデルを層ごとに、または層内で「垂直に」分割します。特定の操作を分割します。 「水平方向」は、多くの場合、テンソル トレーニングと呼ばれます。 多くの最新モデル (例: Transformer) では、アクティベーション バッチ行列と大きな重み行列を乗算することが計算上のボトルネックになります。行列の乗算は、行と列のペア間のドット積として考えることができます。ドット積は異なる GPU で個別に計算することも、ドット積の各部分を異なる GPU で計算して結果を合計することもできます。戦略に関係なく、重み行列を均等なサイズの「シャード」に分割し、各シャードを異なる GPU でホストし、結果を結合するために伝達する前に、そのシャードを使用して行列積全体の関連部分を計算できます。 一例は Megatron-LM です。これは、Transformer のセルフアテンション層と MLP 層内で行列の乗算を並列化します。 PTD-P はテンソル、データ、およびパイプラインの並列処理を使用し、そのパイプライン スケジューリングは複数の個別のレイヤーを各デバイスに割り当てて、ネットワーク通信の増加を犠牲にしてバブル損失を削減します。 ネットワーク入力は、相互通信に比べて高度な並列計算を使用して、次元を超えて並列化できる場合があります。シーケンス並列処理とは、入力シーケンスを時間的に複数のサブサンプルに分割し、よりきめの細かいサンプルで計算を継続できるようにすることで、ピークのメモリ消費を比例的に削減するという考え方です。 専門家混合 (MoE) 方式を使用すると、ネットワークのごく一部のみが使用されます任意の 1 つの入力の出力を計算します。 アプローチ例の 1 つは、複数の重みセットを用意し、ネットワークがゲーティング メカニズムを通じて推論時にどのセットを使用するかを選択できることです。これにより、計算量を増やすことなく、より正確な重みセットを使用できるようになります。コスト、複数のパラメータ。重みの各セットは「エキスパート」と呼ばれ、ネットワークが各エキスパートに特殊な計算とスキルを割り当てる方法を学習することが期待されています。異なるエキスパートが異なる GPU をホストできるため、モデルに使用される GPU の数を拡張する明確な方法が提供されます。 図: ゲート型ネットワークは、n 人の専門家から 2 人だけを選択します。 GShard は、MoE Transformer のパラメータを 6,000 億のパラメータに拡張します。ここで、MoE レイヤーのみが複数の TPU デバイスに分割され、他のレイヤーは完全に複製されます。 Switch Transformer は、1 つの入力を 1 つのエキスパートにルーティングすることで、モデル サイズをより高いスパース性で数兆個のパラメーターに拡張します。 ますます大規模なニューラル ネットワークのトレーニングを容易に扱うことができる計算戦略は他にもたくさんあります。例: 勾配を計算するには、元のアクティベーションを保存する必要があり、デバイスの RAM を大量に消費します。チェックポインティング (アクティベーションの再計算とも呼ばれます) は、アクティベーションのサブセットを保存し、バックワード パス中に中間アクティベーションを適時に再計算し、最大 1 回の完全なフォワード パスの追加の計算コストで大幅なメモリを節約します。また、再計算を選択的にアクティブ化することで、計算コストとメモリ コストを継続的にトレードオフすることもできます。再計算とは、ストレージ コストが比較的高いが計算コストが低いアクティベーションのサブセットをチェックすることです。 混合精度トレーニングでは、より低い精度の数値 (最も一般的には FP16) を使用してモデルをトレーニングします。最新のアクセラレータは、より低い精度の数値を使用してより高い FLOP カウントを達成し、デバイスの RAM を節約することもできます。適切に注意すれば、実質的に精度を損なうことなくモデルを作成できます。 オフロードとは、未使用のデータを CPU または異なるデバイス間で一時的にオフロードし、必要に応じて読み戻すことです。単純な実装ではトレーニングの速度が大幅に低下しますが、高度な実装ではデータがプリフェッチされるため、デバイスは待つ必要がありません。このアイデアの実装の 1 つが ZeRO です。ZeRO は、パラメーター、勾配、およびオプティマイザーの状態を使用可能なすべてのハードウェアにわたって分割し、必要に応じて具体化します。 メモリ効率の高いオプティマイザ メモリ効率の高いオプティマイザは、Adafactor などのオプティマイザによって維持される実行状態のメモリ フットプリントを削減するために提案されています。 圧縮は、中間結果をネットワークに保存するためにも使用できます。たとえば、Gist はバックワード パス用に保存されたアクティベーションを圧縮し、DALL-E は勾配を同期する前に圧縮します。
3
Tensor Parallel
4
専門家混合 (MoE)
5 その他のメモリ節約設計
以上がOpenAI: 大規模なニューラル ネットワークをトレーニングするための 4 つの基本的な方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。