快捷方式

ExecuTorch 概念

本页概述了整个 ExecuTorch 文档中使用的关键概念和术语。它旨在帮助读者理解 PyTorch Edge 和 ExecuTorch 中使用的术语和概念。

AOT(提前)

AOT 通常指在执行之前发生的程序准备。在较高级别上,ExecuTorch 工作流被分成 AOT 编译和运行时。AOT 步骤涉及编译成中间表示 (IR),以及可选的转换和优化。

ATen

从根本上说,它是一个张量库,PyTorch 中几乎所有其他 Python 和 C++ 接口都是基于它的。它提供了一个核心张量类,在其上定义了数百个操作。

ATen 方言

ATen 方言是将急切模块导出到图表示的直接结果。它是 ExecuTorch 编译管道的入口点;导出到 ATen 方言后,后续的 pass 可以降低到核心 ATen 方言Edge 方言

ATen 方言是一个有效的EXIR,具有附加属性。它由函数式 ATen 运算符、高阶运算符(如控制流运算符)和已注册的自定义运算符组成。

ATen 方言的目标是尽可能忠实地捕获用户的程序。

ATen 模式

ATen 模式使用 PyTorch 核心的 Tensor (at::Tensor) 和相关类型(例如 ScalarType)的 ATen 实现。这与便携模式形成对比,后者使用 ExecuTorch 较小的张量 (torch::executor::Tensor) 和相关类型(例如 torch::executor::ScalarType)实现。

  • 依赖于完整 at::Tensor API 的 ATen 内核可在此配置中使用。

  • ATen 内核倾向于执行动态内存分配,并且通常具有额外的灵活性(因此开销)以处理移动/嵌入式客户端不需要的情况。例如,CUDA 支持、稀疏张量支持和数据类型提升。

  • 注意:ATen 模式当前为 WIP。

自动微分安全 ATen 方言

自动微分安全 ATen 方言仅包含可微分的 ATen 运算符,以及高阶运算符(控制流运算符)和已注册的自定义运算符。

后端

消耗图或其部分的特定硬件(如 GPU、NPU)或软件堆栈(如 XNNPACK),具有性能和效率优势。

后端方言

后端方言是将 Edge 方言导出到特定后端的直接结果。它具有目标感知能力,并且可能包含仅对目标后端有意义的运算符或子模块。此方言允许引入不符合 Core ATen 运算符集中定义的架构且未显示在 ATen 或 Edge 方言中的特定于目标的运算符。

后端注册表

将后端名称映射到后端接口的表。这允许在运行时通过名称调用后端。

特定于后端的运算符

这些运算符不属于 ATen 方言或 Edge 方言。特定于后端的运算符仅由发生在 Edge 方言之后的 pass 引入(请参阅后端方言)。这些运算符特定于目标后端,并且通常执行得更快。

Buck2

一个开源的大型构建系统。用于构建 ExecuTorch。

CMake

一个开源的跨平台工具系列,旨在构建、测试和打包软件。用于构建 ExecuTorch。

代码生成

在较高的级别上,代码生成执行两项任务;生成内核注册库,并可选地运行选择性构建

内核注册库将运算符名称(在模型中引用)与相应的内核实现(来自内核库)连接起来。

选择性构建 API 从模型和/或其他来源收集运算符信息,并且仅包含它们所需的运算符。这可以减小二进制文件大小。

代码生成的结果是一组 C++ 绑定(各种 .h.cpp 文件),将内核库和 ExecuTorch 运行时粘合在一起。

核心 ATen 方言

核心 ATen 方言包含核心 ATen 运算符以及高阶运算符(控制流)和已注册的自定义运算符。

核心 ATen 运算符 / 规范 ATen 运算符集

PyTorch ATen 运算符库的一个选定子集。使用核心 ATen 分解表导出时,核心 ATen 运算符不会被分解。它们作为后端或编译器应从上游期望的基本 ATen 操作的参考。

核心 ATen 分解表

分解运算符意味着将其表示为其他运算符的组合。在 AOT 过程中,采用默认分解列表,将 ATen 运算符分解为核心 ATen 运算符。这称为核心 ATen 分解表。

自定义运算符

这些运算符不属于 ATen 库,但出现在急切模式中。已注册的自定义运算符已注册到当前 PyTorch 急切模式运行时,通常使用TORCH_LIBRARY调用。它们很可能与特定目标模型或硬件平台相关联。例如,torchvision::roi_align是 torchvision 广泛使用的自定义运算符(不针对特定硬件)。

DataLoader

一个接口,使 ExecuTorch 运行时能够从文件或其他数据源读取数据,而无需直接依赖于文件或内存分配等操作系统概念。

委托

