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

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 と TensorRT ライブラリ。

  • コンパイラおよびライブラリの環境変数。サポートされているコンパイラおよびライブラリのバージョンの詳細は、サードパーティ製品を参照してください。環境変数の設定は、前提条件となる製品の設定を参照してください。

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

  • この例は、MATLAB® オンラインではサポートされていません。

GPU 環境の検証

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

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

resnet_predict エントリポイント関数

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

この関数 resnet_predict.m は ResNet-50 ネットワークを永続ネットワーク オブジェクトに読み込み、以降の予測呼び出しではこの永続オブジェクトを再利用します。

type('resnet_predict.m')
% Copyright 2018 The MathWorks, Inc.

function out = resnet_predict(in) 
%#codegen

% A persistent object mynet is used to load the series network object.
% At the first call to this function, the persistent object is constructed and
% setup. When the function is called subsequent times, the same object is reused 
% to call predict on inputs, avoiding reconstructing and reloading the
% network object.

persistent mynet;

if isempty(mynet)
    % Call the function resnet50 that returns a DAG network
    % for ResNet-50 model.
    mynet = coder.loadDeepLearningNetwork('resnet50','resnet');
end

% pass in input   
out = mynet.predict(in);

MEX コード生成の実行

エントリポイント関数 resnet_predict 用の CUDA コードを生成するには、MEX ターゲットの GPU コード構成オブジェクトを作成し、ターゲット言語を C++ に設定します。関数 coder.DeepLearningConfig を使用して TensorRT 深層学習構成オブジェクトを作成し、それを GPU コード構成オブジェクトの DeepLearningConfig プロパティに割り当てます。[224,224,3] の入力サイズを指定して codegen コマンドを実行します。この値は ResNet-50 ネットワークの入力層サイズに対応します。

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').

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

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 で開発されました。このネットワークはさまざまなライティング条件とカメラの角度の下で 32 個のロゴを認識できます。このネットワークは単精度の浮動小数点形式で事前学習済みです。

net = getLogonet();

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

unzip('logos_dataset.zip');
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('gpucoder_tensorrt_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;