TensorRT はどのようにしてより高速なアーキテクチャを実現するのでしょうか?

TensorRT はどのようにしてより高速なアーキテクチャを実現するのでしょうか?

この記事は、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 と cuDNN

TensorRT のインストール手順では、最初に 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はクラウドコンピューティングのコスト戦略を強化

>>:  動作計画のための探索アルゴリズム: フロントエンド計画、バックエンド軌道生成から状態解まで

ブログ    

推薦する

最新レポート: 従業員の 25% が ChatGPT などの AI ツールに機密データをアップロードしている

新たな調査によると、従業員の15%がChatGPTに会社のデータを頻繁にアップロードしており、そのデ...

2021年以降の人工知能トレンドに関する5つの予測

[[377548]]アンドリュー・ン教授(スタンフォード大学コンピュータサイエンスおよび電気工学准教...

大規模モデルの微調整には人間のデータに頼らなければならないのでしょうか? DeepMind: フィードバック付きの自己トレーニングの方が優れている

皆さんもご存知のとおり、大規模言語モデル (LLM) はディープラーニングの状況を変えつつあり、人間...

再帰アルゴリズム: 不可解なスイッチ「ライトを引く」

[[411620]]タイトル出典:AcWing[1]。トピック「Pull the Light」とい...

魔法のレコメンデーションシステム:6億人のユーザーの音楽シーンを考えるAI

[51CTO.comより] NetEase Cloud Musicは音楽愛好家が集まる場所です。C...

遺伝的アルゴリズムに基づく高周波タグアンテナの最適設計

無線周波数識別技術は、無線、非接触の自動識別技術であり、近年開発された最先端の技術プロジェクトです。...

Nvidiaの次世代GPUが発表、H100を超える!最初の3nmマルチチップモジュール設計は2024年にデビュー予定

3nmプロセス、H100をはるかに超える性能!つい最近、海外メディアのDigiTimesが、コードネ...

...

生成AI技術:医師の燃え尽き症候群を軽減する新たな希望

若い医師の慢性的な不足により、2034年までに米国全土で124,000件もの求人が発生すると推定され...

貪欲アルゴリズム: バイナリツリーを監視したい!

[[361051]]バイナリツリーの問題の監視アドレス: https://leetcode-cn....

人工知能とデータセンター: AI がリソースを大量に必要とする理由

2023 年末までに AI 生成にどれだけのエネルギーが必要になるかについての予測は不正確です。たと...

...

電子商取引検索アルゴリズム技術の進化

2018年9月28日、アリババの電子商取引検索部門は「未来を探して推奨する」をテーマにした技術サミッ...

AI はあなたの仕事を奪うだけでなく、もっと恐ろしい脅威をもたらす可能性があります...

ビッグデータ時代の到来は、ビッグデータの波だけでなく、人工知能の台頭ももたらします。グーグルの人工知...

...