天天看點

Facebook開源移動端深度學習加速架構,比TensorFlow Lite快一倍

Facebook開源移動端深度學習加速架構,比TensorFlow Lite快一倍

Facebook釋出了一個開源架構,叫QNNPACK,是手機端神經網絡計算的加速包。

官方表示,它可以成倍提升神經網絡的推理效率,幾乎比TensorFlow Lite快一倍。

這個架構,能夠為很多運算加速,比如DW卷積 (Depthwise Convolution) ,許多先進的架構裡面都用得到。

目前,QNNPACK已經是PyTorch 1.0的一部分,在Caffe2裡就能直接使用。

其實,Facebook手機應用裡面,已經部署了這個QNNPACK。也就是說,數以億計的手機都在用了。

從哪個角度加速?

QNNPACK,這個名字眼熟麼?

兩年前,Facebook就推出過一個加速包,叫做NNPACK,Caffe2Go用的就是它。

基于Winograd變換和傅裡葉變換,有效減少卷積計算裡的乘加運算 (Multiply-Add) 。這樣一來,3x3卷積可以隻比1x1慢一倍,而不會慢8倍。

不過,世界變化很快。現在的計算機視覺 (CV) 神經網絡裡,用到的很多卷積類型,已經沾不到NNPACK的光:

比如,1x1卷積,分組卷積 (Grouped Convolution) ,Strided Convolution,擴張卷積 (Dilated Convolution) ,DW卷積 (DepthWise Convolution) ,适用于精度/存儲帶寬受到限制的 (移動端等) 場景。

而CV神經網絡,大部分推理時間,都花在卷積和全連接配接運算上。

Facebook開源移動端深度學習加速架構,比TensorFlow Lite快一倍

這樣的運算,和矩陣乘法密切相關:

大核心的卷積,可以分解成im2col和一個矩陣乘法。

是以,有高效的矩陣乘法,才能有高效的卷積網絡。

于是,QNNPACK出世了。

怎樣加速矩陣乘法?

Facebook開源移動端深度學習加速架構,比TensorFlow Lite快一倍

矩陣乘法,A x B = C。C裡面的每一個元素,都可以看成A中某行和B中某列的點乘。

但直接在點乘基礎上計算的話,一點也不快,會受到存儲帶寬的限制。

Facebook開源移動端深度學習加速架構,比TensorFlow Lite快一倍

如果,能同時計算A中多行和B中多列的點乘,即MRxNR,就能給運算速度帶來猛烈的提升。

不需要太多,這樣細小的改變就夠了。

節省記憶體和緩存

模型訓練,可能更需要高精度。但在訓練完成後,推理部分對精度的需求可能就沒有那麼高了。

低精度的計算,有時對推理的準确性不會産生明顯的影響。

而這樣的運算,不需要太大存儲,并節省能源,有助于把AI部署在移動端。

QNNPACK用的線性量化 (Linear Quantization) 方案,與安卓的神經網絡API相容。

它假設量化值q[i]是用8比特的無符号整數 (Unsigned Integers) 來表示的,以及q[i]與真實值r[i]相關,關系如下:

Facebook開源移動端深度學習加速架構,比TensorFlow Lite快一倍

與其他庫不同,QNNPACK把矩陣A、B都放進一級緩存 (L1 Cache) ,目标是把所有對運算過程并不非常必要的記憶體轉換 (Memory Transformations) 都删掉。

QNNPACK可以在一次微核心調用 (Microkernel Call) 裡,處理A和B。

不需要在微核心之外,累積32位的中間結果,QNNPACK把32位的中間值融合進微核心,然後寫出8位值,節省了存儲帶寬和緩存。

赢了TensorFlow Lite

開發團隊用谷歌的視覺架構MobileNetV2裡面的圖像分類模型來測試。

拿TensorFlow Lite做對手,和QNNPACK比了一場。

Facebook開源移動端深度學習加速架構,比TensorFlow Lite快一倍

結果是,QNNPACK比TensorFlow Lite幾乎快一倍,不論是在高端智能機,還是普通智能機身上。

原文釋出時間為:2018-10-30

本文作者:關注前沿科技

本文來自雲栖社群合作夥伴“

量子位

”,了解相關資訊可以關注“

”。