訓練後的量化

訓練後的量化是一種轉換技巧 同時改善 CPU 和硬體加速器的延遲時間 模型準確度則降低您可以量化已經訓練過的浮點值 使用 TensorFlow 模型將 TensorFlow 模型轉換為 LiteRT 格式 LiteRT 轉換器

最佳化方法

有多種訓練後的量化選項可供選擇。以下是 選項及優點的摘要表格:

做法 優點 硬體
動態範圍 量化 小 4 倍、上傳速度 2 倍至 3 倍 CPU
完整整數 量化 4 倍小、3 倍以上加速 CPU、Edge TPU 微控制器
Float16 量化 比 2 倍,GPU Acceleration CPU、GPU

下列決策樹狀圖有助於判斷哪些訓練後量化 最適合您的用途:

訓練後的最佳化選項

不定量

建議您在不量化的情況下,轉換為 TFLite 模型 點。這樣就能產生浮動的 TFLite 模型。

import tensorflow as tf
converter = tf.lite.TFLiteConverter.from_saved_model(saved_model_dir)
tflite_quant_model = converter.convert()

建議您先完成這個步驟,驗證原始 TF 模型的運算子與 TFLite 相容,而且也能做為 針對後續訓練後產生的量化錯誤偵錯基準 量化方法舉例來說,如果量化的 TFLite 模型 雖然浮動的 TFLite 模型準確,但我們可以縮小範圍 TFLite 運算子的量化版本引發的錯誤。

動態範圍量化

動態範圍量化功能可降低記憶體用量及加快運算速度 您不必提供用於校正的代表資料集。這個 量化類型,以靜態方式將浮點數的權重量化 轉換為整數,且提供 8 位元的精確度:

import tensorflow as tf
converter = tf.lite.TFLiteConverter.from_saved_model(saved_model_dir)
converter.optimizations = [tf.lite.Optimize.DEFAULT]
tflite_quant_model = converter.convert()

如要進一步減少推論期間的延遲時間,請「動態範圍」運算子 根據啟動範圍在 8 位元範圍內動態量化啟動次數,並實際執行 分別針對 8 位元權重和啟動次數進行運算。這項最佳化功能可讓您 接近完全固定點推論的延遲時間不過,輸出內容 以便減少動態範圍運算的速度 而不是完整的固定點運算

完整整數量化

您可以進一步提高延遲時間、降低尖峰記憶體用量。 確保與只有整數類型的硬體裝置或加速器相容 所有模型數學都是整數量化

如需完整的整數量化 就需校正或估算範圍 即(最小值、最大值) 模型中所有浮點張量。與常數不同 權重和偏誤、變數張量,例如模型輸入 無法執行啟動作業 (中間層的輸出內容) 和模型輸出內容 除非我們執行幾次推論週期因此 需要代表性資料集來進行校正。這個資料集可以是 訓練或驗證資料的子集 (約 100 至 500 個樣本)。詳情請參閱 下方的 representative_dataset() 函式。

從 TensorFlow 2.7 版本,您可以透過以下程式碼指定代表性資料集: signature 如以下範例:

def representative_dataset():
  for data in dataset:
    yield {
      "image": data.image,
      "bias": data.bias,
    }

如果指定的 TensorFlow 模型中有多個簽名,您可以 指定簽名索引鍵,以指定多個資料集:

def representative_dataset():
  # Feed data set for the "encode" signature.
  for data in encode_signature_dataset:
    yield (
      "encode", {
        "image": data.image,
        "bias": data.bias,
      }
    )

  # Feed data set for the "decode" signature.
  for data in decode_signature_dataset:
    yield (
      "decode", {
        "image": data.image,
        "hint": data.hint,
      },
    )

您可以提供輸入張量清單來產生代表資料集:

def representative_dataset():
  for data in tf.data.Dataset.from_tensor_slices((images)).batch(1).take(100):
    yield [tf.dtypes.cast(data, tf.float32)]

自 TensorFlow 2.7 版本以來,建議您使用特徵碼式方法 則適合採用輸入張量清單式的方法 即可快速轉換

為了進行測試,您可以使用虛擬資料集,如下所示:

def representative_dataset():
    for _ in range(100):
      data = np.random.rand(1, 244, 244, 3)
      yield [data.astype(np.float32)]
 

採用浮點備用值的整數 (使用預設的浮點輸入/輸出)

為了完整量化模型, 請勿加入整數 (為確保轉換順利進行),請使用 步驟如下:

import tensorflow as tf
converter = tf.lite.TFLiteConverter.from_saved_model(saved_model_dir)
converter.optimizations = [tf.lite.Optimize.DEFAULT]
converter.representative_dataset = representative_dataset
tflite_quant_model = converter.convert()
敬上

只能使用整數

建立僅限整數的模型是 LiteRT 的常見用途 微控制器珊瑚紅 Edge TPU

此外,為確保與純整數裝置 (例如 8 位元) 相容 微控制器) 和加速器 (例如 Coral Edge TPU) 使用 步驟如下:

