嵌入式開發版深度學習模型優化方向- Tensorflow Lite

#rpi4, #tensorflow, #tensorflow-lite

距離上次更新又隔了好一陣子。最近工作又回到以往的老本行- 人工智慧、深度學習模型優化與部署任務。之前挑戰過Raspiberry Pi 3B, ASUS Tinkerboard 與 Nvidia Jetson Nano,不得不說,這幾年隨著應用越來越多,整個生態也越來越完整。之前最常碰到的 CPU 版本差異(arm v7l, aarch64)帶來的套件相容性問題獲得大幅度的解決,常用熱門套件的安裝問題越來越少,需要聚焦的反而是模型的運算效能。

這篇文章不細談傳統的程式邏輯等傳統優化方向,主要是著重在既有的程式碼專案中,改善模型的推論效率。首先拋出兩個很容易混淆的名詞- ONNX (Open Neural Network Exchange) 與 Tensorflow Lite。為什麼說這兩個很容易混淆,主要是自己的接觸歷程經驗,這兩個算是差不多時期拋出來的兩個專案,前者是開放式神經網路交換架構文件,主要有鑑於深度學習框架眾多,例如: Tensorflow, Caffe, Pytorch, Keras … 等,各有各的擁戴者。因此,如果模型與模型想要界接的話,就需要透過這個專案來處理。簡而言之,我們可以把他認為就是一個轉換工具,把不擅長的模型權重轉換成自己擅長的架構進行二次開發。後者就是今天的主題- Tensorflow Lite ,他是一個行動裝置程式庫,用於在行動裝置、微控制器和其他邊緣裝置上部署模型。因此對於這類型運算效能有限的機種,或者我會說是不具備GPU加速或者TPU效率有限的行動裝置的模型優化解決方案。

直接上個例子,假設我有一個 Tensorflow Keras 訓練出來的模型檔案。我使用 h5 檔案格式紀錄權重、JSON 檔案格式紀錄模型的細部架構。如果今天我希望透過 Tensorflow Lite 來做,我需要如何轉換。下面我們直接上程式碼:

import tensorflow as tf
from tensorflow.keras.models import model_from_json

# Load the architecture of the model from JSON file
json_file = open('model.json', 'r')
loaded_model_json = json_file.read()
json_file.close()
loaded_model = model_from_json(loaded_model_json)

# Load weights into the new model
loaded_model.load_weights("model.h5")

# 使用 TFLiteConverter 轉換模型
converter = tf.lite.TFLiteConverter.from_keras_model(loaded_model)
converter.optimizations = [tf.lite.Optimize.DEFAULT]
tflite_model = converter.convert()

# 保存 TFLite 模型
with open('model.tflite', 'wb') as f:
    f.write(tflite_model)

整個程式碼架構非常清楚,主要分成3個階段

  1. 讀入模型架構與權重
  2. 使用 TFLiteConverter 轉換模型
  3. 保存轉換後的 TFLite 模型

如果有留意到的話,可以看到有特別的一行代碼

converter.optimizations = [tf.lite.Optimize.DEFAULT]

基本上他是怎麼做到優化的呢? 其實也不難理解,就是降低精度。大概包含以下幾個策略來達到模型優化的目的:

  1. 量化(Quantization):將模型參數從浮點數轉換為整數,從而減小模型大小並加速推理過程。
  2. 去除不必要的操作(Removing Redundant Operations):去除模型中對於推理無關緊要的操作,從而減小模型複雜度。
  3. 合併操作(Merging Operations):將多個操作合併為一個操作,從而減小計算量。
  4. 減少精度(Reducing Precision):減小操作的數值精度,從而在一定程度上降低模型的計算負擔。
  5. Fused 常見操作(Fused Common Operations):將一些常見的操作合併為一個操作,提高推理速度。

簡單說明功能與測試環境與條件

  • 功能: 這個模型是讀入一張人臉判別他的情緒,一共有6種情緒指標- 0=Angry, 1=Disgust, 2=Fear, 3=Happy, 4=Sad, 5=Surprise, 6=Neutral;
  • 主機: Raspiberry Pi 4 (RAM: 4GB, emmc: 32GB)
  • 作業系統: Raspberry Pi OS 64bits
  • 深度學習運行框架: Tensorflow 2.4.0

最後來張表格,比較一下優化前後差異

既有模型使用優化策略不使用優化策略
FPS3.0 6.26.5
H5 to TensorFlow Lite 模型優化前後差異

果然效能改善將近1倍以上,還提升模型在使用上的便利,不需要分別匯入2個模型檔案,而是直接讀入 tflite 就可以進行推算,其他的代碼也不大需要特別調整。

發佈留言