大規模ニューラルネットワークのトレーニングの概要

 

AバックMicrosoftのオープンソースは、トレーニングフレームワークをがdeepspeedながら、ビューのテストポイントから10倍の速さがあるが、また、最適化のさまざまなメモリのために、最大値は100B(illion)モデルパラメータを訓練することができます。また、図17(​​b)モデルチューリング-NLG、現在のトーナメントでトップトレンチの研修体制を発表しました。

トレーニングモデル100Bは今でもオンラインのBERTベースのトレーニング良いの、(犬の頭)最初の最初の110Mを考えることはありません。本論文では、次のような状況のため、速度とメモリの最適化戦略のモデルの訓練を説明します。

  1. 私は明日返信、今日これらの10フィニッシュをテストする必要があります

  2. ハード私のモデルいくつかの大きなは、私はN + 1を得ることができ、トレーニングの完了前に、カード上億個のサンプルを置くために

  3. 私は素晴らしいT6モデルを思い付いたが、12ギガバイトのカードにロードされていないが、また今年のベスト紙を得ます

(上記純粋に架空であり、任意の類似性は、迅速に以下を参照してください)

:現実には、実際には、大規模な鉄道模型の2つだけの要因を制限し、常に残酷である時間と空間(= GPU =お金)を、以下のように使用することができ、プログラムの状況に応じて:

1.グラデーション蓄積グラデーション蓄積

唯一のシングルカード、およびモデルをロードするかもしれないが、それは限られたバッチ勾配蓄積することができた場合は、逆の後方パラメータ回更新されるN回の前に、バッチサイズのN倍の拡大に対応します。

通常のトレーニングのコードは次のとおりです。

for i, (inputs, labels) in enumerate(training_set):
  loss = model(inputs, labels)              # 计算loss
  optimizer.zero_grad()								      # 清空梯度
  loss.backward()                           # 反向计算梯度
  optimizer.step()                          # 更新参数

蓄積された勾配を添加した後:

for i, (inputs, labels) in enumerate(training_set):
  loss = model(inputs, labels)                    # 计算loss
  loss = loss / accumulation_steps                # Normalize our loss (if averaged)
  loss.backward()                                 # 反向计算梯度,累加到之前梯度上
  if (i+1) % accumulation_steps == 0:
      optimizer.step()                            # 更新参数
      model.zero_grad()                           # 清空梯度

なお、バッチの拡大、あなたは重みが等しいサンプル、保持したい場合は学習率だけでなく、直線的にまたは適切な調整を展開します追加でbatchnormも影響を受けることになります確かに、正確な大規模なバッチとして、あなたは溶液中の[2]をパラメータBNの勢いを調整することができない、小ロットでの平均と分散を。

2.チェックポイントグラデーショングラデーションチェックポイント

1枚のカードだけが、大きなトレーニングモデルが必要な場合は、モデルによって占有されていたメモリを圧縮しようとすることができます。

チェックポイントは、空間、活性値を減少させることによって、保存されたモデルの圧縮空間の勾配時間の方法であるが、勾配の計算に再計算活性値を記憶されてはなりません。

詳細はサブリニアメモリコスト[3]でChentianチートレーニングディープネットを参照することができます。

 

注:最初の行が前方ノードであり、2行目は逆であります

3.ミックスミックス精密トレーニング精密トレーニング

ブレンド精度を訓練することは、シングルカード、マルチカード、リフティング演算効率計算half2のCUDA型で使用することができます。浮動小数点型のhalf2 2 FP16に格納された所望の速度がFP16に二倍FP32であるので、動作中に実質的に同時に行うことができます栗のGelu FP16の最適化のために:

//FP32的gelu运算float gelu(float x)
{
  float cdf = 0.5f * (1.0f + tanhf((0.7978845608028654f * (x + 0.044715f * x * x * x))));
  return x * cdf;
}
//FP16的gelu运算half2 gelu(half2 val)
{
  half2 val_pow3 = __hmul2(val, __hmul2(val, val)); //同时计算两个x*x*x
  float2 tmp_pow = __half22float2(val_pow3);
  float2 cdf =  __half22float2(val);
  //由于tanhf不支持half2类型,只能分开算
  cdf.x = 0.5f * (1.0f + tanhf((0.7978845608028654f * (cdf.x + 0.044715f * tmp_pow.x))));
  cdf.y = 0.5f * (1.0f + tanhf((0.7978845608028654f * (cdf.y + 0.044715f * tmp_pow.y))));
  //同时计算两个x * cdf;return __hmul2(val, __float22half2_rn(cdf));
}

