内核库选择性构建¶
选择性构建是 ExecuTorch 上的一种构建模式,它使用模型元数据来指导 ExecuTorch 构建。此构建模式包含 CMake 上可用的构建工具 API。ExecuTorch 用户可以使用选择性构建 API 来构建具有最小二进制大小的 ExecuTorch 运行时二进制文件,只需包含模型所需的运算符。
本文档旨在通过列出可用的 API、提供高级架构的概述和展示示例,帮助 ExecuTorch 用户更好地使用选择性构建。
Preread:ExecuTorch 运行时概述、ExecuTorch 的高级架构和组件
设计原则¶
为什么选择选择性构建?许多 ExecuTorch 使用案例都受二进制文件大小的限制。选择性构建可以减小 ExecuTorch 运行时的二进制大小,而不会影响对目标模型的支持。
我们选择什么?我们的核心 ExecuTorch 库大约有 50kB,没有运算符/内核或委托。如果我们链接内核库,例如 ExecuTorch 内部的可移植内核库,由于未使用的内核被注册到 ExecuTorch 运行时,整个应用程序的二进制大小会激增。选择性构建能够在内核库上应用过滤器,以便仅链接实际使用的内核,从而减小应用程序的二进制大小。
我们如何选择?选择性构建提供了 API,允许用户传入操作信息,即从目标模型派生的运算符元数据。选择性构建工具将收集这些 op 信息,并为链接的所有内核库构建一个过滤器。
高级架构¶
请注意,所有选择性构建工具都在构建时运行(以区别于编译时或运行时)。因此,选择性构建工具只能访问来自用户输入或模型的静态数据。
基本流程如下所示:
对于我们计划运行的每个模型,我们都会手动或通过 Python 工具从中提取运算信息。Op 信息将被写入 yaml 文件并在构建时生成。
_op 信息聚合器_will收集这些模型操作信息并将它们合并到单个操作信息 yaml 文件中。
_kernel解析器_takes链接的内核库以及合并的 op info yaml 文件中,然后决定将哪些内核注册到 ExecuTorch 运行时。
蜜蜂属¶
我们公开了一个 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
)
选择所有操作¶
如果此 input 设置为 true,则表示我们正在注册链接到应用程序的所有内核库中的所有内核。如果设置为 true,则它实际上会关闭选择性构建模式。
从架构 yaml 中选择操作¶
上下文:每个内核库都设计为具有与之关联的 yaml 文件。有关此 yaml 文件的更多信息,请参阅内核库概述。此 API 允许用户直接传入内核库的架构 yaml,从而有效地将库中的所有内核列入要注册的白名单。
从 operator 列表中选择 root op¶
此 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
从 Operator name 列表或 kernel library 中的 schema yaml 中进行选择。