边缘计算ARMNN(一):ARM-ARMNN-ComputeLibrary rk3399 编译配置

目录

一、写在前面

二、ARMNN简介

三、ARMNN编译

(一)开发环境

(二)开始编译

三、写在最后


一、写在前面

开始环境配置之前,小编要和伙伴们啰嗦一下,热热身。小编一直秉承:学习知识既要见大树,也要见森林!

深度学习发展至今,边缘计算是其非常重要的一部分。那什么是边缘计算?小编的理解简化为大白话即是:让深度网络在终端设备上跑起来,满足精度、稳定性、实时性、成本等需求。稳定性是前提,其他需求相互制衡。就目前而言,边缘计算的发力点主要是三个方面,一是探索、研究并训练合适的网络模型,二是裁剪网络模型,包括减少参数、量化计算等,三是在边缘设备上加速。

深度学习的软件平台主流的有tensorflow pytorch caffe等云端平台,tensorflow_lite、ncnn、MXNN等边缘推理框架。图像分类、目标检测网络主要有lenet vgg googlenet resnet mobile_net yolo ssd等等。这是小编大概了解的。

边缘计算的硬件及API而言,ARM、英伟达、Intel、APPLE和国内的一些芯片/集成电路厂商都在布局,既有统一的标准,又有结合自家硬件API。ARM-A-CPU-NEON ARM-M-CPU-NEON、 DSP-C/C++、FPGA-Verilog、AMD-GPU-OPENCL、NVIDIA-GPU-OPENCL、ARM-MaliGPU-OPENCL、Intel-CPU-SSE、CPU-多核-OPENMP.....伙伴们自行了解了解。关于openCL,可以参照这篇博客https://blog.csdn.net/leonwei/article/details/8880012。ARM官网https://developer.arm.com/documentation/100614/0314/Introduction/About-Arm-Mali-GPUs?lang=en

二、ARMNN简介

ARMNN是什么?引用ARM官网的描述:Arm NN SDK 是一套开源 Linux 软件和工具,支持在高能效的设备上运行机器学习工作负载。它桥接了现有神经网络框架与高能效的  Arm Cortex CPUsArm Mali GPU 或 Arm 机器学习处理器。即和腾讯开源的NCNN,阿里开源的MXNN等一致,相信国内将来也会开发出深度结合自家硬件的AI边缘计算框架。我参照的链接这里:https://community.arm.com/cn/b/blog/posts/arm-nn-development-kit

伙伴们应该知道,ARM的产品覆盖了很多终端设备(手机、智能手环、人脸识别、车辆检测等各类智能电子设备),包括很多芯片大厂也使用ARM的架构。ARMNN旨在结合ARM相关的硬件,加速AI边缘计算。一起来看一张图,了解得全面一些。框图从上到下一共有4层:

  1. NN Frameworks为神经网络框架,如小伙伴知道的Tensorflow Tensorflow_lite caffe onnx等,对边缘终端而言,可以理解为各类可用于推理Inference的神经网络模型文件,大型ARM设备而言可能是训练框架,只不过目前这块NIVIDA GPU占主导。
  2. Arm NN是ARM 开发的中间件或者叫桥接模块,即用于加载推理模型的接口,及作了一些优化。
  3. 这一层是指令集加速层,和第4层硬件紧密结合,目前主要是支持ARM-M系列的CMSIS-M框架、支持ARM-A系列的ComputeLibrary框架(CPU-NEON,CPU-Mali)和ARM-NPU,未来可能支持第三方IP。
  4. 这一层是硬件层,包括ARM-CPU,ARM-GPU,ARM-NPU、第三方IP


ARMNN的未来布局是怎样的?这里同样来看一张框图,一句话概括即:基于ARM自家硬件及其软件API,融合主流神经网络框架,为用户提供高效的AI应用平台。小编不是要打广告哈!!!

三、ARMNN编译

ARMNN的编译资料比较少,基本都是英文的,但是ARM官网也有一片很好的资料,为了方便参考,伙伴们可以Download下来------

指南链接: Configure the Arm NN SDK build environment.pdf  密码: r243,百度网盘。

(一)开发环境

rk3399的友善开发板,配置ARM-CPU-A72@2+A53@4,ARM-GPU-MaliT860,系统ubuntu20.04,设备直接联网,ssh远程访问编译,对于rk3399属于本地编译,交叉编译的需要自己下载好交叉编译工具Toolchain。

Toolchain-- 百度网盘链接: https://pan.baidu.com/s/1n2I0vr_bTAbSzUv0Xpn-_w  密码: u9k1

(二)开始编译

1. 编译环境准备,参考Configure the Arm NN SDK build environment.pdf 中的Before you begin,需要安装git/cmake/scons.

2. 下载源码库,参考Configure the Arm NN SDK build environment.pdf 中的Download libraries,源码建议放在统一目录下,$BASEDIR为统一目录变量,这里参考文档基本没问题

3. Build the Arm Compute Library,这里要注意安装scons编译器,这个编译器比cmake用起来简单,小编也不熟悉,好在按照教程没有出错,建议同时打开NEON和OPENCL。生成的库中包含静态库和动态库,报错处理:

