MADL!AR
Code is cheap, show me the PPT!
首页
分类
Fragment
关于
第一次分享:边缘AI
分类:
分享
发布于: 2024-06-26
## 第一次分享:边缘AI ## 背景 ![powerstyle={max-width: 60%;min-width=300px}](/notebook/img_preview/i/caoliang.net/blog/content/2024_06_27/2.gif) 作为童年获得的第一块掌机,总是对这种简单的黑白屏小玩意有种特殊的情节。在学习电子电路之后,移除了它的内脏,重新设计它的主板并赋予了一颗强劲的芯片,希望继续开发出好玩的功能: * 添加温湿度传感器,增加时间显示,让它可以作为一个赏心悦目的桌面摆件 * 集成红外收发器,将家里的空调、窗帘、电视音响等乱七八糟的遥控器合N为一 * 集成内置提醒:家人生日、重大节日、泡面/泡茶倒计时神器 * 本地关键词唤醒+云端大模型+实时后处理引擎,打造个人语音助手 作为指令的感知端,如果需要频繁对掌机充电,体验就会变得十分糟糕。所以在设计之初就选用了cortex-M系列的MCU作为主控芯片,它的功耗足够低的同时,也有一定的算力,配合边缘AI计算技术,可以使其拥有自己的智能。 ![powerstyle={max-width: 70%;min-width=300px}](/notebook/img_preview/i/caoliang.net/blog/content/2024_06_27/rec.jpg) ## MCU & 嵌入式 嵌入式系统是控制各种物理设备的电子设备的计算机,从蓝牙耳机到现代汽车的发动机控制单元。嵌入式软件是在其上运行的软件。图 1-1显示了可以找到嵌入式系统的几个地方。 ![](/notebook/img_preview/i/caoliang.net/blog/content/2024_06_27/e.jpg) MCU (Micro Crontrol Unit) 是主要用于逻辑控制的芯片,单芯片内封装了CPU、RAM/ROM以及外设接口等部件,体积小、功耗低,但由于主要用于控制,相较于桌面平台以及MPU来讲,计算性能十分羸弱。2020 年1年,MCU的出货量超过 280 亿个。 ![](/notebook/img_preview/i/caoliang.net/blog/content/2024_06_27/mcu.jpg) 与MCU有类似概念的: * MPU (专注于计算,完备的内核体系,通常需要外部支持芯片(IO HUB、RAM)来构成完整计算机系统) * GPU * NPU * DSP * SoC 截止2024年,著名的MCU内核架构有: * ARM Cortex-M * Intel Quark * MIPS * RISC-V ARM的四驾马车 A-R-M-X: [arm.com](https://www.arm.com/) ## 边缘AI 边缘AI是一个新兴概念,主旨是通过一系列工具,使一些日常物品拥有自己的智能,而不再依赖于数据密集型的集中式服务器。 它可以在网络边缘(靠近数据产生的地方)做出一些决策,以下是一些经典场景: * 智能设备安装在电线杆上,预测何时发生故障,有助于防止电力传输引起的森林火灾 * 可穿戴腕带可在消防员面临热应力和过度劳累风险时发出警告,保证他们的安全 * 语音用户界面提供免提技术控制,无需互联网连接 * 智能项圈可监测野生大象的活动,帮助研究人员了解它们的行为并保护它们免受冲突 * 野生动物相机可识别特定动物物种并帮助科学家了解其行为 边缘AI计算的6个级别: ![](/notebook/img_preview/i/caoliang.net/blog/content/2024_06_27/cloud.jpg) 在边缘计算设备上运行AI,有时是出于成本考虑,也有时候受限于应用场景必须这么做。下图展示边缘AI的优势(BLERP): * Bandwidth * Latency * Economics * Reliability * Privacy #### Algorithms for Edge AI 边缘AI的两个非常重要的算法: * feature engineering (特征工程) * artificial intelligence ### __ 特征工程 __ 特征工程是将原始数据转换为统计工具可用的输入的过程。 首先需要领域专业知识来,了解原始数据的哪些部分包含相关信息,然后从噪声中提取该信号。 ##### __ 时间序列 __ 以时间序列为例,大部分传感器将产生时间序列数据: ![](/notebook/img_preview/i/caoliang.net/blog/content/2024_06_27/timeline.jpg) 处理单个数据块需要一定的时间,被称系统延迟。捕获和处理数据的速率称为系统的帧速率,通常以每秒可处理的窗口数表示。帧可能是连续的,也可能是重叠的: ![](/notebook/img_preview/i/caoliang.net/blog/content/2024_06_27/frame.jpg) 当帧速率偏低时,捕获的数据将丢失: ![](/notebook/img_preview/i/caoliang.net/blog/content/2024_06_27/frame_missed.jpg) 在窗口大小的选择上,往往需要做出一些取舍: 1. 大窗口 * 优点:包含的特征多,更容易提取出关键特征,有利于提高准确率 * 缺点:需要更高算力,系统延迟增加,模型也会更大更复杂 2. 小窗口 * 低延迟,低成本 * 准确率低 ##### __ 二次采样 __ 所有时间序列均有一个采样率的概念,二次采样是针对初次采样的数据进行调整的过程: * 下采样(降采样):丢弃部分频率数据 * 上采样(过采样):通过插值等算法,插入缺失的数据(边缘AI较少采用,主要场景是调整输入格式) ##### __ 滤波 __ 通过传感器采样的数据,都会携带噪声。许多MCU都为某些类型的滤波提供硬件支持(DSP),从而减少延迟和能耗,提高信号可用性。 ##### __ 频谱分析 __ 通过常用的数学工具比如傅里叶变换,可以将时间序列信号转换为频域。其数值描述了信号在一定频率范围内位于各个频带(即频谱)分布,声谱图是机器学习模型非常有效的输入。 ![](/notebook/img_preview/i/caoliang.net/blog/content/2024_06_27/fft.jpg) ### __ 人工智能 __ 按功能可以将算法划分为以下几类:分类、回归、物体检测/分割、聚类/降维等等。 ![](/notebook/img_preview/i/caoliang.net/blog/content/2024_06_27/split.jpg) 按照实现方式: __ Conditionals and heuristics (条件和启发,参考决策树)__ 简单高效,结合合适的信号处理方法,条件逻辑可以做出一些非常复杂的决策,且所有分支均可适用自动化测试,不会因未知表现而带来风险;但有两个巨大缺陷: * 实现方式几乎依靠手工编码,考研对数据的理解能力 * 组合爆炸 __ 经典机器学习 __ 机器学习是一种创建算法的特殊方法。启发式算法是通过基于已知规则手工编码逻辑创建的,而机器学习算法则通过探索大量数据来发现规则。 经典机器学习通常使用传统的统计学习模型,如SVM、线性回归、逻辑回归与决策树等,需要手动设计特征,并且不能使用过多的隐藏层进行学习。 __ 深度学习 __ 深度学习专注于神经网络,可以对特征自动学习、自动提取。 深度学习模型之所以有效,是因为它们可以作为__通用函数逼近器__。数学证明,只要你能将某个东西描述为连续函数,深度学习网络就可以对其进行建模。 深度学习模型拥有大量参数,通过参数控制每个神经元的输出和组合,可以拟合非常复杂的函数。但有以下缺点: * 难以寻找参数的理想值 * 过拟合 * 不可解释特性 深度学习的模型: ```bash >>> model.summary() Model: "model" _________________________________________________________________ Layer (type) Output Shape Param # ================================================================= input_1 (InputLayer) [(None, 28, 28, 1)] 0 _________________________________________________________________ conv2d (Conv2D) (None, 26, 26, 32) 320 _________________________________________________________________ max_pooling2d (MaxPooling2D) (None, 13, 13, 32) 0 _________________________________________________________________ conv2d_1 (Conv2D) (None, 11, 11, 64) 18496 _________________________________________________________________ max_pooling2d_1 (MaxPooling2 (None, 5, 5, 64) 0 _________________________________________________________________ conv2d_2 (Conv2D) (None, 3, 3, 128) 73856 _________________________________________________________________ flatten (Flatten) (None, 1152) 0 _________________________________________________________________ dense (Dense) (None, 10) 11530 ================================================================= Total params: 104,202 Trainable params: 104,202 Non-trainable params: 0 ``` * 全连接 由堆叠的神经元层组成。全连接模型的输入直接以一长串数字的形式输入。全连接模型能够学习任何函数,但它们对输入中的空间关系几乎视而不见(例如,输入中的哪些值彼此相邻) [激活函数与全连接层](https://zhuanlan.zhihu.com/p/456956059) * 卷积模型 卷积模型旨在利用其输入中的空间信息。例如,它们可以学习识别图像中的形状,或时间序列传感器数据中的信号结构。这使得它们在嵌入式应用中非常有用,因为空间信息在我们处理的许多信号中都很重要。 ![powerstyle={max-width: 60%;min-width=300px}](/notebook/img_preview/i/caoliang.net/blog/content/2024_06_27/08-04.png) ![](/notebook/img_preview/i/caoliang.net/blog/content/2024_06_27/conv.jpg) 图像可以分解为边缘、纹理等局部模式,而卷积神经网络可以在小的窗口中学习其所蕴含的模式。卷积神经网络有两个特性: * 平移不变性 * 可以学习模式的空间层次结构。第一个卷积层将学习边缘等小的局部模式,第二个卷积层将学习由第一层的特征组成的更大模式,由此类推: ![](/notebook/img_preview/i/caoliang.net/blog/content/2024_06_27/conv2.jpg) 池化:在深度卷积神经网络中,卷积层通常配合池化层一起使用,后者对前一层生成的特征图进行下采样操作,降低特征维度。它不通过卷积操作,而是采用硬编码的max张量计算提取每个局部窗口的最大值。 如果不引入池化层而直接将多层卷积层直接相连,将会造成两个问题: * Dense层过于庞大,将产生严重过拟合 * 不利于学习特征的空间层次结构,造成无法分类的结果 * 序列模型 用于处理时间序列信号甚至书面语言,识别时间序列中的长期模式,通常包含一些内部“记忆”。在嵌入式支持较差,资料很少。 * 嵌入模型 用于迁移学习,旨在降低维度。 深度学习模型的不同组合和堆叠被称为架构,知名的边缘 AI 架构包括: * MobileNet 和 EfficientNet 是专为在移动设备上高效运行而设计的架构系列 * YOLO,一组用于执行对象检测的架构 * Transformer 是一类用于在数据序列之间进行转换的架构 __ 深度学习优化方法 __ 深度学习模型的推理过程是计算密集型任务,对于主要用于控制的MCU来讲是重要的负担。有以下常用的方法降低数据和计算量: 1. 剪枝 有些模型的的许多权重具有零值,因为涉及零权重的任何乘法都将不可避免地产生零结果,可以创建所谓的稀疏模型,旨在跳过不必要的计算。同时,还可以缩减模型大小。目前在嵌入式领域应用较少。 2. 运算符融合 运行深度学习模型时,计算感知算法可以检测计算过程中使用的运算符。当某些运算符组一起使用时,可以用单个融合实现替换它们,提高计算效率。仅适用于某些运算符组合,适用面较窄。 3. Quantization (量化) 4. 蒸馏 ## TensorFlow Lite for Microcontrollers(TFLM) 适用于微控制器的 TensorFlow Lite 在2019年立项,目标是在只有几十KB ROM的MCU上运行AI模型。TFLM做了以下设计: * 无操作系统依赖 * 链接器时没有标准 C 或 C++ 库依赖项 即使是看似简单的函数,例如sprintf() 就很容易占用 20 KB,对于MCU来讲缩减尺寸十分重要。 * 不需要浮点硬件 许多嵌入式平台不支持硬件中的浮点运算,比如Cortex-M0,某些RISC-V MCU。避免浮点数的使用可以大大加速AI模型在这些设备上的表现。因此TFLM专注int8模型。(出于兼容性考虑,框架也支持浮点运算)。 * 没有动态内存分配 TFLM通过解释器运行深度学习的模型。关于解释器: * 解释器 使用解释器来执行模型。灵活易用,有计算和内存开销,不支持所有类型的模型。 * 代码生成 将模型的计算图和参数转换为优化的嵌入式源代码,易于阅读并且可以调试,高效但不够灵活。 相关资料:[TF模型转换](https://www.tensorflow.org/lite/microcontrollers/build_convert?hl=zh-cn) ## ST - CubeAI [](https://stm32ai.st.com/zh/stm32-cube-ai/)