快捷方式

概念

本頁概述了 ExecuTorch 文件中使用的關鍵概念和術語。旨在幫助讀者理解 PyTorch Edge 和 ExecuTorch 中使用的術語和概念。

AOT (提前編譯)

AOT 通常指在執行之前進行的程式準備。概括地說,ExecuTorch 工作流程分為 AOT 編譯和執行時。AOT 步驟包括編譯為中間表示 (IR),以及可選的轉換和最佳化。

ATen

從根本上說,它是一個張量庫,PyTorch 中幾乎所有其他 Python 和 C++ 介面都構建在其之上。它提供了一個核心的 Tensor 類,在此類上定義了數百種操作。

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::Tensor API 的 ATen 核心在此配置下可用。

  • ATen 核心傾向於進行動態記憶體分配,並且通常具有額外的靈活性(以及由此帶來的開銷)來處理移動/嵌入式客戶端不需要的情況。例如,CUDA 支援、稀疏張量支援和 dtype 提升。

  • 注意:ATen 模式目前正在開發中 (WIP)。

Autograd 安全的 ATen 方言

Autograd 安全的 ATen 方言僅包含可微分的 ATen 運算元,以及高階運算元(控制流運算元)和註冊的自定義運算元。

後端

接收整個圖或其中一部分,並帶來效能和效率提升的特定硬體(如 GPU、NPU)或軟體棧(如 XNNPACK)。

後端方言

後端方言是將 Edge 方言匯出到特定後端的直接結果。它具備目標感知能力,可能包含僅對目標後端有意義的運算元或子模組。這種方言允許引入特定於目標的運算元,這些運算元不符合 Core ATen 運算元集中定義的模式,並且不在 ATen 或 Edge 方言中顯示。

後端登錄檔

將後端名稱對映到後端介面的表。這允許在執行時透過名稱呼叫後端。

特定後端運算元

這些運算元不屬於 ATen 方言或 Edge 方言。特定後端運算元僅由 Edge 方言之後的 Pass 引入(參見後端方言)。這些運算元特定於目標後端,通常執行速度更快。

Buck2

一個開源的大規模構建系統。用於構建 ExecuTorch。

CMake

一系列開源、跨平臺的工具,旨在構建、測試和打包軟體。用於構建 ExecuTorch。

程式碼生成

概括地說,程式碼生成執行兩項任務:生成 核心註冊 庫,以及可選地執行 選擇性構建

核心註冊庫將運算元名稱(模型中引用)與相應的核心實現(來自核心庫)連線起來。

選擇性構建 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 執行時能夠從檔案或其他資料來源讀取資料,而無需直接依賴於作業系統概念,如檔案或記憶體分配。

委託

在特定後端(例如 XNNPACK)上執行程式的一部分(或全部),而程式的其餘部分(如果有)在基本 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 執行時的一個示例包裝器。

EXIR

來自 torch.export示 (IR)。包含模型的計算圖。所有 EXIR 圖都是有效的 FX 圖

ExportedProgram

torch.export 的輸出,它將 PyTorch 模型(通常是 nn.Module)的計算圖與模型消耗的引數或權重捆綁在一起。

flatbuffer

一種記憶體效率高、跨平臺的序列化庫。在 ExecuTorch 的上下文中,eager 模式的 PyTorch 模型被匯出為 flatbuffer 格式,這是 ExecuTorch 執行時消耗的格式。

框架開銷

各種載入和初始化任務(非推理)的開銷。例如:載入程式、初始化執行器、核心和後端委託分派,以及執行時記憶體利用。

函式式 ATen 運算元

沒有任何副作用的 ATen 運算元。

EXIR 圖是以 DAG(有向無環圖)形式表示的 PyTorch 程式。圖中的每個節點代表特定的計算或操作,圖的邊由節點之間的引用組成。注意:所有 EXIR 圖都是有效的 FX 圖

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。

PAL (平臺抽象層)

為執行環境提供了覆蓋以下操作的方式;

  • 獲取當前時間。

  • 列印日誌語句。

  • 使程序/系統崩潰。如果預設的 PAL 實現不適用於特定的客戶端系統,則可以對其進行覆蓋。

部分核心

支援部分張量 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 在訓練後應用形成對比。

量化

使用較低精度資料(通常是 int8)對張量執行計算和記憶體訪問的技術。量化透過降低記憶體使用量和(通常)減少計算延遲來提高模型效能;取決於硬體,較低精度下的計算通常會更快,例如 int8 矩陣乘法 vs fp32 矩陣乘法。通常,量化會犧牲模型精度。

執行時

ExecuTorch 執行時在邊緣裝置上執行模型。它負責程式初始化、程式執行以及可選的銷燬(釋放後端擁有的資源)。

開發者工具

使用者對使用 ExecuTorch 執行的程式進行效能分析、除錯和視覺化所需的一系列工具。

選擇性構建

一種 API,用於僅連結程式使用的核心來構建更精簡的執行時。這能顯著節省二進位制檔案大小。

靜態量化

一種量化方法,其中張量被靜態量化。也就是說,浮點數在推理之前被轉換為精度降低的資料型別。

XNNPACK

一個用於 ARM、x86、WebAssembly 和 RISC-V 平臺的神經網路介面運算元最佳化庫。它是一個開源專案,由 PyTorch 和 ExecuTorch 使用。它是 QNNPack 庫的後繼者。這些運算元支援浮點值和量化值。

文件

訪問 PyTorch 全面的開發者文件

檢視文件

教程

獲取針對初學者和高階開發者的深度教程

檢視教程

資源

查詢開發資源並獲得問題解答

檢視資源