Main Content

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 コードを生成し、イメージを分類する方法を示します。

  1. 事前学習済みの GoogLeNet ネットワークを読み込みます。イメージ分類用の異なる事前学習済みネットワークの読み込みを選択できます。必要なサポート パッケージがインストールされていない場合は、示される手順に従ってソフトウェアをインストールしてください。

    net = googlenet;
    

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

    analyzeNetwork(net);
    

    Analyze network app showing network analysis of GoogLeNet.

  3. 分類するイメージのサイズは、ネットワークの入力サイズと同じでなければなりません。GoogLeNet の場合、imageInputLayer のサイズは 224 x 224 x 3 です。出力 classificationLayerClasses プロパティには、ネットワークによって学習されたクラスの名前が含まれています。合計 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 モデルの作成

  1. Simulink モデルを作成し、User-Defined Functions ライブラリから MATLAB Function ブロックを挿入します。

  2. Computer Vision Toolbox™ ライブラリから Image From File ブロックを追加し、File name パラメーターを peppers.png に設定します。

  3. Computer Vision Toolbox ライブラリから Resize ブロックをモデルに追加します。Resize ブロックの [指定] パラメーターを [出力行と出力列の数] に設定し、[出力行と出力列の数] の値として「[224 224]」を入力します。このブロックは、入力イメージのサイズをネットワークの入力層のサイズに変更します。

    Simulink model containing blocks for classifying images using GoogLeNet.

  4. MATLAB Function ブロックをダブルクリックします。既定の関数シグネチャが MATLAB Function ブロック エディターに表示されます。

  5. 予測エントリポイント関数を実装する、googlenet_predict という関数を定義します。関数ヘッダーは in を関数 googlenet_predict の引数として宣言し、scoresindxTop を戻り値として宣言します。

    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);
    

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

    特定の層のネットワーク活性化に activations (Deep Learning Toolbox) メソッドを使用することもできます。たとえば、次のコードの行は layerIdx で指定された層のネットワーク活性化を返します。

    out = activations(mynet,in,layerIdx,'OutputAs','Channels');
    

    classify (Deep Learning Toolbox) メソッドを使用して、学習済みネットワーク mynetin のイメージ データのクラス ラベルを予測することもできます。

    [out,scores] = classify(mynet,in);
    

    LSTM ネットワークに対しては、predictAndUpdateState (Deep Learning Toolbox) メソッドと resetState (Deep Learning Toolbox) メソッドを使用できます。これらのメソッドの使用上の注意および制限については、サポートされる関数を参照してください。

  6. MATLAB Function ブロックのブロック パラメーターを開きます。[コード生成] タブで、[関数のパッケージ化] について [再利用可能な関数] を選択します。

  7. これらのブロックを、次の図に示すように接続します。モデルを googlenetModel として保存します。

    Simulink model showing connection between the blocks.

GPU による高速化のためのモデルの構成

モデル コンフィギュレーション パラメーターにより、シミュレーション中に使用される高速化の方法が決定します。

  1. [コンフィギュレーション パラメーター] ダイアログ ボックスを開きます。[ソルバー] ペインを開きます。高速化のためにモデルをコンパイルし、CUDA コードを生成するには、固定ステップ ソルバーを使用するようにモデルを構成します。次の表に、この例のソルバー構成を示します。

    パラメーター設定生成されたコードに対する影響
    タイプ固定ステップコード生成に必要である、一定の (固定) ステップ サイズを維持します。
    ソルバー離散 (連続状態なし)モデルの状態微分の計算に固定ステップ積分手法を適用します。
    固定ステップ サイズautoSimulink によりステップ サイズが選択されます。

    Snapshot of the configuration parameters dialog showing solver options for simulation.

  2. [シミュレーション ターゲット] ペインを選択します。[言語][C++] に設定します。

  3. [GPU による高速化] を選択します。

    GPU Coder 固有のオプションが、[シミュレーション ターゲット]、[GPU による高速化] ペインに表示されます。この例では、これらの GPU 固有パラメーターの既定値を使用できます。

    GPU Acceleration pane on the configuration parameters dialog of the model.

  4. [シミュレーション ターゲット] ペインで、[深層学習] グループの [ターゲット ライブラリ] パラメーターを [cuDNN] に設定します。

    Snapshot of the configuration parameters dialog showing deep learning options for simulation acceleration.

    [TensorRT] を選択して、NVIDIA GPU 用の TensorRT 高性能推論ライブラリをターゲットにすることもできます。

  5. [OK] をクリックして、[コンフィギュレーション パラメーター] ダイアログ ボックスを保存して閉じます。

    set_param を使用して、モデル パラメーターの構成を MATLAB® コマンド ウィンドウでプログラムによって行うこともできます。

    set_param('googlenetModel','GPUAcceleration','on');
    

