目录

ExecuTorch 概念

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

AOT(提前)

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

ATen

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

ATen 方言

ATen dialect 是将 Eager 模块导出为图形表示的直接结果。它是 ExecuTorch 编译管道的入口点;导出为 ATen 方言后,后续通道可以降低到 Core ATen 方言Edge 方言

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

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

ATen 模式

ATen 模式使用 PyTorch 核心中 Tensor () 和相关类型(如 、)的 ATen 实现。这与 ETensor 模式形成鲜明对比,ETensor 模式使用 ExecuTorch 的较小张量 () 和相关类型实现,例如 .at::TensorScalarTypeexecutorch::runtime::etensor::Tensorexecutorch::runtime::etensor::ScalarType

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

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

  • 注意:ATen 模式目前是一个 WIP。

Autograd safe ATen 方言

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

后端

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

后端方言

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

后端注册表

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

Backend Specific Operator

这些运算符不属于 ATen dialect 或 Edge dialect。后端特定的运算符仅由 Edge dialect 之后发生的传递引入(请参阅 Backend dialect)。这些运算符特定于目标后端,通常会执行得更快。

巴克2

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

CMake

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

代码生成

概括地说,codegen 执行两项任务;生成内核注册库,并选择性地运行 Selective Build

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

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

codegen 的输出是一组 C++ 绑定(各种 , 文件),它们将内核库和 ExecuTorch 运行时粘合在一起。.h.cpp

Core ATen 方言

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

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

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

核心 ATen 分解表

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

自定义运算符

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

数据加载器

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

代表团

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

Dim Order

ExecuTorch 通过返回维度的排列(从最外层到最内层的维度)来描述 Tensor 的内存格式。Dim Order

例如,对于具有内存格式 [N, C, H, W] 或连续内存格式的张量,[0, 1, 2, 3] 将是其暗序。

此外,对于具有 [N, H, W, C] 或 channels_last 内存格式的张量,我们返回 [0, 2, 3, 1] 作为其暗序。

目前 ExecuTorch 仅支持连续和channels_last内存格式的暗序表示。

DSP(数字信号处理器)

专用微处理器芯片,具有针对数字信号处理优化的架构。

DTYPE

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

动态量化

一种量化方法,其中张量在推理过程中动态量化。这与静态量化形成鲜明对比,在静态量化中,张量在推理之前被量化。

动态形状

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

Eager 模式

Python 执行环境,其中模型中的运算符在遇到它们时立即执行。例如,Jupyter / Colab 笔记本在 Eager 模式下运行。这与 graph 模式相反,在 graph 模式下,运算符首先被合成成一个 graph,然后进行编译和执行。

边缘方言

EXIR 的一种方言,具有以下属性:

  • 所有运算符都来自预定义的运算符集,称为 'Edge Operators' 或已注册的自定义运算符。

  • 图形以及每个节点的输入和输出都必须为 Tensor。所有 Scalar 类型都转换为 Tensor。

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

边缘操作员

具有 dtype 特化的 ATen 运算符。

ExecuTorch

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

ExecuTorch 方法

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

ExecuTorch 计划

ExecuTorch 将字符串名称 like 映射到特定的 ExecuTorch 条目。ProgramforwardMethod

executor_runner

ExecuTorch 运行时的示例包装器,包括所有运算符和后端。

EXIR

EX端口 I中间 R演示 (IR) 来自 。包含模型的计算图。所有 EXIR 图表都是有效的 FX 图表torch.export

ExportedProgram

其输出将 PyTorch 模型的计算图(通常为 )与模型使用的参数或权重捆绑在一起。torch.exportnn.Module

FlatBuffer

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

框架税

各种加载和初始化任务的成本(不是推理)。例如;加载程序、初始化 Executor、内核和 backend-delegate 调度以及运行时内存利用率。

功能性 ATen 运算符

ATen 运算符。

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

图形模式

在 graph 模式下,首先将算子合成成一个 graph,然后作为一个整体进行编译和执行。这与 eager 模式相反,在这种模式下,运算符在遇到它们时执行。Graph 模式通常提供更高的性能,因为它允许进行优化,例如运算符融合。

