TensorRTの概要

 

TensorRTとは

TensorRTは、NvidiaのC ++言語によって開発された高性能ニューラルネットワーク推論ライブラリであり、本番環境展開用のオプティマイザーおよびランタイムエンジンです。その高性能コンピューティングパワーは、Nvidiaのグラフィックスプロセッシングユニットに依存しています。推論タスクに焦点を当て、TensorFlow、Caffe、PyTorch、MXNetなどの一般的に使用されるニューラルネットワーク学習フレームワークを補完します。これらのフレームワークのトレーニング済みモデルファイルを直接ロードできます。また、プログラミングを通じて自分でモデルを構築するためのAPIインターフェイスを提供することもできます。

 

 

TensorRTは、Nvidiaのディープラーニングハードウェア環境に依存しています。これはGPUまたはDLAであり、それなしでは使用できません。

TensorRTは、現在のニューラルネットワークレイヤー定義のほとんどをサポートし、開発者が独自に特別なレイヤー操作を実装するためのAPIを提供します。関連する関数はINetworkDefinition :: addPluginV2()です。

 

キーインターフェイスタイプ

TensorRTコアライブラリでは、最も重要なインターフェイスタイプは次のとおりです。

  • IExecutionContext推論エンジン実行コンテキスト
  • ICudaEngine推論エンジン
  • IRuntimeCudaEngineの逆シリアル化
  • INetWorkDefinitionネットワーク定義
  • IParserネットワークモデル分析
  • IOptimizationProfile最適化構成
  • IBuilderConfigCudaEngineの構築パラメーター
  • IBuilderコンストラクター。主にCudaEngineの構築に使用されます
  • ILoggerログインターフェイス。開発者が実装する必要があります

IExecutionContext

CudaEngineを使用して推論操作を実行する推論エンジン実行コンテキスト(Context)は、推論操作の最終的な実行インターフェイスです。

CudaEngineは複数の実行中のコンテキストを持つことができ、各コンテキストは異なるバッチサイズを使用できます。ネットワークモデルの入力サイズが動的調整をサポートしている場合、各コンテキストは独自の異なるサイズの入力を使用することもできます。

主な関数は推論操作を実行することです。特定の関数IExecutionContext::executeV2(bindings)

CudaEngine、ICudaEngine :: createExecutionContext()によって作成されました

 

ICudaエンジン

これは推論エンジンと呼ぶことができ、アプリケーションがこのインターフェースを呼び出して推論を実行できるようにし、同期実行と非同期実行をサポートし、Cudaのストリームとイベントを介して非同期を実装します。推論エンジンは複数の実行中のコンテキストを持つことができ、バッチ入力の実行をサポートします。

CudaEngineの主な機能は、コンテキストを作成して推論タスクを実行することです。コンテキストを作成する方法は、ICudaEngine :: createExecutionContext()です。

CudaEngineは、メモリにシリアル化してからディスクにキャッシュできます。次に使用するときに、ディスクファイルからメモリに直接ロードしてからCudaEngineにシリアル化できるため、時間とパラメータの設定を大幅に節約できます。

CudaEngineの作成方法は、INetworkDefinition(ネットワーク定義インターフェイス)に依存します。NetWorkDefinitionは通常、ONNXモデルファイルまたはTensorFlowでトレーニングされたモデルファイルを解析することによって取得されます。ONNXモデルファイルの解析には、nvonnxparser::IParserインターフェイスが必要です。

:NeworkDefinitionからCudaEngineを生成するのは時間のかかるプロセスです。生成されたCudaEngineはディスクファイルにキャッシュでき、後で使用するために直接ロードできます。

さらに、CudaEngineはクロスプラットフォームではなく、異なるGPUモデルおよび異なるTensorRTバージョンによって生成されたCudaEngineは互換性がない可能性があります。キャッシュされたCudaEngineファイルを使用する場合は、それらを区別するように注意してください。これらの影響要因はファイル名の一部として使用できます。たとえば、Win64_RTX2080TI_70011.engineなどのファイル名を区別します。

関連するインターフェース:

  • IExecutionContext、コンテキストを生成し、コンテキストを介して推測、関連する関数:ICudaEngine :: createExecutionContext()
  • IRuntime、キャッシュファイルの逆シリアル化、CudaEngineの取得、関連関数:IRuntime :: deserializeCudaEngine()
  • IBuilder、NetworkDefinisionおよびBuilderConfig、関連関数に従ってCudaEngineを構築します:IBuilder :: buildEngineWithConfig(INetworkDefinision、IBuilderConfig)

 

IRuntime

