执行Torch的高级架构与组件¶
此页面描述了 ExecuTorch 的技术架构及其各个组件。本文档面向将 PyTorch 模型部署到边缘设备的工程师。
上下文
为了在多样化的硬件、关键的功耗需求以及实时处理需求下实现设备端AI,单一的单体解决方案并不实际。相反,需要一个模块化、分层且可扩展的架构。ExecuTorch定义了一个简化的流程,用于准备(导出、转换和编译)并执行PyTorch程序,包含有倾向性的开箱即用默认组件,并为自定义提供了明确定义的入口点。这种架构大大提高了可移植性,使工程师能够使用高性能的轻量级、跨平台运行时,轻松集成到不同的设备和平台上。
概述¶
将PyTorch模型部署到设备上分为三个阶段:程序准备、运行时准备和程序执行,如下面的图所示,包含多个用户入口点。本文档将分别讨论每个步骤。

图1. 该图展示了三个阶段 - 程序准备、运行时准备和程序执行。
程序准备¶
ExecuTorch 将 PyTorch 的灵活性和易用性扩展到边缘设备。它利用 PyTorch 2 编译器和导出功能 (TorchDynamo, AOTAutograd, 量化, 动态形状, 控制流, 等) 来准备 PyTorch 程序在设备上的执行。
程序准备通常简单称为AOT(提前编译),因为导出、转换和编译操作是在程序最终通过ExecuTorch运行时(用C++编写)之前完成的。为了实现轻量级的运行时和较小的执行开销,我们尽可能将工作推送到AOT阶段。
从程序源代码开始,以下是您完成程序准备所需经历的步骤。
程序源代码¶
导出¶
为了将程序部署到设备上,工程师需要有一个图表示来编译模型以在各种后端上运行。通过 torch.export(),会使用ATen方言生成一个 EXIR(导出中间表示)。所有AOT编译均基于此EXIR,但在降低路径中可以有多种方言,详情如下。
ATen 方言. PyTorch Edge 基于 PyTorch 的张量库 ATen,该库具有高效执行的明确契约。ATen 方言是由 ATen 节点表示的图,这些节点完全符合 ATen 规范。允许自定义操作符,但必须在调度器中注册。它是一个扁平化的表示,没有模块层次结构(更大模块中的子模块),但源代码和模块层次结构都保存在元数据中。这种表示也是 autograd 安全的。
可选地,量化,无论是QAT(量化感知训练)还是PTQ(训练后量化),可以在转换为Core ATen之前应用于整个ATen图。量化有助于减少模型大小,这对于边缘设备非常重要。
核心 ATen 方言。ATen 有数千个操作符。对于一些基本转换和内核库实现来说,这并不理想。来自 ATen 方言图的操作符被分解为基本操作符,从而使操作符集(op set)更小,并且可以应用更基本的转换。核心 ATen 方言也是可序列化的,并可以转换为边缘方言,如下所述。
边缘编译¶
上述的导出过程是在一个与最终执行代码的边缘设备无关的图上进行的。在边缘编译步骤中,我们处理的是特定于边缘设备的表示形式。
边缘方言。所有操作符要么符合带有dtype和内存布局信息的ATen操作符(表示为
dim_order),要么是注册的自定义操作符。标量被转换为张量。这些规范允许后续步骤专注于更小的边缘领域。此外,它还启用了基于特定dtype和内存布局的选择性构建。
使用Edge方言,有两种面向目标的方法可以进一步将图降低到后端方言。此时,特定硬件的委托可以执行许多操作。例如,iOS上的Core ML、Qualcomm上的QNN或Arm上的TOSA可以重写图。此级别的选项包括:
后端委托。编译图(完整或部分)到特定后端的入口点。在此转换过程中,编译后的图将与语义等效的图进行交换。编译后的图将在运行时稍后卸载到后端(又称
delegated),以提高性能。用户自定义的pass。用户也可以执行目标特定的转换。这类好的例子包括内核融合、异步行为、内存布局转换等。
将代码编译为ExecuTorch程序¶
上面的 Edge 程序适合编译,但不适合运行时环境。设备端部署工程师可以降低可以在运行时高效加载和执行的图。
在大多数边缘环境中,动态内存分配/释放会有显著的性能和功耗开销。可以使用AOT内存规划和静态执行图来避免这种情况。
ExecuTorch 运行时是静态的(从图表示的角度来看,但仍然支持控制流和动态形状)。为了避免输出创建和返回,所有功能操作符表示都被转换为 out 变体(输出作为参数传递)。
可选地,用户可以应用他们自己的内存规划算法。例如,嵌入式系统可能有特定的内存层次结构。用户可以针对该内存层次结构进行自定义的内存规划。
该程序被转换为我们的 ExecuTorch 运行时能够识别的格式。
最后,生成的程序可以序列化为 flatbuffer 格式。
运行时准备¶
通过序列化的程序,并提供内核库(用于算子调用)或后端库(用于委托调用),模型部署工程师现在可以为运行时准备程序。
ExecuTorch 拥有 选择性构建 API,用于构建仅链接程序所使用内核的运行时,这可以显著减少生成应用程序的二进制文件大小。
程序执行¶
ExecuTorch 运行时是用 C++ 编写的,具有最少的依赖项,以实现可移植性和执行效率。由于程序已良好地进行了 AOT 预编译,核心运行时组件非常精简,包括:
平台抽象层
日志记录和可选的性能分析
执行数据类型
内核和后端注册表
内存管理
执行器 是加载程序并执行的入口点。执行会从这个极简运行时触发相应的操作符内核或后端执行。
开发者工具¶
用户使用上述流程从研究到生产应该高效。生产力对于用户编写、优化和部署模型至关重要。我们提供 ExecuTorch 开发者工具 以提高生产力。开发者工具不在图中显示。相反,它是一个涵盖了所有三个阶段的开发者工作流的工具集。
在程序准备和执行过程中,用户可以使用 ExecuTorch 开发者工具对程序进行性能分析、调试或可视化。由于端到端流程位于 PyTorch 生态系统内,用户可以关联并显示性能数据以及图可视化,同时还能直接引用程序源代码和模型结构。我们认为这是快速迭代并将 PyTorch 程序部署到边缘设备和环境中的关键组件。