import tensorflow as tf
converter = tf.lite.TFLiteConverter.from_saved_model(saved_model_dir)
converter.optimizations = [tf.lite.Optimize.DEFAULT]
converter.representative_dataset = representative_dataset
converter.target_spec.supported_ops = [tf.lite.OpsSet.TFLITE_BUILTINS_INT8]
converter.inference_input_type = tf.int8  # or tf.uint8
converter.inference_output_type = tf.int8  # or tf.uint8
tflite_quant_model = converter.convert()

Float16 量化

您可以將權重量化為 float16,16 位元浮點數的 IEEE 標準。啟用 float16 請使用下列步驟進行權重量化:

import tensorflow as tf
converter = tf.lite.TFLiteConverter.from_saved_model(saved_model_dir)
converter.optimizations = [tf.lite.Optimize.DEFAULT]
converter.target_spec.supported_types = [tf.float16]
tflite_quant_model = converter.convert()

float16 量化的優點如下:

  • 可將模型大小縮減至一半 (因為所有權重均佔 50% 的一半) 原始大小)。
  • 這麼做能降低準確率的損失。
  • 可支援一些可運作的委派項目 (例如 GPU 委派) 直接用於 float16 資料,導致執行速度比 float32 快 運算。

float16 量化的缺點如下:

  • 這不會像定點數學的量化一樣縮短延遲時間。
  • 根據預設,float16 量化模型會「去量化」權重值 調整為在 CPU 上執行時,浮點數為 float32。(請注意,GPU 委派作業無法執行 因為這個超量化功能可對 float16 資料執行運算)。

僅限整數:採用 8 位元權重的 16 位元啟用項目 (實驗功能)

這是實驗性的量化方案。範圍類似「僅限整數」 而是將啟動數量量化,並根據範圍到 16 位元的範圍和權重 會量化為 8 位元整數,並將偏誤量化為 64 位元整數。這個 稱為 16x8 量化

這種量化的主要優點在於可以提高準確率 但模型大小只會稍微增加

import tensorflow as tf
converter = tf.lite.TFLiteConverter.from_saved_model(saved_model_dir)
converter.representative_dataset = representative_dataset
converter.optimizations = [tf.lite.Optimize.DEFAULT]
converter.target_spec.supported_ops = [tf.lite.OpsSet.EXPERIMENTAL_TFLITE_BUILTINS_ACTIVATIONS_INT16_WEIGHTS_INT8]
tflite_quant_model = converter.convert()

如果模型中的部分運算子不支援 16x8 量化,則 模型還是可以量化,但不支援的運算子仍會以浮點值的形式儲存。 下列選項加入 target_spec 即可。

import tensorflow as tf
converter = tf.lite.TFLiteConverter.from_saved_model(saved_model_dir)
converter.representative_dataset = representative_dataset
converter.optimizations = [tf.lite.Optimize.DEFAULT]
converter.target_spec.supported_ops = [tf.lite.OpsSet.EXPERIMENTAL_TFLITE_BUILTINS_ACTIVATIONS_INT16_WEIGHTS_INT8,
tf.lite.OpsSet.TFLITE_BUILTINS]
tflite_quant_model = converter.convert()

此範例提供的準確度提升 量化計畫包括:

  • 高解析度
  • 例如降噪和波束成形技術等音訊訊號處理技術
  • 去除雜訊
  • 使用單張圖片進行 HDR 重建。

這種量化的缺點包括:

  • 由於 但缺少最佳化核心實作
  • 目前與現有的硬體加速 TFLite 不相容 以及委派代表。
,瞭解如何調查及移除這項存取權。

您可以參考這個量化模式的教學課程 請按這裡

模型準確率

由於權重在訓練後經過量化,因此可能會導致準確度下降 尤其是規模較小的網路預先訓練的完全量化模型 提供給 Kaggle 上特定聯播網的廣告 模型 ,直接在 Google Cloud 控制台實際操作。請務必檢查量化模型的準確性 任何準確度降低的情況在可接受的範圍內。你可以利用這些工具 評估 LiteRT 模型 準確率

另外,如果準確度下滑太高,可以考慮使用量化功能 清楚知道 訓練 ,直接在 Google Cloud 控制台實際操作。不過,這種做法需要在模型訓練期間修改,才能新增假資料 量化節點,訓練後的量化技術 頁面使用現有的預先訓練模型

量化張量的表示法

8 位元量化會使用下列指令,近似浮點值 。

\[real\_value = (int8\_value - zero\_point) \times scale\]

此表示法包含兩個主要部分:

  • 每個軸 (又稱「每個管道」) 或每個張量權重,以 int8 two’s 範圍 [-127, 127] 中的互補值,其中零點等於 0。

  • 個別張量啟用/輸入,以 int82 的互補值表示 範圍 [-128, 127],值為零點 [-128, 127]。

如要深入瞭解我們的量化計畫,請參閱量化計畫 spec。想要插入 TensorFlow 的硬體供應商 建議使用 Lite 的委派介面實作量化配置 這些規格。