Main Content

ARM Mali GPU をターゲットとする深層学習ネットワークのコード生成

GPU Coder™ を使用して、Deep Learning Toolbox™ からさまざまな事前学習済みの深層学習ネットワークの予測に対する最適化されたコードを生成できます。生成コードでは、アーキテクチャを使用した深層畳み込みニューラル ネットワーク (CNN)、層、および入力オブジェクト (SeriesNetwork (Deep Learning Toolbox) または DAGNetwork (Deep Learning Toolbox)) で指定したパラメーターが実装されます。コード ジェネレーターはコンピューター ビジョンおよび機械学習用の ARM® Compute Library を利用します。ARM Mali GPU ターゲットで深層学習を実行するために、ホスト開発コンピューターでコードを生成します。次に、実行可能プログラムをビルドして実行するために、生成されたコードを ARM ターゲット プラットフォームに移動します。たとえば、HiKey960 は生成されたコードを実行できるターゲット プラットフォームの 1 つです。

要件

  1. Deep Learning Toolbox.

  2. Deep Learning Toolbox Model for MobileNet-v2 Network サポート パッケージ。

  3. GPU Coder Interface for Deep Learning サポート パッケージ。サポート パッケージをインストールするには、MATLAB®[アドオン] メニューでサポート パッケージを選択します。

  4. コンピューター ビジョンおよび機械学習用の ARM Compute Library をターゲット ハードウェアにインストールしなければなりません。サポートされているコンパイラおよびライブラリのバージョンの詳細については、前提条件となる製品のインストールを参照してください。

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

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

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

    net = mobilenetv2;
    

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

    analyzeNetwork(net);
    

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

    classNames = net.Layers(end).Classes;
    numClasses = numel(classNames);
    disp(classNames(randperm(numClasses,10)))
    
         cock 
         apiary 
         soap dispenser 
         titi 
         car wheel 
         guenon 
         muzzle 
         agaric 
         buckeye 
         megalith 
    

    詳細については、深層学習層の一覧 (Deep Learning Toolbox)を参照してください。

cnncodegen を使用したコード生成

ARM Compute Library を使ってコードを生成するには、cnncodegen コマンドの targetlib オプションを使用します。cnncodegen コマンドは SeriesNetwork または DAGNetwork ネットワーク オブジェクトの C++ コードを生成します。

  1. 'arm-compute-mali' として指定された 'targetlib' をもつ cnncodegen を呼び出します。次に例を示します。

    net = googlenet;
    cnncodegen(net,'targetlib','arm-compute-mali','batchsize',1);
    

    'arm-compute-mali' の場合、batchsize の値は 1 でなければなりません。

    ARM Compute Library のライブラリ固有のパラメーターを指定できる 'targetparams' の名前と値のペアの引数は、ARM Mali GPU をターゲットとする場合、適用されません。

  2. cnncodegen コマンドは、コード、makefile、cnnbuild_rtw.mk、およびその他のサポート ファイルを生成して、ターゲット ハードウェアに生成されたコードをビルドします。コマンドはすべての生成されたファイルを codegen フォルダーに配置します。

  3. predict を呼び出す C++ main 関数を作成します。生成されたコードと統合するメイン ファイルの例については、ARM Mali GPU での深層学習の予測を参照してください。

  4. 優先する Secure File Copy (SCP) と Secure Shell (SSH) クライアントを使用して、生成された codegen フォルダーとその他のファイルをホスト開発コンピューターから ARM ハードウェアに移動します。ターゲットで実行可能プログラムをビルドします。

生成コード

DAG ネットワークは、103 個の層クラスから成る配列を含む C++ クラス (CnnMain) として生成されます。コード ジェネレーターは畳み込み層とバッチ正規化層のレイヤー フュージョン最適化で層の数を削減します。cnn_exec.hpp ファイルからのクラス宣言のスニペットが表示されます。

 cnn_exec.hpp ファイル

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

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

  • cnn_exec.cpp ファイルには CnnMain クラスのオブジェクト関数の定義が含まれます。

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

制限

  • ARM Mali GPU のコード生成は、'channel-wise' として設定された NumGroups プロパティまたは 2 を超える値をもつ 2 次元のグループ化された畳み込み層でサポートされません。

参考

関数

関連するトピック