ホームページ >テクノロジー周辺機器 >AI >AIトレーニング加速原理分析とエンジニアリング実践の共有

AIトレーニング加速原理分析とエンジニアリング実践の共有

WBOY
WBOY転載
2023-04-12 18:55:101535ブラウズ

この共有では、AI モデルのトレーニング プロセスにおける主なパフォーマンスのボトルネック、およびこれらのボトルネックに対する現在の主な高速化ソリューションと技術原則を体系的に分析し、この点に関する Baidu Intelligent Cloud の実践的な結果をいくつか紹介します。

今日の共有は主に 3 つの部分で構成されます:

最初に、なぜ AI トレーニングを加速する必要があるのか​​、つまり全体的な背景と出発点を紹介します;

2 番目の部分実際のトレーニング プロセス中に遭遇する可能性のあるパフォーマンスのボトルネックを体系的に分析し、これらの問題に対処するための現在の主な高速化ソリューションを紹介します。

3 番目のパートでは、Baidu Baige プラットフォームの AI トレーニング アクセラレーションを紹介します。一部のモデル トレーニングの高速化に対するパッケージ AIAK-Training の実際的な効果。

1. なぜ AI トレーニングが加速しているのでしょうか?

AI システムでは、通常、モデルにはオフライン トレーニングと本番環境からアプリケーションへの推論展開という 2 つの段階が含まれます。

オフライン トレーニング フェーズはモデルを生成するプロセスであり、ユーザーは独自のタスク シナリオに従ってモデルのトレーニングに必要なデータ セットとニューラル ネットワーク アルゴリズムを準備する必要があります。

このアルゴリズムは、多くの変数とパラメーターを含む、非常に複雑な非凸数学関数として理解できます。モデルのトレーニングのプロセスは、実際にはニューラル ネットワーク モデルのパラメーターを学習することです。

モデルのトレーニングが開始されると、データが読み取られ、前方計算のためにモデルに送信され、実際の値との誤差が計算されます。次に、逆計算を実行してパラメータの勾配を取得し、最後にパラメータを更新します。トレーニングには複数ラウンドのデータ反復が含まれます。

トレーニングが完了したら、トレーニングされたモデルを保存し、そのモデルをオンラインにデプロイし、ユーザーの実際の入力を受け入れ、前方計算による推論を完了します。

したがって、トレーニングでも推論でも、中心となるのはデータ計算です。コンピューティング効率を加速するために、トレーニングと推論は通常、GPU などの異種アクセラレーション チップを通じて実行されます。

AIトレーニング加速原理分析とエンジニアリング実践の共有

また、ディープラーニングモデルの開発履歴から判断すると、モデル精度の上限を突破し続けるために、モデルパラメータの数は実際に拡大しています。急速に。ただし、パラメーターの数が増えると、計算の複雑さが増します。

下図の左側は公開論文から抜粋したものですが、この概要を見ると、2010年以前はモデルの計算量が約20か月で2倍になっていることが分かります。 2010 年から 2015 年まで、従来のモデルの計算は 5 ~ 6 か月ごとに 2 倍になりました。 2015年以降、大規模モデルのトレーニングの傾向が現れ、計算量は10倍から100倍に増加しました。

モデルのトレーニングでは、コンピューティング能力とインフラストラクチャに対する要件がますます高まっています。トレーニングにはより多くのコンピューティング能力が必要であり、時間がかかるため、リソースのコストも増加します。ここでは、いくつかの論文や研究で開示されているコスト データをリストします。これは、モデルのトレーニングのコストが非常に高いことを反映しています。

したがって、モデルのトレーニングをいかに安定的に行うか、継続的にコストを削減し効率を高めるかが実は重要です。

AIトレーニング加速原理分析とエンジニアリング実践の共有

このような背景に対して、Baidu Intelligent Cloud は、AI シナリオ向けの統合されたソフトウェアとハ​​ードウェア ソリューションを提供することを目的として、Baidu Baige·AI ヘテロジニアス コンピューティング プラットフォームを立ち上げました。 AI コンピューティング、AI ストレージ、AI アクセラレーション、AI コンテナーの 4 層のテクノロジー スタックを通じて、上位レベルのビジネス シナリオのニーズを満たします。

  • AI コンピューティング層は、高性能 GPU、Kunlun などの異種チップ リソース、高性能 RDMA または IB ネットワーク、自社開発のスーパー AI コンピューター X-MAN などを提供します。
  • AI ストレージ レイヤー (データ レイク ストレージのニーズを満たすオブジェクト ストレージ BOS と、AI 用に特別に設計された高性能並列ファイル システム PFS を含む)、
  • AI アクセラレーション レイヤー (データ レイク ストレージを含む)アクセラレーション スイート RapidFS、AI トレーニング アクセラレーション スイート AIAK-Training、AI 推論アクセラレーション スイート AIAK-Inference;
  • AI コンテナ レイヤー、つまりリソー​​ス スケジューリング レイヤーは、クラウド ネイティブの技術機能を使用して、GPU の柔軟なスケジューリングに対応します。 AIの仕事などのニーズ。前回の技術公開授業ではクラウドネイティブAIの内容を特別に公開しました。

AIトレーニング加速原理分析とエンジニアリング実践の共有

#パフォーマンスの高速化について考えるとき、最初に思い浮かぶのは、より優れたハードウェアを使用することかもしれません。

これにより、一定のパフォーマンスの向上がもたらされますが、ほとんどの場合、ハードウェアの計算能力が十分に活用されていない可能性があります。主な理由は、トレーニング コードの実行効率が最適以上に調整されていないことです。 。 州。

  • まず第一に、より多くのニーズに対応するために、フレームワークは通常、使いやすさ、環境に配慮した構築などにさらに注意を払い、より一般的な最適化機能を提供します。 , アルゴリズムエンジニア アルゴリズムを設計する際、モデルの精度をいかに高めるかが中心となり、パフォーマンス効率への配慮が不十分となり、フレームワークが提供する一般的な最適化機能の一部が活用されない場合があります。
  • したがって、特定のモデル アルゴリズムを使用することを決定した場合、リソース効率とトレーニング効率を向上させるために、意識的に最適化する必要があります。ただし、ここには多くの技術的な課題もあります:

