主要内容

このページの翻訳は最新ではありません。ここをクリックして,英語の最新版を参照してください。

Tensorrtを使使用した深层习习ネットワークネットワーク生成

GPU编码器™を使用して,深度学习工具箱™からさまざまな事前学習済みの深層学習ネットワークの予測に対する最適化されたコードを生成できます。生成コードでは,アーキテクチャを使用した深層畳み込みニューラルネットワーク(CNN),層,および入力オブジェクト(SeriesNetwork(深度学习工具箱)またはDAGNetwork(深度学习工具箱))で指定したパラメーターがが実ますます.nvidia®GPUに対するNVIDIA TensorRT™の高性能な推論ライブラリを利用するようにコードジェネレーターを構成できます。TensorRTでは,ネットワーク層を組み合わせてカーネルの選択を最適化することにより,レイテンシ,スループット,メモリの効率を向上させます。TensorRTの精度モード(FP32、FP16 INT8)を利用し,パフォーマンスをさらに向上させて必要なメモリ量を削減するようにコードジェネレーターを構成することもできます。生成されたコードは,ソースコード,スタティックライブラリまたはダイナミックライブラリ,あるいはさまざまなNVIDIA GPUプラットフォームに展開できる実行可能ファイルとしてプロジェクトに統合できます。

メモ

TensorRTワークフローはMATLAB®オンラインでサポートされていません。

次次いずれかの方法を使使用して畳み込みネットワークの生成します。

  • MATLABエントリポイント関数からCUDA®コードを生成する標準の関数codegen

  • MATLABエントリポイント関数からCUDAコードを生成するGPU编码器アプリ。

メモ

以前のリリースでは,関数cnncodegenを使用するすることによってによってorrライブラリライブラリを対象にことができまし.r2020b以降以降ででででででででででででcnncodegenの代わりにcodegenコマンドコマンド使用するするをお勧めしします。これこれ,今后今后リリースで,关联cnncodegenがc ++コードを生成し,手臂®马里GPUプロセッサ専用のスタティックライブラリをビルドする予定であるためです。

GoogLeNetを使用したコードの生成およびイメージの分類

この例では,GPU编码器を使用して事前学習済みのgooglenet(深度学习工具箱)深层深层畳み込みニューラルネットワークののコードコードを生生,イメージを分类します.Googlenetは,100万枚超えるイメージ习习して,イメージを1000个オブジェクトカテゴリ(キーボード,マグカップ,铅笔,动物など)にネットワークは広范にわたるについてののなな徴をを习してますネットワークはとしてイメージイメージててからから,イメージ内のオブジェクトのラベル各オブジェクトカテゴリの确率と共に出します。この例では,codegenコマンドとGPU编码器アプリを使用して事前学習済みのネットワークのコードを生成する方法を示します。

32岁的この例ではビット浮動小数点(既定値)をテンソル入力の精度として使用します。テンソルに対する8ビット整数精度の使用の詳細については,英伟达TensorRTを使用した深層学習での予測の例を参照してください。

要件

必須

この例では,以下の追加の要件を持つCUDA墨西哥人を生成します。

  1. 深度学习工具。

  2. Googlenet网络的深层学习工具箱模型サポートパッケージ。

  3. 深度学习库的GPU编码器接口サポートパッケージ。

  4. CUDA対応NVIDIA GPUおよび互換性のあるドライバー。8ビット整数精度では,计算能力6.1,6.3,またはそれ以上のCUDA GPUが必要です。7.0以半精度では、计算能力上のCUDA GPUが必要です。

オプション

スタティックライブラリ,ダイナミックライブラリ,実行可能ファイルなどの墨西哥人以外のビルドでは,以下の要件も適用されます。

  1. CUDAツールキット,cuDNNライブラリ,およびTensorRTライブラリ。サポートされているコンパイラおよびライブラリのバージョンの詳細は,前提条件となる製品のインストールを参照してください。

  2. コンパイラおよびライブラリの環境変数。詳細については,環境変数を参照してください。

