この記事は、Heart of Autonomous Driving の公開アカウントから許可を得て転載したものです。転載については出典元にお問い合わせください。 1. TensorRT とは何ですか?2016 年に、Nvidia は独自の GPU 上で推論を高速化するための SDK を提供しました。これは推論フレームワークとも呼ばれます。 2. なぜですか?独自の GPU または DLA を最適化する方法を最もよく知っているのは Nvidia だけなので、TensorRT はネットワークを最も高速に実行し、Pytorch を直接使用するよりも N 倍高速です。 TensorRTははるかに先を行く 3. どのように行われましたか?1. 最適化空間全体を検索Pytorch などの他のトレーニング フレームワークとの最大の違いは、TensorRT のネットワーク最適化アルゴリズムがターゲット GPU の推論パフォーマンス最適化に基づいているのに対し、他のフレームワークはトレーニングと推論を総合的に考慮する必要があり、さらに重要なことに、ターゲット GPU に的を絞った最適化を実行しないことです。 TensorRT はターゲット GPU に対してどのように最適化されますか? 簡単に言えば、可能な設計空間内でグローバルな最適解を探すことです。 この検索空間内の変数は何ですか? たとえば、CUDA アーキテクチャのプログラミング モデルに対応して、Tensor はいくつのブロックに分割されますか?そして、これらのブロックがグリッドにどのように編成されるかです。 タスクは複数のブロックに分割されます ブロックはグリッドに整理されています 異なる組織レベルは、異なるストレージアーキテクチャ内の異なるメモリに対応します。 たとえば、計算を完了するためにどのような命令が使用されるのでしょうか? FFMA、FMMA、または TensorCore 命令である可能性があります... より難しい部分は、Tensor データ フローのスケジュール設定かもしれません。それらはローカル メモリ、共有メモリ、またはグローバル メモリに配置する必要がありますか?どうやって配置するのですか? これらの変数を組み合わせると、巨大な検索空間が形成され、CPU が数日間計算しても結果を取得できない可能性があります。 しかし、ニューラル ネットワークの計算はより大きな粒度の演算子で構成されており、演算子の上にはさらに大きな粒度の層構造があることがわかっています。また、各レイヤーは比較的独立していることも明確にわかっています。つまり、各レイヤーの計算を最適化でき、最終的に最適化されたレイヤーを連結することが、ネットワークのグローバルな最適解になる可能性が高いということです。 そのため、TensorRT は多くの演算子とレイヤー (CUDA カーネル) を事前に書き込みます。もちろん、これらの演算子の入力テンソルと出力テンソルは、ネットワークの入力と出力、および GPU リソースの違いに合わせて構成できます。 いくつかの最適化された演算子 元の命令レベルの検索から演算子レベルの検索へと、検索空間は小さくなりました。これらの実装は CUDA カーネルで記述されているため、カーネルレベルの検索であると言う方が正確です。 しかし、最も重要かつ複雑な部分でもある Tensor データフローのスケジューリング問題は解決されていません。入力テンソルをいくつのブロックに分割すればよいでしょうか?これらのブロックをいくつのスレッドに割り当てる必要がありますか? Tensor はどこに保存されますか?ローカル/共有/グローバルメモリはどこにありますか?中間計算結果はどこに保存されますか? コンピューティング部分のパフォーマンスはシミュレーション(命令セットシミュレーターに類似)で計算できますが、共有/L2/グローバルメモリ内のTensorデータの流れのシミュレーションでは、シミュレートするデータ量とスレッド数が多すぎるため正確な結果を得ることが難しく、試す可能性が多数あるため、CPUシミュレーション計算に頼ることは忘れてください。唯一の方法は、候補演算子をターゲット GPU 上で直接実行し、パフォーマンスを計算し、最終的に比較して最適なソリューションを選択することです。 TensorRT はこのプロセスをタイミングと呼びます。TensorRTは、分析用に最適化された中間プロセスを保存することもでき、これをタイミング キャッシュと呼びます (trtexec --timingCacheFile=<file> 経由)。 Nvida GPU メモリ アーキテクチャ 上記の最適化プロセスは、ハードウェア認識最適化と呼ばれます。 要約すると、オプティマイザーは次の分析に重点を置きます。
これらは、Pytorch などのフレームワークでは、特にストレージ システムの最適化については深く掘り下げられません。 2. カーネルの選択を強制するブロック間のスレッドの実行順序はランダムであるため、CPU は GDDR/HBM にデータを読み書きする可能性があり、GPU クロック周波数も負荷に応じて変化する可能性があり、異なるシステム動作環境では GPU パフォーマンスに違いが生じます。この違いにより、TensorRT Timing の最適解が実際の推論中に最適な解ではなくなり、最適でないカーネルが選択される可能性もあります。 TensorRT は、特定のカーネル実装が最適なソリューションであると確信している場合に、そのカーネル実装を強制的に選択するという解決策を提供します。 TensorRT が提供する API は AlgorithmSelector と呼ばれます。 3. プラグインもちろん、設計した演算子に自信がある場合は、独自のカーネルを記述し、その使用を指定することもできます。 しかし、ほとんどの場合、TensorRT が特定の演算子をサポートしていないことがわかり、カーネルを記述せざるを得なくなります。結局のところ、CUDA プログラミングは簡単ではなく、十分なパフォーマンスが必要です。 4. cuBLAS と cuDNNTensorRT のインストール手順では、最初に CUDA SDK と cuDNN をインストールする必要があります。 TensorRT によって呼び出されるカーネルを Nvidia GPU 用のアセンブリ命令シーケンスにコンパイルするには NVCC コンパイラが必要であるため、CUDA SDK をインストールする必要があることは明らかです。 ただし、CUDA SDK には、TensorRT に依存する cuBLAS ライブラリもあります。C++ ライブラリ BLAS (Basic Linear Algebra Subprograms) は、CPU での線形代数計算に最適化されていることはわかっています。そして、cuBLAS は、CUDA GPU 用に開発された線形代数計算ライブラリです。もちろん、その基礎レイヤーは CUDA カーネルで記述されています。一般的な行列乗算演算子は、cuBLAS を直接呼び出すことができます。 cuBLAS は非常に初期に開発され、CUDA エコシステムで最も初期のライブラリの 1 つになるはずです。しかし、ディープラーニングの人気が高まるにつれて、Nvidia は cuDNN ライブラリをエコシステムに追加しました。これはより高いレベルにあり、ネットワーク層をカプセル化します。つまり、実際には、TensorRT は cuDNN ライブラリの最適化されたカーネルを直接呼び出すこともできます。はい、そしていいえ。 TensorRT は、TensorRT で記述されたカーネルを使用するか、cuBLAS と cuDNN を使用するかを決定する、いわゆるTactic (戦略)を選択できます。 5. 戦術TensorRT の Tactic は多くの最適化オプションを決定できます。 たとえば、オペレーターの時間を計測するたびに、平均実行回数が必要になります。デフォルトでは、不確実性によって発生するエラーを減らすために TensorRT は 4 回実行されますが、この回数は変更できます。 前述のカーネルライブラリの選択、プラグインの選択、GPU クロック周波数のロックなども決定できます。 6. 定量化TensorRT には、ネットワークを量子化する機能が確かにあります。ネットワーク全体を int8 に量子化する暗黙的な量子化方法を提供し、Q/DQ レイヤーを挿入する明示的な量子化方法も提供します。 ハイブリッド量子化は、Nvidia が非常に優れた成果を上げている分野であり、コンピューティング リソースの効率的な使用において重要な役割を果たします。ただし、これは別のトピックであり、機会があれば後で説明します。 7. マルチアプリケーション推論とマルチカード推論実際、これが Nvidia の強みです。競合他社がシングルカードのパフォーマンスについて話しているとき、マルチカードまたはマルチノードは実際には Nvidia のキラー機能です。 さらに、単一のカードで十分なパフォーマンスが得られる場合は、並列推論のストリームを複数用意することが必要になる場合がありますが、これも TensorRT では必須です。 4. TensorRT のカーネルとは何ですか?回答: 実際の操作を通じて、ネットワーク、入力、出力テンソル、およびターゲット GPU リソースに基づいて候補ライブラリから最適なカーネルを選択するハードウェア対応オプティマイザー。 5. コンパイラ最後に、コンパイラのフロントエンドとバックエンドの理論を適用する必要がある場合、上で説明した部分は、基盤となるハードウェアと密接に関連しているため、コンパイラのバックエンド部分に属する必要があります。論理的には物理コンパイラ NVCC の上に配置されているだけです。コンパイラのフロントエンド、つまりハードウェアに関係のないグラフ融合部分も TensorRT Builder で完結します。 AIコンパイラについてあまり知らない人は、次の入門記事を読んでみてください。 https://zhuanlan.zhihu.com/p/632648673 最後に、まとめとして2枚の写真を送ります TensorRT ツールチェーン TensorRTバックエンド最適化プロセス |
<<: AIがピークを迎える中、CIOはクラウドコンピューティングのコスト戦略を強化
>>: 動作計画のための探索アルゴリズム: フロントエンド計画、バックエンド軌道生成から状態解まで
製造業は、自動車、電子機器、医療機器、機械、その他のシステムの部品を生産する上で重要な役割を果たして...
インターネット データ センターの最新の消費者ガイド分析によると、2021 年から 2025 年の期...
人工知能と画像処理の魅力的な世界では、これらの概念は、機械が人間の目と同じように私たちの周りの三次元...
この記事はAI新メディアQuantum Bit(公開アカウントID:QbitAI)より許可を得て転載...
自動化と生成型人工知能 (GenAI) の時代において、「データセンター」の本当の意味を再考する時が...
2020年中国人工知能サミットフォーラム及び中国人工知能競技会結果発表会が23日、厦門で開催された。...
この記事はAI新メディアQuantum Bit(公開アカウントID:QbitAI)より許可を得て転載...
この記事はLeiphone.comから転載したものです。転載する場合は、Leiphone.com公式...
ITS114の統計によると、2019年のわが国のセキュリティとスノーブライトプロジェクトの数千万プ...
Transformer アーキテクチャは、現代の機械学習で広く使用されています。 Attention...