パフォーマンスに影響を与える多くの要因があり、さまざまなモデルの動作特性に従って分析する必要があります。完全に固定された最適化計画はありません。
  • パフォーマンス最適化のニーズ エンジニアリング実装の原則を理解します。たとえば、ヘテロジニアス チップ コンピューティングの最適化を行う場合、それを実行するには専門的な異種混合の研究開発経験が必要であり、技術的な敷居は高くなります。
  • 分散トレーニングを行う場合には、分散トレーニング シナリオでのスケーラビリティの問題を最適化するために、クラスター ハードウェアとネットワーク トポロジを組み合わせる必要がある場合もあります。
  • これらの課題は、モデル トレーニングのパフォーマンスのチューニングに大きな影響を与えているため、抽象的で使いやすいインターフェイス、およびソフトウェアとハードウェア コラボレーション Baidu スマート クラウドでの顧客のモデル トレーニング パフォーマンスを完全に加速する最適化手法。

AIトレーニング加速原理分析とエンジニアリング実践の共有2. トレーニング パフォーマンスのオーバーヘッド分析と加速計画

AIAK トレーニングの具体的な効果を紹介する前に、まず次のトピックで重要な問題を紹介します。トレーニングの加速化 技術的なアイデアとプログラムの原則は何ですか?

モデル トレーニングの最適化自体はソフトウェアとハ​​ードウェアの包括的な作業であり、テクノロジ スタックは比較的複雑であるため、今日の内容では詳細をすべてカバーすることはできません。重要な部分をカバーできるように最善を尽くします。アイデア。

まず、現在のモデルのトレーニング スキームを見てみましょう。これまでの開発段階で、モデル トレーニング ソリューションには 2 つの重要な変更がありました。1 つはシングル カード トレーニングから分散トレーニングへの変更、もう 1 つはデータ並列トレーニングから多次元ハイブリッド並列トレーニングへの変更です。ここで重要なポイントは、トレーニング データの量とモデル パラメーターの量です。

シングルカード トレーニング方法: 実際にこのモードを使用する場合、モデルのパラメーターとデータの量は一般に比較的少なく、シングル カードのトレーニング時間は許容範囲内です。モデル パラメーターのスケールでは、トレーニング プロセス中に 1 枚のカードのビデオ メモリがストレージの上限を満たすことができるようにする必要があります。新しい GPU カードのビデオ メモリ容量構成によると、配置できる最大サイズは通常 10 億パラメータです。
  • データ セットのサイズが比較的大きい場合は、データ セット全体を配置する必要があるためです。トレーニング プロセス中に複数回実行されるため、単一カードのトレーニングには比較的長い時間がかかりますが、現時点では、分散アプローチを通じてトレーニングを高速化するために、単一カードから複数カードに拡張できます。
  • ここで最も広く使用されているのはデータ並列処理です。データ並列スキームでは、データセットが複数の部分に均等に分割され、完全なモデルが各カードに保存され、分割されたサブデータセットが独立して並列処理されます。

たとえば、モデル パラメーターの数が十分に大きい場合、パラメーターの数は数百億または数千億に達し、1 枚のカードでは完全なモデルを保持できなくなります。ここでも、モデルの並列性、またはデータ並列性とモデル並列性を同時に利用するハイブリッド並列方式が登場。

モデル並列処理では、モデルを異なるカードに分割し、各カードにモデルの一部を配置します。ここでは、層内分割または層間分割、Tensor 並列処理など、分割方法が異なります。とパイプライン並列処理はさらに細分化されます。

一般的なモデルのトレーニングではデータ並列処理がよく使用されるため、パフォーマンス最適化のアイデアを紹介する例としてデータ並列処理に焦点を当てます。

AIトレーニング加速原理分析とエンジニアリング実践の共有# まず、ソフトウェアとハ​​ードウェアの全体的な観点から、シングルカード トレーニング中に存在するパフォーマンスのオーバーヘッドを理解しましょう。

下の図の左側は、ソフトウェアの観点から見たトレーニング プロセスです。シングルカードトレーニングのプロセスには、主にデータの読み取り、データの前処理、順計算出力と損失計算、損失関数による逆計算を行って各層パラメータの勾配を取得し、最後に勾配に応じてモデルパラメータを更新することが含まれます。トレーニングが収束するまでこのプロセスを続けます。

以下の図の右側は、簡略化されたノードのハードウェア トポロジ図です。一番上はデータ ストレージで、ローカル ストレージまたはネットワーク ストレージを使用できます。次に CPU とメモリです。0 から 7 までの番号が付けられた複数の PCIe スイッチを介して 8 枚の GPU カードが CPU に接続されており、8 枚のカードは NVSwitch を介して相互接続されています。コンピューティング インスタンスが異なれば、ハードウェア トポロジも異なります。

  • トレーニングが開始されると、最初にデータが読み取られます。これには、ストレージ メディアからメモリへのデータの読み取りが含まれます (主にストレージ I/O オーバーヘッド)。ストレージ メディアに応じて、読み取られるデータの量が異なり、この部分にかかる時間コストも異なります。
  • 次のステップはデータ前処理で、主に読み取りに対していくつかのデータ拡張操作を実行します。画像処理、サイズ変更、コントラスト、彩度調整などのデータ この部分の作業は主に CPU で行われます。 CPU 上でデータの前処理操作が完了したら、データをホスト メモリから GPU メモリにコピーする必要がありますが、これにはホストとデバイス間のメモリ コピーのオーバーヘッドが伴います。
  • 次に、順方向計算を開始します。逆算やパラメータの更新など、この部分のその他の操作は主に GPU を通じて実行され、主な時間は GPU の計算に費やされます。このプロセスには CPU 上の一部の操作が散在する場合があり、ホストとデバイスのメモリ間のコピーが必要になる場合もあります。

したがって、単一カードの観点から見ると、主に I/O、CPU の前処理、CPU と GPU 間のデータのコピー、GPU の計算などのオーバーヘッドがあります。

