核心庫選擇性構建¶
選擇性構建 是 ExecuTorch 上的一種構建模式,它使用模型元資料來指導 ExecuTorch 的構建。這種構建模式包含在 CMake 上可用的構建工具 API。ExecuTorch 使用者可以使用選擇性構建 API 來構建一個二進位制大小最小的 ExecuTorch 執行時二進位制檔案,只包含模型所需的運算元。
本文件旨在透過列出可用的 API、提供高層架構概述和展示示例,幫助 ExecuTorch 使用者更好地使用選擇性構建。
前置閱讀: ExecuTorch 執行時概述、 ExecuTorch 高層架構與元件
設計原則¶
為什麼需要選擇性構建? 許多 ExecuTorch 用例受到二進位制大小的限制。選擇性構建可以在不影響對目標模型的支援的情況下減小 ExecuTorch 執行時的二進位制大小。
我們選擇什麼? 我們的核心 ExecuTorch 庫大約 50kB,不包含任何運算元/核心或委託。如果我們將核心庫(例如 ExecuTorch 內部的可移植核心庫)連結進來,整個應用程式的二進位制大小會急劇增加,因為未使用的核心也會被註冊到 ExecuTorch 執行時中。選擇性構建能夠對核心庫應用過濾器,使得只有實際使用的核心才被連結進來,從而減小應用程式的二進位制大小。
我們如何選擇? 選擇性構建提供了 API,允許使用者傳入從目標模型派生的運算元元資料,即 操作資訊 (op info)。選擇性構建工具將收集這些操作資訊,併為所有連結的核心庫構建一個過濾器。
高層架構¶

請注意,所有選擇性構建工具都在構建時執行(與編譯時或執行時區分開)。因此,選擇性構建工具只能訪問來自使用者輸入或模型的靜態資料。
基本流程如下所示
對於我們計劃執行的每個模型,我們從中提取操作資訊 (op info),可以透過手動方式或 Python 工具。操作資訊將被寫入 yaml 檔案並在構建時生成。
一個 _操作資訊聚合器 (op info aggregator)_ 將收集這些模型操作資訊,並將其合併到一個單獨的操作資訊 yaml 檔案中。
一個 _核心解析器 (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 中進行選擇。