NVIDIA TensorRT を使用した深層学習での予測
この例では、NVIDIA TensorRT™ ライブラリを使用した深層学習アプリケーションのコード生成について説明します。codegen
コマンドを使用し、TensorRT を使用して ResNet-50 イメージ分類ネットワークで予測を実行する MEX ファイルを生成します。2 番目の例では、codegen
コマンドを使用して、ロゴ分類ネットワークに TensorRT を使用することで 8 ビット整数での予測を実行する MEX ファイルを生成する方法について説明します。
サードパーティの必要条件
必須
この例では、CUDA® MEX を生成します。以下のサードパーティ要件が適用されます。
CUDA 対応 NVIDIA® GPU および互換性のあるドライバー。
オプション
スタティック ライブラリ、ダイナミック ライブラリ、または実行可能ファイルなどの MEX 以外のビルドについて、この例では以下の要件も適用されます。
NVIDIA ツールキット。
NVIDIA cuDNN と TensorRT ライブラリ。
コンパイラおよびライブラリの環境変数。詳細は、サードパーティ ハードウェア (GPU Coder)と前提条件となる製品の設定 (GPU Coder)を参照してください。
GPU 環境の検証
関数coder.checkGpuInstall
(GPU Coder)を使用して、この例を実行するのに必要なコンパイラおよびライブラリが正しく設定されていることを検証します。
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 サポート パッケージに含まれています。このサポート パッケージをダウンロードしてインストールするには、アドオン エクスプローラーを使用します。
関数 resnet_predict.m
は ResNet-50 ネットワークを永続ネットワーク オブジェクトに読み込み、以降の予測呼び出しではこの永続オブジェクトを再利用します。
type('resnet_predict.m')
% Copyright 2020 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
(GPU Coder)を使用して 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: View report
テスト イメージに対する予測の実行
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();
8 ビット整数精度の推論計算を備えた NVIDIA TensorRT ライブラリを使用してコード生成を行う場合は、次のネットワークもサポートされます。
YOLOv2 や SSD などのオブジェクト検出器ネットワーク。
回帰ネットワークおよびセマンティック セグメンテーション ネットワーク。
TensorRT で、浮動小数点で学習済みのネットワークのキャリブレーションを行って 8 ビット整数精度で推論を計算するには、キャリブレーション データセットが必要です。データ型を int8 に設定し、キャリブレーション データ セットへのパスを DeepLearningConfig
を使用して設定します。logos_dataset
は、対応する分類ラベルによりグループ化されたイメージを含むサブフォルダーです。int8 をサポートするには、GPU の Compute Capability が 6.1 以上でなければなりません。
メモ: セマンティック セグメンテーション ネットワークでは、キャリブレーション データ イメージが関数 imread
でサポートされている形式でなければなりません。
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: View report
テスト イメージに対する 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;