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

内核库选择性构建

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

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

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

设计原则

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

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

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

高层架构

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

基本流程如下:

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

  2. 一个算子信息聚合器将收集这些模型算子信息,并将它们合并到一个算子信息 YAML 文件中。

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

API

我们公开了一个 CMake 宏 gen_selected_ops,允许用户指定算子信息。

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
  OPS_FROM_MODEL        # path to a pte file of model to select operators from
  DTYPE_SELECTIVE_BUILD # boolean flag to enable dtye selection
)

该宏调用 gen_oplist.py,该脚本需要一个 明确的选择 API 选项。OPS_SCHEMA_YAMLROOT_OPSINCLUDE_ALL_OPSOPS_FROM_MODEL 是互斥的选项,不应同时使用。

选择所有算子

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

从 Schema YAML 选择算子

背景:每个内核库都设计有一个关联的 YAML 文件。有关此 YAML 文件的更多信息,请参阅 内核库概述。此 API 允许用户直接传入内核库的 schema YAML,从而有效地允许注册库中的所有内核。

从算子列表中选择根算子

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

从模型中选择算子

此 API 允许用户传入一个导出的模型的 pte 文件。使用时,将解析 pte 文件以生成一个 YAML 文件,该文件枚举模型中使用的算子和 dtype。

Dtype 选择性构建

除了修剪二进制文件以删除未使用的算子外,还可以通过删除未使用的 dtype 进一步减小二进制文件大小。例如,如果您的模型仅对 add 算子使用浮点数,那么包含 add 算子对于 doublesints 的变体是不必要的。可以将标志 DTYPE_SELECTIVE_BUILD 设置为 ON 以支持此额外优化。目前,dtype 选择性构建仅支持上述模型 API。启用后,将创建一个指定模型仅使用的算子和 dtype 的头文件,并将其链接到 portable_kernels 库的重新构建。此功能仅支持便携式内核库;不支持优化、量化或自定义内核库。

示例演练

CMakeLists.txt 中,我们有以下 cmake 配置选项:

  1. EXECUTORCH_SELECT_OPS_YAML

  2. EXECUTORCH_SELECT_OPS_LIST

  3. EXECUTORCH_SELECT_ALL_OPS

  4. EXECUTORCH_SELECT_OPS_FROM_MODEL

  5. EXECUTORCH_DTYPE_SELECTIVE_BUILD

这些选项允许用户定制 cmake 构建过程以利用不同的 API,并导致在 gen_selected_ops 函数上产生不同的调用。下表描述了在设置这些配置时调用如何变化的某些示例:

示例 cmake 调用

生成的 gen_selected_ops 调用


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


gen_selected_ops(“” “${SELECT_OPS_LIST}” “” “” “”)


cmake -D… -DSELECT_OPS_YAML=ON


set(_custom_ops_yaml ${EXECUTORCH_ROOT}/examples/portable/custom_ops/custom_ops.yaml)
gen_selected_ops(“${_custom_ops_yaml}” “” “”)


cmake -D… -DEXECUTORCH_SELECT_OPS_FROM_MODEL=”model.pte.out”


gen_selected_ops(“” “” “” “${_model_path}” “”)


cmake -D… -DEXECUTORCH_SELECT_OPS_FROM_MODEL=”model.pte.out” -DEXECUTORCH_DTYPE_SELECTIVE_BUILD=ON


gen_selected_ops(“” “” “” “${_model_path}” “ON”)

文档

访问全面的 PyTorch 开发者文档

查看文档

教程

为初学者和高级开发者提供深入的教程

查看教程

资源

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

查看资源