如今,机器学习已经在各个领域广泛应用,如机场的人脸识别系统和Facebook的个性化广告。然而,在嵌入式设备上应用机器学习依然面临巨大挑战。
我们习惯了使用强大的计算能力来处理机器学习任务。例如,AlexNet需要727MFlops的浮点运算能力和235MB的内存才能处理一张227x227像素的图像。然而,即使像Google Nexus S上的ARM Cortex-A8这样性能较强的处理器也只能提供每秒66MFlops的计算能力,这意味着处理一张图像需要等待大约11秒,这显然过慢。
在大学期间,我修了几门关于机器学习的课程,做了许多有趣的实验。即使拥有4GB GTX1050这样的显卡,也无法满足所有模型的训练需求。通常,机器学习工程师很少考虑计算资源的问题,也很少关注内存的使用情况。这是因为硬件成本低廉,手机等设备也拥有相当不错的CPU和大容量内存。你可能已经很久没有遇到手机存储空间不足的情况了,但想象一下,如果使用的是只有256KB闪存的TrueTouch感应控制器,那会是什么样的体验。事实上,由于固件占用了部分空间,实际可用的存储空间更是少得可怜,大概只有100KB左右。再回过头来看看你上一个模型的大小,你会发现这远远不够。
当我们提到“嵌入式设备”时,你首先想到的是什么呢?
1. 嵌入式设备可以是任何电动机械
没错!如今几乎所有电器设备都是嵌入式的,它们内部可能包含一个或多个控制器来管理各种功能,如触摸感应和电机控制。
2. Arduino和树莓派
恭喜你,又答对了!Arduino和树莓派是DIY项目中最受欢迎的工具之一,它们也是典型的嵌入式设备。
3. Jetson Nano及其类似产品
再次答对!Jetson Nano是一种专为运行机器学习模型设计的特殊开发板。它非常强大且具有创新性。
但是,似乎有些地方不对劲。我的一些朋友正在开发很棒的硬件项目,他们通常使用Arduino或STM32。我也认识一些AI工程师,他们对Jetson Nano和类似的设备很感兴趣,认为这些设备代表了嵌入式AI的未来。然而,这些设备中有多少真正被用于消费级产品呢?答案是微乎其微。
想想你家里的电器设备、汽车内的控制器以及工作场所的安全系统,你会发现这些设备大多使用的是价格低廉且资源有限的微控制器。例如,微控制器的主要任务是处理手指触摸屏幕,它可能只拥有ARM Cortex-M0处理器和256KB的内存(实际可用的只有80-120KB),并且是一个实时系统,这意味着你只能在极短的时间内推断模型,比如100微秒。你的目标是改进或更换算法。祝你好运,你已经进入了“嵌入式AI”的世界。
重点:真正的嵌入式世界是由资源极其有限的1-2美元芯片组成的,而消费级产品正是使用这些芯片。
我一直在从事上述项目,进展顺利。我开发了一个适合该微控制器的小型神经网络。接下来,我需要将模型从电脑转移到设备上。
1. 量化
该处理器无法执行浮点运算,即使可以,由于其复杂性和时间消耗,我们也不会使用。因此,我将模型的权重进行量化,即把连续范围内的值转换为有限范围内的离散值。遗憾的是,PyTorch和TensorFlow Lite都无法完全支持这一过程。它们不支持所有的激活函数,尽管我使用的是非常简单的HardTanh。甚至PyTorch都无法将量化模型保存到文件中。因此,我不得不自己动手完成。
2. 推理代码生成
如果你想在控制器上运行模型,就需要使用C代码进行推断。不幸的是,这一步也需要手动完成。因为PyTorch没有推断代码生成的功能,而TFLite虽然有此功能,但功能有限,不支持常见的激活函数。因此,我不得不再次自己动手。
在工作中,我遇到了很多这样的情况。我并不是要批评PyTorch和TensorFlow Lite,而是希望引起大家的关注。重点在于,机器学习社区缺少针对“嵌入式AI”的专业工具。
我注意到大型半导体公司对AI表现出极大的兴趣,并在积极进行有意义的工作。例如,CMSIS-NN为Arm Cortex-M CPU提供了高效的神经网络内核。此外,一些编译器可以生成高效的推理代码,并根据硬件进行优化。还有许多其他优秀的东西。
英文链接:Machine Learning Fails When It Comes to Embedded System. Here’s Why
作者:Andrew Zhuravchak,研发系统工程师。
译者:弯月
——
来源:极客头条