交叉编译ARM Neon目标的深度学习代码
这个例子展示了如何交叉编译生成的深度学习代码来创建库或可执行文件,然后将库或可执行文件部署到ARM®目标(如Hikey 960或Rock 960)上。本例使用codegen
命令。
交叉编译ARM®目标的深度学习代码包括以下步骤:
配置已安装的交叉编译器工具链,以在主机MATLAB®上执行编译。的时候进行编译
codegen
命令在MATLAB中在上位机。使用
codegen
命令构建生成的代码并在主机上创建库或可执行文件。将生成的库或可执行文件和其他支持文件复制到目标硬件。金宝app如果在主机上生成库,则在目标上编译复制的makefile以创建可执行文件。
在目标ARM硬件上运行生成的可执行文件。
您可以将此工作流用于任何支持Neon|SIMD指令集的ARM Neon目标。金宝app此示例仅支持主机Linux®平台金宝app。
先决条件
ARM处理器,支持Neon|SIMD扩金宝app展
ARM计算库(在主机上)
MATLAB®编码器™
支持包M金宝appATLAB编码器接口的深度学习
深度学习工具箱™
支持包深金宝app度学习工具箱模型的Inception-v3网络
图像处理工具箱™
对于部署在armv7(32位Arm架构)目标上,GNU/GCC
g++ -arm-linux-gnueabihf
工具链对于在armv8(64位Arm架构)目标上的部署,GNU/GCC
g++ -aarch64-linux-gnu
工具链交叉编译器和库的环境变量
有关如何安装交叉编译器工具链和设置相关环境变量的信息,请参见交叉编译深度学习代码使用ARM计算库(MATLAB编码器).
本例使用的ARM Compute库版本可能不是代码生成支持的最新版本。金宝app有关受支持的库版本和环境变量的信息,请参见金宝app用MATLAB编码器进行深度学习的先决条件(MATLAB编码器).
本例中的代码行被注释掉了。在运行示例之前取消注释。
这个例子在MATLAB在线中不支持。金宝app
的inception_predict_arm
入口点函数
本例使用Inception-V3图像分类网络。一个预先训练好的MATLAB Inception-V3网络可在支持包深度学习工具箱模型中用于Inception-V3网络。金宝app的inception_predict_arm
入口点函数将Inception-V3网络加载到持久网络对象中。在对函数的后续调用中,将重用持久对象。
类型inception_predict_arm
函数out = inception_predict_arm(in)持久化网络;if isempty(net) net = code . loaddeeplearningnetwork ('inceptionv3','inceptionv3');End out = net.predict(in);结束
设置深度学习配置对象
创建一个编码器。ARMNEONConfig
对象。指定ARM计算库和ARM架构的版本。
DLCFG =编码器。DeepLearningConfig (“arm-compute”);dlcfg。ArmComputeVersion =“19.05”;% dlcfg。ArmArchitecture = 'armv7';%或'armv8'
用于对输入图像进行分类peppers.png
,将图像转换为文本文件。
% generateImagetoTxt(“peppers.png”);
第一种方法:为主机上的入口点函数创建静态库
在这种方法中,首先交叉编译生成的代码以在主机计算机上创建静态库。然后将生成的静态库、ARM Compute库文件、makefile和其他支持文件传输到目标硬件。金宝app在目标硬件上运行makefile生成可执行文件。最后,在目标硬件上运行可执行文件。
设置代码生成配置对象
为静态库创建代码生成配置对象。将目标语言指定为c++。
CFG = code .config(“自由”);cfg。TargetLang =“c++”;
将深度学习配置对象附加到代码生成配置对象上。
cfg。DeepLearningConfig = dlcfg;
配置交叉编译器工具链
请根据目标设备的ARM架构配置交叉编译工具链。
% cfg。当Arm架构为armv8时,Toolchain = 'Linaro AArch64 Linux v6.3.1'% cfg。当Arm架构为armv7时,Toolchain = 'Linaro AArch32 Linux v6.3.1';%
在主机上使用代码生成静态库
使用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硬件。在此代码行和随后的其他代码行中,替换为:
密码与你的密码
用户名与您的用户名
带有设备名称的主机名
targetDir文件的目标文件夹
% system('sshpass -p password SCP -r arm_compute_cc_lib/*.bin arm_compute_cc_lib/*.binlib arm_compute_cc_lib/*.h arm_compute_cc_lib/*.hpp username@hostname:targetDir/');
复制ARM计算库文件到目标硬件
可执行文件在运行时使用ARM Compute库文件。目标板在生成可执行文件和运行可执行文件时不需要头文件。将库复制到所需的路径。
% system(['sshpass -p password scp -r ' fullfile(getenv('ARM_COMPUTELIB'),'lib')' username@hostname: targetDir / ']);
复制支持文金宝app件到目标硬件
将这些文件复制到目标ARM硬件:
Makefile
Makefile_Inceptionv3
从静态库生成可执行文件。输入图像
inputimage.txt
你想要分类。文本文件
synsetWords.tx
返回的类名net.Layers(结束). class
主包装器文件
main_inception_arm.cpp
方法生成的代码inception_predict_arm
函数。
% 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库文件的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"');
第二种方法:在主机上创建可执行的入口点函数
在这种方法中,首先交叉编译生成的代码以在主机上创建可执行文件。然后将生成的可执行文件、ARM Compute库文件和其他支持文件传输到目标硬件。金宝app最后,在目标硬件上运行可执行文件。
设置代码生成配置对象
创建用于生成可执行文件的代码生成配置对象。将目标语言设置为c++。
CFG = code .config(exe”);cfg。TargetLang =“c++”;
将深度学习配置对象附加到代码生成配置对象上。
cfg。DeepLearningConfig = dlcfg;
声明主包装器文件main_inception_arm.cpp
作为自定义源文件。
cfg。CustomSource =“main_inception_arm.cpp”;
配置交叉编译器工具链
请根据目标设备的ARM架构配置交叉编译工具链。
% cfg。工具链= 'Linaro AArch64 Linux v6.3.1';当Arm架构为armv8时,% cfg。Toolchain = 'Linaro AArch32 Linux v6.3.1';%当Arm架构是armv7,
在主机上使用生成可执行文件codegen
使用codegen
命令为入口点函数生成代码,构建生成的代码,并为目标ARM架构创建可执行文件。
% codegen -config CFG inception_predict_arm -args {ones(299,299,3,'single')} -d arm_compute_cc_exe -report
复制生成的可执行文件到目标硬件
将生成的可执行文件和bin文件复制到目标ARM硬件。在此代码行和随后的其他代码行中,替换为:
密码与你的密码
用户名与您的用户名
带有设备名称的主机名
targetDir
文件的目标文件夹
% system('sshpass -p password scp -r arm_compute_cc_exe/*.bin username@hostname:targetDir/');% system('sshpass -p password SCP inception_predict_arm. sh)精灵username@hostname: targetDir / ');
复制ARM计算库文件到目标硬件
可执行文件在运行时使用ARM Compute库文件。它在运行时不使用头文件。将库文件复制到所需的路径。
% system(['sshpass -p password scp -r ' fullfile(getenv('ARM_COMPUTELIB'),'lib')' username@hostname: targetDir / ']);
复制支持文金宝app件到目标硬件
将这些文件复制到目标ARM硬件:
输入图像
inputimage.txt
你想要分类。文本文件
synsetWords.tx
返回的类名net.Layers(结束). class
主包装器文件
main_inception_arm.cpp
方法生成的代码inception_predict_arm
函数。
% system('sshpass -p password scp synsetWords.txt ./inputimage.txt ./main_inception_arm.cpp username@hostname:targetDir/');
在目标硬件上运行可执行文件
在目标上运行生成的可执行文件。确保在运行可执行文件时导出指向ARM Compute库文件的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 ./');
将预测分数映射到标签
将前五个预测分数映射到训练网络中对应的标签。
% outputImage = mapPredictionScores;显示与分类分数重叠的图像。% imshow (outputImage);
另请参阅
编码器。ARMNEONConfig
(MATLAB编码器)|编码器。DeepLearningConfig
(MATLAB编码器)|coder.hardware
(MATLAB编码器)
相关的话题
- 基于ARM计算库的深度学习网络代码生成(MATLAB编码器)
- 基于ARM目标的深度学习代码生成(MATLAB编码器)
- 交叉编译深度学习代码使用ARM计算库(MATLAB编码器)