小编在编译过程中报错,关于noexcept的错误,参照这里解决https://review.mlplatform.org/c/ml/ComputeLibrary/+/5281

小编编译这部分也走了点弯路,还是官网指导靠谱点,就是要看懂英文。

ComputeLibrary编译过程中参照了博客https://blog.csdn.net/houge101/article/details/80867194。"在 640M 内存的 vps 做编译的时候出现了上述错误。
----小编几经搜索, 才发可能是系统没有交换分区, 编译过程中内存耗尽, 导致了编译中断 …解决方式也很简单, 就是增加一个交换分区:">>>其实不用交换区,只需要把-j8,改成j2或j4即可,减小并行编译的线程数量。

4. Build the Boost library,这个库主要在单元测试中用到,如果不编译,那么需要在后面cmake ..中设备BUILD_UNIT_TESTS=OFF,参考文档,编译问题不大,小编编译生成的是静态库。

5. Build the Google Protocol Bufferslibrary,这个protobuf是关键,如果只想支持tensorflow_lite可以不编译,跳过。参考文档,编译问题不大。注意make -j2/4,编译线程不要开太大。注意这个目录:<path>/google/aarch64_pb_install

6. Generate the build dependencies for TensorFlow Lite,这一步没有编译,主要是配置文件,生成lite 格式的解析文件。注意这个目录:$BASEDIR/tensorflow/tensorflow/lite/schema

7. Generate the build dependencies for ONNX,这一步也没有编译,也是生成onnx格式的解析文件,注意这里的protobuf-host是5步中的aarch64_pb_install。

如果是要添加TF_PARSER的格式解析文件,则执行如下命令:

pi@FriendlyELEC:~/ARM-NN-CL/onnx$ cd ../tensorflow

pi@FriendlyELEC:~/ARM-NN-CL/tensorflow$ $BASEDIR/aarch64_pb_install/bin/protoc tensorflow/core/protobuf/saved_model.proto --proto_path=. --proto_path=$BASEDIR/aarch64_pb_install/include --cpp_out $BASEDIR/tensorflow

8. Build Arm NN,这一步的配置是关键,稳定给出的指令仅供参考,建议伙伴们下载这里的更改过的ARMNN包,3步中的Bug也修改了,加了控制动态和静态库的编译选择。

百度网盘链接: https://pan.baidu.com/s/1R17xanZ_c--MAmLuxGhlRQ  密码: 8grd

小编的编译目录是:$BASEDIR=/home/pi/ARM-NN-CL,注意将GlobalConfig.cmake的140行修改如下:

find_package(Boost 1.64 REQUIRED COMPONENTS unit_test_framework) //版本需要对应

编译指令如下:

cmake .. -DARMCOMPUTE_ROOT=/home/pi/ARM-NN-CL/ComputeLibrary \
-DARMCOMPUTE_BUILD_DIR=/home/pi/ARM-NN-CL/ComputeLibrary/build \
-DBUILD_SHARED_LIBS=OFF \
-DBUILD_GATORD_MOCK=ON \
-DBUILD_UNIT_TESTS=ON \
-DBUILD_ARMNN_SERIALIZER=ON \
-DBUILD_ARMNN_QUANTIZER=ON \
-DBOOST_ROOT=/home/pi/ARM-NN-CL/boost \
-DBUILD_TF_LITE_PARSER=1 \
-DTF_LITE_GENERATED_PATH=/home/pi/ARM-NN-CL/tensorflow/tensorflow/lite/schema \
-DFLATBUFFERS_ROOT=/home/pi/ARM-NN-CL/flatbuffers \
-DFLATC_DIR=/home/pi/ARM-NN-CL/flatbuffers-1.12.0/build \
-DARMCOMPUTECL=1 \
-DARMCOMPUTENEON=1 \
-DARMNNREF=1 \
-DONNX_GENERATED_SOURCES=/home/pi/ARM-NN-CL/onnx \
-DTF_GENERATED_SOURCES=/home/pi/ARM-NN-CL/tensorflow/tensorflow/core/protobuf \
-DPROTOBUF_ROOT=/home/pi/ARM-NN-CL/aarch64_pb_install \
-DBUILD_ONNX_PARSER=1 \
-DBUILD_CAFFE_PARSER=OFF \
-DBUILD_TF_PARSER=1 \
-DCMAKE_INSTALL_PREFIX=/home/pi/ARM-NN-CL/armnn/build/install

9. Test your build,编译测试,基本没啥问题,可以make install了。

三、写在最后

然后参考sample目录下的列子,开始AI之旅咯!

如果平台和我的一致,可以直接用我编译好的静态库,小编编译了两天多,小编全程是静态编译,生成的是静态库。编译的过程比较艰辛,需要慢慢摸索,最好比较熟悉掌握cmake工具,后期caffe的接口也是和ONNX的配置方式一样,其他解析器要参考ARMNN的CMakeLists.txt和cmake文件夹下的.cmake文件。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Jeff_ROS

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值