【教材專區】再訪OpenVINO 模型優化器,Runtime API 與度量深度學習模型效能與準確度
OpenVINO 強大之處在於整合了當前 AI 經常應用的情境,像是圖片或是影像的物件辨識、語音辨識、自然語言與數據推薦系統等等,而透過這個套件的 Open Model Zoo 可以導入現有多個常用框
內容簡介
作者介紹
適合人群
你將會學到什麼
購買須知
-
使用模型優化器轉換 Tensorflow/Keras 預訓練模型
-
OpenVINO 模型最佳化實測:PC/NB 當 AI 辨識引擎沒問題!
簡介 上一次(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
-
不須轉換!OpenVINO 整合 TensorFlow 框架實現推論加速!
簡介 有在涉略 AI 邊緣運算的各位們對於 OpenVINO 應該都有基礎的了解:不同框架(如 TensorFlow、PyTorch 等)訓練完成的模型檔在經由 OpenVINO 轉換後可以在不同邊緣運算裝置執行推論加速。 若筆者告訴各位,現在不用經過模型轉換可以直接在 TensorFlow 中推論時完成 OpenVINO 加速呢? 是的你沒看錯!Intel 在 2021 下半年推出的 OpenVINO™ integration with TensorFlow(以下簡稱OVTF)能夠實現在 TensorFlow 中介接 OpenVINO 執行推論加速。本篇將帶大家實際操作看看在不用改 code 就能夠把 TensorFlow 推論進行加速的方法! OpenVINO x TensorFlow 幸福來得太突然 對於 TensorFlow 開發者來說,只要在程式碼裡增加兩行就可以增加推論速度!什麼程式碼這麼神奇!?眼見為憑,這兩行指令如下: import openvino_tensorflow openvino_tensorflow.set_backend('') 上面第一行嚴格來說不算指令,只是匯入了 OpenVINO 整合 TensorFlow 套件。而第二行呼叫了 openvino_tensorflow 設定後端運算硬體的指令,其中帶入的參數可以設定為 CPU(Intel 處理器)、GPU(Intel 處理器中的整合式顯示卡)、MYRIAD(AI 加速晶片 VPU)等。如此一來就已完成 TensorFlow 推論加速了。 而其特別之處從架構圖看來可以得知在原始 TenorFlow 與 OpenVINO toolkit 之間多增加了 Operator Capability Manager (OCM)、Graph Partitioner、TensorFlow Importer 與 Backend Manager,讓前述二者可以渾然天成的結合在一起。簡單來說在執行推論時會對神經網路各個運算進行判讀,是否能夠透過 OpenVINO 進行加速,並讓其對應到 OpenVINO 的相應的運算子,最後分配到指定的後端硬體進行運算,反之若是不行加速的運算則讓其返回在 TensorFlow 中處理。 各別功能作用細節可從 github repo 與說明文件進行深入探究。若不了解這些技術細節也不要緊,參考模型支援文件可以得知各個 TensorFlow 模型(包含 TF-Slim Classification、Object Detecion、TF-Hub 等眾多來源)的支援程度,或是跟著我們接下來的步驟進行體驗一番! OpenVINO™ integration with TensorFlow 架構圖 安裝 OpenVINO™ integration with TensorFlow 此篇文章撰稿時 OVTF 的最新版本為 V1.10,釋出時間是為 2021年12月8日,OpeVINO 核心版本是 2021.4.2 長期支援版本,搭配的 TensorFlow 版本為 2.7.0。在 TensorFlow2 版本猶如飆車般的成長今年,還確實有跟上主要版本,算是相當有誠意。 筆者的開發環境是 Ubnutu 20.04(搭配硬體為 Intel Core i7-1185GRE),在終端機中執行以下指令,過程約花費兩分鐘內即可完成。 pip3 install -U pip pip3 install tensorflow==2.7.0 pip3 install -U openvino-tensorflow 若讀者的開發環境是在 Windows 或 MAC OS,也可以參照互動式安裝指令表來取得執行安裝所需執行的指令。完成安裝後可透過以下指令確認安裝正確: python3 -c "import tensorflow as tf; print('TensorFlow version: ',tf.__version__);\ import openvino_tensorflow; print(openvino_tensorflow.__version__)" 會看到輸出結果如下則表示已安裝完成: TensorFlow version: 2.7.0 OpenVINO integration with TensorFlow version: b'1.1.0' OpenVINO version used for this build: b'2021.4.2' TensorFlow version used for this build: v2.7.0 CXX11_ABI flag used for this build: 0 可以看到 TensorFlow 版本 2.7.0,OpenVINO 版本 2021.4.2 等資訊,往後有版本更新也可以此作為追蹤。若是輸出訊息中有出現: Could not load dynamic library 'libcudart.so.11.0'; dlerror: libcudart.so.11.0: cannot open shared object file: No such file or directory 等錯誤訊息也毋須理會,這只是在檢測系統有無 GPU 硬體的過程,當偵測不到 GPU 則會出現此訊息。 OVTF 範例試玩 在 OVTF github 專案中有附上立即可用的範例程式碼方便我們直接體驗與測試,在終端機下執行下面指令取得專案並且完成設置: git clone https://github.com/openvinotoolkit/openvino_tensorflow.git cd openvino_tensorflow git submodule init git submodule update --recursive cd examples pip3 install -r requirements.txt 完成之後指令後即可在 openvino_tensorflow/examples 目錄下執行影像分類 Classification 或是物件偵測 Object Detection 範例。首先我們先執行影像分類範例: $ python3 classification_sample.py --no_show --backend CPU ...(中間省略)... OVTF Summary -> 149 out of 910 nodes in the graph (16%) are now running with OpenVINO™ backend Inference time in ms: 18.61 military uniform 0.6277221 bow tie 0.34492084 bearskin 0.006691128 theater curtain 0.0056200475 flagpole 0.0028387788 上方命令執行範例程式 classification_sample.py 將會抓取 Grace Hopper 照片,並使用 Inception V3(ImageNet) 模型進行推論,該模型也是取自於TF-Hub,使用推論引擎透過 --backend 參數指定為 CPU,–no_show 代表不顯示推論結果。可以看到輸出訊息中此模型有 16% 的節點可透過 OpenVINO 進行加速,推論時間花費 18.61ms,推論結果 62.7% 為軍服。 我們也可以在參數中加上 --disable_ovtf 來停用 OpenVINO 加速,也可以修改 --backend 參數為 GPU 或 GPU_FP16 來換成 Intel GPU 加速推論,藉此來比較加速前後差異(完整參數資訊可以透過 --help 查詢)。 筆者使用固定 Inception V3 模型與相同輸入照片,切換不同後端推論硬體,其差異如下表。在沒有啟用 OVTF 需要費時 26ms 進行推論,若採用 GPU 並以 FP16 精度進行推論則可以節省一半以上時間縮短至 12.54ms,若單純以 CPU 加速也能有縮短 30% 以上的時間! 此外筆者將模型置換為 Inception、Mobilenet、Resnet V2 152 等四種不同模型,並比較停用 OVTF與 CPU 加速之間的差異,確實發現在 OVTF 啟用後能提升 30%~40% 不等的堆論速度,其中 Mobilenet V3 Large 有 29% 的節點可以透過 OVTF 加速,因此效果最為顯著。 Object Detection with OVTF 接著我們也試玩一下物件偵測範例,在此範例中使用的模型為 Yolo V4,可以偵測 MS COCO 資料集中 80 種物件。在執行之前我們需要把 Yolo V4 由 Darknet 轉換成 TensorFlow 的格式。 $ cd ~/openvino_tensorflow/examples $ chmod +x convert_yolov4.sh $ ./convert_yolov4.sh 筆者接上一個標準 UVC 介面的 WEBCAM,加上 input=0 參數讓範例程式抓取 Webcam 即時影像,並選擇停用 OVTF 與 GPU 後端來比較兩者差異。 #disable OVTF python3 object_detection_sample.py --input=0 --disable_ovtf #backend=GPU python3 object_detection_sample.py --input=0 --backend GPU 實際運行可以看到在沒啟用 OVTF 時每個 frame 花費超過 400ms,而在啟用後可以縮短到 94ms,差異超過四倍! Webcam Object Detection /w TF Inference @FPS:2 Webcam Object Detection /w OVTF GPU Inference @FPS:10 Running Example on Colab 若是手邊沒有合適的開發環境可以來測試也沒關係,OVTF 專案中也提供了兩個 notebook 檔案可以直接在 Colab 上運行測試,分別為影像分類與物件偵測範例。我們直接執行物件偵測範例中所有程式碼區段來檢視成果,可以看到在於有啟用 OVTF(後端硬體為 CPU)的推論時間為 946ms,相較於無啟用 OVTF 花費了 1258ms 減少了 25% 的推論時間! Colab 物件偵測範例啟用 OVTF 與關閉 OVTF 之間差異 小結 這次 Intel 所推出的 OpenVINO™ integration with TensorFlow 專案雖然說不上是個殺手級工具,但也紮紮實實搔到了 AI 開發者的癢處!過往訓練完成 AI 模型後要進行推論驗證,仍需要花費不少心力去轉換與測試,而 OVTF 則大幅削去了開發階段與佈署階段所隔著的鴻溝,直接在開發者熟悉的環境中就能估算實際佈署的效能概況。 筆者也是相當期待後續 OVTF 是否還能衍生出什麼方便好用的功能,又或者是針對其他深度學習框架也能有類似的整合,就讓我們繼續看下去! 詳細內容 不須轉換!OpenVINO整合TensorFlow框架實現推論加速! - 引領創新的科技實作社群媒體Intel在2021下半年推出的OpenVINO™ integration with TensorFlow能夠...makerpro.cc
-
-
標竿深度學習模型效能與初探 OpenVINO 效能增強工具
-
壓縮深度學型模型以提升效能
-
OpenVINO 佈署更容易 : 使用容器 Container
-
簡單易用的深度學型模型圖形化介面工具