本页介绍 ExecuTorch 的工作原理及其主要优势。
ExecuTorch 工作原理¶
概括而言,使用 ExecuTorch 在笔记本电脑、手机、可穿戴设备和物联网设备等端侧设备上运行 PyTorch 模型主要包含三个步骤。
导出模型。第一步是将 PyTorch 程序捕获为图,这是模型的一种新表示,可以用一系列算子(例如加法、乘法或卷积)来表达。此过程安全地保留了原始 PyTorch 程序的语义。这种表示形式是在内存和/或计算能力较低的端侧场景中运行模型的第一步。
将导出的模型编译为 ExecuTorch 程序。根据步骤 1 导出的模型,将其转换为运行时可用于推理的可执行格式,称为 ExecuTorch 程序。此步骤为各种优化提供了入口点,例如压缩模型(例如,量化)以减小尺寸,以及进一步将子图编译到设备上的专用硬件加速器以提高延迟。它还为内存规划提供了入口点,即有效地规划中间张量的位置,以减少运行时内存占用。
在目标设备上运行 ExecuTorch 程序。给定输入(例如表示为输入激活张量的图像),ExecuTorch 运行时加载 ExecuTorch 程序,执行程序表示的指令,并计算输出。此步骤效率很高,因为 (1) 运行时很轻量,并且 (2) 步骤 1 和步骤 2 中已经计算出高效的执行计划,使得能够进行高性能推理。此外,核心运行时的可移植性使得即使在高度受限的设备上也能实现高性能执行。
此图说明了将 PyTorch 程序导出、编译为针对特定硬件设备的 ExecuTorch 程序,最后使用 ExecuTorch 运行时在设备上执行程序的三步过程。
主要优势¶
ExecuTorch 为需要将机器学习模型部署到端侧设备的工程师提供了以下优势
强大稳健的导出。导出使用
torch.export()
,它采用与 PyTorch 2.x 相同的技术来捕获 PyTorch 程序以进行快速执行。虽然 eager 模式灵活且允许在 Python 中进行实验,但如果 Python 不可用或无法提供高效执行,则可能无法正常工作。导出流程生成的 导出中间表示 (Export IR) 可以描述 PyTorch 模型中的各种动态性,包括控制流和动态形状,这使得它成为一个强大的工具,可以轻松地完整捕获现有 PyTorch 模型。算子标准化。在图导出过程中,图中的节点代表算子,例如加法、乘法或卷积。这些算子属于一个称为 核心 ATen 算子集 的小型标准化列表。大多数 PyTorch 程序在导出期间可以使用这个小集合的算子分解为图。标准化算子的少量列表减少了第三方算子库和加速器后端需要覆盖的范围,以便运行为 ExecuTorch 导出的模型。ExecuTorch 运行时自带一个这样的库,称为可移植算子库,它实现了核心 ATen 算子集。
编译器接口(即委托)和开源生态系统的标准化。除了上述 算子标准化 外,ExecuTorch 还提供了用于委托给编译器的 标准化接口。这使得第三方供应商和编译器可以实现接口和 API 入口点,用于编译和执行针对其专用硬件的(部分或完整的)图。这在硬件支持和性能优化方面提供了更大的灵活性,并且更容易与 PyTorch 开源生态系统集成,以实现设备端 AI。
第一方开发者工具由于上述标准化工作,得以构建了统一的第一方 开发者工具,开发者可以使用相同的 API 将 ExecuTorch 模型导出、编译并部署到广泛的目标设备上,例如 iOS、Android 和微控制器,从而简化流程并提高生产力。此外,ExecuTorch 提供性能分析和调试功能,可轻松检查中间状态,这是大多数开发者工作流程的核心部分。
无需中间转换。ExecuTorch 的主要设计原则是允许开发者直接在目标设备上运行模型,而无需转换为第三方中间表示。这消除了设备端开发者在处理这些转换步骤时通常面临的许多问题,例如缺乏调试和性能分析能力、需要熟悉硬件特定的工具,以及因转换步骤失败导致模型无法运行。
易于定制。开发者可以通过应用自定义技术,例如链接高性能算子实现或根据存储和延迟的权衡定制内存规划,在目标架构上优化部署以获得更好的性能提升。通过对导出图上的编译器 Pass 接口和注册 API 的标准化,实现了这种程度的定制。
低开销的运行时和执行。ExecuTorch 运行时采用 C++ 编写,效率高,可以在包括 Linux、iOS、Android、嵌入式系统和裸金属硬件在内的多种架构上运行,只需少量额外的设置或配置。它能够仅链接模型所需的算子,从而使运行时二进制文件大小最小化。由于提前编译和内存规划阶段,它还能够以低延迟运行,运行时只负责执行(例如,调用
conv
算子并将结果保存在内存位置 X)。
以上突出了 ExecuTorch 在可移植性、生产力和性能这三个主要类别中的关键优势。我们认为它是实现在移动和端侧计算平台上的设备端 AI 的理想选择。