TensorFlow 助力 Edge Impulse 实现嵌入式机器学习

发布人:Daniel Situnayake,TinyML 创始工程师,来自 Edge Impulse

运行世界的微控制器

无论您是身处家中、办公室,还是坐在车内阅读这篇文章,您的身边都存在着微控制器。无论是智能手表、厨房电器,还是工业设备和公共交通,这些微型、低功耗的计算机都为我们的现代世界带来了活力。微控制器大多隐藏在其他产品中,实际上这是数量最多的计算机类型,仅 2020 一年就推出了超过 280 亿个微控制器。

嵌入式软件工程师负责编写软件,为以上设备提供动力支持。他们是业内才华出众、心思缜密的程序员,肩负着充分发挥价格低廉的微型处理器每一分效用的重任。比如 Cortex-M4(一款 Arm 架构的典型中端微控制器) 它的 32 位处理器的主频仅有 64Mhz,配备了可用于存储程序的 256KB RAM 和 1MB 的闪存。使用这样空间有限的设备时,需要格外谨慎。

由于微控制器会直接与传感器和硬件对接,嵌入式工程师通常十分了解信号处理和电气工程,同时还在自己关注的领域掌握大量的专业知识。部分工程师可能是专注于医疗器械的小众传感器方面的专家,而部分工程师可能专注于研究音频信号。

嵌入式机器学习

在过去的几年中,我们开发出一系列技术,从而使得在上述低功率微控制器中,运行高度优化后的微型机器学习模型成为可能。通过使用机器学习从源头处解释传感器数据,嵌入式应用可以变得更加智能、快捷和节能,从而能够自行做出决定,而不用再将数据流式传输到云端并等待响应。这一概念又称为嵌入式机器学习或 TinyML

由于嵌入式工程师掌握深奥的信号处理知识和领域专业知识,他们是设计新一代智能应用的理想人选。然而,嵌入式工程师往往掌握多种高度专业化的技能,与数据科学家和机器学习工程师不同的是,他们使用的开发工具链通常不会包括大量的 Python 堆栈。

期望领域专家经过培训成为数据科学家,或是让数据科学家学习使用微控制器所需的嵌入式开发技能都不合理。相反的是,我们需要新一代的工具,让拥有领域专业知识的人员能够捕捉自身的知识和数据分析来构建机器学习模型,并将这些模型部署到嵌入式设备中。在机器学习专家的帮助下这种方法可行性很高。

TinyML 开发流程类似于传统的机器学习工作流。首先我们要收集、探索和评估数据集。接下来,特征工程会采用复杂的数字信号处理形式,通常使用的是嵌入式工程师早已熟知的算法类型。从数据中提取出特征后,我们就会对机器学习模型进行训练和评估,用批判的眼光观察模型的尺寸,确保其适用于体积小巧的微控制器,同时保证模型的运行速度足够快,以发挥其效用。

训练结束后,我们会对模型的尺寸和效率进行优化。这通常会涉及到量化,通过降低模型权重的精度来占用较少的宝贵内存。模型准备就绪后必须以 C++ 库(大多数嵌入式平台选择使用的语言)的形式部署,库中包括运行模型需要的所有运算符内核。然后嵌入式工程师可以编写和调优应用,通过该应用来解释模型的输出并根据输出制定决策。

在整个过程中,您必须仔细评估模型和应用,以确保其在实际环境中使用时能够达到预期的功用。如果监控和审核环节不到位,则建立的模型可能会在表面上看似准确,可在接触到真实世界的数据时则会失效,同时带来诸多不利影响。

Edge Impulse 和 TensorFlow

Edge Impulse 团队现已创建端到端工具套件,可帮助嵌入式工程师和领域专家构建、测试机器学习应用。Edge Impulse 旨在将嵌入式工程师日常使用的工具完美地集成在一起,以提供将机器学习整合到项目中的高级接口。

Edge Impulse 可利用 TensorFlow 生态系统进行训练和优化,并将深度学习模型部署到嵌入式设备上。尽管 Edge Impulse 在设计时考虑到非 ML 工程师,但其背后的理念是,机器学习专家应该能够对模型进行扩展,同时模型应足够灵活,以整合专家的数据分析和新增内容,包括手动调整的模型架构、损失函数和自定义运算符内核。

TensorFlow 生态系统可实现这种可扩展性,同时专家可以利用其提供的一套标准和集成点来进行改进。

训练微型模型

该过程会在训练期间展开。使用 Edge Impulse 的 ML 新手开发者可以使用预设的深度学习模型架构库,该库专为与嵌入式设备配搭使用而设计。例如,这一简单的卷积模型适用于对环境噪声进行分类。

Edge Impulse 会在后台使用 TensorFlow Keras API 生成一个模型的 Python 实现。经验更为丰富的开发者可以自定义深度学习网络的层,从而调整参数并添加反映在底层 Keras 模型中的新层。专家开发者可以直接在界面中编辑训练代码。

