Android平台深度学习--NNAPI

转自:http://blog.sina.com.cn/s/blog_602f87700102y62v.html

1. Android 8.1 (API-27) NNAPI:

人工智能神经网络API(如:TensorFlow)

神经网络 API 能够向设备内置机器学习框架,如 TensorFlow Lite —— Google 移动跨平台机器学习框架、Caffe2 等,提供加速运算和推理。TensorFlow Lite 现已对开发者开放,各位可移步 TensorFlow Lite 开源库进行下载和文档阅览。在 TensorFlow Lite 和神经网络 API 协同合作下,移动设备能够高效运行类似 MobileNets、Inception v3 和 Smart Reply 之类的模块。

2. Android Neural Networks API(NNAPI)
2.1: 简介:
NNAPI (神经网络API)是 NDK中的一套API。由C语言实现。头文件在:
android-ndk-r17b/sysroot/usr/include/android/NeuralNetworks.h
实际上, 在NDK-R16就有了。
 
设计NNAPI的初衷是, 扮演底层平台的角色,支撑上层的各种机器语言学习框架(TensorFlow List, Caffe2等)高效的完成推理计算,甚至是构建/训练模型。
 
2.2: NNAPI有两个显著特点
1. 内置于Android系统,从Android8.1系统开始出现在NDK中。
2. 能够利用硬件加速,使用Android设备的GPU/DSP或各种专门人工智能加速芯片完成神经网络的推理运算,大大提高计算效率。
 
2.3:NNAPI的应用场景(Android8.1, API-27):
NNAPI是给机器学习框架和工具库调用的,理想情况下,各种机器学习框架在内部将构建模型,训练模型,推理运算等操作交由NNAPI完成。
NNAPI会根据Android设备的硬件性能,适当的将这些繁重的计算部署到合适的计算单元(CPU & GPU &DSP &神经网络芯片). 从而使用硬件加速功能完成推理运算。
 
对应用程序开发者,Google官方不推荐直接使用NNAPI, 而是只与TF Lite之类的机器学习框架打交道,构建出适用于TF Lite的模型并部署到Andoroid设备上,其余的工作交给TF Lite和NNAPI 完成。
 
普通开发者也可以按照NDK开发流程来开发基于NNAPI的应用,或者利用其封装出自己的机器学习库。
https://github.com/googlesamples/android-ndk/tree/master/nn_sample
https://github.com/daquexian/DNNLibrary
 
2.4: NNAPI工作原理:
狭义上,NNAPI 单指一组 C 语言 API;广义上,NNAPI 由 NNAPI、NN Runtime、NN HAL 组成。
 
其中,NN Runtime 是 NNAPI 的执行引擎。和其他的 HAL 相同,NN HAL 提供了统一的接口,屏蔽了不同设备厂商的实现差异。从而使开发者只需开发一套代码,便能运行于带有各种加速芯片的设备上。
 
 
自顶往下,安卓应用调用机器学习框架的接口完成推理运算并将结果呈现在界面上,而机器学习框架内部以 NDK 的形式调用 NNAPI,NN Runtime 作为 NNAPI 的执行引擎,完成构建模型、装填模型数据、加载输入数据、推理运算等。此外,NN Runtime 还能对代码进行优化、生成为特殊加速芯片专用的机器代码等。
 
如果安卓设备上没有 GPU、DSP 或专用加速芯片,NNAPI 将退化到 CPU 执行
Android平台深度学习--NNAPI
 
 
 
2.5:开发流程
NNAPI 里包含了 4 类抽象:
 
模型(Model):一个计算图,由数学运算符和运算数组成。这里的运算符是神经网络专用的一些操作,比如 2d 卷积运算、**函数等。运算数是在模型训练过程中形成的常数。在 NNAPI 中,一个模型由 ANeuralNetworksModel 表示。
 
编译(Compilation):配置信息,用于将模型编译成底层代码,一个编译由 ANeuralNetworksCompilation 表示。
 
内存(Memory):内存缓冲区或内存映射文件。NNAPI 利用内存能更加高效的将数据传递给驱动。在代码中,一个Memory 用 ANeuralNetworksMemory 表示。
 
执行(Execution):输入数据、运行模型进行推理运算,收集推理结果。该过程为异步操作,过个线程可以同时等待同一个执行结果。在代码中一个执行用 ANeuralNetworksExecution 表示。
 
Android平台深度学习--NNAPI
 
 
 
2.6:NNAPI 和 TF Lite 关系
NNAPI 具有机器学习框架的功能,只不过跟 TF Lite 比起来,NNAPI 更加底层,功能有限,没有那么多花哨的东西。不仅如此,NNAPI 还具有 NN Runtime 这个功能强大的执行引擎,能够利用安卓设备上各种 XPU,合理分配计算量,提高运算速度。
 
据 谷歌 IO 大会表述,TF Lite 后续开发将与 NNAPI 对接,使 TF Lite 的内部执行调用 NNAPI 完成
google 开源了 TensorFLow Lite,并且在 Android 8.1 版本上为 DSP、GPU、和神经网络芯片等硬件加速器支持了神经网络 API,为了在 Android 移动设备上全面支持 AI 做足了准备
 
 
 
3. Android AI 大事记:
Android平台深度学习--NNAPI
 
 
 
3. MACE(Mobile AI Compute Engine):

https://media.readthedocs.org/pdf/mace/latest/mace.pdf
Github地址:https://github.com/xiaomi/mace

MACE 是小米公司自研的移动端深度学习框架 Mobile AI Compute Engine,2017年12月15日于公司内部正式发布。2018年6月28日,在“2018(第十三届)开源中国开源世界高峰论坛”上,小米公司人工智能与云平台副总裁崔宝秋博士宣布开源 MACE,赋能中国 AI 产业,以期推动移动端深度学习的发展。

Android平台深度学习--NNAPI
 
 

模型格式

MACE 自定义了一种类似 Caffe2 的模型格式。Tensorflow 和 Caffe 训练得到的模型可以转换成 MACE 模型进行部署。MACE 采用 YAML 文件描述模型的部署细节。下一章会给出 YAML 文件的创建方法。

模型转换

目前,提供了Tensorflow、Caffe模型到MACE模型的转换工具,未来会支持更多的框架。