GPU による高速化を使用するモデルのビルド

  1. GPU による高速化を使用するモデルをビルドしてシミュレートするには、[シミュレーション] タブで [実行] を選択するか、次の MATLAB コマンドを使用します。

    out = sim('googlenetModel');
    

    ソフトウェアはまず、モデルに対して CUDA/C++ コードが以前にコンパイルされているかどうかを確認します。コードが以前に作成されている場合は、ソフトウェアがモデルを実行します。コードが以前にビルドされていない場合は、ソフトウェアはまず CUDA/C++ コードを生成およびコンパイルし、その後モデルを実行します。コード生成ツールは、生成されたコードを slprj/_slprj/googlenetModel という名前の作業フォルダーのサブフォルダーに配置します。

  2. 上位 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')
    

コード生成用のモデルの構成

モデル コンフィギュレーション パラメーターにより、コードの生成とビルドのプロセスのさまざまなオプションを指定できます。

  1. [コード生成] ペインを選択します。[システム ターゲット ファイル][grt.tlc] に変更します。

    Embedded Coder® のターゲット ファイル [ert.tlc] またはカスタムのシステム ターゲット ファイルも使用できます。

    GPU コード生成の場合、カスタム ターゲット ファイルは [grt.tlc] または [ert.tlc] に基づいていなければなりません。カスタム ターゲット ファイルの開発については、システム ターゲット ファイルのカスタマイズ (Simulink Coder)を参照してください。

  2. [言語][C++] に設定します。

  3. [GPU コードの生成] を選択します。

  4. [コード生成のみ] を選択します。

  5. [ツールチェーン] を選択します。Linux® プラットフォームの場合は [NVIDIA CUDA | gmake (64-bit Linux)] を選択します。Windows® システムの場合は [NVIDIA CUDA (w/Microsoft Visual C++ 20XX) | nmake (64-bit windows)] を選択します。

    カスタムのシステム ターゲット ファイルを使用する場合は、ツールチェーン アプローチ用のビルド コントロールを設定しなければなりません。カスタム ターゲット用のツールチェーン アプローチの詳細については、カスタム ターゲットを使用したツールチェーン アプローチのサポート (Simulink Coder)を参照してください。

  6. [コード生成]、[レポート] ペインで [コード生成レポートを作成][レポートを自動的に開く] を選択します。

  7. [コード生成]、[インターフェイス] ペインで、[深層学習] グループの [ターゲット ライブラリ][cuDNN] に設定します。

    [TensorRT] を選択して、NVIDIA GPU 用の TensorRT 高性能推論ライブラリをターゲットにすることもできます。

  8. [GPU コードの生成] パラメーターを有効にすると、GPU Coder 固有のオプションが [コード生成]、[GPU コード] ペインに表示されます。この例では、[コード生成]、[GPU コード] ペインで GPU 固有のパラメーターの既定値を使用できます。

    GPU Code pane on the configuration parameters dialog of the model.

  9. [OK] をクリックして、[コンフィギュレーション パラメーター] ダイアログ ボックスを保存して閉じます。

    関数 set_param を使用して、モデル パラメーターの構成を MATLAB コマンド ウィンドウでプログラムによって行うこともできます。

    set_param('googlenetModel','GenerateGPUCode','CUDA');
    

モデルの CUDA コードの生成

  1. Simulink エディターで、Simulink Coder アプリを開きます。

  2. コードを生成します。

診断ビューアーにメッセージが表示されます。コード ジェネレーターにより、CUDA ソース ファイルおよびヘッダー ファイルと HTML コード生成レポートが作成されます。コード ジェネレーターは実行可能ファイルを "ビルド フォルダー" (現在の作業フォルダーの中の googlenetModel_grt_rtw という名前のサブフォルダー) に配置します。

制限

  • averagePooling2dLayer (Deep Learning Toolbox) のコード生成では、サードパーティのライブラリをターゲットとする場合に、非ゼロのパディング値がサポートされません。

    MATLAB Function ブロックを使用して深層学習機能を実装する Simulink モデルでは、非ゼロのパディング値をもつ平均プーリング層がネットワークに含まれている場合、シミュレーションでエラーが発生します。このような場合、MATLAB Function の代わりに Deep Neural Networks ライブラリのブロックを使用して、深層学習機能を実装します。

  • 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};
    

参考

関数

関連するトピック