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 = 'armv7'; % or 'armv8'
入力イメージ 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
ターゲット ハードウェアへの生成されたクロスコンパイル済みスタティック ライブラリのコピー
スタティック ライブラリ、bin ファイルおよびヘッダー ファイルを、生成されたフォルダー 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
ターゲット ハードウェアへの生成された実行可能ファイルのコピー
生成された実行可能ファイルおよび bin ファイルをターゲット 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; % Display the overlayed Image with Classification Scores. % imshow(outputImage);
参考
coder.ARMNEONConfig
| coder.DeepLearningConfig
| coder.hardware