事前学習済みのネットワークの読み込み

  1. 事前学習済みのGoogLeNetネットワークを読み込みます。イメージ分類用の異なる事前学習済みネットワークの読み込みを選択できます。必要なサポートパッケージがインストールされていない場合,ダウンロード用リンクが表示されます。

    网= googlenet;

  2. オブジェクトにはDAGNetworkオブジェクトが格納されています。関数analyzeNetwork(深度学习工具箱)を使用して,ネットワークアーキテクチャを対話的に可視化して表示し,ネットワークに関するエラーや問題を検出して,ネットワーク層についての詳細情報を表示します。層の情報には,層の活性化と学習可能なパラメーターのサイズ,学習可能なパラメーターの総数,および再帰層の状態パラメーターのサイズが含まれます。

    analyzeNetwork(净);

  3. 分類するイメージのサイズは,ネットワークの入力サイズと同じでなければなりません。GoogLeNetの場合,imageInputLayer(深度学习工具箱)のサイズは224 x 224 x 3です。出力classificationLayer(深度学习工具箱)プロパティには,ネットワークによって学習されたクラスの名前が含まれています。1000年合計個のクラス名のうち10個をランダムに表示します。

    一会= net.Layers . class(结束);numClasses =元素个数(类名);disp(类名(randperm (numClasses 10)))
    “快艇”“纱窗”“等足动物”“木勺”“口红”“德雷克”“鬣狗”“哑铃”“草莓”“奶油苹果”

    詳細については,深層学習層の一覧(深度学习工具箱)を参照してください。

エントリポイント関数の作成

  1. MATLABで次を行うエントリポイント関数を作成します。

    1. 関数coder.loadDeepLearningNetworkを使用して深層学習モデルを読み込み,CNNクラスを作成して設定する。詳細については,コード生成用の事前学習済みのネットワークの読み込みを参照してください。

    2. 预测(深度学习工具箱)を呼び出して応答を予測する。

  2. 次に例を示します。

    函数= googlenet_predict(中)% # codegen持续的mynet;如果isempty(mynet) mynet = code . loaddeeplearningnetwork (“googlenet”);结束输入通过率=预测(mynet,);

    永続的なオブジェクトmynetDAGNetworkオブジェクトを読み込みます。エントリポイント関数への最初の呼び出しで,永続的なオブジェクトが作成されて設定されます。後続の関数の呼び出しでは,入力の呼び出し预测に同じオブジェクトが再利用され,ネットワークオブジェクトの再構成と再読み込みが回避されます。

    メモ

    コード生成では,ネットワークを永続オブジェクトに読み込む必要があります。

  3. 特定の層のネットワーク活性化に激活(深度学习工具箱)メソッド,次ののますことことことできできできできでき行行行行行layerIdxで指定された層のネットワーク活性化を返します。

    出=激活(mynet layerIdx,“OutputAs”,“渠道”);

  4. 分类(深度学习工具箱)メソッドを使使,学校済みネットワークmynetのイメージデータのクラスラベルを予測することもできます。

    [,分数]=分类(mynet,);

    lstmネットワークに対しては,predictAndUpdateState(深度学习工具箱)メソッドと重置静止(深度学习工具箱)メソッドも使用できます。これらのメソッドの使用上の注意および制限については,サポートされる関数の表の対応するエントリを参照してください。

