ホームページ >テクノロジー周辺機器 >AI >AIトレーニング加速原理分析とエンジニアリング実践の共有
この共有では、AI モデルのトレーニング プロセスにおける主なパフォーマンスのボトルネック、およびこれらのボトルネックに対する現在の主な高速化ソリューションと技術原則を体系的に分析し、この点に関する Baidu Intelligent Cloud の実践的な結果をいくつか紹介します。
今日の共有は主に 3 つの部分で構成されます:
最初に、なぜ AI トレーニングを加速する必要があるのか、つまり全体的な背景と出発点を紹介します;
2 番目の部分実際のトレーニング プロセス中に遭遇する可能性のあるパフォーマンスのボトルネックを体系的に分析し、これらの問題に対処するための現在の主な高速化ソリューションを紹介します。
3 番目のパートでは、Baidu Baige プラットフォームの AI トレーニング アクセラレーションを紹介します。一部のモデル トレーニングの高速化に対するパッケージ AIAK-Training の実際的な効果。
AI システムでは、通常、モデルにはオフライン トレーニングと本番環境からアプリケーションへの推論展開という 2 つの段階が含まれます。
オフライン トレーニング フェーズはモデルを生成するプロセスであり、ユーザーは独自のタスク シナリオに従ってモデルのトレーニングに必要なデータ セットとニューラル ネットワーク アルゴリズムを準備する必要があります。
このアルゴリズムは、多くの変数とパラメーターを含む、非常に複雑な非凸数学関数として理解できます。モデルのトレーニングのプロセスは、実際にはニューラル ネットワーク モデルのパラメーターを学習することです。
モデルのトレーニングが開始されると、データが読み取られ、前方計算のためにモデルに送信され、実際の値との誤差が計算されます。次に、逆計算を実行してパラメータの勾配を取得し、最後にパラメータを更新します。トレーニングには複数ラウンドのデータ反復が含まれます。
トレーニングが完了したら、トレーニングされたモデルを保存し、そのモデルをオンラインにデプロイし、ユーザーの実際の入力を受け入れ、前方計算による推論を完了します。
したがって、トレーニングでも推論でも、中心となるのはデータ計算です。コンピューティング効率を加速するために、トレーニングと推論は通常、GPU などの異種アクセラレーション チップを通じて実行されます。
また、ディープラーニングモデルの開発履歴から判断すると、モデル精度の上限を突破し続けるために、モデルパラメータの数は実際に拡大しています。急速に。ただし、パラメーターの数が増えると、計算の複雑さが増します。
下図の左側は公開論文から抜粋したものですが、この概要を見ると、2010年以前はモデルの計算量が約20か月で2倍になっていることが分かります。 2010 年から 2015 年まで、従来のモデルの計算は 5 ~ 6 か月ごとに 2 倍になりました。 2015年以降、大規模モデルのトレーニングの傾向が現れ、計算量は10倍から100倍に増加しました。
モデルのトレーニングでは、コンピューティング能力とインフラストラクチャに対する要件がますます高まっています。トレーニングにはより多くのコンピューティング能力が必要であり、時間がかかるため、リソースのコストも増加します。ここでは、いくつかの論文や研究で開示されているコスト データをリストします。これは、モデルのトレーニングのコストが非常に高いことを反映しています。
したがって、モデルのトレーニングをいかに安定的に行うか、継続的にコストを削減し効率を高めるかが実は重要です。
このような背景に対して、Baidu Intelligent Cloud は、AI シナリオ向けの統合されたソフトウェアとハードウェア ソリューションを提供することを目的として、Baidu Baige·AI ヘテロジニアス コンピューティング プラットフォームを立ち上げました。 AI コンピューティング、AI ストレージ、AI アクセラレーション、AI コンテナーの 4 層のテクノロジー スタックを通じて、上位レベルのビジネス シナリオのニーズを満たします。
#パフォーマンスの高速化について考えるとき、最初に思い浮かぶのは、より優れたハードウェアを使用することかもしれません。
これにより、一定のパフォーマンスの向上がもたらされますが、ほとんどの場合、ハードウェアの計算能力が十分に活用されていない可能性があります。主な理由は、トレーニング コードの実行効率が最適以上に調整されていないことです。 。 州。
2. トレーニング パフォーマンスのオーバーヘッド分析と加速計画
モデル トレーニングの最適化自体はソフトウェアとハードウェアの包括的な作業であり、テクノロジ スタックは比較的複雑であるため、今日の内容では詳細をすべてカバーすることはできません。重要な部分をカバーできるように最善を尽くします。アイデア。
まず、現在のモデルのトレーニング スキームを見てみましょう。これまでの開発段階で、モデル トレーニング ソリューションには 2 つの重要な変更がありました。1 つはシングル カード トレーニングから分散トレーニングへの変更、もう 1 つはデータ並列トレーニングから多次元ハイブリッド並列トレーニングへの変更です。ここで重要なポイントは、トレーニング データの量とモデル パラメーターの量です。
シングルカード トレーニング方法: 実際にこのモードを使用する場合、モデルのパラメーターとデータの量は一般に比較的少なく、シングル カードのトレーニング時間は許容範囲内です。モデル パラメーターのスケールでは、トレーニング プロセス中に 1 枚のカードのビデオ メモリがストレージの上限を満たすことができるようにする必要があります。新しい GPU カードのビデオ メモリ容量構成によると、配置できる最大サイズは通常 10 億パラメータです。たとえば、モデル パラメーターの数が十分に大きい場合、パラメーターの数は数百億または数千億に達し、1 枚のカードでは完全なモデルを保持できなくなります。ここでも、モデルの並列性、またはデータ並列性とモデル並列性を同時に利用するハイブリッド並列方式が登場。
モデル並列処理では、モデルを異なるカードに分割し、各カードにモデルの一部を配置します。ここでは、層内分割または層間分割、Tensor 並列処理など、分割方法が異なります。とパイプライン並列処理はさらに細分化されます。
一般的なモデルのトレーニングではデータ並列処理がよく使用されるため、パフォーマンス最適化のアイデアを紹介する例としてデータ並列処理に焦点を当てます。
# まず、ソフトウェアとハードウェアの全体的な観点から、シングルカード トレーニング中に存在するパフォーマンスのオーバーヘッドを理解しましょう。
下の図の左側は、ソフトウェアの観点から見たトレーニング プロセスです。シングルカードトレーニングのプロセスには、主にデータの読み取り、データの前処理、順計算出力と損失計算、損失関数による逆計算を行って各層パラメータの勾配を取得し、最後に勾配に応じてモデルパラメータを更新することが含まれます。トレーニングが収束するまでこのプロセスを続けます。
以下の図の右側は、簡略化されたノードのハードウェア トポロジ図です。一番上はデータ ストレージで、ローカル ストレージまたはネットワーク ストレージを使用できます。次に CPU とメモリです。0 から 7 までの番号が付けられた複数の PCIe スイッチを介して 8 枚の GPU カードが CPU に接続されており、8 枚のカードは NVSwitch を介して相互接続されています。コンピューティング インスタンスが異なれば、ハードウェア トポロジも異なります。
したがって、単一カードの観点から見ると、主に I/O、CPU の前処理、CPU と GPU 間のデータのコピー、GPU の計算などのオーバーヘッドがあります。
次に、データ並列処理のプロセスを見てみましょう。
下図の左側は依然としてトレーニングのメイン プロセスであり、右側は 3 台のマシン 24 枚のカードのトレーニング クラスターのハードウェア トポロジを示しており、3 台のマシンはネットワークを通じて相互接続されています。
データ並列処理では、各デバイスが順方向および逆方向の計算プロセスを並列かつ独立して実行することも前編で紹介しましたので、各トレーニング プロセスでも上記のシングル カード トレーニングが発生します。問題。
データの並列化が単一カードのトレーニングと数学的に同等であることを保証するには、各カードのモデル パラメーターが反復プロセス中に常に一貫していることを確認する必要があります。一方で、各 GPU カードのモデル パラメーターの初期化ステータスを一貫させる必要があり、これは通常、トレーニングを開始する前に最初のカードのパラメーター ステータスを他のカードにブロードキャストすることで行われます。
学習時には、各デバイスで処理するデータが異なるため、順計算で得られるモデルの損失値も異なるため、各デバイスで傾きを逆計算した後に傾きを計算することも必要です。 、反復プロセス中に各カードのモデル パラメーターの一貫性が保たれるように、平均勾配値でモデル パラメーターを更新します。
勾配平均には、ノード内のカード間の通信やノード間のネットワーク通信オーバーヘッドなどの通信プロセスが含まれます。ここでの通信には同期通信と非同期通信が含まれますが、モデル学習の収束性を確保するために、一般的には同期通信ソリューションが使用され、その後の最適化作業も同期通信に基づいて行われます。
上記のことから、単一カードのトレーニングと比較して、データの並列処理により主に追加の通信オーバーヘッドが追加されることがわかります。
上記の分析を通じて、AI トレーニングの高速化は作業の特定の側面だけではなく、データの読み込み、モデルの計算、そして分散コミュニケーション。ここでいうデータロードには、データの入出力、前処理、メモリコピー等の処理が含まれます。
特定の最適化実践では、最適化対象のモデルが与えられた場合、モデル トレーニングを高速化することは、トレーニングの全体的なスループット (1 秒あたりにトレーニングできるサンプル数) を継続的に向上させることを意味します。このプロセスでは、通常、最初に 1 枚のカードのトレーニング スループットを分析できます。1 枚のカードのトレーニング スループットが向上したら、次に 1 枚のカードから複数のカードへの拡張を検討して、カードのトレーニング加速率を向上させる方法を確認できます。複数のカード。
まず、シングルカード トレーニングの最適化です。最終的な最適化目標は、すべての時間を GPU コンピューティングに費やし、アクセラレータの使用率を 100% にすることです。もちろん、実際にこの状態を完全に達成することは困難ですが、この指標を使用して作業をガイドしたり測定したりすることができます。
シングル カードのパフォーマンス最適化の鍵には 2 つの部分が含まれます。
次に、1 枚のカードから複数のカードに拡張し、線形加速率を達成する方法を目標とします。直線加速率という指標は、単純にトレーニングを1枚から2枚に拡張したときに、トレーニングパフォーマンスが1枚のカードの2倍になるかどうかを意味します。
ここでの核心は、分散通信の効率を最適化することであり、ハードウェアレベルの最適化である一方で、実際の通信においてどのように活用するかを考える必要があります。ネットワークの帯域幅リソースの量、または通信プロセスを非表示にできるかどうか。
以下では、これらの側面について詳しく説明します。
1 つ目は、データ読み込みの最適化です。
データローダーをインスタンス化した後、引き続きデータローダーを反復処理して、モデルのトレーニング用にデータのバッチを読み取ります。
ここで最適化を行わなかった場合、下図の上部に示すように、実際には各バッチのデータ読み込み処理と各バッチのモデル学習処理が直列に実行されます。 GPU の観点から見ると、データの読み込みによって計算ギャップが発生し、コンピューティング リソースの時間が無駄になります。
データ読み取りの効率を直接向上させるためにより優れたハードウェアを使用するという前述のことに加えて、他にどのように最適化できるでしょうか?
実際、AI トレーニング プロセス中に、データ アクセスには 2 つの重要な機能があります。
したがって、ハードウェア レベルの変更に依存しない場合に実行できる最適化作業の 1 つは、データのプリフェッチです。データの最初のバッチをトレーニングするときに、データの次のバッチを事前にロードできます。 . I/O プロセスと GPU 上の計算を完全に並列化します。
まず、データローダーの既存の最適化ソリューションを有効に活用する必要があります。まず、num_workers ハイパーパラメーターを適切に設定し、複数のプロセスを通じてデータを読み取ります。このステップは、ストレージ システムからホスト メモリへのデータ プリフェッチを実現できます。 2 つ目は、ホスト メモリから GPU メモリにコピーすることで、固定メモリ メカニズムを通じて高速化できます。
ピン メモリ アクセラレーションの主原理の簡単な紹介: メモリ データには 2 つのタイプがあります: ページ可能メモリとピン メモリです。ページ可能メモリ内のデータはディスクにスワップ アウトできます。この場合、H2D を実行するときに、最初にディスクからメモリに読み取り、次にメモリからビデオ メモリにコピーする必要がある場合があります。さらに、ページャブル メモリ データを GPU メモリにコピーする場合は、最初に一時的な固定メモリ バッファを作成し、ページャブル メモリから固定メモリにデータをコピーしてから、それを GPU に転送する必要があります。これには追加のデータ転送操作も必要です。
ただし、上記のソリューションを有効にすると、ストレージ システムからホスト メモリへのプリフェッチのみが実装され、ホストからデバイスへのデータ コピー速度が向上します。ただし、ホストからデバイスへのメモリのコピーと実際の計算カーネルは依然として GPU 上でシリアルに実行されます。つまり、GPU 上にはまだわずかな時間ギャップが存在します。
AIAK は、この問題に対処するためにさらなる最適化を行い、H2D と前方計算のオーバーラップを可能にしました。
#データ並列シナリオでは、データを均等に分割する必要があることに注意する必要があります。
各学習プロセスに割り当てられるデータが偏ると計算量が異なり、各プロセスの順計算と逆計算の完了時間が異なり、先に計算が完了したプロセスが先に計算を完了することになります。処理中はまず勾配通信リンクに入りますが、Allreduce通信は同期通信であるため、すべてのプロセスが同時に開始・終了する必要があるため、開始するプロセスは最初の通信は、他のすべてのプロセスも AllReduce を開始するのを待ちます。通信操作は一緒に完了します。速度の違いによってリソースのアイドル状態の問題が発生する可能性があります。
この問題を解決するには、各プロセスが同じバッチサイズを使用してデータを読み取る必要があり、各バッチ内のデータ量のバランスをとる必要があります。画像データは通常、トレーニング用に固定サイズですが、NLP モデルは可変長ステートメントを処理する必要があるため、特別な処理が必要になる場合があります。たとえば、データを同じ長さにパディングしたり、サンプルの長さをソートすることで均等に分散したりすることができます。
次に、計算効率の最適化について紹介します。
計算には、順方向、逆方向、およびパラメーターの更新が含まれます。計算の最適化の目標は、異種ハードウェアの計算能力を最大限に活用することであり、理想的な状況は、GPU チップの実際の計算パフォーマンスが理論上のピークに達することです。
まず、単一のオペレーターの観点から分析してみましょう。GPU で計算操作を実行する準備をするとき、簡略化されたプロセスには 4 つのステップがあります。
コンピューティングとメモリ アクセスのオーバーヘッドの割合に応じて、オペレータは一般にコンピューティング ボトルネックまたはメモリ アクセス ボトルネックに分類されます。
オペレーターから完全なモデルのトレーニングに拡張する場合、多くのカーネル計算を継続的に実行する必要があるため、カーネル起動によるカーネル計算と中間結果の読み取りおよび書き込みの間に多くのエラーが発生します。ギャップ問題を計算します。
上記のことから、モデルの計算効率を最適化するには、メモリ アクセスの最適化、計算の最適化、その他のオーバーヘッドの最適化を総合的に考慮する必要があることがわかります。
#1 つ目は演算子融合です。オペレーターが基盤となる GPU で実行されると、1 つ以上のカーネル起動が開始され、カーネル間のインタラクティブ データもビデオ メモリを通過する必要があります。オペレーター フュージョンは、複数の GPU カーネルを 1 つの大きなカーネルに融合して、統合された開始と実行。
#演算子融合を具体的に実装するにはどうすればよいですか?
専門家の経験に基づいた手書きの融合演算子を使用して、モデル内の非効率な操作を分析する方法。 GPU では主に CUDA オペレーターの研究開発が行われますが、ここには一定のしきい値があります。 AIAK-Training は、典型的なモデル構造や顧客のニーズに基づいて、効率的で最適化されたオペレーターの実装を提供します。
もう 1 つの方法は、ソリューションをコンパイルして最適化することです。計算の最適化はコンパイルによって実行され、コードが自動的に生成されるため、さまざまなハードウェアでの手動最適化のコストが削減されます。ただし、現在のコンパイル ソリューションの多くは推論に対してより最適化されており、トレーニング ソリューションは依然として急速な進化の過程にあります。しかし、究極のパフォーマンスという観点から考えると、今後もしばらくは手書き融合オペレーターの仕事が不可欠となるでしょう。
以下では、演算子融合の実際的な事例をいくつか紹介します。 1 つ目は、典型的なモデルのネットワーク構造の最適化です。
次の図は、SwinTransformer モデルのコア モジュール WindowAttend に対する計算融合の最適化を示しています。
WindowAttend 構造体、コアの演算式を次の図に示します。計算プロセスでは、7 つの計算カーネルを順番に実行する必要があります。いくつかの再形成およびその他の変換操作と組み合わせると、合計 10 個のカーネルを起動する必要があります。パフォーマンス分析を通じて、起動カーネルの間隔冗長オーバーヘッドが実際の実行プロセス中のエンドツーエンド時間の 80% 以上を占め、その結果、このモジュールに大きな最適化スペースが生じることが判明しました。
これらのカーネルを 1 つに融合することで、モジュール全体の実行時間が 392 マイクロ秒から 13 マイクロ秒に短縮され、単一のオペレーターは 30 倍高速化されます。モデル全体のトレーニング効率がエンドツーエンドで 20% 以上高速化されました。
この最適化の中心となるアイデアには 3 つの主要なポイントがあります:
次は、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 トレーニング ソリューションまたは混合精度トレーニング ソリューションを使用する方が簡単です。
1 つ目は TF32 トレーニング モードです。TF32 は Ampere によって導入されました。
TF32 浮動小数点数の式には、8 つの指数ビット、10 の仮数ビット、1 つの符号ビットがあります。指数ビットはFP32と同じ、つまりデータ表現範囲は同じですが、仮数ビットはFP32より下位でFP16と同じです。
TF32 はオープンな数値型ではなく、Tensor Core の計算モードであるため、ユーザーが TF32 型の浮動小数点数を直接作成することはできないことに注意してください。
TF32 が有効な場合、Tensor コアは行列の計算または畳み込み演算時に FP32 を TF32 に自動的に変換します。計算が完了した後も、出力データ型は FP32 型のままです。
TF32 トレーニングは、一部のフレームワーク バージョンではデフォルトで有効になっています。一部のフレームワーク バージョンでは、環境変数またはパラメータ設定を通じて手動で有効にする必要がある場合があります。詳細については、フレームワークのユーザー マニュアルを参照してください。
ただし、TF32 は FP32 に比べて精度範囲が狭いため、実際のトレーニング時はモデルの収束精度への影響に注意する必要があります。
#混合精度トレーニングとは、モデルの精度の損失を最小限に抑えながら、FP32 と FP16 の混合精度を使用したトレーニングを指します。 混合精度トレーニングの主な利点は、FP32 トレーニングと比較してメモリ要件が軽減され、より大規模なネットワークをトレーニングしたり、より大きなバッチ サイズを使用したりできることです。使用するメモリ帯域幅を少なくするとデータ転送が高速化でき、半精度の計算により数学演算も高速化できます。ただし、FP16 の指数ビットと仮数ビットの範囲は FP32 よりも小さいため、数値の表現範囲や精度が低下しますが、実際の使用においては表現範囲が狭いため数値オーバーフローが発生したり、精度不足により丸め誤差が発生したりする可能性があります。 同様の問題を最適化するために、混合精度トレーニング ソリューションにはいくつかの重要な技術的タスクがあります。現在、すべてのフレームワークは混合精度をサポートしています。 AIAK トレーニング コンポーネントでは、NVIDIA Apex に AMP O2 混合精度モードがさらに導入され、より多くの計算をより積極的に FP16 に転送してトレーニングを加速します。デフォルトの O1 モードと比較すると、速度はさらに向上しますが、精度が影響を受ける可能性があるため、特定のモデルで検証する必要があります。
AIAK-Training は、トーチアンプのネイティブな使用法と互換性のある使用法を提供し、O2 モードを簡単に有効にすることができます。
#次に、コミュニケーションの最適化について紹介します。これも非常に大きなトピックであり、多くの内容が含まれます。
前述したように、1 枚のカードから複数のカードに拡張するには複数のカード間のデータ同期が必要となるため、通信は主に分散トレーニングで導入され、これらの同期操作は通信によって実装されます。
次の図は、通信最適化のための全体的なアーキテクチャを示しています。
# まず、コミュニケーション戦略レベルでの最適化のアイデアを見てみましょう。1 つ目は、コミュニケーションの隠れた最適化です。
データ並列処理では、学習の逆方向に勾配同期通信を行い、逆方向に勾配を計算した後、グローバル勾配平均を行うことができます。
機構の最適化を行わないと、逆算と通信がシリアルに行われるため、計算に時間差が生じます。
逆プロセスでは、前の勾配の通信と次の勾配の計算の間にデータの依存関係がないため、前の勾配の通信と次の勾配の計算を並列化でき、 2 対 2 つのユーザーの時間が重なることで、通信に時間がかかる部分が隠蔽されます。
実装レベルでは、通信演算子と計算演算子は通常、異なる cuda ストリームにスケジュールされます。通信演算子は通信ストリームにスケジュールされ、計算演算子は計算ストリームにスケジュールされ、異なるストリームでの計算はサブステップとして実行できます。並行して起動および実行されるため、勾配通信と逆方向の計算の並行オーバーラップが実現します。
現在、この最適化機能はフレームワークでデフォルトで有効になっています。
2 つ目は、通信統合の最適化です。
デフォルトでは、モデル内の各グラデーションは通信操作を開始する必要があります。単一の勾配のサイズが比較的小さい場合、小さなデータ パケットが実際に通信されると、ネットワーク帯域幅の使用率が非常に低くなり、通信パフォーマンスが低下します。
通信融合とは、1 つの通信に対して複数の勾配を融合することであり、通信オーバーヘッド モデルの分析から、帯域幅の使用率を向上させるだけでなく、通信の初期化遅延期間を短縮することもできます。
現在、多くの分散トレーニング フレームワークは、デフォルトで勾配融合戦略もサポートしています。さまざまなフレームワークの実装方法には特定の違いがあります。最初に通信シーケンスを決定するために勾配ネゴシエーションが必要な実装もあれば、静的通信を直接使用する実装もあります。バケット。
フレームワークはデフォルトで通信フュージョンをサポートしていますが、勾配フュージョンのサイズは一般にパラメータを通じて設定できます。ユーザーは物理環境とモデルのニーズに応じて適切なフュージョンしきい値を調整でき、次のことができるはずです。より良い利益を達成します。
低帯域幅の TCP 環境など、ネットワーク帯域幅が狭いトレーニング シナリオの場合、勾配同期の遅延がトレーニングの主なパフォーマンスのボトルネックになる可能性があります。
# 通信頻度削減の最適化、最も単純なアイデアは、バッチ サイズを増やし、反復ごとにデータを増やし、反復数を減らす、つまり通信を減らすことです。量。
ただし、バッチサイズは大きいほど良いため、バッチサイズを大きくすると、モデルの収束精度が低下したり、収束速度が遅くなる可能性があります。同様の問題に対応して、業界は、同様の問題を軽減するために層を通じて学習率を適応的に調整する LARS や LAMB などの最適化アルゴリズムも提案しており、AIAK-Training のサポートも追加されています。
バッチサイズを増やすために、ビデオ メモリが十分であれば、バッチサイズ スーパー パラメータを直接調整できます。ビデオ メモリが不足している場合は、勾配の蓄積によっていくつかの勾配通信をスキップすることもできます。これは実際にはバッチ サイズを増やすことと同じです。
次に、通信トポロジの最適化ソリューションである階層トポロジ通信を紹介します。これは、マシン間のネットワーク帯域幅が比較的低い状況も対象としています。
階層通信により、マシン内の高い相互接続帯域幅を最大限に活用しながら、マシン間の低いネットワーク帯域幅の影響を弱めることができます。
この通信ソリューションは AIAK にも実装されています。25Gbps TCP 環境で、32 枚のカードを備えた 4 台のマシンで SwinTransformer トレーニングがテストされました。階層化された allreduce により、パフォーマンスは 85% 高速化できます。
最後に、基盤となる通信ライブラリ レベルでの最適化である GPU Direct RDMA 通信テクノロジを導入します。このテクノロジには、RDMA ネットワークをサポートするハードウェア環境が必要です。
RDMA 通信を使用すると、ローカル アプリケーションがリモート アプリケーションのユーザー モード仮想メモリを直接読み書きできるようになります。CPU の参加が必要な送信リクエストを送信する最初のステップを除く通信プロセス全体は、ネットワーク カード ハードウェアによって完了し、メモリのコピー、システムの割り込み、ソフトウェア処理を必要としないため、非常に低い遅延と高帯域幅を実現できます。
GPU シナリオでは、GPU Direct RDMA テクノロジにより、GPU ビデオ メモリに直接アクセスするための RDMA のサポートがさらに追加され、通信中に GPU ビデオ メモリとホスト メモリの間でデータが往復コピーされることが回避され、クロスマシン通信がさらに削減されます。遅れます。
しかし、実際のケースでは、一部のユーザーが RDMA 環境を購入したが、実際には GDR テクノロジーを使用せず、その結果、通信効率が低下していることが判明しました。ここにはいくつかの主要な構成項目がリストされています。同様の問題が発生した場合は、トラブルシューティングを行って順番に設定できます。
現在の主なパフォーマンス最適化のアイデアとソリューションのいくつかを紹介しましたが、全体として、I/O の最適化、コンピューティングの最適化、通信の最適化に関係なく、最も単純な最適化のアイデアは主に次のようなものです。操作自体を最適化するか、操作の回数を減らすことができるか、操作を他のプロセスと並列化してオーバーヘッドを隠すことができるかなど。
これまでに多くの最適化作業が導入されてきましたが、これを正しく有効にするには、各ユーザーが AIAK トレーニング アクセラレーション キットのエンジニアリング実装原則を明確に理解する必要があります。フレームワーク。トレーニング最適化のコストを簡素化するために、AIAK-Training 高速化パッケージを構築しました。
AIAK-Training は、データ読み込み、モデル計算、通信などを中心としたフルリンク最適化機能を構築します。同時に、この最適化機能をシンプルで使いやすいインターフェイスにカプセル化し、ユーザーは数行のコードを挿入できるため、統合的に使用するとさらに便利になります。同時に、ユーザーが効果的な最適化戦略を自動的に選択できるように、戦略の組み合わせを自動化して最適化するメカニズムも構築しています。
特別に使用する場合、アクセラレーション ライブラリ コンポーネントを個別にインストールしてデプロイすることも、提供されているコンテナー イメージを直接使用することもできます。
#次に、具体的なアプリケーション ケースをいくつか示します。 下図に示すように、主にデータローダーの最適化を目的としています。このシナリオでは、モデルは比較的小さく、データ セットのサイズも比較的小さく、純粋な計算速度は実際には高速ですが、エポック間データのロード時間が比較的長いため、I/O 時間が長くなります。主なボトルネック。 AIAK で提供されるプロセスの再利用と完全なプリフェッチ メカニズムを使用することにより、モデル全体のトレーニングが 166% 高速化されます。 次の図は、モデル計算の最適化の例です。 Transformer クラス モデルのトレーニング シナリオでは、実際のトレーニング中、通信のスケーラビリティは線形に近く、I/O 時間消費率も非常に低く、コンピューティングが主なパフォーマンスのボトルネックとなっています。 このモデルに対して、AIAK-Training は主要構造の演算子融合、混合精度、大規模バッチ調整などを含む一連の計算レベルの最適化を実行し、モデル全体のトレーニング効率が向上しました。 169%増加しました。 以下の図のケースでは、主に通信レベルの最適化が適用され、クラウド TCP 環境の低帯域幅ネットワークの最適化戦略が可能になります。 、bert、vgg16 は 26% ~ 78% 高速化できます。 自動運転シナリオでは、典型的な 2D ビジョン、3D ビジョン、LIDAR、および融合前のモデルに対して一連のモデル トレーニング パフォーマンス テストも実施しました。パフォーマンスが 49% ~ 391% 高速化されます。以上がAIトレーニング加速原理分析とエンジニアリング実践の共有の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。