基於ARM在cpu上作神經網絡加速

本文將嘗試回答一個簡單的問題:什麼庫/工具包/框架能夠幫助咱們優化訓練模型的推理時間?本文只討論已爲ARM架構芯片提供C / C ++接口的工具包和庫(因爲嵌入式設備上使用 ,咱們不多Lua 或 Python),限於文章篇幅,不闡述另一種加速神經網絡推理的方法,即修改網絡架構,從SqeezeNet架構可看出,修改網絡架構是一個可行的方案。基於上述緣由,本文涉及的實驗只涉及使用Caffe,TensorFlow和MXNet這3個開源的深度學習框架html

加速神經網絡模型在硬件平臺計算速度,兩個主要有大的策略:git

1)修改神經網絡的模型;github

2)加快框架運行速度。算法

固然,將這兩個策略結合起來使用,也是一種不錯的思路。後端

修改神經網絡模型有兩種方法,一是經過下降權重精度實現,即下降特徵量化的精度,二是經過權重剪枝來實現,權重剪枝的背後的思想是下降系統參數的冗餘。下降權重低精度一般採用(用定點數或動態定點數表示浮點數的方法,支持這種作法的原理是:推理過程並不須要高精度,由於在運算過程當中,計算的線性性質和非線性的動態範圍壓縮,使得量化偏差僅在子線性地(sub-linearly)範圍內傳遞,從而不會引發數值的劇烈變更。更進一步,咱們可使用低精度乘法來訓練神經網絡模型。結合 SIMD 指令集,好比 SSE3,可使特徵量化過程能夠更爲高效,從而加速訓練過程。然而,目前咱們還很難找到同時使用了這二者的解決方案。好比使用Ristretto框架能夠執行有限精度的自動量化,但它卻並無下降計算負載。TensorFlow 也能夠執行量化,但其推理時間實際上卻增長了 5 到 20 倍,由於TensorFlow還引入了輔助量化/去量化的計算節點。所以在實際操做中,咱們只把量化做爲壓縮網絡權重的方法,當存儲空間有限時能夠這樣操做,至少這已是當前最早進的技術。網絡

從另一個角度看,咱們可採用加快框架的執行時間的方法,這種方法不會影響到模型的參數。這種策略主要上採用優化矩陣之間的乘法(GEMM)類的通用計算技巧,從而同時影響卷積層(其計算一般是 im2col + GEMM)和全鏈接層。除此以外,可使用神經網絡的加速包NNPACK,就我的理解,NNPACK的核心思路是使用快速傅里葉變換將時間域中的卷積運算轉換成了頻域中的乘法運算。架構

加快框架執行速度另外一種方法是將網絡模型和權重配置轉換成針對目標平臺代碼,並對代碼進行優化,而不是讓它們直接在某一個框架內運行。這種方法的典型案例是 TensorRT。還有 CaffePresso, 能夠將 Caffe中prototxt類型的文件定製成適用於各類不一樣硬件平臺的低規格版本。然而,TensorRT 的運行須要CUDA,並且只能在 NVIDIA的 GPU中才能使用,而 CaffePresso 也須要某種硬件加速器(DSP、FPGA 或 NoC)框架

上述內容仔細地評估現有的解決辦法後,我發現如下幾種方法可以加速當前流行的可用模型的推理:iphone

  •  若是你的框架中使用了 OpenBLAS(基礎線性代數程序集的開源實現),你能夠嘗試使用其爲深度學習進行過優化的分支: https://github.com/xianyi/OpenBLAS/tree/optimized_for_deeplearning工具

  • NNPACK 能和其餘一些框架(包括 Torch、Caffe 和 MXNet)聯合使用:http://github.com/Maratyszcza/NNPACK

  • 將TensorFlow編譯爲在樹莓派平臺的目標代碼時,你可使用一些編譯優化標誌,從而充分利用NEON 指令集加速目標代碼的執行速度:http://github.com/tensorflow/tensorflow/tree/master/tensorflow/contrib/makefile#raspberry-pi

 基於以上3種方法,我歸納出如下調測配置:

1. 使用以 OpenBLAS爲後端的Caffe 主分支(caffe-openblas);

2. 使用以 OpenBLAS爲後端OpenBLAS 且爲深度學習優化過的Caffe分支版本(caffe-openblas-dl);

3. 編譯TensorFlow時,使用優化編譯標誌 OPTFLAGS="-Os" (tf-vanilla)

4. 編譯TensorFlow時,使用優化編譯標誌 OPTFLAGS="-Os -mfpu=neon-vfpv4 -funsafe-math-optimizations -ftree-vectorize" (tf-neon-vfpv4)

5. 使用以OpenBLAS實現基礎線性代數程序集的Vanilla MXNet

6. 使用帶有 OpenBLAS 、且爲深度學習優化過MXNet 分支版本(mxnet-openblas-dl)。

你可能會疑惑:配置中怎麼沒有 NNPACK?這確實有點複雜,由 ajtulloch 建立的 Caffe 分支提供了最直接的使用 NNPACK方法。然而自從它被集成進去之後,NNPACK 的API接口 就已經改變了,而且目前我沒法編譯它。Caffe2 對 NNPACK 有原生支持,但我不會考慮 Caffe2,由於它處於實驗性階段而且幾乎對 Caffe 進行了還沒有文檔化的重構。另一個選項就是使用 Maratyszcza的caffe-nnpack分支,但該分支比較老舊且已經中止維護。

另一個問題就是出於NNPACK自己。它只提供了Android/ARM平臺的交叉編譯配置,並不提供在 Linux/ARM 平臺上的交叉編譯配置。結合MXNet,我嘗試編譯目標平臺代碼,但結果沒法在目標平臺上正常運行。我只能在臺式電腦上運行它,可是我並無看到比 OpenBLAS 會有更好的性能。因爲個人目標是評估已經可用的解決方法,因此我只能推遲NNPACK 的實驗了。

以上全部的這些方法都是在四核 1.3 GHz CPU 和 1 GB RAM 的樹莓派 3 上執行。操做系統是 32 位的 Raspbian,因此檢測到的 CPU 不是 ARMv8 架構,而是 ARMv7 架構。硬件規格以下:

  • model name : ARMv7 Processor rev 4 (v7l)

  • BogoMIPS : 38.40

  • Features : half thumb fastmult vfp edsp neon vfpv3 tls vfpv4 idiva idivt vfpd32 lpae evtstrm crc32

  • CPU implementer : 0x41

  • CPU architecture: 7

  • CPU variant : 0x0

  • CPU part : 0xd03

  • CPU revision : 4

爲了評估上述每一個測試配置的性能,我制定的測試方案以下:使用相同的神經網絡。也就是一個有 3 個卷積層和2個全鏈接層且在頂層帶有Softmax的小型卷積神經網絡:

conv1: 16@7x7

relu1pool1: MAX POOL 2x2conv2: 48@6x6

relu2pool2: MAX POOL 3x3conv3: 96@5x5

relu3fc1: 128 unitsfc2: 848 units

softmax

該卷積神經網絡有 1039744 個參數。雖然很是小,但它已經足夠強大了,能夠用來處理許多計算機視覺算法。該網絡使用 Caffe 進行訓練人臉識別任務,並將其轉換爲 TensorFlow 和 MXNet 格式,從而使用這些框架進行評估。批量執行次數對性能有很大的影響,爲了測量前向經過時間(forward pass time),咱們將批量執行的次數設置爲 1 到 256。在不一樣次數的批量執行中,咱們每次執行 100 次前向經過,並計算了每一張圖像的平均處理時間。

評估結果和討論

在下面的表格中,列出了平均前向經過的時間。其中,A 是 caffe-openblas, B 是 caffe-openblas-dl, C 表明 tf-vanilla, D 是 tf-neon-vfpv4, E 是 mxnet-openblas, F 是 mxnet-openblas-dl。

低配硬件就不能運行深度神經網絡了?手把手教你克服「殺牛用雞刀」難題

表1 不一樣測試配置在不一樣的批處理次數下的性能表現

低配硬件就不能運行深度神經網絡了?手把手教你克服「殺牛用雞刀」難題

圖1 線性尺度下不一樣配置的前向經過時間比較

在對數尺度尺度上咱們再來看一下:

低配硬件就不能運行深度神經網絡了?手把手教你克服「殺牛用雞刀」難題

圖2 對數尺度下不一樣配置的前向經過時間比較

測試結果讓我大吃一驚。首先,我沒有預料到在 CPU 上運行 MXNet的性能會這麼差。但這看起來已是一個衆所周知的問題。此外,受限於存儲空間,它沒法運行 256 張圖片的批處理。第二個驚奇是優化過的 TensorFlow 竟有如此好的性能。它甚至比 Caffe 的表現還好(批處理次數超過2時),光從原始框架上看是很難預料這個結果的。須要注意的是,上述測試配置中的優化標誌並非在任意 ARM 芯片上均可以使用的。

Caffe 因速度很是快和思路獨到而知名。若是你須要連續地處理圖片,能夠選擇使用優化過的 OpenBLAS 的 Caffe,可獲得最好的處理性能。若是想提高10ms 的性能,你所要作的就只是簡單的輸入如下指令:

cd OpenBLAS

git checkout optimized_for_deeplearning

爲了將個人研究轉變成正式的東西,我仍須要作大量的工做:評估更多的模型,最終集成 NNPACK,以及研究更多結合了BLAS 後端的框架。雷鋒網但願本文能幫助你瞭解目前最流行的解決方案的推理速度。

via How to run deep neural networks on weak hardware