このページの翻訳は最新ではありません。ここをクリックして、英語の最新版を参照してください。
MATLAB Function ブロックを使用した深層学習ネットワーク用の GPU コード生成
GPU Coder™ を使用すると、さまざまな学習済み深層学習ネットワークを含む Simulink® モデル用に最適化されたコードを生成できます。MATLAB Function ブロックを使用するか、Deep Neural Networks ライブラリのブロックを使用して、Simulink に深層学習の機能を実装できます。MATLAB Function ブロックを使用して実装する場合は、関数 coder.loadDeepLearningNetwork
を使用して、学習済みの深層学習ネットワークを読み込み、ネットワーク オブジェクトのオブジェクト関数を使用して目的の応答を取得します。NVIDIA® GPU 向けの NVIDIA CUDA® Deep Neural Network library (cuDNN) および TensorRT™ の高性能な推論ライブラリを利用するようにコード ジェネレーターを構成できます。生成コードでは、アーキテクチャを使用した深層畳み込みニューラル ネットワーク (CNN)、層、およびネットワーク オブジェクトで指定したパラメーターが実装されます。
例:GoogLeNet を使用したイメージの分類
GoogLeNet は、100 万枚を超えるイメージで学習しており、イメージを 1000 個のオブジェクト カテゴリ (キーボード、マグ カップ、鉛筆、動物など) に分類できます。このネットワークは入力としてイメージを取り、イメージ内のオブジェクトのラベルを各オブジェクト カテゴリの確率と共に出力します。この例では、シミュレーションを実行して事前学習済みの googlenet
深層畳み込みニューラル ネットワークの CUDA コードを生成し、イメージを分類する方法を示します。
事前学習済みの 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 モデルを作成し、[ユーザー定義関数] ライブラリから MATLAB Function ブロックを挿入します。
[Computer Vision Toolbox™] ライブラリから Image From File ブロックを追加し、
File name
パラメーターを[peppers.png]
に設定します。[Computer Vision Toolbox] ライブラリから Resize ブロックをモデルに追加します。Resize ブロックの [指定] パラメーターを
[出力行と出力列の数]
に設定し、[出力行と出力列の数] の値として「[224 224]
」を入力します。このブロックにより、入力イメージのサイズがネットワークの入力層のサイズに変更されます。MATLAB Function ブロックをダブルクリックします。既定の関数シグネチャが MATLAB Function ブロック エディターに表示されます。
予測エントリポイント関数を実装する、
googlenet_predict
という関数を定義します。関数ヘッダーはin
を関数googlenet_predict
の引数として宣言し、scores
とindxTop
を戻り値として宣言します。function [scores,indxTop] = googlenet_predict(in) %#codegen persistent mynet; if isempty(mynet) mynet = coder.loadDeepLearningNetwork('googlenet'); end % pass in input predict_scores = predict(mynet,in); [scores,indx] = sort(predict_scores, 'descend'); indxTop = indx(1:5);
永続オブジェクト
mynet
はDAGNetwork
オブジェクトを読み込みます。エントリポイント関数への最初の呼び出しで、永続オブジェクトが作成されて設定されます。後続の関数の呼び出しでは、入力の呼び出しpredict
に同じオブジェクトが再利用され、ネットワーク オブジェクトの再構成と再読み込みが回避されます。特定の層のネットワーク活性化に
activations
(Deep Learning Toolbox) メソッドを使用することもできます。たとえば、次のコードの行はlayerIdx
で指定された層のネットワーク活性化を返します。out = activations(mynet,in,layerIdx,'OutputAs','Channels');
classify
(Deep Learning Toolbox) メソッドを使用して、学習済みネットワークmynet
でin
のイメージ データのクラス ラベルを予測することもできます。[out,scores] = classify(mynet,in);
LSTM ネットワークに対しては、
predictAndUpdateState
(Deep Learning Toolbox) メソッドとresetState
(Deep Learning Toolbox) メソッドを使用できます。これらのメソッドの使用上の注意および制限については、サポートされる関数を参照してください。MATLAB Function ブロックのブロック パラメーターを開きます。[コード生成] タブで、[関数のパッケージ化] について
[再利用可能な関数]
を選択します。これらのブロックを、次の図に示すように接続します。モデルを
googlenetModel
として保存します。
GPU による高速化のためのモデルの構成
モデル コンフィギュレーション パラメーターにより、シミュレーション中に使用される高速化の方法が決定します。
[コンフィギュレーション パラメーター] ダイアログ ボックスを開きます。[ソルバー] ペインを開きます。高速化のためにモデルをコンパイルし、CUDA コードを生成するには、固定ステップ ソルバーを使用するようにモデルを構成します。次の表に、この例のソルバー構成を示します。
パラメーター 設定 生成されたコードに対する影響 タイプ 固定ステップ
コード生成に必要である、一定の (固定) ステップ サイズを維持します。 ソルバー 離散 (連続状態なし)
モデルの状態微分の計算に固定ステップ積分手法を適用します。 固定ステップ サイズ auto
Simulink によりステップ サイズが選択されます。 [シミュレーション ターゲット] ペインを選択します。[言語] を
[C++]
に設定します。[GPU による高速化] を選択します。
GPU Coder 固有のオプションが、[シミュレーション ターゲット]、[GPU による高速化] ペインに表示されます。この例では、これらの GPU 固有パラメーターの既定値を使用できます。
[シミュレーション ターゲット] ペインで、[深層学習] グループの [ターゲット ライブラリ] パラメーターを
[cuDNN]
に設定します。[TensorRT]
を選択して、NVIDIA GPU 用の TensorRT 高性能推論ライブラリをターゲットにすることもできます。[OK] をクリックして、[コンフィギュレーション パラメーター] ダイアログ ボックスを保存して閉じます。
set_param
を使用して、モデル パラメーターの構成を MATLAB® コマンド ウィンドウでプログラムによって行うこともできます。set_param('googlenetModel','GPUAcceleration','on');
GPU による高速化を使用するモデルのビルド
GPU による高速化を使用するモデルをビルドしてシミュレートするには、[シミュレーション] タブで [実行] を選択するか、次の MATLAB コマンドを使用します。
out = sim('googlenetModel');
ソフトウェアはまず、モデルに対して CUDA/C++ コードが以前にコンパイルされているかどうかを確認します。コードが以前に作成されている場合は、ソフトウェアがモデルを実行します。コードが以前にビルドされていない場合は、ソフトウェアはまず CUDA/C++ コードを生成およびコンパイルし、その後モデルを実行します。コード生成ツールは、生成されたコードを
slprj/_slprj/googlenetModel
という名前の作業フォルダーのサブフォルダーに配置します。上位 5 つの予測ラベルとそれらに対応する確率をヒストグラムとして表示します。ネットワークはイメージを非常に多くのオブジェクト カテゴリに分類しますが、多くのカテゴリは似ているため、ネットワークを評価するときは、通常、上位 5 つの精度を考慮します。このネットワークは高い確率でこのイメージをピーマンとして分類します。
im = imread('peppers.png'); classNamesTop = classNames(out.yout{2}.Values.Data(:,:,1)) h = figure; h.Position(3) = 2*h.Position(3); ax1 = subplot(1,2,1); ax2 = subplot(1,2,2); image(ax1,im); barh(ax2,out.yout{1}.Values.Data(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]
を選択して、NVIDIA GPU 用の TensorRT 高性能推論ライブラリをターゲットにすることもできます。[GPU コードの生成] パラメーターを有効にすると、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 コード生成はサポートされていません。
[GPU による高速化] が有効な場合、コード ジェネレーターでは、カスタム作成された CUDA ソース ファイル (*.cu) のインポートに対する [カスタム コードのインポート] はサポートされません。代わりに、MATLAB Function ブロック内で
coder.ceval
を使用します。MATLAB Function ブロックでは、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)