在特定后端(例如 XNNPACK)上运行程序的部分(或全部),而程序的其余部分(如果有)在基本的 ExecuTorch 运行时上运行。委托使我们能够利用专门后端和硬件的性能和效率优势。

DSP(数字信号处理器)

专门的微处理器芯片,其架构经过优化,适用于数字信号处理。

dtype

数据类型,张量中数据的类型(例如浮点数、整数等)。

动态量化

一种量化方法,其中张量在推理期间动态量化。这与静态量化形成对比,其中张量在推理之前量化。

动态形状

指模型在推理期间接受形状各异的输入的能力。例如,ATen op unique_consecutive 和自定义 op MaskRCNN 具有数据相关性输出形状。此类操作难以进行内存规划,因为即使对于相同的输入形状,每次调用也可能产生不同的输出形状。为了在 ExecuTorch 中支持动态形状,内核可以使用客户端提供的 MemoryAllocator 分配张量数据。

急切模式

Python 执行环境,其中模型中的操作在遇到时立即执行。例如,Jupyter/Colab 笔记本以急切模式运行。这与图模式形成对比,在图模式中,操作首先合成到图中,然后编译并执行。

Edge 方言

具有以下属性的 EXIR 方言

  • 所有操作都来自预定义的操作集,称为“Edge 操作”,或者已注册的自定义操作。

  • 图的输入和输出以及每个节点的输入和输出必须是张量。所有标量类型都转换为张量。

Edge 方言引入了对 Edge 设备有用的专业化,但对一般(服务器)导出不一定有用。但是,Edge 方言不包含特定硬件的专业化,除了原始 Python 程序中已存在的专业化。

Edge 操作

具有 dtype 专业化的 ATen 操作。

ExecuTorch

PyTorch Edge 平台内的统一 ML 软件堆栈,专为高效的设备内推理而设计。ExecuTorch 定义了一个工作流,用于准备(导出和转换)和在移动设备、可穿戴设备和嵌入式设备等 Edge 设备上执行 PyTorch 程序。

ExecuTorch 方法

nn.Module Python 方法的可执行等效项。例如,forward() Python 方法将编译成 ExecuTorch Method

ExecuTorch 程序

ExecuTorch 程序 将字符串名称(如 forward)映射到特定的 ExecuTorch 方法 条目。

executor_runner

包含所有运算符和后端的 ExecuTorch 运行时的一个示例包装器。

EXIR

torch.export 达式 (IR)。包含模型的计算图。所有 EXIR 图都是有效的 FX 图

ExportedProgram

将 PyTorch 模型(通常是 nn.Module)的计算图与模型消耗的参数或权重捆绑在一起的 torch.export 的输出。

flatbuffer

内存高效、跨平台序列化库。在 ExecuTorch 的上下文中,eager 模式 Pytorch 模型将导出到 flatbuffer,这是 ExecuTorch 运行时使用的格式。

框架税

各种加载和初始化任务的成本(不是推理)。例如;加载程序、初始化执行器、内核和后端委托分派以及运行时内存利用率。

函数式 ATen 运算符

没有任何副作用的 ATen 运算符。

EXIR 图是以 DAG(有向无环图)形式表示的 PyTorch 程序。图中的每个节点表示特定的计算或操作,此图的边由节点之间的引用组成。注意:所有 EXIR 图都是有效的 FX 图

图模式

在图模式中,运算符首先合成到图中,然后将作为整体编译和执行。这与 eager 模式形成对比,在 eager 模式中,运算符在遇到时执行。图模式通常提供更高的性能,因为它允许进行诸如运算符融合之类的优化。

高阶运算符

高阶运算符 (HOP) 是一个运算符

  • 它接受 Python 函数作为输入,返回 Python 函数作为输出,或同时接受和返回 Python 函数。

  • 与所有 PyTorch 算子一样,高阶算子也具有针对后端和功能的可选实现。这让我们可以为高阶算子注册自动梯度公式,或定义高阶算子在 ProxyTensor 追踪下的行为。

混合量化

一种量化技术,其中模型的不同部分根据计算复杂度和对精度损失的敏感性采用不同的技术进行量化。模型的某些部分可能不会被量化以保持精度。

中间表示 (IR)

源语言和目标语言之间程序的一种表示形式。通常,它是由编译器或虚拟机内部使用的用于表示源代码的数据结构。

内核

算子的实现。对于不同的后端/输入等,可以有多个算子实现。

内核注册表/算子注册表

一个表,其中包含内核名称与其实现之间的映射。这允许 ExecuTorch 运行时在执行期间解析对内核的引用。

降低

将模型转换为在各种后端上运行的过程。它被称为“降低”,因为它将代码移得更接近硬件。在 ExecuTorch 中,降低作为后端委派的一部分执行。

内存规划

