• 文件 >
  • ExecuTorch 核心庫概述
快捷方式

本頁介紹了可移植核心庫 (Portable Kernel Library) 和最佳化核心庫 (Optimized Kernel Library),它們是 ExecuTorch 預設附帶的核心庫。如果您有興趣使用這些核心庫執行 ExecuTorch 程式,或希望實現自己的核心和核心庫,建議閱讀本頁。

ExecuTorch 核心庫概述

ExecuTorch 程式編碼了描述程式應執行計算的指令。其中許多指令對應於呼叫特定的 ATen 運算子,例如 aten.convolution。然而,ExecuTorch 的核心設計原則之一是將運算子的簽名與運算子的實現分開。這意味著 ExecuTorch 執行時不附帶任何 ATen 運算子的標準實現;使用者必須確保連結包含其 ExecuTorch 程式所需運算子實現的核心庫,並配置運算子註冊以將運算子簽名對映到所需的實現。這使得調整在執行 ExecuTorch 程式時將被呼叫的 aten.convolution 等運算子的實現變得容易;它允許使用者選擇完全符合其用例獨特的效能、記憶體使用、電池使用等約束條件的運算子實現。

本質上,核心庫只是遵循共同主題或設計原則的 ATen 運算子實現的集合。請注意,由於 ExecuTorch 的選擇性構建過程(將在下一節討論),運算子實現是單獨連結的。這意味著使用者可以在構建中輕鬆混合不同的核心庫,而不會犧牲構建大小。

ExecuTorch 預設附帶兩個核心庫:可移植核心庫 (Portable Kernel Library)最佳化核心庫 (Optimized Kernel Library),它們都提供 CPU 運算子實現。

可移植核心庫 (Portable Kernel Library)

可移植核心庫在某種意義上是 ExecuTorch 使用的“參考”核心庫。可移植核心庫的開發考慮了以下目標:

  • 正確性

    • 提供與 PyTorch ATen 庫中運算子原始實現嚴格一致的 ATen 運算子簡單實現

  • 可讀性 / 簡潔性

    • 提供清晰、易讀的原始碼,以便那些希望開發運算子自定義實現的人可以輕鬆理解運算子的預期行為。

  • 可移植性

    • 可移植核心應與 ExecuTorch 執行時一樣可移植;運算子實現不應使用任何外部依賴項,或使用 C++ 的任何未經批准的特性。

  • 運算子覆蓋範圍

    • 作為 ExecuTorch 的“參考”核心庫,可移植核心庫旨在實現高程度的運算子覆蓋。其目標是讓可移植核心庫為列為核心 ATen 運算子的每個運算子提供實現。但是,請注意,可移植核心庫的運算子覆蓋範圍仍在進行中。

可移植核心庫主要旨在提供易於訪問的運算子實現,這些實現可在大多數平臺上“正常工作”,並保證提供正確輸出。效能不是可移植核心庫的目標。事實上,許多瓶頸運算子,如卷積和矩陣乘法,都以最簡單的方式實現,以優先考慮簡潔性和可讀性。因此,如果僅使用可移植核心庫,不應期望觀察到快速的推理時間。然而,除了特定的瓶頸運算子外,大多數運算子都足夠簡單,可移植核心庫的直接實現仍應提供足夠的效能。二進位制大小也不是可移植核心庫的目標。

最佳化核心庫 (Optimized Kernel Library)

最佳化核心庫是 ExecuTorch 附帶的一個補充核心庫,與可移植核心庫不同,它旨在以犧牲可移植性和可讀性為代價,提供以效能為中心的運算子實現。最佳化核心庫中的許多運算子實現受到 PyTorch ATen 庫中相應實現的啟發或基於其實現,因此在許多情況下,可以期待相同的效能水平。

一般來說,最佳化核心庫中的運算子透過以下兩種方式之一進行最佳化:

  1. 使用 CPU 向量內嵌函式

  2. 使用最佳化的數學庫,例如 sleefOpenBLAS

儘管可移植性不是最佳化核心庫的設計目標,但其實現並非旨在針對特定 CPU 架構進行微調。相反,最佳化核心庫力求提供可在各種平臺上應用的效能優異的實現,而不是使用特定於單個平臺的最佳化。

另一個重要注意事項是,運算子覆蓋範圍也不是最佳化核心庫的目標。目前沒有計劃為每個核心 ATen 運算子新增最佳化核心;相反,會根據需要新增最佳化核心以提高特定模型的效能。因此,與可移植核心庫相比,最佳化核心庫中的運算子覆蓋範圍將更為有限。

文件

訪問 PyTorch 的全面開發者文件

檢視文件

教程

獲取面向初學者和高階開發者的深度教程

檢視教程

資源

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

檢視資源