深層学習ネットワークの int8 コードの生成
深層学習では、畳み込み層などのさまざまな処理層を含むニューラル ネットワーク アーキテクチャが使用されます。深層学習モデルは通常、ラベル付きデータの大量のセットに対して動作します。これらのモデルで推論を実行すると、計算量が多くなり、大量のメモリが消費されます。ニューラル ネットワークでは、入力がネットワーク経由で伝播するときに、各層からの入力データ、パラメーター (重み)、および活性化を保存するためにメモリが使用されます。MATLAB® で学習させた深層ニューラル ネットワークは、単精度浮動小数点データ型を使用します。小規模なネットワークでも、これらの浮動小数点算術演算を実行するには大量のメモリとハードウェアが必要です。このような制限は、計算能力が低く、メモリ リソースが少ない場合にデバイスへの深層学習モデルの展開を妨げる可能性があります。重みと活性化を保存するための精度を下げることによって、ネットワークのメモリ要件を緩和させることができます。
Deep Learning Toolbox™ と Deep Learning Toolbox Model Compression Library サポート パッケージを併用して、畳み込み層の重み、バイアス、および活性化を 8 ビットにスケーリングされた整数データ型に量子化することによって、深層ニューラル ネットワークのメモリ フットプリントを削減できます。次に、MATLAB Coder™ を使用してネットワークの最適化されたコードを生成できます。
ARM Cortex-A プロセッサ
生成コードでは、ARM® Compute Library を使用して ARM プロセッサの SIMD を利用します。この生成コードは、Raspberry Pi® などの各種の ARM Cortex®-A CPU プラットフォームに展開できるソース コード、スタティック ライブラリ、ダイナミック ライブラリ、または実行可能ファイルとしてプロジェクトに統合できます。コードを ARM Cortex-A プロセッサに展開するには、ARM Compute Library version 20.02.1 を使用する必要があります。
サポートされている層とクラス
ARM Compute Library を使用して 8 ビット整数で推論計算を実行する次の層について、それらの C++ コードを生成できます。
2 次元平均プーリング層 (
averagePooling2dLayer(Deep Learning Toolbox))2 次元畳み込み層 (
convolution2dLayer(Deep Learning Toolbox))全結合層 (
fullyConnectedLayer(Deep Learning Toolbox))2 次元グループ畳み込み層 (
groupedConvolution2dLayer(Deep Learning Toolbox))。入力引数NumGroupsの値は2と等しくなければなりません。最大プーリング層 (
maxPooling2dLayer(Deep Learning Toolbox))正規化線形ユニット (ReLU) 層 (
reluLayer(Deep Learning Toolbox))入力層と出力層
このような深層学習ネットワークの C++ コード生成では、DAGNetwork (Deep Learning Toolbox)、dlnetwork (Deep Learning Toolbox)、yolov3ObjectDetector (Computer Vision Toolbox)、yolov4ObjectDetector (Computer Vision Toolbox)、および SeriesNetwork (Deep Learning Toolbox) オブジェクトがサポートされます。
コードの生成
8 ビット整数で推論計算を実行するコードを生成するには、coder.ARMNEONConfig オブジェクト dlcfg で次の追加プロパティを設定します。
dlcfg.CalibrationResultFile = 'dlquantizerObjectMatFile'; dlcfg.DataType = 'int8';
あるいは、MATLAB Coder アプリの [深層学習] タブで [ターゲット ライブラリ] を [ARM Compute] に設定します。さらに、[データ型] パラメーターと [キャリブレーション結果ファイルのパス] パラメーターを設定します。
ここで、'dlquantizerObjectMatFile' は、特定のキャリブレーション データについて dlquantizer (Deep Learning Toolbox) で生成される MAT ファイルの名前です。キャリブレーションが目的の場合、dlquantizer オブジェクトの ExecutionEnvironment プロパティを 'CPU' に設定します。
これ以外については、ARM Compute Library を使用した、深層学習ネットワークのためのコード生成で説明されている手順に従います。
例については、Raspberry Pi での深層学習ネットワークの INT8 コードの生成を参照してください。
ARM Cortex-M プロセッサ
生成コードでは、CMSIS-NN ライブラリ version 5.7.0 を利用します。この生成コードは、各種の ARM Cortex-M CPU プラットフォームに展開できるスタティック ライブラリとしてプロジェクトに統合できます。
サポートされている層とクラス
全結合層を表す fullyConnectedLayer (Deep Learning Toolbox) オブジェクトの生成コードは、CMSIS-NN ライブラリを使用して 8 ビット整数で推論計算を実行します。
深層学習ネットワークには、次の層も含めることができます。生成コードは、これらの層については 32 ビット浮動小数点型で計算を実行します。
lstmLayer(Deep Learning Toolbox) オブジェクトで表される長短期記憶層。predictに渡すSequenceLengthの値はコンパイル時の定数でなければなりません。softmaxLayer(Deep Learning Toolbox) オブジェクトで表されるソフトマックス層。入力層と出力層。
このような深層学習ネットワークの C コード生成では、SeriesNetwork (Deep Learning Toolbox) オブジェクトと、SeriesNetwork オブジェクトに変換可能な DAGNetwork (Deep Learning Toolbox) オブジェクトがサポートされます。
コードの生成
CMSIS-NN ライブラリを使用して 8 ビット整数で推論計算を実行するコードを生成するには、coder.CMSISNNConfig オブジェクト dlcfg で CalibrationResultFile プロパティを次のように設定します。
dlcfg.CalibrationResultFile = 'dlquantizerObjectMatFile';あるいは、MATLAB Coder アプリの [深層学習] タブで [ターゲット ライブラリ] を [CMSIS-NN] に設定します。さらに、[キャリブレーション結果ファイルのパス] パラメーターを設定します。
ここで、'dlquantizerObjectMatFile' は、特定のキャリブレーション データについて dlquantizer (Deep Learning Toolbox) で生成される MAT ファイルの名前です。キャリブレーションが目的の場合、dlquantizer オブジェクトの ExecutionEnvironment プロパティを 'CPU' に設定します。
例については、Generate INT8 Code for Deep Learning Network on Cortex-M Targetを参照してください。
参考
アプリ
- ディープ ネットワーク量子化器 (Deep Learning Toolbox)
関数
dlquantizer(Deep Learning Toolbox) |dlquantizationOptions(Deep Learning Toolbox) |calibrate(Deep Learning Toolbox) |validate(Deep Learning Toolbox) |coder.loadDeepLearningNetwork|codegen