ArmNN是Arm机构开源的基于arm嵌入式设备的inference框架,在Arm Cortex-A CPUs、Arm Mali GPUs、Arm Machine Learning processor都可以达到很高的加速效果。不过可惜的是,由于缺乏文档及教程,该框架在国内推广的程度不高,目前Github上star仅有359个。相对于其他竞品inference框架如NCNN、Tengine、Mace、MNN等等,ArmNN的知名度显得很小。不过笔者在项目的多次使用中,发现ArmNN是一个被低估的框架(在arm设备上的性能几乎都优于目前的前传框架),不亏是ARM家精心调教的SDK,对自家核心的性能调教到了极致。
ArmNN基于Arm的另外一个开源计算引擎ComputeLibrary做后端的核心计算,前端支持多种离线训练框架,如TensorFlow、TFLITE、CAFFE以及ONNX。从功能上来说,几乎实现了与市面上所有离线训练框架无缝对接。而且ArmNN在FP32、FP16及INT8上的加速非常可观,笔者在RK3399上做300x300的Mobilenet-SSD(depth_multiplier=1.0),效率可达90ms/ 帧,其余的框架大多在160ms左右徘徊。
笔者后续会在本专栏开源基于ArmNN的Mobilenet-SSD的部署流程及项目代码。接下来,我们将先跟大家讨论如何编译ArmNN。由于目标平台是RK3399-Android-8.1,我们将基于android-arm64-v8a进行编译。下面我们开始:
下载NDK
笔者使用的版本为NDK-r17c,由于ArmNN使用了一些C++14的新特性,所以老一些的NDK版本在编译的时候会出很多莫名其妙的错误。出于稳妥考虑,建议大家用r17c以上的版本,准备完毕以后,需要配置NDK路径:
接下来制作自己的toolchain编译工具链,
如果你想持久化以上环境变量到系统中,你可以写进.bashrc文件中(或macOS的.bash_profile文件)。
编译Boost
先下载对应版本的Boost库,
进行编译,
编译ComputeLibrary
先下载对应版本的ComputeLibrary,
安装scons后(sudo apt-get install scons),进行编译
编译谷歌的ProtoBuf
首先仍是下载对应的源码,并切换至对应版本,
需要注意的是,这里需要编译对应PC(笔者为x86)和目标平台(arm64-v8a)的两个版本。编译过程中依赖cUrl、autoconf、 llibtool等,可以通过如下命令安装 sudo apt-get install curl autoconf libtool build-essential g++。下面先编译x86版本的,
随后安装arm64-v8a版本的,
编译ArmNN 我们这里采用的frontend为tensorflow,所以我们需要先下载对应的tensorflow源码,
随后下载ArmNN源码,
在PC中生成解析tensorflow的protobuf定义(使用x86平台中编译好的protoc),
随后编译ArmNN,
编译完以后,你可以将库和测试用例推到目标平台中进行测试,
执行测试用例,
最后
至此,我们完成了ArmNN的编译。ArmNN是一个性能十分强劲的inference框架。
|