Khorina · 2020年06月29日

TinyML:TVM征服机器学习最后的边界

TinyML:TVM征服机器学习最后的边界

image.png

在裸机设备上优化和部署ML工作负载是非常困难的,Apache TVM是能使这个工作变得简单而快速的开源基础。这里我们将展示TVM的µTVM部件如何给嵌入式平台带来广泛的框架支持,强大的编译器中间件以及灵活的自动调整和编译功能。点击这里观看有关技术的更详细介绍,或者继续阅读这篇简介。

低成本AI驱动的消费类设备的增值导致ML研究人员和从业者对裸机设备(他们通常低功耗且没有操作系统)的兴趣大大增加。虽然专家已经可以在某些裸机设备上运行某些模型,但优化适用于各种设备的模型是具有挑战的,经常需要手动优化设备具体的库。 要针对新的设备,开发者必须要实施一次性定制软件堆栈来管理系统资源和调度模型执行。

手动优化ML软件对于裸机设备的领域不是唯一性的。事实上, 对于在硬件后端工作的开发者这不是一个统一主题(举个例子:GPUsFPGAs)。Apache TVM 帮助了很多ML工程师和公司解决可用硬件目标的广度问题,但直到现在他们也无法对MCU的独特配置提供很多支持。为了解决这个问题,我们将TVM拓展成µTVM(发音为“ MicroTVM”)来呈现MCU后端。TVM有助于执行在裸机设备上运行的由主机驱动的张量程序,同时可以通过AutoTVMTVM内置的张量程序优化器)自动优化这些程序。

image.png

让我们看看实际情况

image.png
                         标准µTVM设置,主机通过JTAG与设备通信

在上图中,我们有一块内置Arm Cortex-M7处理器STM32F746ZG开发板,低功耗封装的强大性能使它成为边缘AI的理想部件。

我们用他的USB-JTAG接口与台式机连接。在台式机上,我们运行OpenOCD 来建立JTAG与设备的JTAG的连接。相反的,OpenOCD允许µTVM使用与设备无关的TCP套接字控制M7处理器。完成这些设置后,我们可以使用如下所示的TVM代码运行CIFAR-10分类器(此处为完整脚本):

OPENOCD_SERVER_ADDR = '127.0.0.1'
OPENOCD_SERVER_PORT = 6666
TARGET = tvm.target.create('c -device=micro_dev')
DEV_CONFIG = stm32f746xx.default_config(OPENOCD_SERVER_ADDR, OPENOCD_SERVER_PORT)

module, params = get_cifar10_cnn()
with micro.Session(device_config) as sess:
    graph, c_module, params = relay.build(module['main'], target=TARGET, params=params)
  micro_mod = micro.create_micro_mod(c_module, DEV_CONFIG)
  graph_mod = graph_runtime.create(graph, micro_mod, ctx=tvm.micro_dev(0))
  graph_mod.run(data=data_np)
  prediction = CIFAR10_CLASSES[np.argmax(graph_mod.get_output(0).asnumpy())]
  print(f'prediction was {prediction}')

下图显示了相比于CMSIS-NN version 5.6.0 (commit b5ef1c9),MicroTVM手动优化的ML内核库的性能结果。
image.png

从图中可以看到,MicroTVM手动优化的开箱即用性能并不好,但这就是AutoTVM可以拯救的地方。我们可以为设备编写时间表模板然后做一轮自动调试,会得到好很多的结果。要插入自动调整的结果,我们只需要把下行替代:

raph, c_module, params =
relay.build(module['main'], target=TARGET, params=params)

用以下内容替换以上代码:

with TARGET,
autotvm.apply_history_best(TUNING_RESULTS_FILE):

graph, c_module, params = relay.build(module['main'], target=TARGET,
params=params)

我们的结果显示在下图:

image.png

性能被提高了2x,我们的结果也更加贴近世界上最厉害的Arm工程师编写的CMSIS-NN代码的结果(特别是需要TFLite兼容的量化支持是)。带有µTVM功能的TVM让你能更好的玩转它们。要了解其工作原理,请参阅由OctoML工程师Logan Weber撰写的detailed deep-dive

自托管运行时:最终的边界

image.png
                                                       设想的µTVM优化和部署流程

正如我们先前演示的那样,虽然可以在当前运行时获得端到端基准测试结果,但在独立设备上部署这些模型仍是我们努力攻破的方向。为了在边缘设备上发挥作用,问题在于面向AutoTVM的运行时当前依赖主机分配张量以及调度功能执行,我们需要通过µTVM的传播途径生成一个可在裸机设备上运行的单一二进制文件。这样用户就可以将这个二进制文件包含进他们的边缘应用程序从而使ML快速的集成到他们的应用程序中去。这个传播途径的每个阶段都已分别就为,现在只需将它们粘合在一起即可,因此请期待我们在此方面的最新进展。

总结

用于单内核优化的MicroTVM现已准备就绪。当我们建立自托管的部署支持时,我们希望你也能像我们把µTVM建立为模型部署的选择时一样兴奋。但是请记住这里的一切都是开源的。 µTVM仍处于起步阶段,因此每个人对其发展轨迹都会产生巨大的影响。

如果有兴趣与我们合作,请查看TVM贡献者指南,或者先加入TVM论坛提出你的想法。

致谢

如果没有以下人员,我不可能出色的完成所有的工作:

  • Tianqi Chen-指导我的设计,是我最出色的导师。
  • Pratyush Patel-与我在创建MicroTVM早期原型时合作。
  • OctoML-促进我的实习工作,使我能全力投入到这个项目中去。
  • Thierry Moreau-在OctoML期间指导我。
  • Luis Vega,教会我MCU交互的基础知识。
  • Ramana Radhakrishnan,给我们提供实验中使用的Arm硬件,并给我们提供相关使用指导。



作者:Mary Bennion
翻译:Khorina
原文链接:https://community.arm.com/developer/ip-products/processors/b/ml-ip-blog/posts/tinyml-tvm-taming-the-final-ml-frontier

推荐阅读
关注数
23582
内容数
1033
Arm相关的技术博客,提供最新Arm技术干货,欢迎关注
目录
极术微信服务号
关注极术微信号
实时接收点赞提醒和评论通知
安谋科技学堂公众号
关注安谋科技学堂
实时获取安谋科技及 Arm 教学资源
安谋科技招聘公众号
关注安谋科技招聘
实时获取安谋科技中国职位信息