DeepSpeed: 大規模モデル トレーニング フレームワーク | JD Cloud 技術チーム

背景:

現在、大規模モデルの開発が非常に活発であり、大規模モデルのトレーニングと微調整にもさまざまな企業が焦点を当てています。ただし、大規模なモデルのトレーニングの問題点は、モデルのパラメーターが大きすぎて、多くの場合数百億に達することであるため、単一の GPU でトレーニングを完了することは基本的に不可能です。したがって、この作業を完了するには、マルチカードまたは分散トレーニングが必要です。

1. 分散トレーニング

1.1 現在、主流の大規模モデル分散トレーニングには主に 2 つのタイプがあります。

  • データ並列トレーニング
  • モデルの並列トレーニング

二、DeepSpeed

DeepSpeed は Microsoft が提供する分散トレーニング ツールで、大規模なモデルをサポートし、より多くの最適化戦略とツールを提供するように設計されています。大規模なモデルのトレーニングのために、DeepSpeed はゼロ、オフロードなどのより多くの戦略を提供します。

2.1 基本コンポーネント

分散トレーニングでは、ノードの変更、グローバル プロセス番号、ローカル プロセス番号、グローバル プロセスの合計数、マスター ノードなどを含む、分散環境の基本構成を習得する必要があります。これらのコンポーネントは分散トレーニングと密接に関連しており、コンポーネント間には通信接続などの非常に大きな接続もあります。

2.2 通信策略

分散トレーニングであるため、モデル パラメーター、勾配パラメーター、その他の情報を送信できるようにマシン間で通信を維持する必要があります。

DeepSpeed は、mpi、gio、nccl などの通信戦略を提供します。

通信策略 通信作用
mpi CPU クラスターの分散トレーニングによく使用されるクロスポイント通信ライブラリです。
輝き CPU または GPU での分散トレーニングをサポートできる高性能な分散トレーニング フレームワークです。
nccl これは、nvidia が提供する GPU 固有の通信ライブラリであり、GPU での分散トレーニングに広く使用されています。

DeepSpeed を分散トレーニングに使用する場合、自分の状況に応じて適切な通信ライブラリを選択できますが、通常、分散トレーニングに GPU を使用する場合は、nccl を選択できます。

2.3 ゼロ (ゼロ冗長オプティマイザー)

Microsoft が開発した Zero は、分散トレーニング プロセスにおけるデータ並列処理とモデル並列処理の制限を解決できます。例: Zero は、データ並列化プロセス (通常のデータ並列トレーニング、モデルのすべてのパラメーターが各マシンにコピーされる) 中にモデルの状態 (オプティマイザー、勾配、パラメーター) を分割することによって、データ並列処理で起こり得るメモリ冗長性の問題を解決します。同時に、トレーニング中に動的通信プランを使用して分散デバイス間で重要な状態変数を共有できるため、計算の粒度やデータの並列通信量が維持されます。

Zero は、大規模なモデル トレーニングの最適化に使用されるテクノロジです。その主な目的は、モデルのメモリ使用量を削減して、モデルをグラフィック カード上でトレーニングできるようにすることです。メモリ使用量は、主に 2 つの部分に分けられます: モデルの状態Activation . Zero は主にモデル状態のメモリ使用量の問題を解決します。

ゼロは、モデル パラメーターを 3 つの部分に分割します。

効果
オプティマイザーの状態 オプティマイザーが勾配更新を実行するときに使用する必要があるデータ
勾配 リバースブロードキャストプロセス中に生成されるデータ。パラメータの更新方向を決定します。
モデルパラメータ モデルパラメータ、モデルトレーニング中にデータから「学習した」情報

 

ゼロのレベルは以下の通りです。

レベル 効果
ゼロゼロ すべてのタイプのシャーディングを使用するのではなく、DDP として DeepSpeed のみを使用します
ゼロワン オプティマイザーの状態を分割し、同じ通信容量とデータ並列処理でメモリを 4 分の 1 に削減します。
ゼロツー オプティマイザーの状態と勾配を分割し、同じ通信容量とデータ並列処理でメモリを 8 分の 1 に削減します。
ゼロスリー オプティマイザーの状態、勾配、パラメータを分割することにより、メモリの削減はデータの並列処理と線形に関係します。たとえば、64 GPU (Nd=64) 間で分割すると、メモリが 64 分の 1 に削減されます。通信量が 50% と緩やかに増加
ゼロインフィニティ Zero-Infinity は、NVMe SSD を使用して GPU と CPU メモリを拡張することにより、大規模なモデルのトレーニングを可能にする Zero-3 の拡張機能です。

2.4 ゼロオフロード:

GPU と比較すると、CPU は比較的安価であるため、ゼロオフロードのアイデアは、トレーニング段階の特定のモデル状態をメモリと CPU 計算にオフロードすることです。

 

ゼロオフロードでは、メモリ使用量を最小限に抑えるためにシステムのコンピューティング効率を低下させたくありませんが、CPU を使用する場合は、通信とコンピューティングの問題 (通信: GPU と CPU 間の通信、コンピューティング: も) も考慮する必要があります。 CPU による多くの計算は効率の低下につながります)。