AIトレーニング加速原理分析とエンジニアリング実践の共有

次に、データ並列処理のプロセスを見てみましょう。

下図の左側は依然としてトレーニングのメイン プロセスであり、右側は 3 台のマシン 24 枚のカードのトレーニング クラスターのハードウェア トポロジを示しており、3 台のマシンはネットワークを通じて相互接続されています。

データ並列処理では、各デバイスが順方向および逆方向の計算プロセスを並列かつ独立して実行することも前編で紹介しましたので、各トレーニング プロセスでも上記のシングル カード トレーニングが発生します。問題。

データの並列化が単一カードのトレーニングと数学的に同等であることを保証するには、各カードのモデル パラメーターが反復プロセス中に常に一貫していることを確認する必要があります。一方で、各 GPU カードのモデル パラメーターの初期化ステータスを一貫させる必要があり、これは通常、トレーニングを開始する前に最初のカードのパラメーター ステータスを他のカードにブロードキャストすることで行われます。

学習時には、各デバイスで処理するデータが異なるため、順計算で得られるモデルの損失値も異なるため、各デバイスで傾きを逆計算した後に傾きを計算することも必要です。 、反復プロセス中に各カードのモデル パラメーターの一貫性が保たれるように、平均勾配値でモデル パラメーターを更新します。

勾配平均には、ノード内のカード間の通信やノード間のネットワーク通信オーバーヘッドなどの通信プロセスが含まれます。ここでの通信には同期通信と非同期通信が含まれますが、モデル学習の収束性を確保するために、一般的には同期通信ソリューションが使用され、その後の最適化作業も同期通信に基づいて行われます。

上記のことから、単一カードのトレーニングと比較して、データの並列処理により主に追加の通信オーバーヘッドが追加されることがわかります。

AIトレーニング加速原理分析とエンジニアリング実践の共有

上記の分析を通じて、AI トレーニングの高速化は作業の特定の側面だけではなく、データの読み込み、モデルの計算、そして分散コミュニケーション。ここでいうデータロードには、データの入出力、前処理、メモリコピー等の処理が含まれます。

特定の最適化実践では、最適化対象のモデルが与えられた場合、モデル トレーニングを高速化することは、トレーニングの全体的なスループット (1 秒あたりにトレーニングできるサンプル数) を継続的に向上させることを意味します。このプロセスでは、通常、最初に 1 枚のカードのトレーニング スループットを分析できます。1 枚のカードのトレーニング スループットが向上したら、次に 1 枚のカードから複数のカードへの拡張を検討して、カードのトレーニング加速率を向上させる方法を確認できます。複数のカード。

まず、シングルカード トレーニングの最適化です。最終的な最適化目標は、すべての時間を GPU コンピューティングに費やし、アクセラレータの使用率を 100% にすることです。もちろん、実際にこの状態を完全に達成することは困難ですが、この指標を使用して作業をガイドしたり測定したりすることができます。

シングル カードのパフォーマンス最適化の鍵には 2 つの部分が含まれます。

  • まず、データの読み込み効率を最適化します。ストレージ システムからは、より高性能のストレージ メディア、これらの高速ストレージ メディアに基づく並列ファイル システム、または一部のキャッシュ アクセラレーション システムを使用できます。前述したように、Baidu Baige は、PFS、RapidFS などの対応するストレージ システム ソリューションも提供しています。さらに、フレームワーク データローダーでデータ読み取りプロセスを最適化する必要があります。
  • 2 つ目は、モデルの計算効率の最適化です。計算実装を最適化する方法と計算ユニットの利用効率を向上させる方法が主な考慮事項であり、これにはモデルと組み合わせた詳細な分析が必要になる場合があります。

次に、1 枚のカードから複数のカードに拡張し、線形加速率を達成する方法を目標とします。直線加速率という指標は、単純にトレーニングを1枚から2枚に拡張したときに、トレーニングパフォーマンスが1枚のカードの2倍になるかどうかを意味します。

ここでの核心は、分散通信の効率を最適化することであり、ハードウェアレベルの最適化である一方で、実際の通信においてどのように活用するかを考える必要があります。ネットワークの帯域幅リソースの量、または通信プロセスを非表示にできるかどうか。

AIトレーニング加速原理分析とエンジニアリング実践の共有

以下では、これらの側面について詳しく説明します。

1 つ目は、データ読み込みの最適化です。

データローダーをインスタンス化した後、引き続きデータローダーを反復処理して、モデルのトレーニング用にデータのバッチを読み取ります。

ここで最適化を行わなかった場合、下図の上部に示すように、実際には各バッチのデータ読み込み処理と各バッチのモデル学習処理が直列に実行されます。 GPU の観点から見ると、データの読み込みによって計算ギャップが発生し、コンピューティング リソースの時間が無駄になります。

データ読み取りの効率を直接向上させるためにより優れたハードウェアを使用するという前述のことに加えて、他にどのように最適化できるでしょうか?

実際、AI トレーニング プロセス中に、データ アクセスには 2 つの重要な機能があります。

  • データ セットがシャッフルされた後、各ラウンドに必要なバッチ データが作成されます。トレーニングとアクセス シーケンスは既知です;
  • データ間に依存関係がないため、任意の 2 つのバッチのデータ読み取りを並行して実行できます。

したがって、ハードウェア レベルの変更に依存しない場合に実行できる最適化作業の 1 つは、データのプリフェッチです。データの最初のバッチをトレーニングするときに、データの次のバッチを事前にロードできます。 . I/O プロセスと GPU 上の計算を完全に並列化します。

AIトレーニング加速原理分析とエンジニアリング実践の共有

まず、データローダーの既存の最適化ソリューションを有効に活用する必要があります。まず、num_workers ハイパーパラメーターを適切に設定し、複数のプロセスを通じてデータを読み取ります。このステップは、ストレージ システムからホスト メモリへのデータ プリフェッチを実現できます。 2 つ目は、ホスト メモリから GPU メモリにコピーすることで、固定メモリ メカニズムを通じて高速化できます。