このインターフェイスの名前は誤解されやすいです。名前は非常に低レベルのインターフェイスのようですが、実際の機能は主に1つだけで、CudaEngineのシリアル化されたキャッシュファイルを逆シリアル化し、CudaEngineオブジェクトを再度取得します。

入手方法:nvinfer1 :: createInferRuntime(void)

関連するインターフェース:

  • ICudaEngineは、NetworkDefinisionおよびBuilderConfig、関連関数に従ってCudaEngineを構築します。IBuilder:: buildEngineWithConfig()

INetWorkDefinition

ネットワーク定義インターフェース。このインターフェースは、開発者がニューラルネットワークをゼロから構築するための一連の機能を提供します。これには、入力テンサーと出力テンサーの次元サイズ、各レイヤーのタイプとアクティブ化関数などが含まれます。 addカスタムレイヤーは非常に強力なインターフェースです。ただし、その機能は基本的に一般的な使用にはなりません。ネットワークの定義は、ONNXファイルなどのトレーニングされたネットワークモデルファイルから自動的に生成されるためです。

このインターフェースの一般的な使用手順:

  1. IBuilder :: createNetwork()を介してINetWorkDefinitionを生成します。
  2. インターフェイスNvOnnxParser::createParser(&INetWorkDefinition、...)を使用して、このINetWorkDefinitionにバインドされたIPaserオブジェクトを作成します。
  3. IPaser :: parseFromFile( "path.onnx")を呼び出すと、モデルファイルからINetWorkDefinitionオブジェクトが作成されます。

IParser

ONNXパーサーは、トレーニングされたモデルファイルを解析し、モデルファイルに従ってバインドされたINetWorkDefinitionオブジェクトを構築します。

メソッドの取得:NvOnnxParser :: createParser(&INetWorkDefinition、...)

主な機能:IPaser :: parseFromFile( "path.onnx")

IOptimizationProfile

動的モデルの各入力テンソルと出力テンソルの次元を指定します。関数はIOptimizationProfile::setDimensions()です。

CudaEngineを構築するときは、少なくとも1つのIOptimizationProfileが必要です。これは、各ExecutionContextが推論操作を実行する前にIOptimizationProfileを指定する必要があるためです。

IBuilder :: createOptimizationProfile(void)を取得する方法

関連するインターフェース:

  • IBuilderConfig、各IBuilderConfigには少なくとも1つのIOptimizationProfileが必要です。IOptimizationProfileはIBuilderConfigとともにCudaEngineに組み込まれ、ExecutionContextによって指定されます。関連する関数はIBuilderConfig::addOptimizationProfile(IOptimizationProfile)です。
  • IExecutionContext、各コンテキストが作成された後、IOptimizationProfile、IExecutionContext :: setOptimizationProfile(index)を指定する必要があります。このインデックスは、IBuilderConfigのIOptimizationProfileのシリアル番号であり、順序はaddOptimizationProfileの呼び出し順序に従います。

IBuilderConfig

CudaEngineの構成パラメーターを作成するには、IOptimizationProfile構成を追加して、最大作業メモリー・スペース、最大バッチ・サイズ、最小許容精度レベル、および半精度浮動小数点精度操作を設定します。

IBuilder :: createBuilderConfig(void)を取得する方法

関連するインターフェース:

  • IBuilder、NetworkDefinisionおよびBuilderConfigに従ってCudaEngineを構築し、関数:IBuilder :: buildEngineWithConfig(INetworkDefinision、IBuilderConfig)

Iビルダー

IBuilderインターフェイスは、主にCudaEngineの構築に使用され、INetWorkDefinitionインターフェイスオブジェクト、IOptimizationProfile、およびIBuilderConfigインターフェイスオブジェクトの生成にも使用されます。

ILogger

ログインターフェイスは、TensorRT内のいくつかのメッセージ、警告、エラー、およびその他の情報を出力するために使用されます。

IBuilderとIRuntimeを作成するときは、ILoggerオブジェクトを渡す必要があります。このインターフェイスを実装し、それらに渡すオブジェクトを作成する必要があります。インターフェイスの最も簡単な実装は次のとおりです。

class Logger : public ILogger           
 {
     void log(Severity severity, const char* msg) override
     {
         // suppress info-level messages
         if (severity != Severity::kINFO)
             std::cout << msg << std::endl;
     }
 } gLogger;

フローチャート

要約する

この記事では、TensorRTを使用するために必要なインターフェースを紹介し、これらのインターフェース間の呼び出し関係を習得し、TensorRTのワークフローを理解します。今後、各ステップの具体的な詳細を実際のプロジェクトと組み合わせて詳細に紹介します。

参考

https://docs.nvidia.com/deeplearning/tensorrt/developer-guide/index.html

 

おすすめ

転載: blog.csdn.net/Ango_/article/details/116140436