端智能技术|青训营笔记

155 阅读6分钟

这是我参与「第四届青训营 」笔记创作活动的第5天

8.8 android第五课——端智能技术

一、端智能是什么?

端智能(On-Device Machine Learning)是指把机器学习/深度学习算法模型应用和部署到端设备上,这里端设备是相对云服务而言的,可以是手机,也可以是物联网IoT设备

二、为什么要做端智能?

  • Low Latency(低延迟):

    无需往返服务器,也无需等待结果返回,实时性高

    可以利用设备上的硬件加速(例如GPU或TPU)来获得更快的结果

    由于低延迟推理,解锁了新的用例,例如实时处理视频,例如,使用分段模型删除视频通话中的背景,或使用支持视觉搜索的摄像头跟踪对象

  • Privacy:保护隐私

  • Power:端设备算力越来越强大

  • Offline:可离线,此外,由于所有数据的处理都在端设备上进行,因此可以减少用户移动数据计划的使用量

  • Low Cost:低成本

  • 端云协同:端智能不是云智能的替代,是云端机器学习的延伸,是要结合云和端各自的优势,在云端之间合理分配任务以获取最优解

设备上机器学习的一些限制:

由于机器学习的本质,训练的模型可能会变得相当大,尽管当它们在服务器上允许时这不是问题,但是客户端上运行可能会受到限制,移动设备在存储、内存、计算资源和功耗限制方面受到比服务端更多限制,因此设备上的模型需要比服务器对应的模型小得多,通常,这意味着这些功能较弱,所以使用案例将决定使用设备上的模型是否合适

三、端智能技术的发展历程

2006年,深度学习被提出,由于大数据的发展和硬件算力的提升,深度学习算法和框架不断演进,人工智能领域迎来了一次大发展

与此同时,端侧设备在算力,算法和框架上也有很大的发展,各类端侧机器学习框架和应用案例越来越多

端智能机器学习框架:

四、端智能案例落地的套路

image-20220808160621593

  • 首先,把问题描述和定义清楚,并调研出通过机器学习解决问题的方法。

  • 然后,设计和训练出机器学习模型,并针对端侧设备优化和转换模型。

    1. 模型设计就像一个搭积木的过程,通过调整神经元个数和层数让预测更精确;神经元和层数越多相应耗时也会增加,需要综合权衡考虑。

    2. 模型训练:

      1. 搭建训练环境-Tensorflow
      2. 训练样本处理
      3. 模型构建-Keras
      4. 模型训练
      5. 验证模型准确度
    3. 模型压缩和转换:

      • 为什么要做模型转换?

        • 移动端使用的是被优化的推理引擎,可以在不同CPU和GPU架构下高效的执行模型推理计算。
      • 这里我们使用Tensorflow Lite作为移动端上推理引擎。

        • TensorFlow Lite 的设计旨在在各种设备上高效执行模型。这种高效部分源于在存储模型时,采用了一种特殊的格式。
        • TensorFlow模型在被TensorFlow Lite 使用前,必须转换成这种格式。
        • Tensorflow Lite 提供转换器 TFLite Convert
  • 最后,把优化后模型部署和集成到端侧设备应用中,执行推理预测,并以进预测结果解决定义的问题。

    核心:让移动端可以加载到前面转化的模型

    1. 简单做法:放在App包体内assets目录下image-20220808155947137
    2. 进阶做法:通过url动态下载,支持动态更新,同时减少包体积
  • 在移动端加载模型,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)
      
  • 移动端推理预测image-20220808160713537

    • 加载模型

      • 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 基础知识,了解业内端智能框架
    • 理解怎么做端智能,可以协作完成端智能技术解决实际业务问题的需求落地

进阶

  • 达成:对移动端技术、端智能技术和负责业务有更深入的理解,可以站在更全面的视野上设计端上智能解决方案,建设端上智能架构。

img

\