ARM Neon ターゲット用の深層学習コードのクロス コンパイル
この例では、生成された深層学習コードをクロスコンパイルして、ライブラリまたは実行可能なファイルを作成し、ライブラリまたは実行可能なファイルを Hikey 960 や Rock 960 などの ARM® ターゲットで展開する方法を説明します。この例では、codegen
コマンドを使用します。
ARM® ターゲットの深層学習コードのクロス コンパイルには、次の手順が含まれます。
インストールされているクロスコンパイラ ツールチェーンを設定して、ホスト MATLAB® でコンパイルを実行します。ホスト コンピューターの MATLAB で
codegen
コマンドを実行すると、コンパイルが行われます。codegen
コマンドを使用して、生成されたコードをビルドし、ホスト コンピューター上にライブラリまたは実行可能なファイルを作成します。生成されたライブラリまたは実行可能なファイルと、その他のサポート ファイルをターゲット ハードウェアにコピーします。ホスト コンピューター上にライブラリを生成する場合は、コピーした makefile をターゲットでコンパイルして実行可能ファイルを作成します。
生成された実行可能ファイルをターゲット ARM ハードウェアで実行します。
このワークフローは、Neon|SIMD 命令セットをサポートする任意の ARM Neon ターゲットで使用できます。この例は、ホスト Linux® プラットフォームでのみサポートされます。
前提条件
NEON|SIMD 拡張をサポートする ARM プロセッサ
ARM Compute Library (ホスト コンピューター上)
MATLAB® Coder™
MATLAB Coder Interface for Deep Learning サポート パッケージ
Deep Learning Toolbox™
Deep Learning Toolbox Model for Inception-v3 Network サポート パッケージ
Image Processing Toolbox™
armv7 (32 ビット Arm アーキテクチャ) ターゲットに展開する場合、GNU/GCC
g++-arm-linux-gnueabihf
ツールチェーンarmv8 (64 ビット Arm アーキテクチャ) ターゲットに展開する場合、GNU/GCC
g++-aarch64-linux-gnu
ツールチェーンクロス コンパイラおよびライブラリの環境変数
クロスコンパイラ ツールチェーンをインストールし、関連する環境変数を設定する方法の詳細については、ARM Compute Library を使用する深層学習コードのクロスコンパイルを参照してください。
この例で使用されている ARM Compute Library のバージョンは、コード生成でサポートされている最新バージョンではない可能性があります。サポートされているライブラリのバージョン、および環境変数の詳細については、深層学習に MATLAB Coder を使用するための前提条件を参照してください。
この例のコード行はコメント アウトされています。例を実行する前に、コメントを解除してください。
この例は、MATLAB Online ではサポートされていません。
エントリポイント関数 inception_predict_arm
この例では、Inception-V3 イメージ分類ネットワークを使用します。MATLAB 用の事前学習済み Inception-V3 ネットワークは、Deep Learning Toolbox Model for Inception-V3 Network サポート パッケージに含まれています。エントリポイント関数 inception_predict_arm
は、Inception-V3 ネットワークを永続的なネットワーク オブジェクトに読み込みます。それ以降、この関数を呼び出すと、永続オブジェクトが再利用されます。
type inception_predict_arm
function out = inception_predict_arm(in) persistent net; if isempty(net) net = coder.loadDeepLearningNetwork('inceptionv3','inceptionv3'); end out = net.predict(in); end
深層学習構成オブジェクトの設定
coder.ARMNEONConfig
オブジェクトを作成します。ARM Compute Library のバージョンと ARM アーキテクチャを指定します。
dlcfg = coder.DeepLearningConfig('arm-compute'); dlcfg.ArmComputeVersion = '20.02.1'; dlcfg.ArmArchitecture = 'armv8'; % or 'armv7'
入力イメージ peppers.png
を分類するには、イメージをテキスト ファイルに変換します。
generateImagetoTxt('peppers.png');
1 番目の方法: ホスト上でのエントリポイント関数のスタティック ライブラリの作成
この方法では、最初に、生成されたコードをクロス コンパイルして、ホスト コンピューター上にスタティック ライブラリを作成します。次に、生成されたスタティック ライブラリ、ARM Compute Library ファイル、makefile、その他のサポート ファイルをターゲット ハードウェアに転送します。ターゲット ハードウェアで makefile を実行して、実行可能ファイルを生成します。最後に、ターゲット ハードウェアで実行可能ファイルを実行します。
コード生成構成オブジェクトの設定
スタティック ライブラリ用のコード生成構成オブジェクトを作成します。ターゲット言語を C++ に指定します。
cfg = coder.config('lib'); cfg.TargetLang = 'C++';
コード生成構成オブジェクトに深層学習構成オブジェクトを追加します。
cfg.DeepLearningConfig = dlcfg;
クロスコンパイラ ツールチェーンの設定
ターゲット デバイスの ARM アーキテクチャに基づいてクロスコンパイラ ツールチェーンを設定します。
cfg.Toolchain = 'Linaro AArch64 Linux v6.3.1';% When the Arm Architecture is armv8 cfg.Toolchain = 'Linaro AArch32 Linux v6.3.1';% When the Arm Architecture is armv7
codegen を使用したホスト コンピューターでのスタティック ライブラリの生成
codegen
コマンドを使用して、エントリポイント関数のコードを生成し、生成されたコードをビルドし、ターゲット ARM アーキテクチャのスタティック ライブラリを作成します。
codegen -config cfg inception_predict_arm -args {ones(299,299,3,'single')} -d arm_compute_cc_lib -report
生成されてクロスコンパイルされたスタティック ライブラリのターゲット ハードウェアへのコピー
スタティック ライブラリ、ビン ファイル、およびヘッダー ファイルを、生成されたフォルダー arm_compute_cc_lib
からターゲット ARM ハードウェアにコピーします。このコード行とその後に続く他のコード行で、次のように置き換えます。
password: 自分のパスワード
username: 自分のユーザー名
hostname: 自分のデバイス名
targetDir: ファイルの保存先フォルダー
system('sshpass -p password scp -r arm_compute_cc_lib/*.bin arm_compute_cc_lib/*.lib arm_compute_cc_lib/*.h arm_compute_cc_lib/*.hpp username@hostname:targetDir/');
ARM Compute Library ファイルのターゲット ハードウェアへのコピー
実行可能ファイルは、実行時に ARM Compute Library ファイルを使用します。ターゲット ボードは、実行可能ファイルの生成時と実行可能ファイルの実行時にヘッダー ファイルを必要としません。ライブラリを目的のパスにコピーします。
system(['sshpass -p password scp -r ' fullfile(getenv('ARM_COMPUTELIB'),'lib') ' username@hostname:targetDir/']);
サポート ファイルのターゲット ハードウェアへのコピー
次のファイルをターゲット ARM ハードウェアにコピーします。
スタティック ライブラリから実行可能ファイルを生成する makefile
Makefile_Inceptionv3
。分類する入力イメージ
inputimage.txt
。net.Layers(end).Classes
によって返される ClassNames を含むテキスト ファイルsynsetWords.tx
t。関数
inception_predict_arm
用に生成されたコードを呼び出すメイン ラッパー ファイルmain_inception_arm.cpp
。
system('sshpass -p password scp synsetWords.txt ./Makefile_Inceptionv3 ./inputimage.txt ./main_inception_arm.cpp username@hostname:targetDir/');
ターゲットでの実行可能ファイルの作成
ターゲットで makefile をコンパイルして、スタティック ライブラリから実行可能ファイルを生成します。この makefile は、スタティック ライブラリをメイン ラッパー ファイル main_inception_arm.cpp
にリンクし、実行可能ファイルを生成します。
system('sshpass -p password ssh username@hostname "make -C targetDir -f Makefile_Inceptionv3 arm_inceptionv3 "');
ターゲットでの実行可能ファイルの実行
生成された実行可能ファイルをターゲットで実行します。実行可能ファイルの実行時には、ARM Compute Library ファイルを指す LD_LIBRARY_PATH を必ずエクスポートしてください。
system('sshpass -p password ssh username@hostname "export LD_LIBRARY_PATH=targetDir/lib; cd targetDir;./inception_predict_arm.elf inputimage.txt out.txt"');
2 番目の方法: ホスト上でのエントリポイント関数の実行可能ファイルの作成
この方法では、最初に、生成されたコードをクロス コンパイルして、ホスト コンピューター上に実行可能ファイルを作成します。次に、生成された実行可能ファイル、ARM Compute Library ファイル、その他のサポート ファイルをターゲット ハードウェアに転送します。最後に、ターゲット ハードウェアで実行可能ファイルを実行します。
コード生成構成オブジェクトの設定
実行可能ファイルの生成用にコード生成構成オブジェクトを作成します。ターゲット言語を C++ に設定します。
cfg = coder.config('exe'); cfg.TargetLang = 'C++';
コード生成構成オブジェクトに深層学習構成オブジェクトを追加します。
cfg.DeepLearningConfig = dlcfg;
メイン ラッパー ファイル main_inception_arm.cpp
をカスタム ソース ファイルとして宣言します。
cfg.CustomSource = 'main_inception_arm.cpp';
クロスコンパイラ ツールチェーンの設定
ターゲット デバイスの ARM アーキテクチャに基づいてクロスコンパイラ ツールチェーンを設定します。
cfg.Toolchain = 'Linaro AArch64 Linux v6.3.1'; % When the Arm Architecture is armv8, cfg.Toolchain = 'Linaro AArch32 Linux v6.3.1';% When the Arm Architecture is armv7,
codegen
を使用したホスト コンピューターでの実行可能ファイルの生成
codegen
コマンドを使用して、エントリポイント関数のコードを生成し、生成されたコードをビルドし、ターゲット ARM アーキテクチャの実行可能ファイルを作成します。
codegen -config cfg inception_predict_arm -args {ones(299,299,3,'single')} -d arm_compute_cc_exe -report
生成された実行可能ファイルのターゲット ハードウェアへのコピー
生成された実行可能ファイルとビン ファイルをターゲット ARM ハードウェアにコピーします。このコード行とその後に続く他のコード行で、次のように置き換えます。
password: 自分のパスワード
username: 自分のユーザー名
hostname: 自分のデバイス名
targetDir
: ファイルの保存先フォルダー
system('sshpass -p password scp -r arm_compute_cc_exe/*.bin username@hostname:targetDir/'); system('sshpass -p password scp inception_predict_arm.elf username@hostname:targetDir/');
ARM Compute Library ファイルのターゲット ハードウェアへのコピー
実行可能ファイルは、実行時に ARM Compute Library ファイルを使用します。実行時にヘッダー ファイルを使用しません。ライブラリ ファイルを目的のパスにコピーします。
system(['sshpass -p password scp -r ' fullfile(getenv('ARM_COMPUTELIB'),'lib') ' username@hostname:targetDir/']);
サポート対象のファイルのターゲット ハードウェアへのコピー
次のファイルをターゲット ARM ハードウェアにコピーします。
分類する入力イメージ
inputimage.txt
。net.Layers(end).Classes
によって返される ClassNames を含むテキスト ファイルsynsetWords.tx
t。関数
inception_predict_arm
用に生成されたコードを呼び出すメイン ラッパー ファイルmain_inception_arm.cpp
。
system('sshpass -p password scp synsetWords.txt ./inputimage.txt ./main_inception_arm.cpp username@hostname:targetDir/');
ターゲット ハードウェア上での実行可能ファイルの実行
生成された実行可能ファイルをターゲットで実行します。実行可能ファイルの実行時には、ARM Compute Library ファイルを指す LD_LIBRARY_PATH を必ずエクスポートしてください。
system('sshpass -p password ssh username@hostname "export LD_LIBRARY_PATH=targetDir/lib; cd targetDir;./inception_predict_arm.elf inputimage.txt out.txt"');
ターゲットから MATLAB への出力データの転送
生成された出力をホスト コンピューターの現在の MATLAB セッションにコピーします。
system('sshpass -p password scp username@hostname:targetDir/out.txt ./');
予測スコアのラベルへのマッピング
上位 5 つの予測スコアを学習済みネットワークの対応するラベルにマッピングします。
outputImage = mapPredictionScores; imshow(outputImage);
参考
coder.ARMNEONConfig
| coder.DeepLearningConfig
| coder.hardware