精簡運算元配置檔案
精簡運算元配置檔案是 ONNX Runtime 從原始碼構建指令碼的輸入。它指定了執行時中包含哪些運算元。ONNX Runtime 中精簡的運算元集可以減小構建二進位制檔案的大小。較小的執行時用於受限環境,例如移動和 Web 部署。
本文向您展示如何使用 create_reduced_build_config.py 指令碼生成精簡運算元配置檔案。您也可以透過將 ONNX 模型轉換為 ORT 格式來生成精簡運算元配置檔案。
目錄
create_reduced_build_config.py 指令碼
要建立精簡運算元配置檔案,請在您的模型上執行指令碼 create_reduced_build_config.py。
核心配置檔案可以根據需要手動編輯。該配置可以從 ONNX 或 ORT 格式模型建立。
create_reduced_build_config.py --help
usage: Script to create a reduced build config file from ONNX or ORT format model/s. [-h] [-f {ONNX,ORT}] [-t] model_path_or_dir config_path
positional arguments:
model_path_or_dir Path to a single model, or a directory that will be recursively searched for models to process.
config_path Path to write configuration file to.
optional arguments:
-h, --help show this help message and exit
-f {ONNX,ORT}, --format {ONNX,ORT}
Format of model/s to process. (default: ONNX)
-t, --enable_type_reduction
Enable tracking of the specific types that individual operators require. Operator implementations MAY support limiting the type support included
in the build to these types. Only possible with ORT format models. (default: False)
配置檔案格式
運算元精簡配置檔案的基本格式是 <運算元域>;<該域的 opset>;<運算元1>[,運算元2]...
例如:
#domain;opset;op1,op2...
ai.onnx;12;Add,Cast,Concat,Squeeze
opset 可以與每個模型的 opset 匯入匹配,也可以與運算元版本首次可用的初始 ONNX opset 匹配。如果手動編輯配置檔案,使用模型中的 opset 匯入值是最簡單的。
例如,如果一個模型匯入了 ONNX 的 opset 12,則該模型中的所有 ONNX 運算元都可以在“ai.onnx”域下列為 opset 12。
Netron 可用於檢視 ONNX 模型屬性以發現 opset 匯入。此外,DNN 和 傳統機器學習運算元的 ONNX 運算元規範列出了單個運算元版本。
型別精簡格式
每運算元型別資訊
如果運算元實現支援的型別可以限制為特定的型別集,則在配置檔案中運算元名稱之後立即以 JSON 字串形式指定。
強烈建議您首先使用啟用了型別精簡的 ORT 格式模型生成配置檔案,以便檢視哪些運算元支援型別精簡,以及如何為單個運算元定義條目。
所需型別通常按運算元的輸入和/或輸出列出。型別資訊位於一個對映中,具有“inputs”和“outputs”鍵。 “inputs”或“outputs”的值是輸入/輸出的索引號與所需型別列表之間的對映。
例如,ai.onnx:Cast 的輸入和輸出型別都相關。輸入 0 和輸出 0 的型別資訊可能如下所示:
{"inputs": {"0": ["float", "int32_t"]}, "outputs": {"0": ["float", "int64_t"]}}
它直接新增到配置檔案中的運算元名稱之後。例如:
ai.onnx;12;Add,Cast{"inputs": {"0": ["float", "int32_t"]}, "outputs": {"0": ["float", "int64_t"]}},Concat,Squeeze
例如,如果輸入 0 和 1 的型別很重要,則條目可能如下所示(例如 ai.onnx:Gather):
{"inputs": {"0": ["float", "int32_t"], "1": ["int32_t"]}}
最後,一些運算元執行非標準操作,並將其型別資訊儲存在“custom”鍵下。 ai.onnx.OneHot 是一個例子,其中三個輸入型別組合成一個三元組。
{"custom": [["float", "int64_t", "int64_t"], ["int64_t", "std::string", "int64_t"]]}
由於這些原因,最好先生成配置檔案,然後根據需要手動編輯任何條目。
全域性允許型別
也可以將所有運算元支援的型別限制為特定的型別集。這些被稱為全域性允許型別。它們可以在配置檔案中單獨一行指定。
指定所有運算元全域性允許型別的格式是
!globally_allowed_types;T0,T1,...
Ti 應該是 ONNX 和 ORT 支援的 C++ 標量型別。最多允許一個全域性允許型別規範。
指定每運算元型別資訊和指定全域性允許型別是互斥的——同時指定兩者將導致錯誤。