由于 Edge Impulse 使用的是 TensorFlow 库和 API,我们便可以相当轻松地使用自身逻辑来扩展内置训练代码。例如,tf.data.Dataset 类可用于为训练和验证数据集提供有效的流水线。我们可以轻松扩展该流水线以添加转换功能,例如以下屏幕截图中图像分类项目的数据增强功能。

如需深入进行实验,开发者可以下载 Jupyter Notebook 应用,其中包含了在本地运行脚本需要的所有依赖项。

任何使用 TensorFlow API 的自定义模型代码都会无缝融入由 Edge Impulse 托管的端到端流水线中。训练会在云端进行,通过使用 TensorFlow 实用程序和 Edge Impulse 自身的开源技术,训练后的模型会自动针对嵌入式部署进行优化。

模型优化

在将深度学习模型部署到嵌入式设备的过程中,最常用的优化方法就是量化。Edge Impulse 使用 TensorFlow 模型优化工具包 来量化模型,从而将模型权重的精度从 float32 降低到 int8,这样对准确性的影响最小。

通过使用 适用于微控制器的 TensorFlow Lite 和模拟软件 Renode,Edge Impulse 能够在将模型部署到目标嵌入式设备后,为开发者提供模型延迟时间和内存用量的准确预估结果。我们可以借此轻松确定优化带来的影响,例如数据集不同切片的量化。

同一模式下 int8 量化后的模型和未优化模型间的对比,表明其性能和结果之间的差异

为在最大程度上获取灵活性及与开发者当前的工作流兼容,训练后的模型可提供多种下载格式。开发者可以将原始模型以 TensorFlow SavedModel 格式导出,也可以用可移植的 TensorFlow Lite FlatBuffer 格式下载其中一个优化后的模型:

下载使用 TensorFlow SavedModel 和 TensorFlow Lite 格式进行序列化的模型链接

部署

在对模型训练和测试后,我们可通过多种方式将模型部署到目标设备中。嵌入式工程师会使用大量 C++ 编码,因此标准方法为导出 C++ SDK(一个能实现信号处理流水线和深度学习模型的优化源代码库)。该 SDK 拥有宽松的开源许可,因此开发者可以在任何项目中自由使用该 SDK,或将其分享给其他人。

运行深度学习模型主要有两种选择,这两种方法均采用 TensorFlow 技术。首先是 Edge Impulse 推出的 EON 编译器,这个代码生成工具可将 TensorFlow Lite 模型转换为人类可读的 C++ 程序。

启用 EON 编译器后最高可减少 50% 的内存用量,同时不会对模型精度造成影响

EON 编译器可利用在适用于微控制器的 TensorFlow Lite 中实现的运算符内核,无需使用解释器即可有效调用这些内核,如此可节省高达 50% 的内存用量。EON 编译器会自动将任何可用的优化版内核应用到目标设备中,这意味着将可以在任何适当的情况下使用 Arm CMSIS-NN 之类的库。

这种额外的灵活性可以为部分项目带来益处。在这种情况下,开发者会选择导出库,该库使用适用于微控制器的 TensorFlow Lite 解释器来运行模型。这对于希望在特定硬件上实验自定义内核实现的开发者,或是在内置适用于微控制器的 TensorFlow Lite 的环境下工作的开发者而言显得十分有用。

除了 C++ SDK 以外,开发者还可以选择定位特定环境。例如,TensorRT 库可以为 NVidia Jetson Nano 嵌入式 Linux 开发者工具包提供优化支持。庞大的 TensorFlow 生态系统和开源社区为这种互操作性提供支持,同时还为很多平台和目标提供工具。

可以为更广泛的 TensorFlow 生态系统(如 NVidia Jetson Nano)中的目标,优化并导出模型

助力新技术

TensorFlow 因其有诸多用于训练模型和将模型部署到嵌入式设备的成熟和可扩展的成套技术,在深度学习框架中独树一帜。在致力将深度学习模型推向前沿的公司中,TensorFlow 格式(如 TensorFlow Lite Flatbuffer)已然成为事实上的标准。

TensorFlow 生态系统在推动嵌入式机器学习发展的过程中起着至关重要的作用,让诸如 Edge Impulse 等公司将人工智能交到领域专家的手中,让他们去打造新一代的消费者和工业技术。

您可通过多种途径详细了解使用 Edge Impulse 和 TensorFlow 的嵌入式机器学习。在 Coursera 上查看 嵌入式机器学习简介 课程,或者直接跳转至入门 指南从音频中辨别声音 教程。您还可以查看 Edge Impulse 公开项目

原文:How TensorFlow helps Edge Impulse make ML accessible to embedded engineers
中文:TensorFlow 公众号