logo
Loading...

OpenVINO 模型最佳化實測:PC/NB 當 AI 辨識引擎沒問題! - 【教材專區】再訪OpenVINO 模型優化器,Runtime API 與度量深度學習模型效能與準確度 - Cupoy

簡介 上一次(ROS系統YOLOv3效能初體驗)我們談到在 Intel OpenVINO 架構下,當需要進行 AI 運算時利用 Intel GPU 加速一樣可獲得不錯的效能,並且使用 YOLO v3 ...

簡介 上一次(ROS系統YOLOv3效能初體驗)我們談到在 Intel OpenVINO 架構下,當需要進行 AI 運算時利用 Intel GPU 加速一樣可獲得不錯的效能,並且使用 YOLO v3 進行測試。 這次我們將會自製一個 CNN 分類器,並透過 OpenVINO 的模型轉換程式轉換成IR模型,並進行模型效能與正確率分析。依據Intel官方網站的說明,OpenVINO 可以針對不同模型進行最佳化,目前支援包括 Tensorflow、Keras、Caffe、ONNX、PyTorch、mxnet 等多種模型。 也就是說,當使用者透過其他框架訓練完成的模型檔,例如 Keras 的 model.h5 檔,或者 TensorFlow 的 model.pb 檔,只要經過轉換就可以在 OpenVINO 中以最高效能來執行。 圖片來源: Intel OpenVINO 官方網站 不過讀者可能會比較在意的就是透過 OpenVINO 加速後,效能是能提昇多少、正確率會不會發生變化?還有就是若我已經有一個訓練好的 Model,我要如何轉換為 OpenVINO 可以讀取的模型呢? 本文將分為兩個部份來說明,第一個部份就是如何進行模型轉換,第二部份則來評測轉換前後的執行效能差異,除了模型比較之外,讀者一定會想了解 Intel OpenVINO GPU與NVIDIA CUDA 的差異,這部份也在本文中進行比較,我相信會讓讀者大開眼界。 OpenVINO 模型轉換 以目前官方文件所述,OpenVINO 架構執行效能最佳的為 IR(Intermediate Representations) 格式模型,所謂的 IR 模型是「中間表達層」,IR 模型包含一個 bin 及 xml,bin 包含實際權重的網路權重 weight 及誤差 bais 資料,而 xml 則是記載網路結構。 後續當 OpenVINO 要載入模型時,只要讀取這兩個檔案即可,雖然這樣轉換須多經過一道手續,但是卻可大幅提高執行效能,在此我們介紹如何轉換模型。 資料來源:openvino官網 本次就以筆者在教學上最常用的個案「玩猜拳」為例,利用卷積類神經 CNN 模型製作一個圖形分類器,可以對「剪、石、布」以及「無」(代表使用者還沒有出拳)的四種圖形進行判斷。模型採用 [224x224x3] 的圖片格式,本文以 Tensorflow 為例演練轉換過程,其他模型轉換方式類似,讀者可以參考本例作法進行轉換測試。 無(N)  布(P) 石(P) 剪(S) 1. TensorFlow模型轉換 一般來說以 TensorFlow 訓練模型的話,那麼我們可能會得到兩種格式的檔案,一種為使用 Keras 的 h5 檔,另外一種則是 TensorFlow 的 pb 檔,h5 檔案可以透過 python 轉換成 pb 檔,因此本文僅介紹 pb 檔的模型轉換。 另外為了後續測試能有一致的標準,本文的模型使用 Google 的 Teachable Machine(簡稱 TM)進行訓練,這樣可以讓讀者在與自己的電腦進行效能比較時,能有較公平的比較基準,若讀者有自行訓練的類神經模型,一樣可以參考下面的方式進行轉換。 關於 TM 的訓練過程,請自行參考其他教程,本文僅針對最後的模型下載過程進行說明。也就是說,當 TM 已經訓練好模型之後,就可以點選右上角的「Export Model」匯出模型。 開啟匯出模型視窗後 點選:1.Tensorflow,然後點選儲存格式為 2.Savemodel,最後選 3.Download my model。 此時下載的檔案內容包含一個文字檔案「labels.txt」及資料夾「model.savedmodel」,而在資料夾內則包含「saved_model.pb」及資料夾「assets」及「variables」,接下來我們就可以將此檔案轉換為 IR 格式。 下載的 tensorflow pb 檔案。 下一步我們則可以利用 OpenVINO 內建的「model_optimizer」模組進行優化及模型轉換,一般是在「/opt/intel/openvino_安裝版本/deployment_tools/model_optimizer/」資料夾內,我們將會選用的轉換程式為 mo_tf.py,而語法如下 python3 mo_tf.py --saved_model_dir ###draft_code_symbol_lessthen######draft_code_symbol_lessthen###模型檔案存放資料夾路徑>> --output_dir ###draft_code_symbol_lessthen######draft_code_symbol_lessthen###IR模型檔輸出路徑>> --input_shape ###draft_code_symbol_lessthen######draft_code_symbol_lessthen###輸入層結構>> --data_type ###draft_code_symbol_lessthen######draft_code_symbol_lessthen###選用的資料格式>> 舉例來說,假設我的 pb 模型檔存放在「Tensorflow/SaveModel」資料夾內,而要輸出到「IR」資料夾,而第一層架構為 [1,224,224,3](此代表輸入1張圖,長寬為 224×224,有 RGB 三色),選用 FP32 (預設值)為資料格式,此時語法為 python3 mo_tf.py --saved_model_dir Tensorflow/SaveModel --output_dir IR --input_shape [1,224,224,3] --data_type FP32 轉換完成會出現的訊息。 轉換完成的 IR 模型檔案。 當轉換完成的訊息出現後,就可以在 IR 資料夾中看到三個檔案「saved_model.bin」、「saved_model.mapping」、「saved_model.xml」,這樣就代表轉換完成了。 若您原本是使用 Keras 的 h5 model 檔案的話那該怎麼辦,先轉成 pb 檔結構,再轉換成 IR 即可,以下為 h5 轉換 pb 的 python 語法。 import tensorflow as tf model = tf.keras.models.load_model('saved_model.h5') #h5的檔案路徑 tf.saved_model.save(model,'modelSavePath') #'modelSavePath'為pb模型檔案輸出路徑 將 h5 轉換成 pb 檔案後,就可以依照前述方式將再將 pb 轉換成 IR 檔案。除了 TensorFlow 之外,其他模型的轉換方式,可以參考 OpenVINO官方網頁說明。 模型轉換效率比較 當使用 OpenVINO 進行模型轉換時,並非單純轉換而已,事實上 OpenVINO 在轉換過程會對模型進行最佳化(算是偷吃步嗎?哈哈),最佳化部份包括以下兩種: 修剪:剪除訓練過程中的網路架構,保留推理過程需要的網路,例如說剪除 DropOut 網路層就是這種一個例子。 融合:有些時候多步操作可以融合成一步,模型優化器檢測到這種就會進行必要的融合。 如果要比較最佳化後的類神經網路差異,我們可以透過線上模型視覺化工具,開啟兩個不同模型檔案來查看前後的變化。下圖為利用 netron 分別開啟原始 pb 模型及轉換後的 IR 模型的網路架構圖,讀者可以發現經過轉換後的模型與原始 TensorFlow 模型有很大的差別,IR模型會將多個網路進行剪除及融合,減少網路層數提昇運算效能。 以下圖為例,左側為 IR 模型,右側為TF模型,兩者比較後可以發現,原先使用的 Dropout 層已經在 IR 中被刪除。 模型轉後前後比較圖左圖為 IR 模型 右圖為原始 TensorFlow 模型(由於模型都相當大,此處僅呈現差異的一小部份) 在 OpenVINO 轉換工作結束後,就會告知最佳化前後所造成的差異,以本例而言,原本 995 個節點、 1496 個路徑的類神經網路就被最佳化為 729 個節點、1230 個路徑,因此能提昇運算效率。 解模型轉換過程之後,接下來就是測試 OpenVINO 在執行上是否有效能上的優勢。以下會有二個測試,測試項目包括效能及正確率,以了解 OpenVINO 是否能具有實用性,也就是說在獲得效能的同時,是否能保有相同的正確性,讓讀者對於後續是否採購支援 OpenVINO 機器有比較的依據: 在 RQP-T37 上測試 IR 模型及 TensorFlow Keras h5 模型效能比較 OpenVINO iGPU 及 Colab 的 GPU 效能比較 1. 在 RQP-T37 上測試 IR 模型及 Tensorflow 上的差異 本測試是同一台機器 (RQP-T37) 及環境 (Ubuntu 20.04.2 LTS) 之下進行,模型則採用 Google TeachableMachine 所製作的手勢分類器(猜拳遊戲:剪刀石頭布),辨識對象為 800 張 224x224x3 的手勢照片,模型採用 FP32 進行分析辨識總時間及正確率。 為了避免單次測試可能造成的誤差,測試取 100 次的平均及標準差,並繪製盒型圖(Box plot),本測試並不使用其他測試常採用的 fps(Frame per second),而僅計算的是辨識(inference) 總時間,不計算檔案讀取、資料轉換過程所耗費的時間。因為本測試主要要了解模型轉換後的差異,避免受到其他因素的影響因此不使用 fps。 (a) IR 模型程式碼片段,顯示僅計算推論時間。(評估標準為 Inference 總時間) (b) TensorFlow 模型程式片段,顯示僅計算推論時間。(評估標準為 Inference 總時間) 在完成 100 次執行之後,我們先看原始 TensorFlow 模型的執行狀況如下表,做完 800 張照片的手勢推論,平均時間為 38.941,換算辨識一張的時間約 0.04 秒,而標準差 0.103,大致換算 fps 的上限約 25,這樣的結果算是中規中矩。 另一方面 IR 模型進行推論結果則呈現在下圖,可以發現效能非常高,分析 800 張照片平均只要 1.332 秒,也就是一張 224×224 的照片僅需要 0.00166 秒,非常不可思議,換算 fps 上限約為 602,若看標準差也只有 0.008,代表耗費時間也相當穩定,並無太大起伏。 相對於原始的 Tensorflow pb 模型來說,效能大約提昇了 30 倍,相當令人驚豔。 雖然效能提昇如此之多,讀者應該會覺得 OpenVINO 的 Inference 引擎可能會在「效能」與「正確性」之間進行 trade off,是否在大幅提昇效能後,卻喪失了最重要的推論正確性?此時觀察兩次測試時的混淆矩陣可以發現,在 TensorFlow 模型時 800 次只有 3 次將布看成剪刀,正確率為 797/800 大約 0.996。 而在 IR 模型時,800 次辨識有 9 次將石頭看成剪刀,所以其正確率為 793/800=0.991,事實上兩者相差無幾,不過有趣的是兩個模型所辨識錯誤的項目不太一樣,值得後續再深入討論。 筆者在此必須強調,OpenVINO 架構的效能提昇如此之多,個人認為主要在於模型最佳化 (model_optimizer) 的過程,雖然 Intel CPU 及 GPU 雖然有所幫助,但不可能把效能提升到 30 倍之多。 TensorFlow 模型辨識混淆矩陣 IR 模型辨識混淆矩陣 測試小結: 經過最佳化的 IR 比 TensorFlow 模型效能上大幅提昇,差異約 30 倍 經過最佳化的 IR 與 TensorFlow 模型正確率幾乎相當 2. 比較 OpenVINO iGPU 及 Colab 的 GPU 本測試則是使用 Colab 上的 GPU 進行加速運算,Google Colab 可以說是近幾年來最受歡迎的程式開發平台了,尤其是提供免費的 GPU 加速,可以讓使用者在 AI 運算上獲得相當好的效能。因此本次也針對 Colab 平台進行測試,測試之前查詢 Colab 所提供的 GPU 規格為 Tesla T4。 而根據 NVIDIA 的規格表,T4 具有 2,560 個 CUDA 核心,FP32 的算力為 8.1 TFLOPS。 NVIDIA T4 規格(資料來源:NVIDIA) 與前次測試相同,推論對象為 800 張 224x224x3 的圖片,採用原始的 TensorFlow pb 模型,且確認有開啟 GPU 加速。 經過 100 次分析後,獲得上表可以得知,Colab 的運算速度比本次測試用的電腦採用的 Intel CPU 時效能高,平均一次約 28.52 秒,相當於分類 1 張照片只花 0.035 秒,換算 fps 上限 28.05,這個效能符合Colab 所提供的 GPU 規格。 讀者可能會想到在 Colab 上的照片讀取效能比 Local 端差多了,這樣評估不公平,這裡要注意的是,我們測試都僅加總推論時間,並沒有計算檔案讀取的時間。此次測試比較後,OpenVINO 效能還是明顯較好。不過一樣的,筆者認為效能提昇是來自於 OpenVINO 的模型最佳化。 測試小結: 同樣在 pb 模型下,Colab 採用的 GPU 加速後,效能大於 Intel CPU IR 模型在 OpenVINO 模型最佳化及加速後,效能超過 NVIDIA CUDA 結論 本次文章主要讓讀者了解 OpenVINO 架構的效能與正確性的比較,另外也說明自製模型的轉換過程。測試時雖硬體上有明顯差距,以及並未使用 TensorRT 做模型最佳化,但本測試還是有一定的代表性,也就是說當讀者擁有一台 Intel 電腦時,透過安裝 OpenVINO ToolKit 來進行模型最佳化,一樣可以獲得性能相當好的 AI 辨識引擎,不一定要購買超高等級的顯示卡才能進行 AI 專案開發。 畢竟一般讀者購買電腦一定有 CPU,卻不一定會購買獨立 GPU 顯示卡,或者像是無法加裝顯示卡的筆記型電腦,以往沒有獨立顯卡的電腦以 CPU 進行 AI 推論時都會花費大量時間,系統無法即時反應,因此缺乏實用性。而本次測試則是證明在 OpenVINO 架構下,就可以透過模型最佳化程式及 Intel GPU 加速,進而在幾乎不影響正確率的結果下得到非常好的效能,這個效能甚至超越 NVIDIA 架構。 不過筆者必須提醒讀者,目前 OpenVINO 只有提供 Inferencing,尚不提供 Training 的功能,所以讀者必須先透過其他方式進行訓練獲得模型後,才可以在 OpenVINO 中進行實地推論。雖然如此,無論是採用 Intel 的電腦,還是標榜低價的文書電腦,都可以快速進行 AI 運算,可以說是實做 AI 系統非常好的工具。 詳細內容 OpenVINO模型最佳化實測:PC/NB當AI辨識引擎沒問題! - 引領創新的科技實作社群媒體本文針對OpenVINO進行模型最佳化轉換的效能實測,證明Intel-based PC及NB也能拿來當AI辨識...makerpro.cc