将 ML 模型部署到微控制器有几种可能的方法。
在微控制器上部署的主要限制因素是 ML 模型通常是一组参数的表示,这些参数旨在与新数据点一起用作预测算法的输入。大多数这样的模型都假设存在一个实现所讨论算法的随附库。然而,一个 microcrontoller 可能使用一种奇特的芯片架构,或者有非常多或不寻常的资源限制,这些限制阻碍了这些标准库的轻松部署。
大概您已经有一些方法可以将输入输入您的微控制器并对其进行编程,以便调用您可以编写的某些函数。如果没有,您首先需要弄清楚如何做到这一点,正确的方法取决于您的微控制器。一种常见的方法是用 C 或其他语言的非常有限的子集编写汇编代码或代码。另一种方法是找到另一种语言(例如Java、Python)的解释器分发版,该解释器已编译为在您的芯片上工作。无论哪种方式,您都需要某种方法来对芯片进行编程。
假设您可以对芯片进行编程,那么在部署模型时您将面临两个基本挑战:
大多数模型的参数都使用非常宽的浮点数进行训练。例如,可以使用 128 位数字。在标准计算环境中,CPU 或 GPU 将能够有效地对宽数据类型执行操作。在微控制器上,您可能仅限于 8 位或 16 位整数。要在这样的环境中使用您的模型参数,您需要使参数更小(通常通过将它们四舍五入以适应更小的数字格式,这个过程称为“量化”),或者通过查找或编写软件可以在表示为较小数据类型集合的大型数据类型上模拟您想要的操作(可能是加法和乘法)。第一种方法可能会使模型表现不佳。第二个可能使模型预测非常慢。
您需要算法的实现。一些算法,如线性回归、线性判别分析,甚至决策树都非常容易实现预测,并且可能只需要加法、乘法和/或比较。您可以自己用 C 的一个简单子集甚至在汇编中编写这些(例如,使用线性回归进行预测应该只是一个简单的循环)。其他算法,如深度神经网络,可能包含更复杂的操作,并且可能包含许多以复杂序列执行的此类操作。对于这些,您通常需要找到实现算法的库的分发版,或者自己编译一个。自己编译一个需要为您的特定微控制器设置一个构建工具链,并且可能会非常参与。