微控制器的 RAM 和存储空间有限,这限制了机器学习模型的大小。此外,LiteRT for Microcontrollers 目前仅支持部分操作,因此并非所有模型架构都可行。
本文档介绍了将 TensorFlow 模型转换为可在微控制器上运行的过程。此外,它还概述了支持的操作,并就如何设计和训练模型以适应有限的内存提供了一些指导。
如需查看构建和转换模型的可运行的端到端示例,请参阅 Hello World 示例。
模型转换
如需转换经过训练的 TensorFlow 模型以在微控制器上运行,您应使用 LiteRT 转换器 Python API。这会将模型转换为 FlatBuffer,从而减小模型大小,并修改模型以使用 LiteRT 操作。
为了尽可能缩减模型大小,您应考虑使用训练后量化。
转换为 C 数组
许多微控制器平台都不支持原生文件系统。在程序中使用模型的最简单方法是将其作为 C 数组包含在内,并将其编译到程序中。
以下 Unix 命令将生成一个 C 源文件,其中包含 LiteRT 模型作为 char 数组:
xxd -i converted_model.tflite > model_data.cc
输出应类似如下所示:
unsigned char converted_model_tflite[] = {
0x18, 0x00, 0x00, 0x00, 0x54, 0x46, 0x4c, 0x33, 0x00, 0x00, 0x0e, 0x00,
// <Lines omitted>
};
unsigned int converted_model_tflite_len = 18200;
生成文件后,您可以将其纳入您的计划中。请务必将数组声明更改为 const,以便在嵌入式平台上提高内存效率。
如需查看如何在程序中包含和使用模型的示例,请参阅 Hello World 示例中的 hello_world_test.cc。
模型架构和训练
在设计用于微控制器的模型时,请务必考虑模型大小、工作负载和所用的操作。
模型大小
模型必须足够小,才能在运行时以二进制形式与程序的其余部分一起放入目标设备的内存中。
如需创建较小的模型,您可以在架构中使用更少且更小的层。不过,小型模型更容易出现欠拟合问题。 这意味着,对于许多问题,尝试使用可放入内存中的最大模型是有意义的。不过,使用更大的模型也会增加处理器的负载。
工作负载
模型的大小和复杂性会对工作负载产生影响。大型复杂模型可能会导致占空比较高,这意味着设备的处理器花费更多时间工作,而空闲时间较少。这会增加功耗和热输出,具体是否会造成问题取决于您的应用。
运营支持
LiteRT for Microcontrollers 目前仅支持有限数量的 TensorFlow 操作,这会影响可运行的模型架构。我们正在努力扩展操作支持,包括参考实现和针对特定架构的优化。
您可以在文件 micro_mutable_ops_resolver.h 中查看支持的操作