ピン メモリ アクセラレーションの主原理の簡単な紹介: メモリ データには 2 つのタイプがあります: ページ可能メモリとピン メモリです。ページ可能メモリ内のデータはディスクにスワップ アウトできます。この場合、H2D を実行するときに、最初にディスクからメモリに読み取り、次にメモリからビデオ メモリにコピーする必要がある場合があります。さらに、ページャブル メモリ データを GPU メモリにコピーする場合は、最初に一時的な固定メモリ バッファを作成し、ページャブル メモリから固定メモリにデータをコピーしてから、それを GPU に転送する必要があります。これには追加のデータ転送操作も必要です。

ただし、上記のソリューションを有効にすると、ストレージ システムからホスト メモリへのプリフェッチのみが実装され、ホストからデバイスへのデータ コピー速度が向上します。ただし、ホストからデバイスへのメモリのコピーと実際の計算カーネルは依然として GPU 上でシリアルに実行されます。つまり、GPU 上にはまだわずかな時間ギャップが存在します。

AIAK は、この問題に対処するためにさらなる最適化を行い、H2D と前方計算のオーバーラップを可能にしました。

AIトレーニング加速原理分析とエンジニアリング実践の共有

#データ並列シナリオでは、データを均等に分割する必要があることに注意する必要があります。

各学習プロセスに割り当てられるデータが偏ると計算量が異なり、各プロセスの順計算と逆計算の完了時間が異なり、先に計算が完了したプロセスが先に計算を完了することになります。処理中はまず勾配通信リンクに入りますが、Allreduce通信は同期通信であるため、すべてのプロセスが同時に開始・終了する必要があるため、開始するプロセスは最初の通信は、他のすべてのプロセスも AllReduce を開始するのを待ちます。通信操作は一緒に完了します。速度の違いによってリソースのアイドル状態の問題が発生する可能性があります。

この問題を解決するには、各プロセスが同じバッチサイズを使用してデータを読み取る必要があり、各バッチ内のデータ量のバランスをとる必要があります。画像データは通常、トレーニング用に固定サイズですが、NLP モデルは可変長ステートメントを処理する必要があるため、特別な処理が必要になる場合があります。たとえば、データを同じ長さにパディングしたり、サンプルの長さをソートすることで均等に分散したりすることができます。

AIトレーニング加速原理分析とエンジニアリング実践の共有

次に、計算効率の最適化について紹介します。

計算には、順方向、逆方向、およびパラメーターの更新が含まれます。計算の最適化の目標は、異種ハードウェアの計算能力を最大限に活用することであり、理想的な状況は、GPU チップの実際の計算パフォーマンスが理論上のピークに達することです。

まず、単一のオペレーターの観点から分析してみましょう。GPU で計算操作を実行する準備をするとき、簡略化されたプロセスには 4 つのステップがあります。

  • 最初に GPU 計算カーネルを CPU 上で非同期に起動します;
  • カーネルの実行をスケジュールするときは、まず計算に必要なデータを CPU 上のグローバル メモリから読み取る必要があります。 GPU;
  • 計算の実行を開始;
  • 計算が完了したら、計算結果をグローバル メモリに書き戻す必要があります。

コンピューティングとメモリ アクセスのオーバーヘッドの割合に応じて、オペレータは一般にコンピューティング ボトルネックまたはメモリ アクセス ボトルネックに分類されます。

オペレーターから完全なモデルのトレーニングに拡張する場合、多くのカーネル計算を継続的に実行する必要があるため、カーネル起動によるカーネル計算と中間結果の読み取りおよび書き込みの間に多くのエラーが発生します。ギャップ問題を計算します。

上記のことから、モデルの計算効率を最適化するには、メモリ アクセスの最適化、計算の最適化、その他のオーバーヘッドの最適化を総合的に考慮する必要があることがわかります。

  • メモリ アクセスの最適化では、主にビデオ メモリとコンピューティング ユニット間のデータ転送時間を短縮する方法を考慮します。オペレーター実装の観点からは、データを共有メモリなどのより高速なストレージに移動し、グローバル メモリへのアクセスを減らし、それによってメモリ アクセス時間を節約するなど、GPU ストレージ階層アーキテクチャをうまく活用する必要があります。または、計算命令とメモリアクセス命令をうまくオーバーラップさせて、計算メモリアクセス率を向上させます。単一の演算子から複数の演算子に拡張する場合は、中間結果の読み取りと書き込みを減らす方法も考慮する必要があります。この問題は通常、演算子の融合によって最適化できます。
  • 計算の最適化、計算のボトルネックのほとんど問題点 タスクがブロックに正しく分割されていないか、GPU 並列計算の利点が十分に活用されておらず、並列性が低いことが考えられます。また、統合命令セットが使用されずに演算効率が低下したり、Tensor Core などの高性能演算ユニットが使用されずにリソースが無駄になったりする可能性もあります。さまざまな問題にはさまざまな最適化方法も対応しており、
  • カーネルの起動やその他のオーバーヘッド、メモリアクセスや計算に多くの時間がかかること、演算子融合、Cuda Graph などの最適化方法が考えられます。

AIトレーニング加速原理分析とエンジニアリング実践の共有

#1 つ目は演算子融合です。オペレーターが基盤となる GPU で実行されると、1 つ以上のカーネル起動が開始され、カーネル間のインタラクティブ データもビデオ メモリを通過する必要があります。オペレーター フュージョンは、複数の GPU カーネルを 1 つの大きなカーネルに融合して、統合された開始と実行。

  • 実行する必要のあるオペレータの数が減るため、カーネルのスケジューリングと開始のオーバーヘッドを削減できます;
  • フュージョンを通じて、中間結果をレジスタを通じて転送できます。メモリの前後の転送により、ビデオ メモリの待ち時間が大幅に短縮されます。
  • 一部のシナリオでは、オペレータ フュージョンを使用して、コンピューティング リソースを最大限に活用し、リソースとコンピューティングの効率を向上させることができます。

AIトレーニング加速原理分析とエンジニアリング実践の共有

#演算子融合を具体的に実装するにはどうすればよいですか?

