Main Content

このページの翻訳は最新ではありません。ここをクリックして、英語の最新版を参照してください。

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 を使用する深層学習コードのクロスコンパイル (MATLAB Coder)を参照してください。

この例で使用されている ARM Compute Library のバージョンは、コード生成でサポートされている最新バージョンではない可能性があります。サポートされているライブラリのバージョン、および環境変数の詳細については、MATLAB Coder を使用した深層学習の前提条件 (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 のバージョンを指定します。

dlcfg = coder.DeepLearningConfig('arm-compute');
dlcfg.ArmComputeVersion = '19.05';

入力イメージ 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.txt。

  • 関数 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.txt。

  • 関数 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);

参考

(MATLAB Coder) | (MATLAB Coder) | (MATLAB Coder)

関連するトピック