量化是在 CPU 上最流行的加速神經(jīng)網(wǎng)絡(luò)推理方法之一。去年,TensorFlow Lite 通過 XNNPACK 后端提高了浮點(diǎn)模型的性能。如今,我們將 XNNPACK 后端擴(kuò)展至量化模型。各個(gè)計(jì)算機(jī)視覺模型就表現(xiàn)而言,與默認(rèn)的 TensorFlow Lite 量化內(nèi)核相比,改擴(kuò)展在 ARM64 手機(jī)上的速度平均提升 30%,在 x86-64 筆記本電腦及桌面設(shè)備系統(tǒng)上提升 5 倍,在 WebAssembly SIMD 的瀏覽器內(nèi)推理上提升 20 倍。
TensorFlow Lite
https://tensorflow.google.cn/lite
XNNPACK 后端
https://github.com/tensorflow/tensorflow/blob/master/tensorflow/lite/delegates/xnnpack/README.md
XNNPACK 中的量化推理針對(duì) TensorFlow 模型優(yōu)化工具包所用的對(duì)稱量化架構(gòu)進(jìn)行了優(yōu)化。XNNPACK 既支持傳統(tǒng)的按張量量化架構(gòu),也支持較新且準(zhǔn)確率更高的帶有權(quán)重渠道量化和激活按張量量化的架構(gòu)。此外,XNNPACK 還支持非對(duì)稱量化架構(gòu),但效率有所降低。
對(duì)稱量化架構(gòu)
https://tensorflow.google.cn/lite/performance/quantization_spec#symmetric_vs_asymmetric
傳統(tǒng)的按張量量化架構(gòu)
https://arxiv.org/abs/1712.05877
帶有權(quán)重渠道量化和激活按張量量化的架構(gòu)
https://arxiv.org/abs/1806.08342
性能提升
我們?cè)谝恍┻吘壴O(shè)備和神經(jīng)網(wǎng)絡(luò)架構(gòu)針對(duì) XNNPACK 加速的量化推理進(jìn)行了評(píng)估。我們以下文介紹的四個(gè)公開模型和兩個(gè)內(nèi)部量化模型為基準(zhǔn),它涵蓋了常見的計(jì)算機(jī)視覺任務(wù):
1.EfficientNet-Lite0 圖像分類 [下載]
下載
https://tfhub.dev/tensorflow/lite-model/efficientnet/lite0/int8/2
2.EfficientDet-Lite0 對(duì)象檢測(cè) [下載]
EfficientDet-Lite0
https://arxiv.org/abs/1911.09070
下載
https://tfhub.dev/tensorflow/lite-model/efficientdet/lite0/int8/1
3.DeepLab v3 分割,使用 MobileNet v2 特征提取器 [下載]
DeepLab v3
https://ai.googleblog.com/2018/03/semantic-image-segmentation-with.html
MobileNet v2
https://arxiv.org/abs/1801.04381
下載
https://tfhub.dev/sayakpaul/lite-model/deeplabv3-mobilenetv2/1/default/1
4.CartoonGAN 圖像風(fēng)格轉(zhuǎn)化 [下載]
CartoonGAN
https://ieeexplore.ieee.org/document/8579084
下載
https://tfhub.dev/sayakpaul/lite-model/cartoongan/int8/1
5.Face Mesh 特征點(diǎn)的量化版本
6.視頻分割的量化版本
視頻分割
https://ai.googleblog.com/2018/03/mobile-real-time-video-segmentation.html
使用 XNNPACK 在 Android/ARM64 手機(jī)上對(duì)量化的計(jì)算機(jī)視覺模型進(jìn)行單線程推理時(shí)的速度提升
在六個(gè) Android ARM64 移動(dòng)設(shè)備上,XNNPACK 與默認(rèn)的 TensorFlow Lite 量化內(nèi)核相比,平均提升 30%。
使用 XNNPACK 在 x86-64 筆記本電腦和桌面設(shè)備系統(tǒng)上對(duì)量化的計(jì)算機(jī)視覺模型進(jìn)行單線程推理時(shí)的速度提升
XNNPACK 在搭載 x86 處理器的筆記本電腦和桌面設(shè)備系統(tǒng)上有了更大幅度的提升。在我們基準(zhǔn)測(cè)試中的 5 個(gè) x86 處理器上,XNNPACK 將推理速度平均提升 5 倍。值得注意的是,不支持 AVX 指令集的低端和老式處理器,通過將量化推理轉(zhuǎn)換為 XNNPACK,將速度提升 20 倍以上,而 TensorFlow Lite 以前的推理后端只針對(duì) AVX、AVX2 和 AVX512 指令集優(yōu)化了,而 XNNPACK 則為所有 x86-64 處理器提供了優(yōu)化實(shí)現(xiàn)。
通過 V8 運(yùn)行時(shí),使用 XNNPACK 在手機(jī)、筆記本電腦和桌面設(shè)備上對(duì)量化的計(jì)算機(jī)視覺模型進(jìn)行單線程 WebAssembly SIMD 推理的速度提升
除了傳統(tǒng)的移動(dòng)設(shè)備和筆記本電腦/桌面設(shè)備平臺(tái)外,XNNPACK 還通過 TensorFlow Lite Web API 為網(wǎng)絡(luò)平臺(tái)進(jìn)行量化推理加速。上圖展示了在 3 個(gè) x86-64 和 2 個(gè) ARM64 系統(tǒng)上通過 V8 JavaScript 引擎運(yùn)行 WebAssembly SIMD 基準(zhǔn)時(shí),與默認(rèn)的 TensorFlow Lite 實(shí)現(xiàn)相比,幾何速度平均提升 20 倍。
TensorFlow Lite Web API
https://github.com/tensorflow/tfjs/tree/master/tfjs-tflite
兩年的優(yōu)化
XNNPACK 起初是 QNNPACK 庫(kù)的一個(gè)分支,但是由于 XNNPACK 的第一個(gè)版本專注于浮點(diǎn)推理,而 QNNPACK 專注于量化推理,因此無(wú)法將兩者進(jìn)行比較。如今,隨著 XNNPACK 引入對(duì)量化推理的支持及近兩年的性能優(yōu)化,我們可以直接評(píng)估。
QNNPACK
https://github.com/pytorch/QNNPACK
為了比較這兩個(gè)量化推理后端,我們將隨機(jī)的 MobileNet v1 和 MobileNet v2 模型從 XNNPACK API 移植到 QNNPACK API,并在兩個(gè) ARM64 Android 手機(jī)和兩個(gè) x86-64 系統(tǒng)上對(duì)其單線程性能進(jìn)行了基準(zhǔn)測(cè)試。上圖顯示了結(jié)果,XNNPACK 在兩年內(nèi)取得了驚人的進(jìn)步。XNNPACK 在舊的 Pixel 3a 手機(jī)上的速度提升 50%,在新的 Pixel 4a 手機(jī)上速度提升 4 到 5 倍,在 x86-64 筆記本電腦上提升 2.5X,在 x86-64 工作站上提升 3 倍多。XNNPACK 從 QNNPACK 派生出來(lái)后的兩年中進(jìn)行了多種優(yōu)化,這使其性能提升:
MobileNet v1
https://github.com/google/XNNPACK/blob/master/models/qs8-mobilenet-v1.cc
MobileNet v2
https://github.com/google/XNNPACK/blob/master/models/qs8-mobilenet-v2.cc
●
XNNPACK 保留了 QNNPACK 中的優(yōu)化,如間接卷積算法和針對(duì)微架構(gòu)的微內(nèi)核選擇,并通過間接反卷積算法將其進(jìn)一步增強(qiáng),同時(shí)具備更靈活的能力,如量化加法運(yùn)算符和量化乘法運(yùn)算符中內(nèi)置的類 numpy 廣播。
間接卷積算法
https://arxiv.org/abs/1907.02129
間接反卷積算法
https://ieeexplore.ieee.org/document/9150450
●
卷積、反卷積和全連接運(yùn)算符將 8 位激活和權(quán)重的乘積累積為 32 位數(shù)字,最終需要將該數(shù)字轉(zhuǎn)換回來(lái),或者重新量化為 8 位數(shù)字。有多種方法可以實(shí)現(xiàn)重新量化,但 QNNPACK 采用了來(lái)自 GEMMLOWP庫(kù)的架構(gòu),該庫(kù)開創(chuàng)了神經(jīng)網(wǎng)絡(luò)推理的量化計(jì)算。然而,人們后來(lái)發(fā)現(xiàn) GEMMLOWP 的重新量化架構(gòu)在準(zhǔn)確率和性能方面并不是最優(yōu)的,XNNPACK 憑借更高的性能和準(zhǔn)確率取代了它。
GEMMLOWP 庫(kù)
https://github.com/google/gemmlowp
●
QNNPACK 以非對(duì)稱量化架構(gòu)為目標(biāo),其中激活和權(quán)重都表示為無(wú)符號(hào)整數(shù),并帶有零點(diǎn)和比例量化參數(shù),而 XNNPACK 的優(yōu)化專注于對(duì)稱量化,其中激活和權(quán)重都是有符號(hào)整數(shù),且權(quán)重有額外的限制:權(quán)重的零點(diǎn)始終為零,量化的權(quán)重被限制在 [-127, 127] 范圍間(雖然 -128 可以表示為有符號(hào) 8 位整數(shù),但是仍被排除在外)。在 XNNPACK 中利用對(duì)稱量化時(shí)具有兩個(gè)計(jì)算優(yōu)勢(shì)。首先,過濾器權(quán)重是靜態(tài)時(shí),輸入零點(diǎn)與過濾器權(quán)重的乘積累積結(jié)果可以完全融合到卷積、反卷積和全連接運(yùn)算符中的偏移項(xiàng)中。因此,推理計(jì)算中完全沒有零點(diǎn)參數(shù)。其次,有符號(hào)的 8 位輸入元素與限制在 [-127, 127] 的權(quán)重元素的乘積可以填入 15 位。如此一來(lái),卷積、反卷積和全連接運(yùn)算符的微內(nèi)核能夠在 16 位變量上進(jìn)行一半的累積,而不是始終將乘積擴(kuò)展到 32 位。
表示為無(wú)符號(hào)整數(shù),并帶有零點(diǎn)和比例量化參數(shù)
https://arxiv.org/abs/1712.05877
●
QNNPACK 微內(nèi)核針對(duì) ARM 上的 NEON SIMD 指令集和 x86 上的 SSE2 SIMD 指令集進(jìn)行了優(yōu)化,但 XNNPACK 支持更多的特定指令集優(yōu)化。XNNPACK 中的大多數(shù)量化微內(nèi)核都針對(duì) x86/x86-64 上的 SSE2、SSE4.1、AVX、XOP、AVX2 和 AVX512 指令集,ARM/ARM64 上的 NEON、NEON V8 和 NEON 點(diǎn)積指令集,以及 WebAssembly SIMD 指令集進(jìn)行了優(yōu)化。此外,XNNPACK 為 WebAssembly 1.0 和 pre-NEON ARM 處理器提供標(biāo)量支持。
●
QNNPACK 為高端 ARM 和低端 ARM 內(nèi)核引入了提供專門匯編微內(nèi)核的想法,而 XNNPACK 將這一想法進(jìn)一步推進(jìn)。XNNPACK 不僅針對(duì) Cortex-A53、Cortex-A55 以及具有或不具有 NEON 點(diǎn)積指令集的高端內(nèi)核的專門專家調(diào)整軟件流水線匯編微內(nèi)核,甚至在它們之間還支持實(shí)時(shí)切換。進(jìn)行推理的線程從大核遷移到小核時(shí),XNNPACK 會(huì)自動(dòng)適應(yīng),從使用針對(duì)大核優(yōu)化的微內(nèi)核轉(zhuǎn)換到針對(duì)小核優(yōu)化的微內(nèi)核。
●
QNNPACK 主要專注于多線程推理,并將計(jì)算分割成大量的小任務(wù),每個(gè)任務(wù)計(jì)算輸出張量的一個(gè)小切片。XNNPACK 重新設(shè)計(jì)了并行化,讓任務(wù)變得靈活:可以分割為細(xì)粒度或粗粒度,具體取決于參與并行化的線程數(shù)量。通過動(dòng)態(tài)調(diào)整任務(wù)粒度,XNNPACK 在單線程執(zhí)行中實(shí)現(xiàn)了低開銷,在多線程推理中實(shí)現(xiàn)了高并行化效率。
總之,這些優(yōu)化讓 XNNPACK 擁有最先進(jìn)的量化推理能力,且讓 TensorFlow Lite 成為最通用的量化推理解決方案,涵蓋包括 Raspberry Pi Zero、Chromebook,以及具有服務(wù)器類處理器的工作站在內(nèi)的眾多系統(tǒng)。
如何使用?
量化的 XNNPACK 推理在所有平臺(tái) TensorFlow Lite 的 CMake 構(gòu)建,以及網(wǎng)絡(luò)平臺(tái) TensorFlow Lite 的 Bazel 構(gòu)建中默認(rèn)啟用,并將在 2.7 版本的 TensorFlow Lite Web API 中可用。在其他平臺(tái)的 Bazel 構(gòu)建中,量化的 XNNPACK 推理通過構(gòu)建時(shí)的選擇機(jī)制啟用。使用 Bazel 構(gòu)建 TensorFlow Lite 時(shí),如果添加 --define tflite_with_xnnpack=true --define xnn_enable_qs8=true,TensorFlow Lite 解釋器將默認(rèn)使用 XNNPACK 后端,使用具有對(duì)稱量化的受支持運(yùn)算符。可以通過添加 --define xnn_enable_qu8=true Bazel 選項(xiàng),對(duì)非對(duì)稱量化的運(yùn)算符進(jìn)行有限支持。
TensorFlow Lite Web API
https://github.com/tensorflow/tfjs/tree/master/tfjs-tflite
可加速哪些運(yùn)算?
XNNPACK 后端目前支持量化的 TensorFlow Lite 運(yùn)算符的子集(請(qǐng)參閱文檔,了解詳細(xì)信息和限制)。XNNPACK 支持由模型優(yōu)化工具包通過訓(xùn)練后的整數(shù)量化和量化感知訓(xùn)練產(chǎn)生的模型,但不支持訓(xùn)練后的動(dòng)態(tài)范圍量化。
文檔
https://github.com/tensorflow/tensorflow/blob/master/tensorflow/lite/delegates/xnnpack/README.md#quantized-operators
未來(lái)展望
這是 XNNPACK 集成到 TensorFlow Lite 后的第三個(gè)版本,之前是浮點(diǎn)實(shí)現(xiàn)的初始版本以及引入稀疏推理支持的后續(xù)版本。在未來(lái)版本中,我們將添加以下改進(jìn):
●
最新 ARM 處理器上的半精度推理
●
稀疏量化推理。
●
更加快速的密集推理。
希望您能在 GitHub 和 StackOverflow 頁(yè)面上積極發(fā)表您的想法和評(píng)論,您也可以在 discuss.tensorflow.org 上提問。
GitHub
https://github.com/tensorflow/tensorflow/issues
StackOverflow
https://stackoverflow.com/questions/tagged/tensorflow-lite
discuss.tensorflow.org
http://discuss.tensorflow.org
責(zé)任編輯:haq
-
cpu
+關(guān)注
關(guān)注
68文章
10901瀏覽量
212759 -
模型
+關(guān)注
關(guān)注
1文章
3298瀏覽量
49112
原文標(biāo)題:用 XNNPACK 加速量化推理
文章出處:【微信號(hào):tensorflowers,微信公眾號(hào):Tensorflowers】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論