Deep Neural Networks ライブラリ ブロック用の GPU コード生成
GPU Coder™ を使用すると、さまざまな学習済み深層学習ネットワークを含む Simulink® モデル用に最適化されたコードを生成できます。MATLAB Function ブロックを使用するか、Deep Learning Toolbox™ の Deep Neural Networks のブロックまたは Computer Vision Toolbox™ の Computer Vision Toolbox、Analysis and Enhancement ライブラリを使用して、Simulink に深層学習機能を実装できます。
GPU Coder は、以下の深層学習ブロックをサポートしています。
Predict (Deep Learning Toolbox) ブロック — ブロック パラメーターで指定された学習済みネットワークを使用して応答を予測します。
Predict ブロックの使用方法の詳細については、深層学習を使用した Simulink での車線検出と車両検出 (Deep Learning Toolbox)を参照してください。
Image Classifier (Deep Learning Toolbox) ブロック — ブロック パラメーターで指定された学習済み深層学習ニューラル ネットワークを使用してデータを分類します。
Image Classifier ブロックの使用方法の詳細については、深層学習を使用した Simulink での ECG 信号の分類 (Deep Learning Toolbox)を参照してください。
Stateful Classify (Deep Learning Toolbox) ブロック — ブロック パラメーターで指定された学習済み再帰型ニューラル ネットワークを使用して、入力におけるデータのクラス ラベルを予測します。
Stateful Predict (Deep Learning Toolbox) ブロック — ブロック パラメーターで指定された学習済み再帰型ニューラル ネットワークを使用して、入力におけるデータの応答を予測します。
Deep Learning Object Detector (Computer Vision Toolbox) ブロック — ブロック パラメーターで指定された学習済みオブジェクト検出器を使用して、入力イメージの境界ボックス、クラス ラベル、およびスコアを予測します。
Deep Learning Object Detector ブロックの使用方法の詳細については、深層学習を使用した Simulink での車線検出と車両検出 (Deep Learning Toolbox)を参照してください。
これらのライブラリ ブロックでは、MAT ファイルまたは MATLAB® 関数から事前学習済みネットワークを Simulink モデルに読み込むことができます。
NVIDIA® GPU 向けの NVIDIA CUDA® Deep Neural Network library (cuDNN) および TensorRT™ の高性能な推論ライブラリを利用するようにコード ジェネレーターを構成できます。生成コードでは、アーキテクチャを使用した深層畳み込みニューラル ネットワーク (CNN)、層、およびネットワーク オブジェクトで指定したパラメーターが実装されます。
例:GoogLeNet を使用したイメージの分類
GoogLeNet は、100 万個を超えるイメージで学習しており、イメージを 1000 個のオブジェクト カテゴリ (キーボード、マグ カップ、鉛筆、動物など) に分類できます。このネットワークは入力としてイメージを取ってから、イメージ内のオブジェクトのラベルを各オブジェクト カテゴリの確率と共に出力します。この例では、シミュレーションを実行して事前学習済みの googlenet
深層畳み込みニューラル ネットワークの CUDA コードを生成し、イメージを分類する方法を示します。事前学習済みネットワークは、Deep Learning Toolbox のサポート パッケージとして利用可能です。
事前学習済みの GoogLeNet ネットワークを読み込みます。
net = googlenet;
オブジェクト
net
にはDAGNetwork
オブジェクトが格納されています。関数analyzeNetwork
を使用して、ネットワーク アーキテクチャを対話的に可視化して表示し、ネットワークに関するエラーや問題を検出して、ネットワーク層についての詳細情報を表示します。層の情報には、層の活性化と学習可能なパラメーターのサイズ、学習可能なパラメーターの総数、および再帰層の状態パラメーターのサイズが含まれます。analyzeNetwork(net);
分類するイメージのサイズは、ネットワークの入力サイズと同じでなければなりません。GoogLeNet の場合、
imageInputLayer
のサイズは 224 x 224 x 3 です。出力classificationLayer
のClasses
プロパティには、ネットワークによって学習されたクラスの名前が含まれています。合計 1000 個のクラス名のうち 10 個をランダムに表示します。classNames = net.Layers(end).Classes; numClasses = numel(classNames); disp(classNames(randperm(numClasses,10)))
'speedboat' 'window screen' 'isopod' 'wooden spoon' 'lipstick' 'drake' 'hyena' 'dumbbell' 'strawberry' 'custard apple'
GoogLeNet モデルの作成
Simulink モデルを作成し、Deep Neural Networks ライブラリから Predict ブロックを挿入します。
[Computer Vision Toolbox] ライブラリから Image From File ブロックを追加し、
File name
パラメーターを[peppers.png]
に設定します。[Computer Vision Toolbox] ライブラリから Resize ブロックをモデルに追加します。Resize ブロックの [指定] パラメーターを[出力行と出力列の数]
に設定し、[出力行と出力列の数] の値として「[224 224]
」を入力します。Resize ブロックにより、入力イメージのサイズがネットワークの入力層のサイズに変更されます。To Workspace をモデルに追加し、変数名を[yPred]
に変更します。Predict ブロックの [ブロック パラメーター (Subsystem)] を開きます。[ネットワーク] で
[MATLAB 関数からのネットワーク]
を選択し、[MATLAB 関数] で [googlenet] を選択します。これらのブロックを、次の図に示すように接続します。モデルを
googlenetModel.slx
として保存します。
GPU による高速化のためのモデルの構成
モデル コンフィギュレーション パラメーターにより、シミュレーション中に使用される高速化の方法が決定します。
[コンフィギュレーション パラメーター] ダイアログ ボックスを開きます。[ソルバー] ペインを開きます。高速化のためにモデルをコンパイルし、CUDA コードを生成するには、固定ステップ ソルバーを使用するようにモデルを構成します。次の表に、この例のソルバー構成を示します。
パラメーター 設定 生成されたコードに対する影響 タイプ 固定ステップ
コード生成に必要である、一定の (固定) ステップ サイズを維持します。 ソルバー 離散 (連続状態なし)
モデルの状態微分の計算に固定ステップ積分手法を適用します。 固定ステップ サイズ auto
Simulink によりステップ サイズが選択されます。 [シミュレーション ターゲット] ペインを選択します。[言語] を
[C++]
に設定します。[GPU による高速化] を選択します。GPU Coder 固有のオプションが、[シミュレーション ターゲット]、[GPU による高速化] ペインに表示されます。この例では、これらのパラメーターの既定値を使用できます。
[シミュレーション ターゲット] ペインで、[深層学習] グループの [ターゲット ライブラリ] を
[cuDNN]
に設定します。[TensorRT]
も選択できます。[OK] をクリックして、[コンフィギュレーション パラメーター] ダイアログ ボックスを保存して閉じます。
set_param
を使用して、モデル パラメーターの構成を MATLAB コマンド ウィンドウでプログラムによって行うこともできます。set_param('googlenetModel','GPUAcceleration','on');
GPU による高速化を使用するモデルのビルド
GPU による高速化を使用するモデルをビルドしてシミュレートするには、[シミュレーション] タブで [実行] を選択するか、次のコマンドを使用します。
out = sim('googlenetModel');
ソフトウェアはまず、モデルに対して CUDA/C++ コードが以前にコンパイルされているかどうかを確認します。コードが以前に作成されている場合は、ソフトウェアがモデルを実行します。コードが以前にビルドされていない場合は、ソフトウェアはまず CUDA/C++ コードを生成およびコンパイルし、その後モデルを実行します。コード生成ツールは、生成されたコードを
slprj/_slprj/googlenetModel
という名前の作業フォルダーのサブフォルダーに配置します。上位 5 つの予測ラベルとそれらに対応する確率をヒストグラムとして表示します。ネットワークはイメージを非常に多くのオブジェクト カテゴリに分類しますが、多くのカテゴリは似ているため、ネットワークを評価するときは、通常、上位 5 つの精度を考慮します。このネットワークは高い確率でこのイメージをピーマンとして分類します。
im = imread('peppers.png'); predict_scores = out.yPred.Data(:,:,1); [scores,indx] = sort(predict_scores,'descend'); topScores = scores(1:5); classNamesTop = classNames(indx(1:5)) h = figure; h.Position(3) = 2*h.Position(3); ax1 = subplot(1,2,1); ax2 = subplot(1,2,2); image(ax1,im); barh(ax2,topScores(1,5:-1:1,1)) xlabel(ax2,'Probability') yticklabels(ax2,classNamesTop(5:-1:1)) ax2.YAxisLocation = 'right'; sgtitle('Top 5 predictions using GoogLeNet')
コード生成用のモデルの構成
モデル コンフィギュレーション パラメーターにより、コードの生成とビルドのプロセスのさまざまなオプションを指定できます。
[コンフィギュレーション パラメーター] ダイアログ ボックスで、[コード生成] ペインを選択します。[システム ターゲット ファイル] を
[grt.tlc]
に変更します。Embedded Coder® のターゲット ファイル
[ert.tlc]
またはカスタムのシステム ターゲット ファイルも使用できます。GPU コード生成の場合、カスタム ターゲット ファイルは
[grt.tlc]
または[ert.tlc]
に基づいていなければなりません。カスタム ターゲット ファイルの開発については、システム ターゲット ファイルのカスタマイズ (Simulink Coder)を参照してください。[言語] を
[C++]
に設定します。[GPU コードの生成] を選択します。
[コード生成のみ] を選択します。
[ツールチェーン] を選択します。Linux® プラットフォームの場合は
[NVIDIA CUDA | gmake (64-bit Linux)]
を選択します。Windows® システムの場合は[NVIDIA CUDA (w/Microsoft Visual C++ 20XX) | nmake (64-bit windows)]
を選択します。カスタムのシステム ターゲット ファイルを使用する場合は、ツールチェーン アプローチ用のビルド コントロールを設定しなければなりません。カスタム ターゲット用のツールチェーン アプローチの詳細については、カスタム ターゲットを使用したツールチェーン アプローチのサポート (Simulink Coder)を参照してください。
[コード生成]、[レポート] ペインで [コード生成レポートを作成] と [レポートを自動的に開く] を選択します。
[コード生成]、[インターフェイス] ペインで、[深層学習] グループの [ターゲット ライブラリ] を
[cuDNN]
に設定します。[TensorRT]
も選択できます。GPU Coder 固有のオプションは、[コード生成]、[GPU コード] ペインにあります。この例では、[コード生成]、[GPU コード] ペインで GPU 固有のパラメーターの既定値を使用できます。
[OK] をクリックして、[コンフィギュレーション パラメーター] ダイアログ ボックスを保存して閉じます。
set_param
を使用して、モデル パラメーターの構成を MATLAB コマンド ウィンドウでプログラムによって行うこともできます。set_param('googlenetModel','GenerateGPUCode','CUDA');
モデルの CUDA コードの生成
Simulink エディターで、Simulink Coder アプリを開きます。
コードを生成します。
診断ビューアーにメッセージが表示されます。コード ジェネレーターにより、CUDA ソース ファイルおよびヘッダー ファイルと HTML コード生成レポートが作成されます。コード ジェネレーターは実行可能ファイルを "ビルド フォルダー" (現在の作業フォルダーの中の googlenetModel_grt_rtw
という名前のサブフォルダー) に配置します。
制限
Stateflow® チャートでの MATLAB Function ブロック用の GPU コード生成はサポートされていません。
コード ジェネレーターでは、MATLAB 言語のすべてのデータ型がサポートされているわけではありません。サポートされているデータ型については、ブロックのドキュメンテーションを参照してください。
GPU コード生成の場合、カスタム ターゲット ファイルは
[grt.tlc]
または[ert.tlc]
に基づいていなければなりません。生成されたコードを展開するには、[メイン プログラム例の生成] オプションを使用して
ert_main.cu
モジュールを生成することを推奨します。このオプションには Embedded Coder ライセンスが必要です。MathWorks® が提供する
rt_cppclass_main.cpp
静的メイン モジュールを使用することもできます。ただし、静的メイン ファイルは、モデルのクラス コンストラクターが深層学習オブジェクトを指すように変更しなければなりません。次に例を示します。static googlenetModelModelClass::DeepLearning_googlenetModel_T googlenetModel_DeepLearning; static googlenetModelModelClass googlenetModel_Obj{ &googlenetModel_DeepLearning};
参考
関数
open_system
(Simulink) |load_system
(Simulink) |save_system
(Simulink) |close_system
(Simulink) |bdclose
(Simulink) |get_param
(Simulink) |set_param
(Simulink) |sim
(Simulink) |slbuild
(Simulink)