为模型分配和管理内存的过程。在 ExecuTorch 中,在将图保存到 flatbuffer 之前运行内存规划传递。这会为每个张量分配一个内存 ID 和缓冲区中的偏移量,标记张量存储的起始位置。

节点

EXIR 图中的节点表示特定的计算或操作,并使用 torch.fx.Node 类在 Python 中表示。

操作符

张量上的函数。这是抽象;内核是实现。对于不同的后端/输入/等,可能会有不同的实现。

操作符融合

操作符融合是将多个操作符组合成一个复合操作符的过程,由于内核启动次数减少和内存读/写次数减少,从而导致更快的计算。这是图模式相对于急切模式的性能优势。

out 变体

操作符的 out 变体会将预先分配的张量作为其 out 关键字参数接收,并将结果存储在那里,而不是在内核实现中分配返回的张量。

这使得内存规划器更容易执行张量生命周期分析。在 ExecuTorch 中,在内存规划之前执行 out 变体传递。

PAL(平台抽象层)

为执行环境提供覆盖操作的方式,例如;

  • 获取当前时间。

  • 打印日志语句。

  • 使进程/系统恐慌。如果默认 PAL 实现不适用于特定客户端系统,则可以覆盖它。

部分内核

支持张量数据类型和/或维度顺序子集的内核。

分区器

模型的部分可以委托在经过优化的后端上运行。分区器将图拆分为适当的子网络,并标记它们以进行委托。

便携模式(精益模式)

便携模式使用 ExecuTorch 的较小张量实现(torch::executor::Tensor)以及相关类型(torch::executor::ScalarType 等)。这与 ATen 模式形成对比,ATen 模式使用 ATen 的张量实现(at::Tensor)和相关类型(ScalarType 等)。

  • torch::executor::Tensor,也称为 ETensor,是 at::Tensor 的源兼容子集。针对 ETensor 编写的代码可以针对 at::Tensor 进行构建。

  • ETensor 不拥有或自行分配内存。为了支持动态形状,内核可以使用客户端提供的 MemoryAllocator 分配张量数据。

便携内核

便携内核是与 ETensor 兼容的运算符实现。由于 ETensor 与 at::Tensor 兼容,因此便携内核可以针对 at::Tensor 进行构建,并与 ATen 内核在同一模型中使用。便携内核是

  • 与 ATen 运算符签名兼容

  • 使用便携 C++ 编写,以便可以针对任何目标进行构建

  • 作为参考实现编写,优先考虑清晰度和简单性,而不是优化

  • 通常比 ATen 内核小

  • 编写时避免使用 new/malloc 动态分配内存。

程序

描述 ML 模型的代码和数据集合。

程序源代码

描述程序的 Python 源代码。它可以是 Python 函数,也可以是 PyTorch 急切模式 nn.Module 中的方法。

PTQ(训练后量化)

一种量化技术,其中模型在训练后进行量化(通常是为了提高性能)。PTQ 在训练后应用量化流程,而 QAT 在训练期间应用量化流程,两者形成对比。

QAT(量化感知训练)

量化后模型可能会失去准确性。与 PTQ 等方法相比,QAT 通过在训练时模拟量化的效果来实现更高的准确性。在训练期间,所有权重和激活都“伪量化”;浮点值被舍入以模拟 int8 值,但所有计算仍然使用浮点数进行。因此,训练期间的所有权重调整都会“意识到”模型最终将被量化。QAT 在训练期间应用量化流程,而 PTQ 在训练后应用量化流程。

量化

使用精度较低的数据对张量执行计算和内存访问的技术,通常为 int8。量化通过降低内存使用量和(通常)降低计算延迟来提高模型性能;根据硬件,低精度计算通常会更快,例如 int8 矩阵乘法与 fp32 矩阵乘法。通常,量化是以牺牲模型准确性为代价的。

运行时

ExecuTorch 运行时在边缘设备上执行模型。它负责程序初始化、程序执行以及(可选)销毁(释放后端拥有的资源)。

SDK

软件开发工具包。用户需要使用 ExecuTorch 运行程序时进行分析、调试和可视化的工具。

选择性构建

用于通过仅链接到程序使用的内核来构建精简运行时的 API。这可以显著节省二进制文件大小。

静态量化

一种量化方法,其中张量被静态量化。也就是说,浮点数在推理之前被转换为精度较低的数据类型。

XNNPACK

针对 ARM、x86、WebAssembly 和 RISC-V 平台的神经网络接口运算符的优化库。这是一个开源项目,PyTorch 和 ExecuTorch 使用它。它是 QNNPack 库的后继版本。这些运算符支持浮点值和量化值。

文档

访问 PyTorch 的综合开发者文档

查看文档

教程

获取初学者和高级开发者的深入教程

查看教程

资源

查找开发资源并获得问题的解答

查看资源