専門家の経験に基づいた手書きの融合演算子を使用して、モデル内の非効率な操作を分析する方法。 GPU では主に CUDA オペレーターの研究開発が行われますが、ここには一定のしきい値があります。 AIAK-Training は、典型的なモデル構造や顧客のニーズに基づいて、効率的で最適化されたオペレーターの実装を提供します。

もう 1 つの方法は、ソリューションをコンパイルして最適化することです。計算の最適化はコンパイルによって実行され、コードが自動的に生成されるため、さまざまなハードウェアでの手動最適化のコストが削減されます。ただし、現在のコンパイル ソリューションの多くは推論に対してより最適化されており、トレーニング ソリューションは依然として急速な進化の過程にあります。しかし、究極のパフォーマンスという観点から考えると、今後もしばらくは手書き融合オペレーターの仕事が不可欠となるでしょう。

AIトレーニング加速原理分析とエンジニアリング実践の共有

以下では、演算子融合の実際的な事例をいくつか紹介します。 1 つ目は、典型的なモデルのネットワーク構造の最適化です。

次の図は、SwinTransformer モデルのコア モジュール WindowAttend に対する計算融合の最適化を示しています。

WindowAttend 構造体、コアの演算式を次の図に示します。計算プロセスでは、7 つの計算カーネルを順番に実行する必要があります。いくつかの再形成およびその他の変換操作と組み合わせると、合計 10 個のカーネルを起動する必要があります。パフォーマンス分析を通じて、起動カーネルの間隔冗長オーバーヘッドが実際の実行プロセス中のエンドツーエンド時間の 80% 以上を占め、その結果、このモジュールに大きな最適化スペースが生じることが判明しました。

これらのカーネルを 1 つに融合することで、モジュール全体の実行時間が 392 マイクロ秒から 13 マイクロ秒に短縮され、単一のオペレーターは 30 倍高速化されます。モデル全体のトレーニング効率がエンドツーエンドで 20% 以上高速化されました。

