ドキュメンテーション

最新のリリースでは、このページがまだ翻訳されていません。 このページの最新版は英語でご覧になれます。

NVIDIA TensorRT による深層学習での予測

この例では、NVIDIA TensorRT™ ライブラリを使用した深層学習アプリケーションのコード生成を説明します。codegen コマンドを使用し、TensorRT を使って ResNet-50 イメージ分類ネットワークで予測を実行する MEX ファイルを生成します。2 番目の例では、codegen コマンドを使用して、ロゴ分類ネットワークに TensorRT を使うことで 8 ビット整数での予測を実行する MEX ファイルを生成する方法について説明します。

必要条件

  • Compute Capability 3.2 以上の CUDA® 対応 NVIDIA® GPU。8 ビット整数の例には、Compute Capability 6.1 以上の NVIDIA® GPU が必要です。

  • NVIDIA CUDA ツールキットおよびドライバー。

  • NVIDIA cuDNN ライブラリ (v7)。

  • NVIDIA TensorRT ライブラリ。

  • コンパイラおよびライブラリの環境変数。サポートされているコンパイラおよびライブラリのバージョンの詳細は、Third-party Products を参照してください。環境変数の設定は、Environment Variables を参照してください。

  • GPU Coder Interface for Deep Learning サポート パッケージ (深層学習のコード生成用)。

  • Deep Learning Toolbox™ (DAGNetwork オブジェクトを使用するため)。

  • Deep Learning Toolbox™ の ResNet-50 サポート パッケージ (事前学習済みの ResNet ネットワークを使用するため)。

GPU 環境の検証

関数 coder.checkGpuInstall を使用し、この例を実行するのに必要なコンパイラおよびライブラリが適切に設定されていることを検証します。

envCfg = coder.gpuEnvConfig('host');
envCfg.DeepLibTarget = 'tensorrt';
envCfg.DeepCodegen = 1;
envCfg.Quiet = 1;
coder.checkGpuInstall(envCfg);

フォルダーの作成と関連ファイルのコピー

次のコードは、現在の作業フォルダー (pwd) にフォルダーを作成します。この新しいフォルダーには、この例に関連するファイルのみが含まれます。現在の作業フォルダーに影響を与えたくない (または、このフォルダーにファイルを生成できない) 場合、作業フォルダーを変更してください。

gpucoderdemo_setup('gpucoderdemo_tensorrt_target');

関数 'resnet_predict' について

よく知られた DAG ネットワーク ResNet-50 を使用して、TensorRT によるイメージの分類を表示します。MATLAB™ 用の事前学習済み ResNet-50 モデルは、Deep Learning Toolbox の ResNet-50 サポート パッケージに含まれています。このサポート パッケージをダウンロードしてインストールするには、アドオン エクスプローラーを使用します。アドオンの検索とインストールの詳細は、アドオンの入手 (MATLAB) を参照してください。

関数 resnet_predict.m は、ResNet-50 ネットワークを永続ネットワーク オブジェクトに読み込みます。それ以降、この関数を呼び出すと、同じ永続ネットワーク オブジェクトが再利用されます。

関数 'resnet_predict' の MEX コード生成の実行

関数 resnet_predict からコードを生成するには、TensorRT ターゲット ライブラリ用に作成した深層学習構成オブジェクトを指定して coder.gpuConfig オブジェクトを使用します。

cfg = coder.gpuConfig('mex');
cfg.TargetLang = 'C++';
cfg.DeepLearningConfig = coder.DeepLearningConfig('tensorrt');
codegen -config cfg resnet_predict -args {ones(224,224,3)} -report
Code generation successful: To view the report, open('codegen/mex/resnet_predict/html/report.mldatx').

テスト イメージに対する predict の呼び出し

im = imread('peppers.png');
im = imresize(im, [224,224]);
predict_scores = resnet_predict_mex(double(im));
%
% get top 5 probability scores and their labels
[val,indx] = sort(predict_scores, 'descend');
scores = val(1:5)*100;
net = resnet50;
classnames = net.Layers(end).ClassNames;
labels = classnames(indx(1:5));

メモリに読み込まれた静的ネットワーク オブジェクトをクリアします。

clear mex;

int8 での予測用の TensorRT コードの生成

int8 の精度で推論を実行する TensorRT コードを生成することもできます。事前学習済みのロゴ分類ネットワークを使用してイメージのロゴを分類します。

事前学習済みの LogoNet ネットワークがない場合はそれをダウンロードし、logonet.mat として保存します。このネットワークは MATLAB で開発されたものであり、そのアーキテクチャは AlexNet のアーキテクチャに似ています。このネットワークはさまざまなライティング条件とカメラの角度の下で 32 個のロゴを認識できます。このネットワークは単精度の浮動小数点で事前学習済みです。

net = getLogoNet();

TensorRT で、浮動小数点で学習済みのネットワークのキャリブレーションを行って推論の 8 ビット整数精度を計算するには、キャリブレーション データセットが必要です。以下に示すように DeepLearningConfig オブジェクトを使用して、データ型を int8 に設定し、キャリブレーション データセットへのパスを設定します。''logos_dataset'' は、対応する分類ラベルによりグループ化されたイメージを含むサブフォルダーです。int8 をサポートするには、GPU の Compute Capability が 6.1 以上でなければなりません。

cfg = coder.gpuConfig('mex');
cfg.TargetLang = 'C++';
cfg.GpuConfig.ComputeCapability = '6.1';
cfg.DeepLearningConfig = coder.DeepLearningConfig('tensorrt');
cfg.DeepLearningConfig.DataType = 'int8';
cfg.DeepLearningConfig.DataPath = 'logos_dataset';
cfg.DeepLearningConfig.NumCalibrationBatches = 50;
codegen -config cfg logonet_predict -args {ones(227,227,3,'int8')} -report
Code generation successful: To view the report, open('codegen/mex/logonet_predict/html/report.mldatx').

テスト イメージに対する int8 での予測の実行

im = imread('test.png');
im = imresize(im, [227,227]);
predict_scores = logonet_predict_mex(int8(im));
%
% get top 5 probability scores and their labels
[val,indx] = sort(predict_scores, 'descend');
scores = val(1:5)*100;
classnames = net.Layers(end).ClassNames;
labels = classnames(indx(1:5));

メモリに読み込まれた静的ネットワーク オブジェクトをクリアします。

clear mex;