模型最佳化

邊緣裝置的記憶體或運算能力通常有限。您可以對模型套用各種最佳化設定,以便在這些限制條件內執行模型。此外,部分最佳化作業可使用專用硬體加速推論。

LiteRT 和 TensorFlow 模型最佳化工具包提供相關工具,可將推論最佳化的複雜度降至最低。

建議您在應用程式開發過程中考慮模型最佳化。本文將概述一些最佳做法,說明如何最佳化 TensorFlow 模型,以便部署至邊緣硬體。

為什麼要將模型最佳化

模型最佳化可從多方面協助應用程式開發。

縮減大小

您可以運用某些最佳化方法縮減模型大小。較小的模型有下列優點:

  • 較小的儲存空間:較小的模型佔用使用者裝置的儲存空間較少。舉例來說,如果 Android 應用程式使用較小的模型,使用者行動裝置上的儲存空間用量就會減少。
  • 縮減下載大小:較小的模型下載到使用者裝置時,所需時間和頻寬較少。
  • 減少記憶體用量:執行較小的模型時,使用的 RAM 較少,可釋出記憶體供應用程式其他部分使用,進而提升效能和穩定性。

在上述所有情況下,量化作業都能縮減模型大小,但可能會犧牲部分準確度。修剪和叢集化可讓模型更容易壓縮,進而縮減模型大小,方便下載。

縮短延遲

延遲時間是指使用特定模型執行單一推論所需的時間。某些最佳化方式可減少使用模型執行推論所需的運算量,進而降低延遲時間。延遲也可能影響耗電量。

目前,量化可簡化推論期間發生的計算,藉此降低延遲時間,但可能會犧牲部分準確度。

加速器相容性

部分硬體加速器 (例如 Edge TPU) 可搭配經過適當最佳化的模型,以極快的速度執行推論作業。

一般來說,這類裝置需要以特定方式量化模型。如要進一步瞭解各硬體加速器的需求,請參閱相關說明文件。

缺點

最佳化作業可能會導致模型準確度發生變化,因此在應用程式開發過程中,請務必將這點納入考量。

準確度變化取決於要最佳化的個別模型,因此很難事先預測。一般來說,針對大小或延遲情況進行最佳化的模型,準確率會稍微降低。視應用程式而定,這可能會影響使用者體驗,也可能不會。在極少數情況下,某些模型可能會因最佳化程序而提高準確度。

最佳化類型

LiteRT 目前支援透過量化、修剪和叢集化進行最佳化。

這些是 TensorFlow 模型最佳化工具包的一部分,可提供與 TensorFlow Lite 相容的模型最佳化技術資源。

量化

量化會降低用於表示模型參數的數字精確度,預設為 32 位元浮點數。這會縮減模型大小並加快運算速度。

LiteRT 提供下列量化類型:

做法 資料條件 縮減大小 準確率 支援的硬體
訓練後的 float16 量化 無資料 最多 50% 準確度損失不顯著 CPU、GPU
訓練後的動態範圍量化 無資料 最多 75% 準確度損失最小 CPU、GPU (Android)
訓練後的整數量化 未標記的代表性樣本 最多 75% 準確度略有下降 CPU、GPU (Android)、EdgeTPU
量化感知訓練 已加上標籤的訓練資料 最多 75% 準確度損失最小 CPU、GPU (Android)、EdgeTPU

根據預期模型大小和準確度,下列決策樹可協助您選取模型可能要使用的量化配置。

quantization-decision-tree

以下是幾種模型在訓練後量化和量化感知訓練的延遲時間和準確率結果。所有延遲數字都是在 Pixel 2 裝置上測得,且使用單一大型核心 CPU。隨著工具包的改善,這裡的數字也會隨之提升:

型號 Top-1 Accuracy (Original) 最高準確率 (訓練後量化) 最高準確率 (量化感知訓練) 延遲時間 (原始) (毫秒) 延遲時間 (訓練後量化) (毫秒) 延遲時間 (量化感知訓練) (毫秒) 大小 (原始) (MB) 大小 (最佳化) (MB)
Mobilenet-v1-1-2240.7090.6570.70 1241126416.94.3
Mobilenet-v2-1-2240.7190.6370.709 899854143.6
Inception_v30.780.7720.775 113084554395.723.9
Resnet_v2_1010.7700.768不適用 39732868不適用178.344.9
表 1:針對特定 CNN 模型進行模型量化的好處

透過 int16 啟動項目和 int8 權重進行完整整數量化

透過 int16 啟動項目進行量化 是完整的整數量化機制,啟動項目為 int16,權重為 int8。與啟動和權重皆為 int8 的完整整數量化配置相比,這個模式可提升量化模型的準確度,同時維持類似的模型大小。如果啟動對量化很敏感,建議使用這項功能。

注意:目前 TFLite 僅提供此量化機制未經最佳化的參考核心實作,因此預設效能會比 int8 核心慢。目前只能透過專用硬體或自訂軟體,充分發揮這個模式的優勢。

以下是部分模型在啟用這項模式後的準確率結果。

型號 準確度指標類型 準確度 (float32 啟動) 準確度 (int8 啟動) 準確度 (int16 啟動)
Wav2letterWER6.7%7.7% 7.2%
DeepSpeech 0.5.1 (未展開)CER6.13%43.67% 6.52%
YoloV3mAP(IOU=0.5)0.5770.563 0.574
MobileNetV1最高準確率0.70620.694 0.6936
MobileNetV2最高準確率0.7180.7126 0.7137
MobileBertF1(完全比對)88.81(81.23)2.08(0) 88.73(81.15)
表 2:透過 int16 啟動項目進行模型量化的好處

修剪

剪除的運作方式是移除模型中對預測結果影響不大的參數。修剪後的模型在磁碟上大小相同,且具有相同的執行階段延遲,但可以更有效地壓縮。因此,剪枝是減少模型下載大小的實用技術。

日後,LiteRT 將可減少修剪模型的延遲時間。

分群

分群: 將模型中每一層的權重分組為預先定義數量的叢集,然後提供每個叢集所屬權重的群集中心值。這樣一來,模型中唯一權重值的數量就會減少,複雜度也會降低。

因此,叢集模型可以更有效地壓縮,提供與修剪類似的部署優勢。

開發工作流程

首先,請檢查託管模型中的模型是否適用於您的應用程式。如果沒有,建議使用者先使用訓練後量化工具,因為這項工具適用範圍廣泛,且不需要訓練資料。

如果無法達到準確度和延遲目標,或是硬體加速器支援很重要,建議採用量化感知訓練。如要瞭解其他最佳化技術,請參閱 TensorFlow 模型最佳化工具包

如要進一步縮減模型大小,可以先嘗試剪除和/或叢集化模型,再進行量化。