概念¶
本頁概述了 ExecuTorch 文件中使用的關鍵概念和術語。旨在幫助讀者理解 PyTorch Edge 和 ExecuTorch 中使用的術語和概念。
AOT (提前編譯)¶
AOT 通常指在執行之前進行的程式準備。概括地說,ExecuTorch 工作流程分為 AOT 編譯和執行時。AOT 步驟包括編譯為中間表示 (IR),以及可選的轉換和最佳化。
ATen 方言¶
ATen 方言是將 eager 模組匯出為圖表示的直接結果。它是 ExecuTorch 編譯流水線的入口點;匯出為 ATen 方言後,後續 Pass 可以將其降低到 Core ATen 方言 和 Edge 方言。
ATen 方言是具有額外屬性的有效 EXIR。它包含函式式 ATen 運算元、高階運算元(如控制流運算元)以及註冊的自定義運算元。
ATen 方言的目標是儘可能忠實地捕獲使用者的程式。
ATen 模式¶
ATen 模式使用 PyTorch 核心中的 Tensor (即 at::Tensor) 和相關型別 (如 ScalarType) 的 ATen 實現。這與 ETensor 模式形成對比,ETensor 模式使用 ExecuTorch 中更小的 Tensor 實現 (即 executorch::runtime::etensor::Tensor) 和相關型別 (如 executorch::runtime::etensor::ScalarType)。
依賴完整
at::TensorAPI 的 ATen 核心在此配置下可用。ATen 核心傾向於進行動態記憶體分配,並且通常具有額外的靈活性(以及由此帶來的開銷)來處理移動/嵌入式客戶端不需要的情況。例如,CUDA 支援、稀疏張量支援和 dtype 提升。
注意:ATen 模式目前正在開發中 (WIP)。
Autograd 安全的 ATen 方言¶
Autograd 安全的 ATen 方言僅包含可微分的 ATen 運算元,以及高階運算元(控制流運算元)和註冊的自定義運算元。
後端¶
接收整個圖或其中一部分,並帶來效能和效率提升的特定硬體(如 GPU、NPU)或軟體棧(如 XNNPACK)。
後端方言¶
後端方言是將 Edge 方言匯出到特定後端的直接結果。它具備目標感知能力,可能包含僅對目標後端有意義的運算元或子模組。這種方言允許引入特定於目標的運算元,這些運算元不符合 Core ATen 運算元集中定義的模式,並且不在 ATen 或 Edge 方言中顯示。
後端登錄檔¶
將後端名稱對映到後端介面的表。這允許在執行時透過名稱呼叫後端。
特定後端運算元¶
這些運算元不屬於 ATen 方言或 Edge 方言。特定後端運算元僅由 Edge 方言之後的 Pass 引入(參見後端方言)。這些運算元特定於目標後端,通常執行速度更快。
程式碼生成¶
概括地說,程式碼生成執行兩項任務:生成 核心註冊 庫,以及可選地執行 選擇性構建。
核心註冊庫將運算元名稱(模型中引用)與相應的核心實現(來自核心庫)連線起來。
選擇性構建 API 從模型和/或其它來源收集運算元資訊,並且僅包含它們所需的運算元。這可以減小二進位制檔案的大小。
程式碼生成的輸出是一組 C++ 繫結(各種 .h、.cpp 檔案),它們將核心庫和 ExecuTorch 執行時粘合在一起。
Core ATen 方言¶
Core ATen 方言包含核心 ATen 運算元以及高階運算元(控制流)和註冊的自定義運算元。
核心 ATen 運算元 / 標準 ATen 運算元集¶
PyTorch ATen 運算元庫的一個精選子集。使用核心 ATen 分解表匯出時,核心 ATen 運算元不會被分解。它們作為後端或編譯器應從上游期望的基線 ATen 運算元的參考。
Core ATen 分解表¶
分解運算元意味著將其表達為其他運算元的組合。在 AOT 過程中,會採用預設的分解列表,將 ATen 運算元分解為核心 ATen 運算元。這稱為 Core ATen 分解表。
自定義運算元¶
這些運算元不屬於 ATen 庫,但出現在 eager 模式 中。註冊的自定義運算元通常透過 TORCH_LIBRARY 呼叫註冊到當前的 PyTorch eager 模式執行時中。它們很可能與特定的目標模型或硬體平臺相關聯。例如,torchvision::roi_align 是 torchvision 廣泛使用的自定義運算元(不針對特定硬體)。
DataLoader¶
一個介面,使 ExecuTorch 執行時能夠從檔案或其他資料來源讀取資料,而無需直接依賴於作業系統概念,如檔案或記憶體分配。
維度順序¶
ExecuTorch 引入了 維度順序 來描述張量的記憶體格式,透過返回維度從最外層到最內層的排列。
例如,對於記憶體格式為 [N, C, H, W] 或 連續 記憶體格式的張量,[0, 1, 2, 3] 將是其維度順序。
此外,對於記憶體格式為 [N, H, W, C] 或 channels_last 記憶體格式 的張量,我們返回 [0, 2, 3, 1] 作為其維度順序。
目前,ExecuTorch 僅支援 連續 和 channels_last 記憶體格式的維度順序表示。
DSP (數字訊號處理器)¶
一種針對數字訊號處理優化了架構的專用微處理器晶片。
dtype¶
資料型別,張量中資料的型別(例如,浮點數、整數等)。
動態形狀¶
指模型在推理過程中能夠接受不同形狀輸入的能力。例如,ATen 運算元 unique_consecutive 和自定義運算元 MaskRCNN 的輸出形狀依賴於資料。對這類運算元進行記憶體規劃很困難,因為即使輸入形狀相同,每次呼叫也可能產生不同的輸出形狀。為了在 ExecuTorch 中支援動態形狀,核心可以使用客戶端提供的 MemoryAllocator 分配張量資料。
Eager 模式¶
Python 執行環境,其中模型中的運算元在遇到時立即執行。例如,Jupyter / Colab notebook 在 eager 模式下執行。這與 graph 模式形成對比,graph 模式中運算元首先被合成為圖,然後編譯並執行。
Edge 方言¶
EXIR 的一種方言,具有以下屬性
所有運算元均來自預定義的運算元集,稱為“Edge 運算元”或註冊的自定義運算元。
圖以及每個節點的輸入和輸出必須是 Tensor。所有 Scalar 型別都被轉換為 Tensor。
Edge 方言引入了對邊緣裝置有用的特化,但不一定適用於通用(伺服器)匯出。然而,Edge 方言不包含針對特定硬體的特化,除了原始 Python 程式中已有的特化。
Edge 運算元¶
帶有 dtype 特化的 ATen 運算元。
ExecuTorch¶
PyTorch Edge 平臺內的一個統一 ML 軟體棧,旨在實現高效的裝置端推理。ExecuTorch 定義了一個工作流程,用於在移動、可穿戴裝置和嵌入式裝置等邊緣裝置上準備(匯出和轉換)和執行 PyTorch 程式。
ExecuTorch 方法¶
nn.Module Python 方法的可執行等價物。例如,forward() Python 方法會編譯成一個 ExecuTorch Method。
ExecuTorch 程式¶
一個 ExecuTorch Program 將諸如 forward 之類的字串名稱對映到特定的 ExecuTorch Method 入口。
executor_runner¶
包含所有運算元和後端的 ExecuTorch 執行時的一個示例包裝器。
ExportedProgram¶
torch.export 的輸出,它將 PyTorch 模型(通常是 nn.Module)的計算圖與模型消耗的引數或權重捆綁在一起。
flatbuffer¶
一種記憶體效率高、跨平臺的序列化庫。在 ExecuTorch 的上下文中,eager 模式的 PyTorch 模型被匯出為 flatbuffer 格式,這是 ExecuTorch 執行時消耗的格式。
框架開銷¶
各種載入和初始化任務(非推理)的開銷。例如:載入程式、初始化執行器、核心和後端委託分派,以及執行時記憶體利用。
函式式 ATen 運算元¶
沒有任何副作用的 ATen 運算元。
Graph 模式¶
在 graph 模式下,運算元首先被合成為一個圖,然後作為一個整體進行編譯和執行。這與 eager 模式形成對比,eager 模式下運算元在遇到時即執行。Graph 模式通常提供更高的效能,因為它允許運算元融合等最佳化。
高階運算元¶
高階運算元 (HOP) 是指以下型別的運算元
接受 Python 函式作為輸入,或返回 Python 函式作為輸出,或兩者皆是。
與所有 PyTorch 運算元一樣,高階運算元也具有針對後端和功能的可選實現。這使我們能夠例如註冊高階運算元的 autograd 公式,或定義高階運算元在 ProxyTensor 追蹤下的行為。
混合量化¶
一種量化技術,根據計算複雜度和對精度損失的敏感性,模型不同部分採用不同的技術進行量化。模型某些部分可能不進行量化以保留精度。
中間表示 (IR)¶
源語言和目標語言之間的程式表示形式。通常,它是編譯器或虛擬機器內部用於表示原始碼的資料結構。
核心¶
運算元的實現。一個運算元可以有針對不同後端/輸入等的多種實現。
核心登錄檔 / 運算元登錄檔¶
包含核心名稱與其實現之間對映的表。這使得 ExecuTorch 執行時能夠在執行期間解析對核心的引用。
降低¶
將模型轉換為在各種後端上執行的過程。稱之為“降低”是因為它將程式碼移得更接近硬體。在 ExecuTorch 中,降低作為後端委託的一部分執行。
記憶體規劃¶
為模型分配和管理記憶體的過程。在 ExecuTorch 中,在將圖儲存到 flatbuffer 之前會執行一個記憶體規劃 Pass。這將為每個張量分配一個記憶體 ID 和緩衝區中的偏移量,標記張量儲存的起始位置。
節點¶
EXIR 圖中的一個節點代表特定的計算或操作,在 Python 中使用 torch.fx.Node 類表示。
運算元¶
在張量上執行的函式。這是抽象;核心是實現。一個運算元可以有針對不同後端/輸入等的多種實現。
運算元融合¶
運算元融合是將多個運算元組合成一個複合運算元的過程,由於減少了核心啟動次數和記憶體讀寫次數,從而加快了計算速度。這是 graph 模式相對於 eager 模式的效能優勢。
Out 變體¶
運算元的 out 變體不會在核心實現中分配返回的張量,而是將其結果儲存到透過 out kwarg 傳入的預分配張量中。
這使得記憶體規劃器更容易執行張量生命週期分析。在 ExecuTorch 中,在記憶體規劃之前會執行一個 out 變體 Pass。
部分核心¶
支援部分張量 dtype 和/或維度順序的核心。
分割槽器¶
模型的部分可能被委託到最佳化的後端上執行。分割槽器將圖分割成適當的子網路並標記它們以進行委託。
ETensor 模式¶
ETensor 模式使用 ExecuTorch 中更小的張量實現(executorch::runtime::etensor::Tensor)以及相關型別(executorch::runtime::etensor::ScalarType 等)。這與 ATen 模式形成對比,ATen 模式使用 ATen 實現的張量(at::Tensor)和相關型別(ScalarType 等)。
executorch::runtime::etensor::Tensor,也稱為 ETensor,是at::Tensor的原始碼相容子集。針對 ETensor 編寫的程式碼可以針對at::Tensor進行構建。ETensor 本身不擁有或分配記憶體。為了支援動態形狀,核心可以使用客戶端提供的 MemoryAllocator 分配 Tensor 資料。
可移植核心¶
可移植核心是運算元實現,它們被編寫成與 ETensor 相容。由於 ETensor 與 at::Tensor 相容,可移植核心可以針對 at::Tensor 進行構建,並與 ATen 核心在同一模型中使用。可移植核心具有以下特點:
與 ATen 運算元簽名相容
使用可移植 C++ 編寫,因此可以針對任何目標進行構建
作為參考實現編寫,優先考慮清晰度和簡潔性而非最佳化
通常比 ATen 核心尺寸更小
編寫時避免使用 new/malloc 進行動態記憶體分配。
程式¶
描述 ML 模型的程式碼和資料的集合。
程式原始碼¶
描述程式的 Python 原始碼。它可以是 Python 函式,也可以是 PyTorch eager 模式 nn.Module 中的方法。
PTQ (訓練後量化)¶
一種量化技術,模型在訓練後進行量化(通常為了效能提升)。PTQ 在訓練後應用量化流程,這與 QAT 在訓練期間應用形成對比。
QAT (量化感知訓練)¶
模型在量化後可能會損失精度。與 PTQ 等技術相比,QAT 透過在訓練期間模擬量化的影響,從而實現更高的精度。在訓練期間,所有權重和啟用都被“偽量化”;浮點值被四捨五入以模擬 int8 值,但所有計算仍然使用浮點數完成。因此,訓練期間進行的所有權重調整都“感知”到模型最終將被量化。QAT 在訓練期間應用量化流程,這與 PTQ 在訓練後應用形成對比。