codegenを使用したコード生成

  1. 出力ファイル名,場所,タイプなどのビルド設定を構成するには,コーダー構成オブジェクトを作成します。このオブジェクトを作成するには,関数coder.gpuConfigを使用します。たとえば,codegenコマンドを使用してCUDA墨西哥人を生成する場合,cfg = coder.gpuConfig(墨西哥人);を使用します。

    その他の利用可能なオプションは次のとおりです。

    1. cfg = coder.gpuConfig(“自由”);, CUDA C / c++スタティックライブラリの生成時にcodegenで使用するコード生成構成オブジェクトを作成します。

    2. cfg = coder.gpuConfig (dll);, CUDA C / c++ダイナミックライブラリの生成時にcodegenで使用するコード生成構成オブジェクトを作成します。

    3. cfg = coder.gpuConfig (exe);, CUDA C / c++実行可能ファイルの生成時にcodegenで使用するコード生成構成オブジェクトを作成します。

  2. TensorRTのコード生成パラメーターを指定するには,DeeplearningConfigプロパティを,coder.deeplearningconfigをを用して作物编码器。TensorRTConfigオブジェクトに設定します。

    cfg = coder.gpuConfig (墨西哥人的);cfg。TargetLang =“c++”;cfg。DeepLearningConfig =编码器。DeepLearningConfig (“tensorrt”);cfg.DeepLearningConfig.DataType =“fp32”

    数据类型プロパティを使用することによって,サポートされている層での推論計算の精度を指定します。32ビット浮動小数点の推論を実行する場合,“fp32”を使用します。半精度には,“fp16”を使用します。8ビット整数には,'int8'を使用します。既定値は“fp32”です。INT86.1以の精度には、计算能力上のCUDA GPUが必要です。FP167.0以の精度には、计算能力上のCUDA GPUが必要です。GpuConfigオブジェクトのComputeCapabilityプロパティを使用して,適切な计算能力値に設定します。

    “INT8”オプションを選択すると,TensorRTは浮動小数点データをint8に量子化します。再キャリブレーションは,絞り込んだキャリブレーションデータのセットを使用して実行されます。キャリブレーションデータは,DataPath公司で指定したイメージデータの位置に存在していなければなりません。再キャリブレーションの前にイメージの前処理を実行し,コード生成の前に前処理ステップをエントリポイントファイルに含める必要があります。

    メモ

    INT8データ型のコード生成は,エントリポイント関数内の複数の深層学習ネットワークをサポートしていません。

    Tensorrtを使用ししロゴロゴネットワークに対してに対してビットででを実するについては,英伟达TensorRTを使用した深層学習での予測を参照してください。

  3. codegenコマンドを実行します。codegenコマンドはgooglenet_predict.mMATLABエントリポイント関数からCUDAコードを生成します。

    codegen配置cfggooglenet_predictarg游戏{1 (224224 3)}报告

    1. 报告オプションは,MATLABコードのデバッグに使用できるコード生成レポートを生成するようにcodegenに指示します。

    2. arg游戏オプションは,入力在で指定したクラス,サイズ,および実数/複素数を使用して,ファイルgooglenet_predict.mをコンパイルするようにcodegenに指示します。値(224224年,3)はGoogLeNetネットワークの入力層サイズに対応します。

    3. 配置オプションは,指定した构成オブジェクトコード生成に使使ようにcodegenに指示します。

    メモ

    コード生成に半精度の入力を指定できます。ただし,コードジェネレーターの型は入力を単精度にキャストします。深度学习工具箱は,MATLAB内のすべての計算に単精度浮動小数点演算を使用します。コード生成時,编码器。TensorRTConfig数据类型プロパティに“fp16”を指定することで,半精度(16ビット浮動小数点)の入力での推論を有効にできます。

    コードジェネレーターは,既定で列優先のレイアウトを使用します。行優先のレイアウトを使用するには,codegenコマンドに-rowmajorオプションを渡します。あるいは,コード生成構成オブジェクトのcfg。RowMajorパラメーターを変更して,行優先のレイアウトでコードを構成します。

  4. コード生成に成功し,matlabコマンドウィンドウで[レポートの表示)あるmatlabコードコードへのリンクが提供されコード生成レポートを参照してください。

    代码生成成功:查看报告

生成コード

DAGネットワ​​ークは,144个の层クラスから成るを含むc ++クラスクラス生成されます。googlenet_predict_types.hファイルからのクラス宣言のスニペットが表示されます。

