这是我参与「第四届青训营 」笔记创作活动的第5天
8.8 android第五课——端智能技术
一、端智能是什么?
端智能(On-Device Machine Learning)是指把机器学习/深度学习算法模型应用和部署到端设备上,这里端设备是相对云服务而言的,可以是手机,也可以是物联网IoT设备
二、为什么要做端智能?
-
Low Latency(低延迟):
无需往返服务器,也无需等待结果返回,实时性高
可以利用设备上的硬件加速(例如GPU或TPU)来获得更快的结果
由于低延迟推理,解锁了新的用例,例如实时处理视频,例如,使用分段模型删除视频通话中的背景,或使用支持视觉搜索的摄像头跟踪对象
-
Privacy:保护隐私
-
Power:端设备算力越来越强大
-
Offline:可离线,此外,由于所有数据的处理都在端设备上进行,因此可以减少用户移动数据计划的使用量
-
Low Cost:低成本
- 端云协同:端智能不是云智能的替代,是云端机器学习的延伸,是要结合云和端各自的优势,在云端之间合理分配任务以获取最优解
设备上机器学习的一些限制:
由于机器学习的本质,训练的模型可能会变得相当大,尽管当它们在服务器上允许时这不是问题,但是客户端上运行可能会受到限制,移动设备在存储、内存、计算资源和功耗限制方面受到比服务端更多限制,因此设备上的模型需要比服务器对应的模型小得多,通常,这意味着这些功能较弱,所以使用案例将决定使用设备上的模型是否合适
三、端智能技术的发展历程
2006年,深度学习被提出,由于大数据的发展和硬件算力的提升,深度学习算法和框架不断演进,人工智能领域迎来了一次大发展
与此同时,端侧设备在算力,算法和框架上也有很大的发展,各类端侧机器学习框架和应用案例越来越多

端智能机器学习框架:
- Google:Tensorflow Lite、ML Kit
- Meta:PyTorch Mobile、PyTorch Live
- Apple: CoreML
- 腾讯:NCNN、TNN,(NCNN和TNN不得不说的故事)
- 阿里:MNN
- 百度:Paddle-Lite
- 华为: HiAI 、ML Kit
- 小米:Mace
- 其他:字节(ByteNN、Pitaya),快手(KwaiNN、Ykit)……
四、端智能案例落地的套路
-
首先,把问题描述和定义清楚,并调研出通过机器学习解决问题的方法。
-
然后,设计和训练出机器学习模型,并针对端侧设备优化和转换模型。
-
模型设计就像一个搭积木的过程,通过调整神经元个数和层数让预测更精确;神经元和层数越多相应耗时也会增加,需要综合权衡考虑。
-
模型训练:
- 搭建训练环境-Tensorflow
- 训练样本处理
- 模型构建-Keras
- 模型训练
- 验证模型准确度
-
模型压缩和转换:
-
为什么要做模型转换?
- 移动端使用的是被优化的推理引擎,可以在不同CPU和GPU架构下高效的执行模型推理计算。
-
这里我们使用Tensorflow Lite作为移动端上推理引擎。
- TensorFlow Lite 的设计旨在在各种设备上高效执行模型。这种高效部分源于在存储模型时,采用了一种特殊的格式。
- TensorFlow模型在被TensorFlow Lite 使用前,必须转换成这种格式。
- Tensorflow Lite 提供转换器 TFLite Convert
-
-
-
最后,把优化后模型部署和集成到端侧设备应用中,执行推理预测,并以进预测结果解决定义的问题。
核心:让移动端可以加载到前面转化的模型
- 简单做法:放在App包体内assets目录下
- 进阶做法:通过url动态下载,支持动态更新,同时减少包体积
- 简单做法:放在App包体内assets目录下
-
在移动端加载模型,Tensorflow Lite官方给出了指引
- www.tensorflow.org/lite/guide/…
- 代码参考 DigitalClassifier
- Tensorflow Lite 将模型的加载和执行封装在Interpreter类中
-
// 引入tensorflow lite 依赖 implementation 'org.tensorflow:tensorflow-lite:0.0.0-nightly-SNAPSHOT' // 从文件加载模型 public Interpreter(File modelFile, Options options) // 将模型读取到bytebuffer,从bytebuffer加载模型 public Interpreter(ByteBuffer byteBuffer, Options options)
-
移动端推理预测
-
推理预测是指设备上执行 TensorFlow Lite 模型
- 代码位于 DigitalClassifier
- www.tensorflow.org/lite/guide/… (官方指导)
-
加载模型
-
var model: ByteBuffer = load(mymodel.tflite) val interpreter = Interpreter(model, options) // 可通过 interpreter 查看输入和输出格式 // inputShape:[1, 28, 28], outputShape:[1, 10] 复制代码
-
-
构造模型输入
- 模型的输入28x28单通道灰度图,而用手写输入是数据是存在bitmap中
- 需要将bitmap图片 resize 缩放到28x28像素,转灰度,再转成bytebuffer,这是 interpreter 接受的输入格式。
-
执行推理预测
- 构造输出buffer,调用run执行计算
-
val result = Array(1) { FloatArray(10) } // outputShape:[1, 10] interpreter.run(inputByteBuffer,result) 复制代码
-
获取推理预测结果
- result中的10个数值代表手写输入是 0~9 这10个数字置信度分值,对分值进行排序,把排序前三的数字作为预测输出,供用户选择。
-
五、端智能工程师学习路线
入门
-
达成:对端智能技术有一定认识,可以协作完成端智能技术的需求落地
- 了解端智能技术是什么、可以做什么
- 掌握移动端开发、Machine Learning 基础知识,了解业内端智能框架
- 理解怎么做端智能,可以协作完成端智能技术解决实际业务问题的需求落地
-
学习资料:
- 了解端智能可以做哪些事情:Google MLKit、华为 MLKit
- 机器学习入门: Tensorflow入门、机器学习速成课、微软AI-EDU
- 机器学习在移动端应用:TensorflowLite入门
- 机器学习原理:吴恩达课程
进阶
- 达成:对移动端技术、端智能技术和负责业务有更深入的理解,可以站在更全面的视野上设计端上智能解决方案,建设端上智能架构。
\