Main Content

Deep Neural Networks ライブラリ ブロック用の GPU コード生成

GPU Coder™ を使用すると、さまざまな学習済み深層学習ネットワークを含む Simulink® モデル用に最適化されたコードを生成できます。MATLAB Function ブロックを使用するか、Deep Neural Networks ライブラリのブロックを使用して、Simulink に深層学習の機能を実装できます。Deep Neural Networks ブロック ライブラリには次のものが含まれます。

  • Predict (Deep Learning Toolbox) ブロック — ブロック パラメーターで指定された学習済みネットワークを使用して応答を予測します。このブロックでは、MAT ファイルまたは MATLAB® 関数から事前学習済みネットワークを Simulink モデルに読み込むことができます。

    Predict ブロックの使用方法の詳細については、深層学習を使用した Simulink での車線検出と車両検出 (Deep Learning Toolbox)を参照してください。

  • Image Classifier (Deep Learning Toolbox) ブロック — ブロック パラメーターで指定された学習済み深層学習ニューラル ネットワークを使用してデータを分類します。このブロックでは、MAT ファイルまたは MATLAB 関数から事前学習済みネットワークを Simulink モデルに読み込むことができます。

    Image Classifier ブロックの使用方法の詳細については、深層学習を使用した Simulink での ECG 信号の分類 (Deep Learning Toolbox)を参照してください。

NVIDIA® GPU 向けの NVIDIA CUDA® Deep Neural Network library (cuDNN) および TensorRT™ の高性能な推論ライブラリを利用するようにコード ジェネレーターを構成できます。生成コードでは、アーキテクチャを使用した深層畳み込みニューラル ネットワーク (CNN)、層、およびネットワーク オブジェクトで指定したパラメーターが実装されます。

例:GoogLeNet を使用したイメージの分類

GoogLeNet は、100 万枚を超えるイメージで学習しており、イメージを 1000 個のオブジェクト カテゴリ (キーボード、マグ カップ、鉛筆、動物など) に分類できます。このネットワークは入力としてイメージを取ってから、イメージ内のオブジェクトのラベルを各オブジェクト カテゴリの確率と共に出力します。この例では、シミュレーションを実行して事前学習済みの googlenet 深層畳み込みニューラル ネットワークの CUDA コードを生成し、イメージを分類する方法を示します。事前学習済みネットワークは、Deep Learning Toolbox™ のサポート パッケージとして利用可能です。

  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 モデルを作成し、Deep Neural Networks ライブラリから Predict ブロックを挿入します。

  2. [Computer Vision Toolbox™] ライブラリから Image From File ブロックを追加し、File name パラメーターを [peppers.png] に設定します。[Computer Vision Toolbox] ライブラリから Resize ブロックをモデルに追加します。Resize ブロックの [指定] パラメーターを [出力行と出力列の数] に設定し、[出力行と出力列の数] の値として「[224 224]」を入力します。Resize ブロックにより、入力イメージのサイズがネットワークの入力層のサイズに変更されます。To Workspace をモデルに追加し、変数名を [yPred] に変更します。

    Simulink model containing blocks for classifying images using GoogLeNet.

  3. Predict ブロックの [ブロック パラメーター (Subsystem)] を開きます。[ネットワーク][MATLAB 関数からのネットワーク] を選択し、[MATLAB 関数][googlenet] を選択します。

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

    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 Acceleration pane on the configuration parameters dialog of the model.

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

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

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

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

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

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

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

    out = sim('googlenetModel');
    

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

  2. 上位 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)
    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] も選択できます。

  8. 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 という名前のサブフォルダー) に配置します。

制限

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

参考

関数

関連するトピック