網絡模型小型化--量化

在這裏插入圖片描述

網絡模型量化

模型量化

以更少位數的數據類型用於近似表示32位有限範圍浮點型數據的過程

模型的輸入輸出依然是浮點型

達到減少模型尺寸大小、減少模型內存消耗及加快模型推理速度等目標

原理

  • 模型量化橋接了定點與浮點,建立了一種有效的數據映射關係,使得以較小的精度損失代價獲得了較好的收益
  • 由浮點到定點的量化
  • 由定點到浮點反量化

優缺點

好處

  • 減小模型尺寸,如8位整型量化可減少75%的模型大小
  • 減少存儲空間,在邊緣側存儲空間不足時更具有意義
  • 易於在線升級,模型更小意味着更加容易傳輸
  • 減少內存耗用,更小的模型大小意味着不需要更多的內存
  • 加快推理速度,訪問一次32位浮點型可以訪問四次int8整型,整型運算比浮點型運算更快
  • 減少設備功耗,內存耗用少了推理速度快了自然減少了設備功耗
  • 支持微處理器,有些微處理器屬於8位的,低功耗運行浮點運算速度慢,需要進行8bit量化

缺點

  • 模型量化增加了操作複雜度,在量化時需要做一些特殊的處理,否則精度損失更嚴重
  • 模型量化會損失一定的精度,雖然在微調後可以減少精度損失,但推理精度確實下降

TF模型的兩類量化方式

針對已經訓練好的模型進行量化

  • TensorFlow Lite converter

  • TensorFlow Lite Optimizing COnverter(toco命令工具)

  • 需要結合業務場景及所擁有的硬件資源選擇量化的方式,目的是以最小損失達到最大化模型量化效果

  • 訓練後量化幾種方案

    • 混合量化–僅量化權重

      • 浮點型的權重量化爲int8整型,可將模型大小直接減少75%、提升推理速度最大3倍
      • 推理的過程中,需要將int8量化值反量化爲浮點型後再進行計算
      • 如果某些Ops不支持int8整型量化,那麼其保存的權重依然是浮點型的
    • 全整型量化–權重和激活值都進行量化

      • 試圖將權重、激活值及輸入值均全部做int8量化,並且將所有模型運算操作置於int8下進行執行,以達到最好的量化效果
      • 需要一個具有代表性的小數據集,用於統計激活值和輸入值等的浮點型範圍,以便進行精準量化
    • 半精度float16量化–僅量化權重

      • 將權重量化爲半精度float16形式,其可以減少一半的模型大小、相比於int8更小的精度損失
      • 如果硬件支持float16計算的話那麼其效果更佳
      • 在CPU運行時,半精度量化也需要像int8量化一樣進行反量化到float32在進行計算
      • GPU可以支持float16運算

TF量化感知訓練(Quantization-aware training)

  • 僞量化的過程

  • 在可識別的某些操作內嵌入僞量化節點(fake quantization nodes)

    • 用以統計訓練時流經該節點數據的最大最小值,便於在使用TOCO轉換tflite格式時量化使用並減少精度損失

    • 需要對訓練和推理過程添加代碼

      • 第一步,在訓練圖結構內添加僞量化節點
      • 第二步,重寫推理圖結構並保存爲新的模型
      • 第三步,轉換模型爲全量化模型

兩種方式的有缺點比較

  • 兩者均可達到模型量化的作用
  • 兩者的推理工作原理是一樣的
  • 兩者都可工作在Tensorflow lite推理框架下並進行相應加速
  • 訓練後量化工作量稍微簡單些,而量化感知訓練工作量更繁瑣一些
  • 量化感知訓練比訓練後量化損失的精度更少,官方推薦使用量化感知訓練方式
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章