核心函式庫選擇性建置¶
選擇性建置是 ExecuTorch 上的一種建置模式,它使用模型元資料來引導 ExecuTorch 建置。這種建置模式包含 CMake 上可用的建置工具 API。ExecuTorch 使用者可以使用選擇性建置 API 來建置一個包含最小二進位大小的 ExecuTorch 執行階段二進位檔,方法是僅包含模型所需的運算子。
本文檔旨在透過列出可用的 API、提供高階架構的概述並展示範例,協助 ExecuTorch 使用者更好地使用選擇性建置。
預讀:ExecuTorch 執行階段概述、ExecuTorch 的高階架構和組件
設計原則¶
為何需要選擇性建置? 許多 ExecuTorch 的使用案例都受到二進位檔大小的限制。選擇性建置可以減少 ExecuTorch 執行時期的二進位檔大小,而不會影響對目標模型的支援。
我們要選擇什麼? 我們核心的 ExecuTorch 函式庫約為 50kB,不包含任何運算子/核心或委派。如果我們連結核心函式庫,例如 ExecuTorch 內部的可移植核心函式庫,則整個應用程式的二進位檔大小會激增,因為未使用的核心會被註冊到 ExecuTorch 執行時期。選擇性建置能夠對核心函式庫應用過濾器,以便只連結實際使用的核心,從而減少應用程式的二進位檔大小。
我們如何選擇? 選擇性建置提供 API,允許使用者傳入運算子資訊,即從目標模型衍生的運算子元資料。選擇性建置工具將收集這些運算子資訊,並為所有連結的核心函式庫建立過濾器。
高階架構¶
請注意,所有選擇性建置工具都在建置時執行(與編譯時或執行時區分)。因此,選擇性建置工具只能存取來自使用者輸入或模型的靜態資料。
基本流程如下:
對於我們計劃運行的每個模型,我們從中提取運算子資訊,可以手動提取或透過 Python 工具提取。運算子資訊將被寫入 yaml 檔案,並在建置時產生。
一個 _運算子資訊聚合器_ 將收集這些模型運算子資訊,並將它們合併到單個運算子資訊 yaml 檔案中。
一個 _核心解析器_ 接收連結的核心函式庫以及合併的運算子資訊 yaml 檔案,然後決定將哪些核心註冊到 ExecuTorch 執行時期。
API¶
我們公開了一個 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,則實際上關閉了選擇性建置模式。
從 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 中進行選擇。