目录

内核库选择性构建

选择性构建是 ExecuTorch 上的一种构建模式,它利用模型元数据来指导 ExecuTorch 的构建。此构建模式包含可在 CMake 上使用的构建工具 API。ExecuTorch 用户可以使用选择性构建 API,通过仅包含模型所需的算子,构建出二进制体积最小的 ExecuTorch 运行时二进制文件。

本文档旨在通过列出可用的 API、概述高层架构并展示示例,帮助 ExecuTorch 用户更好地使用选择性构建功能。

预读: ExecuTorch 运行时概述, ExecuTorch 的高层架构和组件

设计原则

为何选择选择性构建? 许多 ExecuTorch 用例受限于二进制文件大小。选择性构建可以在不影响目标模型支持的前提下,减小 ExecuTorch 运行时的二进制文件大小。

我们在选择什么? 我们的核心 ExecuTorch 库大小约为 50kB,不包含任何算子/内核或委托。如果我们链接内核库(例如 ExecuTorch 内部便携式内核库),由于未使用的内核被注册到 ExecuTorch 运行时中,整个应用程序的二进制文件大小会急剧增加。选择性构建能够对内核库应用过滤器,从而仅链接实际使用的内核,进而减小应用程序的二进制文件大小。

我们如何选择? 选择性构建提供 API,允许用户传入从目标模型派生的算子信息(op info)和算子元数据。选择性构建工具将收集这些算子信息,并为所有链接的内核库构建过滤器。

高层架构

请注意,所有选择性构建工具均在构建时运行(以区别于编译时或运行时)。因此,选择性构建工具仅能访问来自用户输入或模型的静态数据。

基本流程如下:

  1. 对于计划运行的每个模型,我们通过手动方式或借助 Python 工具从中提取算子信息。算子信息将写入 YAML 文件,并在构建时生成。

  2. 一个 _op 信息聚合器_ 将收集这些模型 op 信息,并将它们合并到单个 op 信息 yaml 文件中。

  3. 内核解析器接收链接后的内核库以及合并后的算子信息 YAML 文件,然后决定将哪些内核注册到 ExecuTorch 运行时中。

APIs

我们公开了一个 CMake 宏[gen_selected_ops](https://github.com/pytorch/executorch/blob/main/build/Codegen.cmake#L12),允许用户指定算子信息:

gen_selected_ops(
  LIB_NAME         # the name of the selective build operator library to be generated
  OPS_SCHEMA_YAML  # path to a yaml file containing operators to be selected
  ROOT_OPS         # comma separated operator names to be selected
  INCLUDE_ALL_OPS  # boolean flag to include all operators
)

全选操作

如果将此输入设置为 true,则表示我们正在注册链接到应用程序中的所有内核库的所有内核。如果设置为 true,则实际上会关闭选择性构建模式。

从架构 yaml 中选择操作

上下文:每个内核库都设计有一个与其关联的yaml文件。有关此yaml文件的更多信息,请参见内核库概述。此API允许用户直接传递内核库的schema yaml,从而有效地将库中的所有内核列入白名单进行注册。

从运算符列表中选择根运算符

此 API 允许用户传入一个算子名称列表。请注意,此 API 可与上述 API 结合使用,我们将根据两个 API 输入的并集创建白名单。

示例演练

在 CMakeLists.txt 中,我们包含以下逻辑:

set(_kernel_lib)
if(SELECT_ALL_OPS)
  gen_selected_ops("" "" "${SELECT_ALL_OPS}")
elseif(SELECT_OPS_LIST)
  gen_selected_ops("" "${SELECT_OPS_LIST}" "")
elseif(SELECT_OPS_YAML)
 set(_custom_ops_yaml ${EXECUTORCH_ROOT}/examples/portable/custom_ops/custom_ops.yaml)
  gen_selected_ops("${_custom_ops_yaml}" "" "")
endif()

然后在调用 CMake 时,我们可以这样做:

cmake -D… -DSELECT_OPS_LIST="aten::add.out,aten::mm.out”

Or

cmake -D… -DSELECT_OPS_YAML=ON

从内核库中的算子名称列表或模式 YAML 文件中进行选择。

文档

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

查看文档

教程

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

查看教程

资源

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

查看资源