TensorFlow Lite 和 TensorFlow 運算元相容性

您在模型中使用的機器學習 (ML) 運算元可能會影響將 TensorFlow 模型轉換為 TensorFlow Lite 格式的過程。TensorFlow Lite 轉換器僅支援通用推論模型中使用的部分 TensorFlow 運算,這表示並非所有模型都能直接轉換。轉換器工具可讓您加入其他運算元,但以這種方式轉換模型也需要您修改用於執行模型的 TensorFlow Lite 執行階段環境,這可能會限制您使用標準執行階段部署選項 (例如 Google Play 服務) 的能力。

TensorFlow Lite 轉換器旨在分析模型結構並套用最佳化,使其與直接支援的運算元相容。例如,根據模型中的 ML 運算元,轉換器可能會省略或融合這些運算元,以便將它們對應到 TensorFlow Lite 的對應運算元。

即使是針對支援的運算,有時也會基於效能考量而預期特定的使用模式。若要瞭解如何建置可用於 TensorFlow Lite 的 TensorFlow 模型,最好的方法是仔細考慮運算的轉換和最佳化方式,以及此過程施加的限制。

支援的運算元

TensorFlow Lite 內建運算元是 TensorFlow 核心程式庫中運算元的子集。您的 TensorFlow 模型也可能包含自訂運算元,形式可以是複合運算元或您定義的新運算元。下圖顯示這些運算元之間的關係。

TensorFlow operators

從這個 ML 模型運算元範圍來看,轉換過程支援 3 種模型類型

  1. 僅具有 TensorFlow Lite 內建運算元的模型。(建議)
  2. 具有內建運算元和選取的 TensorFlow 核心運算元的模型。
  3. 具有內建運算元、TensorFlow 核心運算元和/或自訂運算元的模型。

如果您的模型僅包含 TensorFlow Lite 原生支援的運算,則不需要任何額外標記即可轉換。這是建議的路徑,因為這種類型的模型將順利轉換,並且更易於使用預設 TensorFlow Lite 執行階段進行最佳化和執行。您的模型也有更多部署選項,例如 Google Play 服務。您可以從 TensorFlow Lite 轉換器指南開始使用。請參閱 TensorFlow Lite Ops 頁面,以取得內建運算元的清單。

如果您需要包含來自核心程式庫的選取 TensorFlow 運算,則必須在轉換時指定,並確保您的執行階段包含這些運算。請參閱選取 TensorFlow 運算元主題以取得詳細步驟。

盡可能避免最後一個選項,即在轉換後的模型中包含自訂運算元。自訂運算元可以是透過組合多個基本 TensorFlow 核心運算元建立的運算元,或定義完全新的運算元。當自訂運算元轉換時,它們可能會因為產生內建 TensorFlow Lite 程式庫之外的依附元件而增加整體模型的大小。自訂運算 (如果不是專為行動或裝置部署而建立),在部署到資源受限的裝置時,效能可能會比伺服器環境更差。最後,就像包含選取的 TensorFlow 核心運算元一樣,自訂運算元也需要您修改模型執行階段環境,這會限制您無法利用標準執行階段服務 (例如 Google Play 服務)。

支援的類型

大多數 TensorFlow Lite 運算都以浮點數 (float32) 和量化 (uint8int8) 推論為目標,但許多運算尚不支援其他類型,例如 tf.float16 和字串。

除了使用不同版本的運算外,浮點數模型和量化模型之間的另一個差異是它們的轉換方式。量化轉換需要張量的動態範圍資訊。這需要在模型訓練期間進行「假量化」、透過校準資料集取得範圍資訊,或進行「即時」範圍估計。如需更多詳細資訊,請參閱量化

簡單明瞭的轉換、常數摺疊和融合

即使許多 TensorFlow 運算沒有直接的對應項目,TensorFlow Lite 仍然可以處理它們。對於可以從圖表中簡單移除 (tf.identity)、由張量取代 (tf.placeholder) 或融合到更複雜的運算 (tf.nn.bias_add) 的運算來說,就是這種情況。即使某些支援的運算有時也可能會透過其中一個過程移除。

以下是通常從圖表中移除的 TensorFlow 運算的不完整清單

實驗性運算

以下 TensorFlow Lite 運算存在,但尚未準備好用於自訂模型

  • CALL
  • CONCAT_EMBEDDINGS
  • CUSTOM
  • EMBEDDING_LOOKUP_SPARSE
  • HASHTABLE_LOOKUP
  • LSH_PROJECTION
  • SKIP_GRAM
  • SVDF