0
雷鋒網 AI 開發者按:近日,TensorFlow 強勢推出能將模型規模壓縮卻幾乎不影響精度的半精度浮點量化(float16 quantization)工具。小體積、高精度,還能夠有效的改善 CPU 和硬件加速器延遲。TensorFlow 發出相應的文章對該工具做了簡要的說明,雷鋒網 AI 開發者將其整理編譯如下。

我們非常高興能夠將訓練后的 float16 quantization 作為模型優化工具包(Model Optimization Toolkit)的一部分。這套工具包括了:
混合量化(https://medium.com/tensorflow/introducing-the-model-optimization-toolkit-for-tensorflow-254aca1ba0a3 )
修剪(https://medium.com/tensorflow/tensorflow-model-optimization-toolkit-pruning-api-42cac9157a6a )
在計算中,半精度是二進制浮點計算機數字格式,占用計算機存儲器中的 16 位。在 IEEE 754-2008 標準中,16 位 base-2 格式稱為 binary16。它用于在高精度對于執行算術計算不是必需的應用中存儲浮點值,并且 IEEE 754 標準將 binary16 指定為具有以下格式:
Sign bit(符號位): 1 bit
Exponent width(指數位寬): 5 bits
Significand precision(尾數精度): 11 bits (有10位被顯式存儲)

圖 1 IEEE 754 標準下 binary16 的格式
訓練后的 float16 quantization 減少了 TensorFlow Lite 模型的大小(高達 50%),同時以少量的精度損失為代價。它將模型常量(如權重和偏差值)從全精度浮點(32 位)量化為減少精度的浮點數據類型(IEEE FP16)。
訓練后的 float16 quantization 是量化 TensorFlow Lite 模型很好的方法,因為它對精度的影響極小并且能夠使得模型大小顯著減小。在這里可以通過查看該文檔(包括一個新的浮動圖表,https://www.tensorflow.org/lite/performance/post_training_quantization),以幫助你了解不同的量化選項和場景。

圖 2 幫助確定合適量化場景的決策樹
尤其是在部署到邊緣時,降低精度將產生很大的收益。
模型尺寸減少 2 倍。模型中的所有常量值都存儲在 16 位浮點數而不是 32 位浮點數中;由于這些常量值通常在整個模型尺寸中占主導地位,因此通常會將模型的尺寸減小約一半。
精確度損失可忽略不計。深度學習模型通常能夠在使用相較于最初訓練時更少精確度的情況下,產生良好的推理結果。并且在我們對多個模型的實驗中,我們發現推理質量幾乎沒有損失。例如圖 4 中,MobileNet V2 top 1 的測試結果顯示,其精度降低值小于 0.03%。
模型尺寸測試結果
訓練后的 float16 quantization 對精度的影響很小,并可以使得深度學習模型的大小減小約 2 倍。
以下是在 MobileNet V1 和 V2 模型以及 MobileNet SSD 模型的一些測試結果。其中,MobileNet v1 和 v2 的結果基于 ImageNet 圖像識別任務測得,而 MobileNet SSD 模型則在 COCO 目標檢測任務上評估而得。

圖 3 不同模型下模型大小變化
模型精度測試結果
在 ILSVRC 2012 圖像分類任務中,我們評估了標準 Mobilenet Float32 模型(和 FP16 變體)。在 COCO 目標檢測任務中,我們對 Mobilenet SSD float32 模型及其 fp16 變體進行了評估。

圖 4 不同模型下精度損失測試結果
用戶可以在 TensorFlow Lite converter 上指定訓練后的 float16 quantization,即使用經過訓練的 float32 模型,將優化設置為 DEFAULT,然后再將目標規范支持的類型設置為 float16 常量。

圖 5 模型參數相關設置
轉換模型后,用戶就可以像任何其它 TensorFlow Lite 模型那樣直接運行該模型了。默認情況下,模型將在 CPU 上運行,通過將 16 位參數「上采樣」為 32 位,然后在標準 32 位浮點運算中執行操作。在今后的優化過程中,我們也希望能夠有更多的硬件支持加速 fp16 計算,這樣半精度值就不再需要進行「上采樣」的操作,而是直接進行計算。
同時,用戶還可以在 GPU 上運行模型。我們已經增強了 TensorFlow Lite GPU 代理,以接收 16 位精度參數并直接運行(而無需像在 CPU 上那樣先進行轉換)。
在應用程序中,用戶可以通過 TfLiteGpuDelegateCreate 函數(文檔)創建 GPU 代理。需要注意的是在為代理指定選項時,請確保將 precision_loss_allowed 設置為 1,從而使其能夠在 GPU 上直接使用 float16 操作。

圖 6 在 GUP 上運行模型的參數設置
有關 GPU 委托的概述,可以參閱我們之前的帖子(https://medium.com/tensorflow/tensorflow-lite-now-faster-with-mobile-gpus-developer-preview-e15797e6dee7);如果想進一步了解該工具,可以在 CoLab 教程中查看 float16 quantization 工具的使用示例。
原文鏈接:
CoLab 教程:
雷鋒網 AI 開發者
雷峰網原創文章,未經授權禁止轉載。詳情見轉載須知。