Liliya Wu 2021年1月17日
Arm Ethos-U microNPU
近年来,边缘人工智能(Edge AI)和端侧人工智能(Endpoint AI)技术呈现爆炸式发展。为了应对边缘和端侧人工智能技术发展的新浪潮,Arm设计并推出了一种新型机器学习处理器(ML Processor):微型神经网络处理器(microNPU),以增强在资源受限的物联网设备中的机器学习推理能力。借助Arm Ethos-U系列microNPU,您可以轻松地在基于Arm Cortex和Arm Neoverse的各种嵌入式设备和系统中构建低成本、高效的人工智能(AI)解决方案。Ethos-U 提供了一系列可扩展的性能和内存接口,可与低功耗的 Cortex-M SoC以及高性能的 Arm Cortex-A、Cortex-R 和 Arm Neoverse SoC集成。
图1:Arm Ethos-U MicroNPU芯片设计参考图
Vela 概述
要在 Ethos-U 上部署您的神经网络 (NN) 模型,第一步是使用 Vela 编译您准备好的模型。Vela 是一个开源的 Python 工具,可以将您的神经网络模型优化为适于运行在包含 Ethos-U NPU 的嵌入式系统上的模型。
经过Vela编译,优化后的模型将包含一部分可以由Ethos-U microNPU 加速的TensorFlow Lite算子。无法由NPU加速的部分算子将保持不变,并通过适当的内核回调在CPU上运行。
图2:算子工作流示意图
我们不断致力于增加Vela支持的算子。如果您安装了Vela,可以通过在您的CLI命令行窗口(例如Windows系统的cmd窗口或Linux系统的terminal窗口)键入以下命令来生成当前版本Vela编译器支持算子的报告。该报告将会在当前工作路径下,名为“SUPPORT_OPS.md”。
vela --supported-ops-report
然而,您也许会注意到,在该报告中,部分算子有一定的约束条件。如果约束条件没有满足,该算子也会回调在CPU上运行。但是在这种情况下,并不意味着整个模型不能允许,只是您模型的部分算子无法被Ethos-U NPU加速。那些不支持的算子将会被回调在CPU上运行。通过以下的命令行,您可以查看那些回调在CPU上运行的算子的具体情况
vela network.tflite --show-cpu-operations
流程步骤
使用Vela编译器编译您的模型是将您的神经网络模型部署在Arm Ethos-U系列microNPU上的第一步也是必要的一步。在本篇博客中,我们将给您介绍如何使用Vela编译器来编译您模型的通用流程步骤。
Vela编译器可以在Linux, Mac OS以及Microsoft Windows10操作系统上运行。通过以下命令,您可以轻松的通过Pypi(https://pypi.org/project/ethos-u-vela/)社区安装Vela,但是您也可以访问Arm ML platform(https://review.mlplatform.org/plugins/gitiles/ml/ethos-u/ethos-u-vela)平台来获取Vela编译器的源码以及查看更高级的安装方式。
pip3 install ethos-u-vela
请注意在您开始安装过程之前,您的电脑需要满足“Prerequisites”小节中提到的先决条件。如果想要获取所安装的Vela编译器的版本信息,您可以通过以下命令行查看。
vela --version
通用的流程步骤如下图所示:
图3:通用流程步骤示意图
1.准备您的神经网络模型
为了能够被Ethos-U微型NPU加速,您的神经网络模型算子必须被量化为8位整数或者16位整数(有符号)。Vela编译器的输入为.tflite文件,该文件包含您优化好的神经网络模型。您可以通过命令行来将该模型传递给Vela编译器进行编译。
您可以通过以下两种方式来准备您的.tflite模型文件:
· 如果您已经有自己的预训练模型:
您可以使用诸如TensorFlow Model Optimization toolkit(https://github.com/tensorflow...)等的量化工具来对您的模型进行量化。您也可以参考我们的优化方法博客(Optimization blog,https://community.arm.com/arm...)来量化您的自定义神经网络模型。
· 如果您没有自己的预训练模型:
根据您的需求,Arm ML Zoo(https://github.com/ARM-softwa...)以及TensorFlow Hub(https://tfhub.dev/s?deploymen...)给您提供了大量的.tflite形式的机器学习模型。您可以直接下载使用。
2.准备您的Vela配置文件
Vela 是一个可高度自定义的Ethos-U NPU离线编译工具。您可以通过重写 Vela 配置文件轻松地自定义 Ethos-U 嵌入式系统的各种属性,例如:内存延迟以及带宽。但我们强烈建议您在对其进行自定义时,要使其尽可能接近您计划部署的真实硬件系统。
Vela 配置文件的格式是 Python ConfigParser .ini 类型,主要包括两部分属性配置信息:系统配置(System Configuration)设定和内存模式(Memory Mode)设定。
同样地,您也可以通过以下两种方式来准备您的Vela配置文件
· 使用官方提供的Vela配置文件:
我们为您提供了一个官方的“vela.ini”文件来描述嵌入式设备和系统的一些通用情况。您可以官方提供的配置文件样例用作您的 vela 配置文件。目前Vela版本中提供的系统选项情况如下表所示。如果您想要查看有关每个系统选项的更详细的属性信息,您可以直接查看 vela.ini (https://review.mlplatform.org/plugins/gitiles/ml/ethos-u/ethos-u-vela/+/refs/heads/master/vela.ini)文件。
表1:系统配置设定和内存模式设定选项
注:表中的选项为vela 3.2.0版本提供且与具体版本相关。
· 使用自定义的Vela配置文件
如果当前 Vela 版本中现有的我们提供的通用配置选择无法满足您的硬件系统要求,您可以编写Vela 配置文件来进行系统情况的自定义。同时,请使用以下命令来指定自定义 Vela 配置文件的路径。具体编写方法请参阅“配置文件(Configuration File,https://review.mlplatform.org/plugins/gitiles/ml/ethos-u/ethos-u-vela/+/HEAD/OPTIONS.md#configuration-file)”小节中的详细编写说明。同时您的设置应与对区域配置寄存器进行编程的驱动程序保持一致,以控制用于模型数据访问的 AXI 端口(有关详细信息,请参阅 Ethos-U 编程器模型,https://developer.arm.com/documentation/102420/0200/Programmers-model?_ga=2.106923014.460425718.1643370090-47266314.1623726109)。
vela network.tflite --config your_vela_configuration_file.ini
3.配置与运行
Vela编译器为用户提供了大量的命令行接口来配置每一次的调用过程。更详细与全面的信息您可以查看“Command Line Interface”(https://review.mlplatform.org/plugins/gitiles/ml/ethos-u/ethos-u-vela/+/refs/heads/master/OPTIONS.md#command-line-interface)小节来查看。
在众多的参数中,除了“Network”这一项为必填参数外,正确设置以下关键参数选项以反映真实的硬件平台配置至关重要。如果您没有另外指定这些参数,它将在特定于版本的内部默认值下运行。请参阅每个版本的“Vela Options”文档以了解每个参数的默认值。
表2:关键参数列表
目前,我们提供以下选择供您用作硬件加速器配置和优化策略。
表3: 硬件加速器配置和优化策略
一个配置与调用示例如下所示:
vela network.tflite \
–-output-dir ./output \
--accelerator-config ethos-u55-256 \
--optimise Performance \
--config vela.ini \
--system-config Ethos-U55_High_End_Embedded \
--memory-mode Shared_Sram
使用上述命令行调用Vela编译器进行编译操作后,您将在指定目录“./output”下获得优化后的模型。输出的模型文件格式为_vela.tflite格式。同时,在您的控制台命令行窗口也将显示Vela编译过程的日志。
有时您的日志文件中会出现一些警告信息,请您仔细查看这些信息。这些信息将会告知您在Vela编译器编译的过程中,为优化后的模型网络,Vela编译器所做的决定,例如:那些算子可能会被回调到CPU上运行。
欢迎试用
作为在 Ethos-U系列NPU上部署神经网络模型的第一步,Vela编译器是开源且易于使用的。快来试用Vela编译器,尽情体验一下 Arm Ethos-U 系列microNPU为嵌入式系统带来的巨大的机器学习能力的提升吧!