高阶运算符

高阶运算符 (HOP) 是满足以下条件的运算符:

  • 接受 Python 函数作为输入,返回 Python 函数作为输出,或两者兼而有之。

  • 与所有 PyTorch 运算符一样,高阶运算符也具有用于后端和功能的可选实现。例如,这允许我们为高阶运算符注册一个 autograd 公式,或者定义高阶运算符在 ProxyTensor 跟踪下的行为方式。

混合量化

一种量化技术,其中模型的不同部分根据计算复杂性和对精度损失的敏感性使用不同的技术进行量化。为了保持准确性,模型的某些部分可能无法量化。

中间表示 (IR)

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

内核

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

内核注册表 / Operator 注册表

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

降低

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

内存规划

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

节点

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

算子

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

运算符融合

算子融合是将多个算子组合成单个复合算子的过程,由于内核启动次数和内存读/写次数减少,计算速度更快。这是 graph 模式与 Eager 模式相比的性能优势。

输出变量

算子的 out 变体不会在内核实现中分配返回的张量,而是将预先分配的张量接收到其 out kwarg 中,并将结果存储在那里。

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

PAL(平台抽象层)

为执行环境提供一种方法来覆盖操作,例如;

  • 获取当前时间。

  • 打印日志语句。

  • 进程/系统出现紧急情况。 如果默认的 PAL 实现不适用于特定的客户端系统,则可以覆盖它。

部分内核

支持张量 dtypes 和/或 dim 顺序子集的内核。

分区程序

模型的各个部分可以委托在优化的后端上运行。分区程序将图形拆分为适当的子网络,并标记它们以进行委派。

ETensor 模式

ETensor 模式使用 ExecuTorch 的较小 tensor () 实现以及相关类型 () 等。这与 ATen 模式形成对比,ATen 模式使用 Tensor () 和相关类型 (等) 的 ATen 实现。executorch::runtime::etensor::Tensorexecutorch::runtime::etensor::ScalarTypeat::TensorScalarType

  • executorch::runtime::etensor::Tensor,也称为 ETensor,是 的源兼容子集。针对 ETensor 编写的代码可以针对 .at::Tensorat::Tensor

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

便携式内核

可移植内核是编写为与 ETensor 兼容的 Operator 实现。由于 ETensor 与 兼容,因此可以针对与 ATen 内核相同的模型构建和使用 portable 内核。可移植内核包括:at::Tensorat::Tensor

  • 与 ATen 操作员签名兼容

  • 用可移植的 C++ 编写,因此他们可以针对任何目标进行构建

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

  • 通常比 ATen 内核小

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

程序

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

程序源代码

用于描述程序的 Python 源代码。它可以是 Python 函数,也可以是 PyTorch 的 eager 模式下的方法。nn.Module

PTQ (训练后量化)

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

QAT(量化感知训练)

量化后,模型可能会失去准确性。与 eg.PTQ,通过在训练时对量化效果进行建模。在训练期间,所有权重和激活都是“假量化”的;float 值四舍五入以模拟 int8 值,但所有计算仍然使用浮点数完成。因此,训练期间的所有权重调整都是“意识到”模型最终将被量化的。QAT 在训练期间应用量化流程,而 PTQ 则在训练之后应用量化流程。

量化

对具有较低精度数据的张量执行计算和内存访问的技术,通常为 。量化通过降低内存使用率和(通常)减少计算延迟来提高模型性能;根据硬件的不同,以较低精度完成的计算通常会更快,例如 Matmul 对 Matmul。通常,量化是以牺牲模型准确性为代价的。int8int8fp32

运行

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

开发人员工具

用户分析、调试和可视化使用 ExecuTorch 运行的程序所需的工具集合。

选择性构建

一个 API,用于通过仅链接到程序使用的内核来构建更精简的运行时。这大大节省了二进制文件的大小。

静态量化

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

XNNPACK 包装

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

文档

访问 PyTorch 的全面开发人员文档

查看文档

教程

获取面向初学者和高级开发人员的深入教程

查看教程

资源

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

查看资源