TensorFlow RNN 轉換為 LiteRT

總覽

LiteRT 支援將 TensorFlow RNN 模型轉換為 LiteRT 融合 LSTM 運算。融合作業的存在是為了在 做為基礎核心實作項目,並提供給更高層級的 介面,定義量化化等複雜轉換。

由於 TensorFlow 中有許多 RNN API 變體,因此我們會採用 兩個摺疊位置:

  1. 提供標準 TensorFlow RNN API 的原生支援,例如 Keras LSTM。 這是我們建議的選項。
  2. 提供 轉換基礎架構 使用者定義的 RNN 實作,將其插入並轉換成 LiteRT。我們提供了一些立即可用的範例 運用語言 LSTMCellSimpleLayerNormalizedLSTMCellSimple RNN 介面。

轉換器 API

這項功能是 TensorFlow 2.3 版本的一部分。您也可以透過 tf-nightly 直立線或頭部。

轉換為 LiteRT 時可使用這項轉換功能 擷取或是透過 Keras 模型 直接匯總資料查看使用範例。

來自儲存的模型

# build a saved model. Here concrete_function is the exported function
# corresponding to the TensorFlow model containing one or more
# Keras LSTM layers.
saved_model, saved_model_dir = build_saved_model_lstm(...)
saved_model.save(saved_model_dir, save_format="tf", signatures=concrete_func)

# Convert the model.
converter = TFLiteConverter.from_saved_model(saved_model_dir)
tflite_model = converter.convert()

來自 Keras 模型

# build a Keras model
keras_model = build_keras_lstm(...)

# Convert the model.
converter = TFLiteConverter.from_keras_model(keras_model)
tflite_model = converter.convert()

範例

Keras LSTM 轉換為 LiteRT Colab 會說明以 LiteRT 翻譯模式執行端對端的方式。

支援 TensorFlow RNN API

我們支援立即將 Keras LSTM 轉換為 LiteRT。適用對象 如要進一步瞭解運作方式,請參閱 Keras LSTM 介面 和轉換邏輯 這裡

另外,請務必強調 LiteRT 的 LSTM 合約 轉換為 Keras 作業定義

  1. 輸入張量的維度 0 是批量。
  2. recurrent_weight 張量的維度 0 是 輸出內容
  3. weightrecurrent_kernel 張量會轉置。
  4. 轉置的權重、轉置的 recurrent_kernel 和 bias 張量為 分割成 4 個相同大小的張量 (沿著維度 0)。這類 ID 與 輸入閘、忘記閘門、儲存格和輸出閘門

Keras LSTM 變體

時間重要

使用者可以選擇時間重要,或完全不考慮時間。Keras LSTM 為重要時刻 屬性。針對單向序列 LSTM 就能對應至 unidirecional_sequence_lstm 時間主要屬性

BiDirectional LSTM

雙向 LSTM 可使用兩個 Keras LSTM 層來實作, 以及反向播放 1 軸的範例 請按這裡。 看到 go_backward 屬性時,我們會將其辨識為反向 LSTM 我們把這三個群組反向 LSTM這是未來的工作。目前, 這會在 LiteRT 中產生兩個 UnidirectionalSequenceLSTM 作業 模型

使用者定義的 LSTM 轉換範例

LiteRT 也可讓使用者轉換使用者定義的 LSTM 。我們以 Lingvo 的 LSTM 為例 詳情請參閱 lingvo.LSTMCellSimple 介面 和轉換邏輯 請參閱這篇文章。 我們也在 lingvo.LayerNormalizedLSTMCellSimple 介面 及其轉換邏輯 請參閱這篇文章

「使用自己的 TensorFlow RNN」為 LiteRT

如果使用者的 RNN 介面與標準支援的介面不同 從幾個選項開始:

選項 1:在 TensorFlow Python 中編寫轉接程式程式碼,以調整 RNN 介面 附加至 Keras RNN 介面這表示具有 tf_implementations 註解 產生的 RNN 介面函式與 Keras LSTM 層之後,您將使用與 Keras LSTM 相同的轉換 API 正常運作。

方法 2:如果無法採用上述做法 (例如 Keras LSTM 缺少某些) 功能目前是由 LiteRT 的融合式 LSTM 元件提供,例如 層正規化),然後以下列方式擴充 LiteRT 轉換器 然後插入「Prepare-複合」函式 MLIR-pass 請參閱這篇文章。 函式的介面應視同 API 合約, 包含轉換成融合 LiteRT LSTM 所需的引數 例如輸入、偏誤、權重、投影、圖層正規化等, 傾向以引數的形式傳遞給這個函式的張量 排名 (即 MLIR 中的 RankedTensorType)。這樣您就能更輕鬆編寫 轉換程式碼,將這些張量假設為 RankedTensorType 將這些物件轉換為與整合式 LiteRT 相對應的排名張量 運算子的運算元。

Lingvo 的 LSTMCellSimple 就是這類轉換流程的完整範例 LiteRT 轉換。

Lingvo 中的 LSTMCellSimple 是 請按這裡。 以這個 LSTM 儲存格訓練的模型可轉換為 LiteRT 如下:

  1. 使用 tf_implementations 將 LSTMCellSimple 所有用途納入 tf.function 中 加上這類註解 (例如 lingvo.LSTMCellSimple 就會是 適當的註解名稱)。確保產生的 tf.function 轉換程式碼預期的函式介面一致。這個 是模型作者和新增註解之間的合約 轉換程式碼。
  2. 擴充 prepare-複合函式傳遞,插入自訂複合運算 轉換為 LiteRT 融合的 LSTM 運算轉換詳情請見 LSTMCellSimple 轉換程式碼。

    轉換合約:

  3. 權重投影張量會遭到轉置。

  4. {input, recurrent} 設定為 {cell, input gate, 找不到門檻, 輸出 gate} 的方式是分解交錯的權重張量。

  5. {bias}{bias} 藉此擷取出雜訊

  6. 系統會分離交錯的投影張量來擷取投影

  7. 已針對以下使用者撰寫類似轉換: LayerNormalizedLSTMCellSimple

  8. LiteRT 轉換基礎架構的其他部分,包括 MLIR 票證 以及最終匯出至 LiteRT Flatbuffer 的最終範圍 重複使用

已知問題/限制

  1. 目前僅支援轉換無狀態 Keras LSTM (預設) 行為)。有狀態的 Keras LSTM 轉換是未來的工作。
  2. 您仍可使用 基礎無狀態 Keras LSTM 層 使用者計劃這類 TensorFlow 程式仍可轉換為 LiteRT 會使用本文所述功能。
  3. 雙向 LSTM 目前建模為兩個 UnidirectionalSequenceLSTM 以及 LiteRT 中的作業這會替換為 BidirectionalSequenceLSTM 運算。