作者/攝影 | 曾吉弘 |
文章分類 | 教學(翻譯) |
時間 | 3小時 |
成本 | |
難度 | ****** (1~10) |
材料表 |
|
(Original post from Intel Movidius NCS blog: “Using and Understanding the Neural Compute SDK: mvNCCheck”:https://movidius.github.io/blog/mvNCCheck/)
Neural Compute SDK Toolkit: mvNCCheck
Intel® Movidius™ 神經運算軟體開發套件(Neural Compute Software Development Kit,NCSDK)包含三套工具,用於幫助使用者順利上手,操作Intel® Movidius™ 神經運算棒(Intel® Movidius™ NCS)。這些工具包含:mvNCCheck,mvNCCompile及mvNCProfile。本文將幫助您更認識mvNCCheck工具程式的運作方式,以及如何將它整合至Neural Compute SDK的整體工作流程中。
使用mvNCCheck的網路會有怎樣的效果呢?
您將學到:
- 如何使用mvNCCheck tool
- 如何解釋mvNCCheck的輸出結果
您會需要:
- Intel Movidius Neural Compute Stick 神經運算棒 – 購買請按我
- 執行Ubuntu 16.04的 x86_64 筆記型電腦
如果尚未做過的話,請在您的開發電腦上安裝NCSDK。安裝步驟請參考Intel Movidius NCS Quick Start Guide 或 CAVEDU的Intel Movidius相關文章。
檢查網路
Step 1:開啟terminal,切換至ncsdk/examples/caffe/GoogLeNet目錄下
Step 2:使用mvNCCheck 來使Intel Movidius NCS上的網路生效。
Step 3:完成了!您應該會看到類似下面的畫面訊息:
mvNCCheck的功能為何,為何要用到它?
作為NCSDK的一部分,mvNCCheck提供以下三項主要功能:
- 確保資料從fp32轉為fp16時的正確性
- 快速確認指定網路是否相容於Intel NCS
- 對網路各層進行快速除錯
確保結果的準確性
為確保結果的正確性,mvNCCheck會比較Intel Movidius NCS 與網路原生框架(Caffe/TensorFlow™)兩者間的推論結果。由於Intel Movidius NCS與NCSDK採用16-bit 浮點數資料,因此必須將收進來的32-bit浮點數資料轉為16-bit。fp32/fp16的轉換過程可能在推論結果中產生minor rounding的問題,這時候mvNCCheck工具程式就很好用了,它可檢查您所使用的網路是否產生正確的結果。
首先,mvNCCheck工具程式會讀取網路,並將模型轉換為Intel Movidius NCS可用的格式。接著它會在Intel Movidius NCS上使用網路來推論,也會用網路原生框架(Caffe/TensorFlow)來執行推論。
最後,mvNCCheck 會產生一份簡易的報表,比較Intel Movidius NCS與網路原生框架兩者的推論結果。這些結果可用於確認某個神經網路在fp32/fp16轉換後,是否還能產生一定正確性以上的結果。比較結果接下來會詳細討論。
判斷網路與Intel Movidius NCS的相容性
mvNCCheck也可用於檢查某個網路是否相容於Intel Movidius NCS。有蠻多原因都會造神經網路與Intel Movidius NCS不相容,其中包括(但不限於)記憶體限制、不支援的層或不支援的神經網路架構。若想了解更多原因,請參考 Intel Movidius NCS documentation website 上關於TensorFlow與Caffe框架的說明。另外,最新的 NCSDK Release Notes也會說明關於SDK的勘誤與最新功能⋯⋯等等。
使用mvNCCheck對網路進行偵錯
若您的網路執行不如預期,可運用mvNCCheck來對網路偵錯,只要執行 mvNCCheck 時加上 -in 與 -on 選項即可。
- -in 選項可讓您將某個節點指定為輸入節點
- -on 選項可讓您將某個節點指定為輸出節點
使用mvNCCheck並搭配 -in 與 -on 參數,透過逐層分析或二元搜尋分析,比較Intel NCS 與Caffe/TensorFlow的結果,這樣便有機會找出發生錯誤/差異的層。
偵錯範例:
假設您的網路架構如下:
- Input – Data
- conv1 – Convolution Layer(卷積層)
- pooling1 – Pooling Layer(池化層)
- conv2 – Convolution Layer(卷積層)
- pooling2 – Pooling Layer(池化層)
- Softmax – Softmax
假設您執行mvNCCheck所取得的結果為nan(並非數字)。請用以下指令搭配 -on 選項來檢查第一卷積層(Convolution layer) “conv1” 的輸出結果:
若是較大的網路時,使用二元搜尋法將有助於降低找到發生問題的那一層所需的時間。
理解mvNCCheck的輸出結果
來看看上述 mvNCCheck 輸出所代表的意義:
- 綠色方框為Intel NCS的前五項推論結果
- 紅色方框為原生框架(可能是Caffe或TensorFlow)的前五項推論結果
- 藍色方框是兩者推論結果的各項比較結果
若想要深入理解這些結果,我們得先了解Intel Movidius NCS與Caffe/TensorFlow的輸出都是儲存在一個tensor中(tensor 要簡單定義的話,就是一個值的陣列)。五項測試都是兩個tensor間的數學性比較。
名詞解釋:
- ACTUAL – 神經運算棒的tensor輸出
- EXPECTED– 框架(Caffe或TensorFlow)的 tensor 輸出
- Abs – 計算絕對值
- Max – 計算一個(或多個)tensor的最大值
- Sqrt – 計算某數值的平方根
- Sum – 計算某數值的加總
最小像素正確度(Min Pixel Accuracy):
本數值代表兩個輸出tensor值之間的最大誤差。
平均像素正確度(Average Pixel Accuracy):
兩個 tensor 數值的均差。
錯誤值百分比:
本數值代表Intel Movidius NCS的tensor值,與框架tensor間的誤差是否超過 2%。
為什麼是2%?這個閾值設定扣掉了來自fp32/fp16轉換後的精度降低的影響程度。
Pixel-wise L2 error:
本數值代表整個輸出tensor的約略相對誤差。
將差異加總起來:
將Intel Movidius NCS tensor與框架tensor之間的所有差異加總起來。
沒有輸入的話,mvNCCheck如何進行推論?
在神經網路中進行向前傳遞時,常見的作法是以一個tensor或一個數值陣列作為輸入。如果未指令輸入的話,mvNCCheck使用範圍在 -1 至 1之間的隨機浮點數作為輸入tensor。只要在圖像路徑後加上 “-i” 參數,也可將讓 mvNCCheck 接受圖像輸入。
可能發生的錯誤與解決方法
若執行 mvNCCheck 但網路發生錯誤時,可能原因如下:
輸入值縮放
某些神經網路要求輸入值得先被縮放(scale)調整過。若輸入未經縮放的話,可能造成Intel Movidius NCS與網路原生框架的推論結論不一致的狀況。
使用 mvNCCheck 時,可用–S選項來指定用於縮放輸入值的除數。圖像通常以每個顏色通道數值範圍介於 0 到 255 間的方式儲存。若有個神經網路需要輸入值介於 0.0 到 1.0 之間,請用–S 255選項將所有輸入數值除以255,就可以把它們縮放到 0.0 到 1.0 之間了。
–M 選項可用於對輸入值減去均值。例如,若某個神經網路需要輸入值介於 -1 到 1 之間的話,請同時用–S 128與–M 128選項將做到此事。
未支援的層
Intel Movidius NCS 並未支援前所有的神經網路架構與層。若執行 mvNCCheck 後看見“Stage Details Not Supported”的錯誤訊息,就代表您所選用的網路需額外處理步驟,或是Neural Compute SDK尚未支援這些層。想知道目前支援哪些層,請參考 Neural Compute Caffe Support 與 Neural Compute TensorFlow Support 等說明網頁。
其他Bug
其他造成不正確結果的可能原因就是bug啦!請來這邊回報吧:Intel Movidius Neural Compute Developer Forum.
更多關於mvNCCheck
關於 mvNCCheck 所以有可用的參數,請參考 mvNCCheck 文件頁面。
延伸閱讀
- Intel Movidius NCS 開發工作流程
- 本篇文章談到了如何設定神經網路,包含了均值減法與 scaling 等主題。