• 文档 >
  • 内核库选择性构建
快捷方式

内核库选择性构建

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

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

前置阅读: ExecuTorch 运行时概述ExecuTorch 高层架构与组件

设计原则

为什么需要选择性构建? 许多 ExecuTorch 用例受到二进制大小的限制。选择性构建可以在不影响对目标模型的支持的情况下减小 ExecuTorch 运行时的二进制大小。

我们选择什么? 我们的核心 ExecuTorch 库大约 50kB,不包含任何算子/内核或委托。如果我们将内核库(例如 ExecuTorch 内部的可移植内核库)链接进来,整个应用程序的二进制大小会急剧增加,因为未使用的内核也会被注册到 ExecuTorch 运行时中。选择性构建能够对内核库应用过滤器,使得只有实际使用的内核才被链接进来,从而减小应用程序的二进制大小。

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

高层架构

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

基本流程如下所示

  1. 对于我们计划运行的每个模型,我们从中提取操作信息 (op info),可以通过手动方式或 Python 工具。操作信息将被写入 yaml 文件并在构建时生成。

  2. 一个 _操作信息聚合器 (op info aggregator)_ 将收集这些模型操作信息,并将其合并到一个单独的操作信息 yaml 文件中。

  3. 一个 _内核解析器 (kernel resolver)_ 接收链接的内核库以及合并的操作信息 yaml 文件,然后决定哪些内核将被注册到 ExecuTorch 运行时中。

API

我们暴露了一个 CMake 宏 [gen_selected_ops](https://github.com/pytorch/executorch/blob/main/tools/cmake/Codegen.cmake#L12),以允许用户指定操作信息 (op info)。

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,实际上是关闭了选择性构建模式。

从 schema 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”

或者

cmake -D… -DSELECT_OPS_YAML=ON

从算子名称列表或内核库的 schema yaml 中进行选择。

文档

访问全面的 PyTorch 开发者文档

查看文档

教程

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

查看教程

资源

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

查看资源