googlenet_predict_types.hファイル

  • このクラスの设置()メソッドは,ハンドルを設定し,ネットワークオブジェクトの各層にメモリを割り当てます。

  • 预测()メソッドは,ネットワーク内の144個の層それぞれについて予測を呼び出します。

  • DeepLearningNetwork.cuファイルにはb_googlenet_0クラスクラスオブジェクト关节

バイナリファイルは,ネットワーク内の全結合層や畳み込み層などのパラメーターを持つ層に対してエクスポートされます。たとえば,ファイルcnn_googlenet_conv * _wおよびcnn_googlenet_conv * _bは,ネットワーク内の卷积层层の重みとバイアスパラメーターに対応しコードジェネレータージェネレーター,はジェネレーターは,これらのバイナリファイルをcodegenフォルダーに配置します。

メモ

窗户®システムシステムの合,位防守などのウイルス対策ソフトウェアによって,一道のの重みファイルが感染されいると误って识别さされれされる场场がありれますのケースはは误検知でありますますますケースは误検知でありでありますますケースは误検知でありでありますますケースはは误検を安全であるとしてマークできます。

生成されたコードファイルgooglenet_predict ()で,エントリポイント关圈googlenet_predict.cuは,b_googlenet_0クラス型の静的オブジェクトを構築し,このネットワークオブジェクトに対して设置や预测を呼び出します。

googlenet_predict.cuファイル

アプリを使用したコード生成

エントリポイント関数を指定し,入力の型を指定するには,アプリで手順を完了します。GPU编码器アプリアプリ使使使用した生成を参照してください。

[コード生成)手顺手顺,以下を行い。

  1. [ビルドタイプ]墨西哥人に設定します。

  2. [詳細設定]をクリックします。[深層学習]ペインで,[ターゲットライブラリ](TensorRT)に設定します。

  3. 設定ウィンドウを閉じます。CUDAコードを生成するには,[生成]をクリックします。

生成されたmakefile

“自由”“dll”,およびexe”ターゲットに対して,コードジェネレーターはcodegenフォルダーに* _rtw.mk使ファイルを作成します。この使ファイルでは,生成されたコードの場所はセクションで検出された変数START_DIRを使用して指定されます。既定では,この変数は,コードが生成される現在の作業フォルダーのパスを指します。生成されたファイルを移動し,makefileを使用してビルドする予定がある場合は,START_DIRの生成された値を適切なパスの場所で置き換えます。

生成され喵喵喵喵

  1. 分類するイメージのサイズは,ネットワークの入力サイズと同じでなければなりません。分類するイメージを読み取り,そのサイズをネットワークの入力サイズに変更します。このサイズ変更では,イメージの縦横比が多少変化します。

    我= imread (“peppers.png”);inputLayerSize = net.Layers (1) .InputSize;我= imresize (im, inputLayerSize (1:2));
  2. 入力イメージに対してGoogLeNetの预测を呼び出します。

    predict_scores = googlenet_predict_mex (im);
  3. 上第五位つの予測ラベルとそれらに対応する確率をヒストグラムとして表示します。ネットワークはイメージを非常に多くのオブジェクトカテゴリに分類しますが,多くのカテゴリは似ているため,ネットワークを評価するときは,通常,上5位つの精度を考慮します。このネットワークは高い確率でこのイメージをピーマンとして分類します。

    [分数,indx] =排序(predict_scores“下”);classNamesTop =一会(indx (1:5));h =图;h.Position (3) = 2 * h.Position (3);ax₁=情节(1、2、1);ax2 =情节(1、2、2);图像(ax₁,im);barh (ax2,分数(5:1:1))包含(ax2,'可能性') yticklabels (ax2 classNamesTop (5: 1:1)) ax2。YAxisLocation ='对';sgtitle (“使用GoogLeNet的5大预测”

参考

関数

オブジェクト

関連するトピック