精密研修[5]を混合することは理解することは難しいことではありませんが、以下の点に注意します:

  1. 精密訓練を混合することは、単にFP16の唯一の80%は、精度の損失を引き起こす可能性があり、それを計算するためにFP32 FP16に変身されていません

  2. 損失スケーリング:勾配の値がオーバーフローして、非常に小さいのでFP16、FP32は、したがって、第一の記憶喪失および増幅するので、勾配をも増幅することができることは、記憶されてもよいFP16と、FP32更新が再スケーリングとなるであろう

  3. それが蓄積操作などBatchNormになると、ソフトマックス、オーバーフローでFP16は、FP32を保存する必要性は一般的にGPU TensorCoreのFP16 * FP16 + FP32 = FP32演算を使用します

全体的なプロセス:FP32重量 - > FP16重み - FP32が展開>損失 - - >プレFP16が算出される> FP16ターン - > FP16逆勾配計算は、 - >勾配更新を重FP32の重量をスケーリング

ハンド分割ライン:次のステップは、トラックを捨てることです!

4.分散訓練分散トレーニング

分散型トレーニングは複数のカードの平行訓練は、一般的に次の2つの状況があります:

  • マルチGPU:単一のマルチカード、PCIEによって、NVlink、GPUの直接P2P通信に

  • GPU直接RDMA通信とマルチマシンカード、​​ソケットが(イーサネット)またはインフィニバンド:マルチノード

実際には、フレームはNCCL NVIDIA通信を用いてもよいし、複数のマシンの通信速度は、IB(インフィニバンド)を介して機械の[6]を近づけることができます。言うべきではない、物事の一番下(私は理解していない)、実際には、ヘルプ検索操作や保守、およびリスト手段にオープンソースのフレームワークの構成サーバーアドレスに父である錬金術師のため。

パラレルトレーニングを最適化するには、いくつかの戦略がありますが、主な目的は、パラメータ算出同期(シンク)とのデータ転送を削減することです。

現在までの32ギガバイトのカードに、あなたがそうでなければ、トレーニングのために別のマシン上で異なる層を置くことができ、並列にデータを使用することができ、下詰め、モデル1.3Bのパラメータを置きます。それを理解する[7]の二つの方法の間に、図のfacie差:

4.1データのパラレルデータの並列

二つの方法があり、並列データ[9]。

パラメータサーバー

新しいパラメータは、作業者に放送した後、クラスタは、算出した勾配、マスターの更新パラメータを計算する統一されたすべてのノードを待機するマスタと複数のワーカー、マスターする必要があります。勾配が新しいパラメータに適用されます後のマスターで、このように主なボトルネックは、そのためもあり、非同期トレーニング、他のノードを待っていない、勾配パラメータの更新後に受信した労働者が、古いパラメータに関するこの他のワーカー取得することができあまりにも遠く、サブ最適なソリューションへの結果の最適化モデル。

リングオール削減

すべてのクラスタ作業員が自宅勾配を受けながら、次のホームに渡された勾配の蓄積良いの計算の終了を入れ、データはKの部分に分割され、閉ループを形成し、反復勾配労働者は、最後のすべて等しく、同期させることができています更新パラメータは、PSより効率的なアーキテクチャであるためには、それが今の主流の方法です。図低い[10]やショーはすべて、2つのステージを収集削減散乱。

試写

4.2モデルの並列モデル並列

多くの各活性化勾配値の損失の広がりを逆にする必要性などのパラレルデータより通信オーバーヘッドが戻されているため、ほとんどのモデルは、第二のサンプルの数にフィットされ、そしてため、並列モデルは、最初の一枚のカード、現在一般的ではありませんその後、多くのがありますが、大きな値を活性化させます。

パイプライン並列処理

順次フォワードおよびリバース計算するための異なるマシン、にモデルの異なる層へのパイプライン並列方法。誰もがどのような彼らの考え方を整理するために19年のGoogleとMicrosoftは、[12]の論文とソースコードをGPipe [11]とPipeDreamをリリースしました:

並列で最も素朴なモデルではまず見て、それが人生のいくつかの廃棄物です:

注:リバース活性化パラメータおよび値の偏導関数を計算するために必要な、より長いを取ります。

allreduceとして計算されるように、改良され、実際には、データスライスを提案しているGoogleのGPipeはそうでは、それのいくつかは、次のノードに渡さ終え、最後の同期更新パラメータが、それでもそのように私たちの若者保存それを見ることはできません。

PipeDreamが、実際には、作られたマイクロソフトだから同期が小さい上、非同期データとなり:すぐに逆方向データスライスの、完全な計算、アップデートを超える逆勾配、彼はその誰も、誰もが狂ったドライアップ

しかし、人々は混乱に乗るような問題がある、前方パラメータ5の計算に使用されるそのようなworker1は、1の後に逆転5が、勾配パラメータの計算は長い逆2/3された後にされました/ 4更新。著者が参加しましたので、スタッシュ重量メカニズムを、パラメータに対応する各データは、最大保存されます!Worker1あなたは5逆の更新の前の宝箱からのパラメータを考え出すことができるように:

その質問は再び:前方worker1 5上のパラメータ1ですが、worker3は3で、最終的な概要は混乱をオンにする時ではないでしょうか?著者が参加しているように、垂直同期の計算ですべての労働者を強制するためのメカニズムを、彼らは5パラメータ1のとき。ときの最終まとめモデルということだから、あなたは同じパラメータを取得することができます。しかし、この同期は、1回の更新の5重量と同様に空隙を、計算の多くを引き起こす可能性があるが、デフォルトは、垂直同期になるように、各層ながら正確に同じではないではないので2/3/4重量は、白計算されるが、なぜなら重量スタッシュ、すべてのパラメータが有効です。

テンソルスライス

ニューラルネットワークは複雑な関数とみなすことができ、本質的には、様々なテンソル間で計算され、我々は良いCNNのセットを定義し、RNNは、実際のコンピューティング機能です。この観点から考えるために、モデルは、実際には別のマシンに分散し、各テンソル計算に平行ですこの分野での研究18歳FlexFLowとメッシュTensorFlow、Nvidiaのメガトロン[13]また、この戦略を使用します。例の下には変圧器を分割する方法を説明します。

主にY = GLUE(XA)のための第一の層に自己注目とFFN、FFNからなる変圧器は、2つの方法で解決することができます。

メガトロンテンソルは、第2の実施形態をスライスして行うので、同期させるために第1の演算GLUEの必要性を見ることができる、自己注目はまたように、同様の戦略を使用した場合にのみ、逆重合Gを介して第一重合によるfは指定できます

残りLayernormドロップアウトや計算を同期する必要があります。

一方、著者はまた、埋め込みの単語寸法は、カットポイントされ、そしてMLM予測及びクロスエントロピーの最後ただけターンパスBATCH_SIZE後、転送BATCH_SIZE * seq_len * vocab_size A PROBへのネットワークトラフィック(または必要性を低減するために一緒に融合しました*)損失値をseq_len。

成長しているモデルでは、分散しても推論を訓練することは確かに工学の傾向で、多くのポイントだけでなく、分散戦略は、ネットワークトラフィックの最適化、メモリの最適化だけでなく、上記の最適化することができますがあります。

加速オプティマイザLAMB

上記パラレルデータは、ほぼ直線的にトレーニング速度を向上させることができますが、あまりにも多くのバッチモデルの精度と収束速度(データへの貧弱なフィットを)減らすことができますが。Googleのように、19年後に[14]オプティマイザと呼ばれるLAMBを立ち上げ訓練のための層状適応モーメントバッチオプティマイザ繰り返しを減らし、分散訓練シナリオでは、大規模なバッチ用に最適化されたが、32768分の65536トレーニングをサンプリングすることができますこれにより、トレーニング時間を削減する回数は、お金の味を感じます。

主にLAMBアダムとLARS(層状アダプティブレートスケーリング)の組み合わせ、レート調整を学習。バッチは、上述したときに大きな学習率も大きくなる必要があるとなり、これはノルム重みによってLRの比と卒業生によって[15]、この問題を解決するために収束不安定、LARSにつながります。

 

右ここでノルムが重みを計算する層を取られ、それが層状です。上記の式を理解することができる。トレーニングの始まりは、重量が比較的小さく、損失や勾配が比較的大きいので、割合は小さいですが、重さになると、より大きな&小さな勾配が緩やかにウォームアップします学習を開始します。いくつかのサンプルのために良いフィットは、損失がゼロに近づくと、勾配が小さい学習率は、フィットを超える防ぐために、極小値の中に閉じ込め、増加しますとなります。

LAMBは、層状のこの適応のアイデアを組み合わせます。

わずかに、重量は重量ノルムマッピングに追加された変更を公式は、本質的にスケールの役割を果たし、勾配式は、さらに重量減衰、すなわち、目的関数L2正則を添加します。

概要

この記事では、いくつかの方法を最適化するために、速度モデルのトレーニング及びメモリについて説明し、実際にそれが混合されるようブレンド精度+パラレルデータ、パラレルデータ並列モデル+、+勾配データ並列チェックポイントなど、様々です。戦略について語った記事をカバーするにがdeepspeed、学生がpytorchアップを手配することができます〜

合格大物にエラーがある場合に指摘してくださいことを発見した場合 - 最後に、様々な戦略の導入理由は、スペースの都合で、いくつかの仮定およびオミット最終結果、深さに参考文献の内容を勉強しに興味のある学生があります -

 

 

公開された33元の記事 ウォンの賞賛0 ビュー3270

おすすめ

転載: blog.csdn.net/xixiaoyaoww/article/details/104645796