博客

使用 ExecuTorch 和 Arm 将 PyTorch 模型部署到微边缘设备

AI 的世界正在超越云端,触及掌心大小的设备。在这些以千字节为单位衡量内存的微型系统上运行 PyTorch 模型,需要一种全新的思维方式。ExecuTorch 正是为此而生,作为一种用于边缘推理的轻量级运行时,它利用量化和图编译等优化技术,架起了熟悉的 PyTorch 工作流与低功耗 Arm 微控制器之间的桥梁,使模型能够高效地在边缘设备上运行。

最近,我使用 PyTorch 和 ExecuTorch 在 Arm Corstone-320 平台上构建了一个“微型剪刀石头布 (RPS)”演示。目标是:获取一个在 PyTorch 中训练的小型卷积神经网络 (CNN),并将其部署到带有 Arm Ethos-U NPU 的模拟 Arm 微控制器(通过 Arm 固定虚拟平台 (FVP))上。以下是这一过程的概览,以及它对所有从事边缘计算开发人员的重要性。

为什么要在边缘端使用 PyTorch?

PyTorch 让模型实验变得快速直观,但从动态图的灵活性转向嵌入式硬件的刚性约束并非易事。大多数微控制器的 RAM 不足 1 MB 且没有操作系统,因此传统的 Python 推理方案并不适用。

ExecuTorch 通过将 PyTorch 模型编译为紧凑、可移植的格式 (`.pte`) 解决了这个问题,这种格式可以在计算、功耗和内存资源极少的设备上运行。在此过程中,权重和激活值会从浮点数被量化为更低精度的整数格式(通常为 int8),在保持模型精度的同时,显著降低了内存占用和计算成本。计算图也会被扁平化、融合和优化,剔除冗余操作,从而实现边缘端的流畅执行。它将 PyTorch 生态系统扩展到了最小的 Arm Cortex-M 和基于 Ethos-U 的系统上。

从 PyTorch 到微边缘

好消息是,我已经构建了一条详细的学习路径,引导您完成端到端的 TinyML EdgeAI 流水线。

微型 RPS 游戏

该课程的核心是微型 RPS 游戏。这是一种学习 TinyML 的有趣且易于上手的方式,同时展示了 PyTorch 工作流在向下扩展时与向上扩展一样简单。它是一个极简但完整的 AI 工作流,能够:

  • 生成自己的数据集。
  • 在 PyTorch 中训练 CNN。
  • 通过 ExecuTorch 导出模型。
  • 将其部署到 FVP,无需物理硬件。
  • 您只需要一台运行 Ubuntu 22.04 或更高版本的 x86 Linux 主机或虚拟机即可。

流水线

  1. 在 PyTorch 中进行模型训练

我们定义并训练了一个紧凑的 CNN,用于对“石头”、“剪刀”和“布”的合成图像进行分类。为了模拟数据差异,每个类别都被渲染为带噪点的 28×28 灰度字母图像(“R”、“P”或“S”)。(查看学习路径获取详细脚本)

```python

import torch
import torch.nn as nn

class TinyRPS(nn.Module):
    """
    Simple ConvNet:
    [B,1,28,28] -> Conv3x3(16) -> ReLU -> Conv3x3(32) -> ReLU
      -> MaxPool2d(2) -> Conv3x3(64) -> ReLU -> MaxPool2d(2)
      -> flatten -> Linear(128) -> ReLU -> Linear(3)
    """

    def __init__(self):
        super().__init__()
        self.body = nn.Sequential(
            nn.Conv2d(1, 16, 3, padding=1),
            nn.ReLU(inplace=True),
            nn.Conv2d(16, 32, 3, padding=1),
            nn.ReLU(inplace=True),
            nn.MaxPool2d(2),
            nn.Conv2d(32, 64, 3, padding=1),
            nn.ReLU(inplace=True),
            nn.MaxPool2d(2),
        )
        self.head = nn.Sequential(
            nn.Flatten(),
            nn.Linear(64 * 7 * 7, 128),
            nn.ReLU(inplace=True),
            nn.Linear(128, 3),
        )

    def forward(self, x):
        x = self.body(x)
        x = self.head(x)
        return x
```

该架构结构紧凑且适配 Ethos,非常适合部署到微边缘设备。训练使用 Adam 优化器,处理少量合成数据集,在几个 epoch 后即可达到超过 95% 的验证准确率。

  1. 导出到 ExecuTorch

训练完成后,模型被导出为 ExecuTorch `.pte` 程序。这种格式经过优化,无需在运行微型嵌入式运行时的设备上安装 Python 即可执行。(查看学习路径获取详细脚本)

```python

from executorch import exir
from torch.export import export

def export_to_pte(model: nn.Module, out_path: str, img_size: int) -> None:
    model.eval()
    example = torch.zeros(
        1, 1, img_size, img_size,
        dtype=torch.float32
    )

    # Export with PyTorch’s exporter
    exported = export(model, (example,))
    edge = exir.to_edge(exported)
    prog = edge.to_executorch()

    with open(out_path, "wb") as f:
        f.write(prog.buffer)

    print(f"[export] wrote {out_path}")
```

此步骤有效地将您的 PyTorch 计算图转换为静态、内存高效的图,可以在开销极小的微控制器上运行。

  1. 在 Arm Corstone-320 FVP 上部署

`.pte` 文件被部署到 Arm Corstone-320 FVP 上,这是一种结合了 Cortex-M CPU 和 Ethos-U microNPU 的软件仿真平台。这允许开发人员在将模型烧录到真实硬件之前,先在本地运行和验证模型。RPS 游戏让您可以在终端中进行互动,体验实时的端侧推理。

经验教训

通过完成这个演示,我发现 PyTorch 的灵活性不必局限于数据中心。ExecuTorch 使我们能够将同样熟悉的 PyTorch 工作流带到物联网传感器、可穿戴设备和嵌入式设备中,从而在任何地方实现保护隐私的低功耗 AI。

边缘 AI 虽小,但潜力巨大。

亲自尝试一下

学习路径: Edge AI with PyTorch & ExecuTorch – Tiny RPS on Arm 目标受众:具有基本 PyTorch 经验的 ML 开发人员和嵌入式工程师。先决条件:Arm TinyML 入门

致谢

本学习路径是团队合作的成果。我要特别感谢为课程付出的团队成员,包括 Annie Tallund、Zingo Andersen、George Gekov、Gemma Paris、Adrian Lundell、Madeline Underwood、Mary Bennion 和 Fredrik Knutsson 的宝贵贡献。

探索更多关于在低功耗、资源受限设备上使用 Arm Ethos-U NPU 进行 Edge AI 开发的帮助信息