Zero-Offload が実現したいのは、コンピューティング ノードとデータ ノードを GPU と CPU に分散することです。コンピューティング ノードが属するデバイスが計算を実行し、データ ノードが属するデバイスがストレージを担当します。

ゼロオフロードセグメンテーションのアイデア:

以下の図には、FWD、BWD、Param update、float2half の 4 つの計算ノードがあります。最初の 2 つの計算複雑さはおよそ O(MB)、B はバッチ サイズ、最後の 2 つの計算複雑さは O(マ)。計算効率を落とさないように、最初の 2 つのノードは GPU 上に配置され、後の 2 つのノードは計算量が少ないだけでなく、Adam ステートを扱う必要があるため、CPU 上に配置されます。 Adam ステートは当然メモリに配置されますが、データ グラフを単純化するために、最初の 2 つのノードを 1 つのノード FWD-BWD スーパー ノードにマージし、最後の 2 つのノードを 1 つのノードにマージする更新スーパー ノードにします。以下の図の右側に示すように、勾配 16 とパラメーター 16 の 2 つのエッジに沿って分割されます。



ゼロオフロード計算のアイデア:

GPU で順方向計算と逆方向計算を実行し、勾配を CPU に渡し、パラメーターを更新して、更新されたパラメーターを GPU に渡します。効率を向上させるために、計算と通信を並列化することができ、バックプロパゲーション段階では、GPU は勾配値がバケットを満たすまで待機し、新しい勾配を計算してバケットを CPU に転送します。が完了すると、CPU は基本的に最新の勾配値を持っており、同様に、下図に示すように、CPU もパラメータが更新されたときに、計算されたパラメータを GPU に同期送信します。



2.5 混合精度:

混合精度トレーニングとは、トレーニング プロセス中に FP16 (半精度浮動小数点) 精度と FP32 (単精度浮動小数点) 精度の両方を使用する手法を指します。FP16 を使用すると、メモリ フットプリントが大幅に削減され、より大きなモデルをトレーニングできるようになります。ただし、FP16 の精度が低いため、トレーニング プロセス中に勾配の消失やモデルの崩壊などの問題が発生する可能性があります。

DeepSpeed は混合精度トレーニングをサポートしており、config.json 構成ファイルで設定して混合精度を有効にすることができます ("fp16.enabled": true)。トレーニング プロセス中、DeepSpeed は一部の操作を FP16 形式に自動的に変換し、必要に応じて精度のスケーリング係数を動的に調整して、トレーニングの安定性と精度を確保します。

混合精度トレーニングを使用する場合は、勾配クリッピング (Gradient Clipping) や学習率調整 (Learning Rate Schedule) などのいくつかの問題に注意する必要があります。勾配クリッピングにより勾配の爆発を防ぐことができ、学習率の調整によりモデルの収束を向上させることができます。

3. まとめ

DeepSpeed を使用すると、マシンが限られている場合に大規模なモデルをトレーニングしたり微調整したりするのに便利であると同時に、使用できる優れたプロパティが多数あり、後からマイニングを続けることもできます。

現在主流のモデルトレーニング方法: GPU + PyTorch + Megatron-LM + DeepSpeed

アドバンテージ

  1. ストレージ効率: DeepSpeed は、トレーニング メモリの使用量を削減するための新しいゼロ ソリューションを提供します。これは、従来のデータ並列処理とは異なります。モデルの状態と勾配を分割して、大量のビデオ メモリを節約します。
  2. スケーラビリティ: DeepSpeed は、効率的なデータ並列処理、モデル並列処理、パイプライン並列処理、およびそれらの組み合わせ (ここでは 3D 並列処理とも呼ばれます) をサポートします。
  3. 使いやすさ:トレーニング段階では、数行のコードを変更するだけで、pytorch モデルで DeepSpeed と Zero を使用できるようになります。

参考:

1. http://wed.xjx100.cn/news/204072.html?action=onClick

2. https://zhuanlan.zhihu.com/p/513571706

著者: JD Logistics Zheng Shaoqiang

出典:JD Cloud Developer Community 転載の際は出典を明記してください

Lei Jun氏はXiaomiのThePaper OSの完全なシステムアーキテクチャを発表し、最下層が完全に再構築されたと述べ、 Yuque氏は10月23日に障害の原因と修復プロセスを発表 Microsoft CEOのナデラ氏「Windows Phoneとモバイル事業を放棄したのは間違った決断だった」 . Java 11 と Java 17 の使用率は両方とも Java 8 を上回りました . Hugging Face はアクセスを制限されました. Yuque ネットワークの停止は約 10 時間続きましたが、現在は通常に戻っています. Oracle は Visual Studio Code 用の Java 開発拡張機能を開始しました. The National Data Administration マスク氏、ウィキペディアを「魏事百科事典」に改名したら10億寄付 USDMySQL 8.2.0 GAを正式発表
{{名前}}
{{名前}}

おすすめ

転載: my.oschina.net/u/4090830/blog/10123191