この最適化の中心となるアイデアには 3 つの主要なポイントがあります:

  • GPU の 3 レベルのメモリ アクセス パイプライン (ビデオ メモリ、共有メモリ、レジスタ;
  • ブロッキング戦略を通じて、2 つの行列乗算とソフトマックスを融合;
  • 前方中間結果の最適化には、Tensor コアを最大限に活用し、逆計算での再読み込みの代わりに再計算を使用します。 、メモリアクセスのオーバーヘッドが大幅に削減されます。

AIトレーニング加速原理分析とエンジニアリング実践の共有

#次の図は、FCOS3D モデルにおける座標圧縮操作の最適化であるデータ操作の融合の例です。

パフォーマンス分析により、この操作中に多数の GPU ギャップがあり、GPU 使用率が低いことが判明しました。この操作の主な機能は、インデックスに基づいて 3D-Tensor を 2D-Tensor に圧縮することです。ネイティブ実装では、最初にホスト側でインデックスが生成され、次に H2D コピーが実行され、最後に Tensor 圧縮が完了します。これにより、追加のコピーと待機のオーバーヘッドが発生します。

この目的のために、操作のこの部分を再実装しました。中心となるアイデアは、すべての操作を GPU に移行し、インデックスの生成と Tensor の圧縮を GPU 上で直接完了し、CPU の参加を減らし、 CPU-GPU間の不必要なメモリコピーを回避します。

単一オペレーターの実行時間は 9.69 ミリ秒から 32 マイクロ秒に短縮され、300 倍高速化され、モデル全体のエンドツーエンドのトレーニングが 10% 以上改善されました。

AIトレーニング加速原理分析とエンジニアリング実践の共有

次に、計算の並列性を向上させ、GPU 並列計算の利点を最大限に活用する、計算最適化の別のアイデアを紹介します。実際の事例も交えて紹介します。

一部のモデルでは、一部の操作が連続して実行されることがわかりました。たとえば、一部のターゲット検出モデルでは、損失計算プロセス中に、一部の操作がバッチに従って実行されず、各ピクチャまたはサンプルごとに for ループで実行されます。この場合、バッチサイズを増やすと、ここでのシリアル化が行われない可能性があります。私たちが望むパフォーマンスを実現します。

YOLOv7 の SimOTA 操作を例に挙げると、ネイティブ実装では、バッチの各ピクチャが for ループを介して走査され、ピクチャの gtbox に対して SimOTA ラベルの割り当てが実行されます。このシリアル実装により、操作のこの部分の GPU 使用率が非常に非効率になります。

各画像を処理する際、データ間の依存関係はありません。したがって、私たちが行ったタスクの 1 つは、シリアル計算をバッチ並列計算に変更し、データのバッチに対するラベルの割り当てを並列化することで、計算のこの部分の効率を高速化することです。

AIトレーニング加速原理分析とエンジニアリング実践の共有

最終的な効果として、SimOTA の操作時間は 384 ミリ秒から 69 ミリ秒に短縮され、コンピューティング効率は 5.5 倍向上し、エンドツーエンドのトレーニング効率が向上しました。モデル全体では上記より 18% 増加しました。

モデルのトレーニング プロセス中には、パラメーターの更新など、同様のシナリオが他にもあります。パラメータが更新されると、デフォルトでは、各パラメータがループを通過し、各パラメータがパラメータ更新のために Cuda カーネルを起動し、順番に実行します。

この状況を受けて、AIAK では FusedOptimizer の最適化も追加しており、パラメーター更新オペレーターを融合することでパラメーターを一括更新し、カーネル起動回数を大幅に削減することができます。

AIトレーニング加速原理分析とエンジニアリング実践の共有

以下では、主に CPU Launch Kernel のオーバーヘッドを削減するための別の最適化手法 CUDA Graph を紹介します。

CUDA Graph は、CUDA 10 バージョンで導入された機能です。一連の CUDA カーネルを 1 つのユニットにカプセル化できます。複数の GPU カーネルを 1 つの CPU 起動操作で起動できるため、CPU のオーバーヘッドが削減されます。 CPU 起動カーネル。

下図に示すように、デフォルトでは、CPU は複数のカーネルを順番に起動する必要があり、カーネルの計算時間が比較的短い場合、カーネル間の起動ギャップがパフォーマンスのボトルネックになる可能性があります。 CUDA グラフを使用すると、グラフの構築に余分な時間を費やすだけで済み、その後のグラフの出力により、実際の実行中のカーネル間のギャップを大幅に短縮できます。

現在、多くのフレームワークでも CUDA Graph のサポートが追加されており、K でコードを挿入することでこの機能を有効にできるようになりました。ただし、動的シェイプをサポートしていない、動的制御フローをサポートしていない、プロセス中の CPU 操作をキャプチャできないなど、いくつかの使用制限があります。モデルの状況に基づいてこの最適化機能を使用してみることができます。

AIトレーニング加速原理分析とエンジニアリング実践の共有

次は、Tensor Core コンピューティング ユニットを最大限に活用するための最後の計算最適化方法です。

通常、GPU には複数の SM が含まれており、各 SM にはさまざまなデータ型のコンピューティング コアとさまざまなストレージ リソースが含まれています。以下の図の左側は、NVIDIA A100 SM の概略図を示しており、SM には 64 個の FP32 CUDA コアと 4 個の Tensor コアが含まれています。

モデルをトレーニングする際、デフォルトでは FP32 CUDA Core が主に計算に使用され、Tensor Core は Volta シリーズの GPU から導入された特別なハードウェア実行ユニットで、主に行列や畳み込みの高速化に使用されます。効率。

一度に 2 つのスカラーの計算しか実行できない FP32 CUDA コアと比較して、Tensor コアは一度に 2 つの行列の計算を実行できるため、Tensor コアの計算スループットは FP32 の計算スループットよりもはるかに高くなります。 CUDAコア。

A100 では、Tensor コアはさまざまな浮動小数点データ型をサポートしており、深層学習トレーニングの場合は、FP16、BF16、および TF32 モードが含まれる場合があります。

TF32 は主に単精度トレーニング シナリオで使用され、FP32 トレーニングと比較して、同じメモリ アクセス帯域幅要件を維持しながら、理論上のコンピューティング スループットが 8 倍増加します。

FP16/BF16 は主に混合精度のトレーニング シナリオで使用され、FP32 トレーニングと比較してメモリ アクセス要件が半分に減り、理論上の計算スループットが 16 倍増加します。

Tensor Core を使用すると、基礎となる cublas または cuda インターフェイスをプログラミングに使用できます。アルゴリズム開発者にとっては、フレームワークで提供される TF32 トレーニング ソリューションまたは混合精度トレーニング ソリューションを使用する方が簡単です。

AIトレーニング加速原理分析とエンジニアリング実践の共有

1 つ目は TF32 トレーニング モードです。TF32 は Ampere によって導入されました。

TF32 浮動小数点数の式には、8 つの指数ビット、10 の仮数ビット、1 つの符号ビットがあります。指数ビットはFP32と同じ、つまりデータ表現範囲は同じですが、仮数ビットはFP32より下位でFP16と同じです。

TF32 はオープンな数値型ではなく、Tensor Core の計算モードであるため、ユーザーが TF32 型の浮動小数点数を直接作成することはできないことに注意してください。

TF32 が有効な場合、Tensor コアは行列の計算または畳み込み演算時に FP32 を TF32 に自動的に変換します。計算が完了した後も、出力データ型は FP32 型のままです。

TF32 トレーニングは、一部のフレームワーク バージョンではデフォルトで有効になっています。一部のフレームワーク バージョンでは、環境変数またはパラメータ設定を通じて手動で有効にする必要がある場合があります。詳細については、フレームワークのユーザー マニュアルを参照してください。

ただし、TF32 は FP32 に比べて精度範囲が狭いため、実際のトレーニング時はモデルの収束精度への影響に注意する必要があります。

AIトレーニング加速原理分析とエンジニアリング実践の共有

#混合精度トレーニングとは、モデルの精度の損失を最小限に抑えながら、FP32 と FP16 の混合精度を使用したトレーニングを指します。

混合精度トレーニングの主な利点は、FP32 トレーニングと比較してメモリ要件が軽減され、より大規模なネットワークをトレーニングしたり、より大きなバッチ サイズを使用したりできることです。使用するメモリ帯域幅を少なくするとデータ転送が高速化でき、半精度の計算により数学演算も高速化できます。

ただし、FP16 の指数ビットと仮数ビットの範囲は FP32 よりも小さいため、数値の表現範囲や精度が低下しますが、実際の使用においては表現範囲が狭いため数値オーバーフローが発生したり、精度不足により丸め誤差が発生したりする可能性があります。

同様の問題を最適化するために、混合精度トレーニング ソリューションにはいくつかの重要な技術的タスクがあります。

  • オペレーターのブラックとホワイト リストのメカニズム、フレームワークはブラックとホワイトのリストを使用して、オペレーターの精度を自動的に選択しますモデルのトレーニング プロセス中に、開発者の介入なしに、型変換のためのキャスト操作が自動的に挿入されます。数値精度に敏感な計算には、引き続き FP32 が使用されます。行列の乗算など、数値的に安全な計算には、FP16 が使用されます。
  • トレーニング プロセス中に、FP32 の重みパラメータのコピーが保存されますトレーニング中にパラメータを更新し、丸め誤差の問題を最適化するために使用されます;
  • FP16 の簡単なオーバーフローの問題を解決するには、Loss を n 倍に拡大するなど、Loss スケーリング ソリューションが使用されます。連鎖律、勾配も同様にしてFP16の表現範囲に収まるようにn倍に拡大する具体的な処理を下図の左側に示します。

現在、すべてのフレームワークは混合精度をサポートしています。 AIAK トレーニング コンポーネントでは、NVIDIA Apex に AMP O2 混合精度モードがさらに導入され、より多くの計算をより積極的に FP16 に転送してトレーニングを加速します。デフォルトの O1 モードと比較すると、速度はさらに向上しますが、精度が影響を受ける可能性があるため、特定のモデルで検証する必要があります。

AIAK-Training は、トーチアンプのネイティブな使用法と互換性のある使用法を提供し、O2 モードを簡単に有効にすることができます。

AIトレーニング加速原理分析とエンジニアリング実践の共有

#次に、コミュニケーションの最適化について紹介します。これも非常に大きなトピックであり、多くの内容が含まれます。

前述したように、1 枚のカードから複数のカードに拡張するには複数のカード間のデータ同期が必要となるため、通信は主に分散トレーニングで導入され、これらの同期操作は通信によって実装されます。

次の図は、通信最適化のための全体的なアーキテクチャを示しています。

  • 最下層は、従来の TCP ネットワークを含むネットワーク プロトコル層であり、トレーニング シナリオでますます使用されています。 RoCE または IB 用の RDMA ネットワーク。 Baidu Baige は、これらの基盤となるネットワーク ソリューションのサポートも提供します。明らかに、ハードウェア インフラストラクチャを改善してネットワーク帯域幅を増やし、遅延を短縮することが、通信パフォーマンスを最適化する最も直接的かつ効果的な方法です。
  • 次に、通信ライブラリ層があります。通信には基礎となるネットワーク プロトコルを使用する必要があり、実際のアプリケーションにはポイントツーポイント通信、集団通信などの複数の通信プリミティブが含まれる可能性があるため、高度にカプセル化され最適化された通信ライブラリもいくつか登場しています。 GPU トレーニング シナリオでは、通常、より優れたパフォーマンスを持つ NCCL 通信ライブラリを使用します。
  • 基礎となる通信ライブラリに基づいて、上位層フレームワークは分散トレーニング通信アーキテクチャをより簡単に構築できます。一般的なものには、パラメータ サーバー アーキテクチャと集団通信アーキテクチャがあります。現在、CV/NLP などのモデルは主に集合通信アーキテクチャを採用しています。
  • 通信戦略層では、主にアプリケーション層の通信効率を最適化するため、通信の隠蔽、通信の融合、通信の圧縮、通信頻度の削減などの工夫が行われており、これらの手法の多くは重ね合わせて使用​​することも可能です。 。

AIトレーニング加速原理分析とエンジニアリング実践の共有

# まず、コミュニケーション戦略レベルでの最適化のアイデアを見てみましょう。1 つ目は、コミュニケーションの隠れた最適化です。

データ並列処理では、学習の逆方向に勾配同期通信を行い、逆方向に勾配を計算した後、グローバル勾配平均を行うことができます。

機構の最適化を行わないと、逆算と通信がシリアルに行われるため、計算に時間差が生じます。

逆プロセスでは、前の勾配の通信と次の勾配の計算の間にデータの依存関係がないため、前の勾配の通信と次の勾配の計算を並列化でき、 2 対 2 つのユーザーの時間が重なることで、通信に時間がかかる部分が隠蔽されます。

実装レベルでは、通信演算子と計算演算子は通常、異なる cuda ストリームにスケジュールされます。通信演算子は通信ストリームにスケジュールされ、計算演算子は計算ストリームにスケジュールされ、異なるストリームでの計算はサブステップとして実行できます。並行して起動および実行されるため、勾配通信と逆方向の計算の並行オーバーラップが実現します。

現在、この最適化機能はフレームワークでデフォルトで有効になっています。

AIトレーニング加速原理分析とエンジニアリング実践の共有

2 つ目は、通信統合の最適化です。

デフォルトでは、モデル内の各グラデーションは通信操作を開始する必要があります。単一の勾配のサイズが比較的小さい場合、小さなデータ パケットが実際に通信されると、ネットワーク帯域幅の使用率が非常に低くなり、通信パフォーマンスが低下します。

通信融合とは、1 つの通信に対して複数の勾配を融合することであり、通信オーバーヘッド モデルの分析から、帯域幅の使用率を向上させるだけでなく、通信の初期化遅延期間を短縮することもできます。

現在、多くの分散トレーニング フレームワークは、デフォルトで勾配融合戦略もサポートしています。さまざまなフレームワークの実装方法には特定の違いがあります。最初に通信シーケンスを決定するために勾配ネゴシエーションが必要な実装もあれば、静的通信を直接使用する実装もあります。バケット。

フレームワークはデフォルトで通信フュージョンをサポートしていますが、勾配フュージョンのサイズは一般にパラメータを通じて設定できます。ユーザーは物理環境とモデルのニーズに応じて適切なフュージョンしきい値を調整でき、次のことができるはずです。より良い利益を達成します。

AIトレーニング加速原理分析とエンジニアリング実践の共有

低帯域幅の TCP 環境など、ネットワーク帯域幅が狭いトレーニング シナリオの場合、勾配同期の遅延がトレーニングの主なパフォーマンスのボトルネックになる可能性があります。

  • この場合、考えられる最適化方法の 1 つは通信の圧縮です。通信圧縮には、主に 3 つの異なる圧縮アイデアがあります。
  • 量子化圧縮。勾配を表すために低精度を使用するなど、この方法は圧縮率が低く、32 ビットから最大 1 ビットまで圧縮できます。最大圧縮32倍です。
  • スパース圧縮、DGC アルゴリズムなどの一般的なアルゴリズムの中心的な考え方は、各反復で重要な勾配、つまり勾配値が設定されたしきい値を超えるだけを送信し、同時に情報を削減することです。重要でない勾配はローカルに蓄積されますが、十分な時間がある限り、蓄積された勾配は最終的に設定されたしきい値を超え、勾配の交換が実行されます。このようにして、通信データ量が削減され、ネットワーク帯域幅の需要が削減されます。同時に、モデルの収束への影響を軽減するために、運動量補正、勾配クリッピング、運動量係数マスキング、予熱トレーニングなどのさまざまな方法によっても軽減されます。このソリューションは現在、主に SGD オプティマイザーをサポートしています。
  • 低ランク行列圧縮方式、PowerSGD などの代表的なアルゴリズムの中心となるアイデアは、大きな勾配行列を複数の小さな勾配行列に分解し、小さな行列を送信することで通信量を削減することです。

AIトレーニング加速原理分析とエンジニアリング実践の共有

# 通信頻度削減の最適化、最も単純なアイデアは、バッチ サイズを増やし、反復ごとにデータを増やし、反復数を減らす、つまり通信を減らすことです。量。

ただし、バッチサイズは大きいほど良いため、バッチサイズを大きくすると、モデルの収束精度が低下したり、収束速度が遅くなる可能性があります。同様の問題に対応して、業界は、同様の問題を軽減するために層を通じて学習率を適応的に調整する LARS や LAMB などの最適化アルゴリズムも提案しており、AIAK-Training のサポートも追加されています。

バッチサイズを増やすために、ビデオ メモリが十分であれば、バッチサイズ スーパー パラメータを直接調整できます。ビデオ メモリが不足している場合は、勾配の蓄積によっていくつかの勾配通信をスキップすることもできます。これは実際にはバッチ サイズを増やすことと同じです。

AIトレーニング加速原理分析とエンジニアリング実践の共有

次に、通信トポロジの最適化ソリューションである階層トポロジ通信を紹介します。これは、マシン間のネットワーク帯域幅が比較的低い状況も対象としています。

階層通信により、マシン内の高い相互接続帯域幅を最大限に活用しながら、マシン間の低いネットワーク帯域幅の影響を弱めることができます。

この通信ソリューションは AIAK にも実装されています。25Gbps TCP 環境で、32 枚のカードを備えた 4 台のマシンで SwinTransformer トレーニングがテストされました。階層化された allreduce により、パフォーマンスは 85% 高速化できます。

AIトレーニング加速原理分析とエンジニアリング実践の共有

最後に、基盤となる通信ライブラリ レベルでの最適化である GPU Direct RDMA 通信テクノロジを導入します。このテクノロジには、RDMA ネットワークをサポートするハードウェア環境が必要です。

RDMA 通信を使用すると、ローカル アプリケーションがリモート アプリケーションのユーザー モード仮想メモリを直接読み書きできるようになります。CPU の参加が必要な送信リクエストを送信する最初のステップを除く通信プロセス全体は、ネットワーク カード ハードウェアによって完了し、メモリのコピー、システムの割り込み、ソフトウェア処理を必要としないため、非常に低い遅延と高帯域幅を実現できます。

GPU シナリオでは、GPU Direct RDMA テクノロジにより、GPU ビデオ メモリに直接アクセスするための RDMA のサポートがさらに追加され、通信中に GPU ビデオ メモリとホスト メモリの間でデータが往復コピーされることが回避され、クロスマシン通信がさらに削減されます。遅れます。

しかし、実際のケースでは、一部のユーザーが RDMA 環境を購入したが、実際には GDR テクノロジーを使用せず、その結果、通信効率が低下していることが判明しました。ここにはいくつかの主要な構成項目がリストされています。同様の問題が発生した場合は、トラブルシューティングを行って順番に設定できます。

AIトレーニング加速原理分析とエンジニアリング実践の共有

現在の主なパフォーマンス最適化のアイデアとソリューションのいくつかを紹介しましたが、全体として、I/O の最適化、コンピューティングの最適化、通信の最適化に関係なく、最も単純な最適化のアイデアは主に次のようなものです。操作自体を最適化するか、操作の回数を減らすことができるか、操作を他のプロセスと並列化してオーバーヘッドを隠すことができるかなど。

3. AIAK トレーニング アクセラレーション キットの実践

これまでに多くの最適化作業が導入されてきましたが、これを正しく有効にするには、各ユーザーが AIAK トレーニング アクセラレーション キットのエンジニアリング実装原則を明確に理解する必要があります。フレームワーク。トレーニング最適化のコストを簡素化するために、AIAK-Training 高速化パッケージを構築しました。

AIAK-Training は、データ読み込み、モデル計算、通信などを中心としたフルリンク最適化機能を構築します。同時に、この最適化機能をシンプルで使いやすいインターフェイスにカプセル化し、ユーザーは数行のコードを挿入できるため、統合的に使用するとさらに便利になります。同時に、ユーザーが効果的な最適化戦略を自動的に選択できるように、戦略の組み合わせを自動化して最適化するメカニズムも構築しています。

特別に使用する場合、アクセラレーション ライブラリ コンポーネントを個別にインストールしてデプロイすることも、提供されているコンテナー イメージを直接使用することもできます。

AIトレーニング加速原理分析とエンジニアリング実践の共有

#次に、具体的なアプリケーション ケースをいくつか示します。

下図に示すように、主にデータローダーの最適化を目的としています。このシナリオでは、モデルは比較的小さく、データ セットのサイズも比較的小さく、純粋な計算速度は実際には高速ですが、エポック間データのロード時間が比較的長いため、I/O 時間が長くなります。主なボトルネック。

AIAK で提供されるプロセスの再利用と完全なプリフェッチ メカニズムを使用することにより、モデル全体のトレーニングが 166% 高速化されます。

AIトレーニング加速原理分析とエンジニアリング実践の共有

次の図は、モデル計算の最適化の例です。

Transformer クラス モデルのトレーニング シナリオでは、実際のトレーニング中、通信のスケーラビリティは線形に近く、I/O 時間消費率も非常に低く、コンピューティングが主なパフォーマンスのボトルネックとなっています。

このモデルに対して、AIAK-Training は主要構造の演算子融合、混合精度、大規模バッチ調整などを含む一連の計算レベルの最適化を実行し、モデル全体のトレーニング効率が向上しました。 169%増加しました。

AIトレーニング加速原理分析とエンジニアリング実践の共有

以下の図のケースでは、主に通信レベルの最適化が適用され、クラウド TCP 環境の低帯域幅ネットワークの最適化戦略が可能になります。 、bert、vgg16 は 26% ~ 78% 高速化できます。

AIトレーニング加速原理分析とエンジニアリング実践の共有

自動運転シナリオでは、典型的な 2D ビジョン、3D ビジョン、LIDAR、および融合前のモデルに対して一連のモデル トレーニング パフォーマンス テストも実施しました。パフォーマンスが 49% ~ 391% 高速化されます。


AIトレーニング加速原理分析とエンジニアリング実践の共有

以上がAIトレーニング加速原理分析とエンジニアリング実践の共有の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事は51cto.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。