本頁提供有關可移植核心函式庫和最佳化核心函式庫的說明,這些是 ExecuTorch 附帶的預設核心函式庫。建議對使用這些核心函式庫執行 ExecuTorch 程式感興趣的人,或者想要實作自己的核心和核心函式庫的人閱讀。
ExecuTorch 核心函式庫概觀¶
ExecuTorch 程式會編碼指令,描述程式應執行的計算。許多這些指令會對應到呼叫特定的 ATen 運算子,例如 aten.convolution
。然而,ExecuTorch 的核心設計原則之一是運算子的簽章應與運算子的實作分離。這意味著 ExecuTorch 執行時期不包含任何 ATen 運算子的標準實作;使用者必須確保連結到包含其 ExecuTorch 程式所需運算子的實作的核心函式庫,並配置運算子註冊,以將運算子簽章對應到所需的實作。這使得調整運算子(例如 aten.convolution
)的實作變得容易,這些運算子將在執行 ExecuTorch 程式時被呼叫;它允許使用者選擇完全符合其使用案例的獨特效能、記憶體使用量、電池使用量等限制的運算子實作。
本質上,核心函式庫只是一組遵循共同主題或設計原則的 ATen 運算子實作的集合。請注意,由於 ExecuTorch 的選擇性建置流程(在以下章節中討論),運算子實作會個別連結。這意味著使用者可以輕鬆地在其建置中混合不同的核心函式庫,而不會犧牲建置大小。
ExecuTorch 預設提供兩個核心函式庫:Portable Kernel Library (可攜式核心函式庫) 和 Optimized Kernel Library (最佳化核心函式庫),兩者都提供 CPU 運算子實作。
Portable Kernel Library¶
Portable Kernel Library 在某種意義上是 ExecuTorch 使用的「參考」核心函式庫。Portable Kernel Library 的開發考慮了以下目標:
正確性
提供與 PyTorch 的 ATen 函式庫中運算子的原始實作嚴格一致的 ATen 運算子的直接實作。
可讀性/簡潔性
提供清晰、可讀的原始碼,以便想要開發運算子自訂實作的人可以輕鬆理解運算子的所需行為。
可攜性
可攜式核心應與 ExecuTorch 執行時期一樣可攜式;運算子實作不應使用任何外部依賴項,或使用 C++ 的任何未經授權的功能。
運算子覆蓋率
作為 ExecuTorch 的「參考」核心函式庫,Portable Kernel Library 旨在具有高度的運算子覆蓋率。目標是 Portable Kernel Library 為列為核心 ATen 運算子的每個運算子提供實作。但是,請注意,Portable Kernel Library 的運算子覆蓋率仍在進行中。
Portable Kernel Library 主要旨在提供易於存取的運算子實作,這些實作可在大多數平台上「正常運作」,並保證提供正確的輸出。效能不是 Portable Kernel Library 的目標。事實上,為了優先考慮簡潔性和可讀性,許多瓶頸運算子(例如卷積和矩陣乘法)都以最直接的方式實作。因此,如果僅使用 Portable Kernel Library,則不應期望觀察到快速的推論時間。但是,在特定瓶頸運算子之外,大多數運算子都足夠簡單,Portable Kernel Library 的直接實作仍然可以提供足夠的效能。二進制大小也不是 Portable Kernel Library 的目標。
Optimized Kernel Library¶
Optimized Kernel Library 是 ExecuTorch 隨附的一個補充核心函式庫,與 Portable Kernel Library 相比,它旨在以犧牲可攜性和可讀性為代價來提供以效能為中心的運算子實作。Optimized Kernel Library 中的許多運算子實作都受到 PyTorch 的 ATen 函式庫中相應實作的啟發或基於該實作,因此在許多情況下,可以預期相同的效能程度。
一般來說,Optimized Kernel Library 中的運算子透過以下兩種方式之一進行最佳化:
使用 CPU 向量內建函數
使用最佳化的數學函式庫,例如
sleef
和OpenBLAS
儘管可攜性不是 Optimized Kernel Library 的設計目標,但實作並非旨在針對特定的 CPU 架構進行微調。相反,Optimized Kernel Library 尋求提供可以在各種平台上應用的高效能實作,而不是使用特定於單個平台的最佳化。
另一個重要的注意事項是,運算子覆蓋率也不是 Optimized Kernel Library 的目標。沒有計劃為每個核心 ATen 運算子添加最佳化的核心;相反,會根據需要添加最佳化的核心,以提高特定模型的效能。因此,與 Portable Kernel Library 相比,Optimized Kernel Library 中的運算子覆蓋率將受到更大的限制。