之前我們談到在Intel OpenVINO架構(gòu)下,當(dāng)需要進(jìn)行AI運(yùn)算時(shí)利用Intel GPU加速一樣可獲得不錯(cuò)的效能,并且使用YOLO v3進(jìn)行測(cè)試。
這次我們將會(huì)自制一個(gè)CNN分類器,并透過(guò)OpenVINO的模型轉(zhuǎn)換程序轉(zhuǎn)換成IR模型,并進(jìn)行模型效能與正確率分析。依據(jù)Intel官方網(wǎng)站的說(shuō)明,OpenVINO可以針對(duì)不同模型進(jìn)行優(yōu)化,目前支持包括Tensorflow、Keras、Caffe、ONNX、PyTorch、mxnet等多種模型。
也就是說(shuō),當(dāng)使用者透過(guò)其他框架訓(xùn)練完成的模型文件,例如Keras的model.h5檔,或者TensorFlow的model.pb檔,只要經(jīng)過(guò)轉(zhuǎn)換就可以在OpenVINO中以最高效能來(lái)執(zhí)行。
不過(guò)讀者可能會(huì)比較在意的就是透過(guò)OpenVINO加速后,效能是能提升多少、正確率會(huì)不會(huì)發(fā)生變化?還有就是若我已經(jīng)有一個(gè)訓(xùn)練好的Model,我要如何轉(zhuǎn)換為OpenVINO可以讀取的模型呢?
本文將分為兩個(gè)部份來(lái)說(shuō)明,第一個(gè)部份就是如何進(jìn)行模型轉(zhuǎn)換,第二部份則來(lái)評(píng)測(cè)轉(zhuǎn)換前后的執(zhí)行效能差異,除了模型比較之外,讀者一定會(huì)想了解Intel OpenVINO GPU與NVIDIA CUDA的差異,這部份也在本文中進(jìn)行比較,我相信會(huì)讓讀者大開眼界。
OpenVINO模型轉(zhuǎn)換
以目前官方文件所述,OpenVINO架構(gòu)執(zhí)行效能最佳的為IR(Intermediate Representations) 格式模型,所謂的IR模型是「中間表達(dá)層」,IR模型包含一個(gè)bin及xml,bin包含實(shí)際權(quán)重的網(wǎng)絡(luò)權(quán)重weight及誤差bais數(shù)據(jù),而xml則是記載網(wǎng)絡(luò)結(jié)構(gòu)。
后續(xù)當(dāng)OpenVINO要加載模型時(shí),只要讀取這兩個(gè)檔案即可,雖然這樣轉(zhuǎn)換須多經(jīng)過(guò)一道手續(xù),但是卻可大幅提高執(zhí)行效能,在此我們介紹如何轉(zhuǎn)換模型。
本次就以較常用的個(gè)案「玩猜拳」為例,利用卷積類神經(jīng)CNN模型制作一個(gè)圖形分類器,可以對(duì)「剪、石、布」以及「無(wú)」(代表使用者還沒(méi)有出拳)的四種圖形進(jìn)行判斷。模型采用[224x224x3]的圖片格式,本文以Tensorflow為例演練轉(zhuǎn)換過(guò)程,其他模型轉(zhuǎn)換方式類似,讀者可以參考本例作法進(jìn)行轉(zhuǎn)換測(cè)試。
無(wú)(N)
布(P)
石(P)
剪(S)
1. TensorFlow模型轉(zhuǎn)換
一般來(lái)說(shuō)以TensorFlow訓(xùn)練模型的話,那么我們可能會(huì)得到兩種格式的檔案,一種為使用Keras的h5檔,另外一種則是TensorFlow的pb檔,h5檔案可以透過(guò)python轉(zhuǎn)換成pb檔,因此本文僅介紹pb文件的模型轉(zhuǎn)換。
另外為了后續(xù)測(cè)試能有一致的標(biāo)準(zhǔn),本文的模型使用Google的Teachable Machine(簡(jiǎn)稱TM)進(jìn)行訓(xùn)練,這樣可以讓讀者在與自己的計(jì)算機(jī)進(jìn)行效能比較時(shí),能有較公平的比較基準(zhǔn),若讀者有自行訓(xùn)練的類神經(jīng)模型,一樣可以參考下面的方式進(jìn)行轉(zhuǎn)換。
關(guān)于TM的訓(xùn)練過(guò)程,請(qǐng)自行參考其他教程,本文僅針對(duì)最后的模型下載過(guò)程進(jìn)行說(shuō)明。也就是說(shuō),當(dāng)TM已經(jīng)訓(xùn)練好模型之后,就可以點(diǎn)選右上角的「Export Model」導(dǎo)出模型。
開啟導(dǎo)出模型窗口后,點(diǎn)選:1.Tensorflow,然后點(diǎn)選單元格式為2.Savemodel,最后選3.Download my model。
此時(shí)下載的檔案內(nèi)容包含一個(gè)文本文件「labels.txt」及文件夾「model.savedmodel」,而在文件夾內(nèi)則包含「saved_model.pb」及文件夾「assets」及「variables」,接下來(lái)我們就可以將此檔案轉(zhuǎn)換為IR格式。
下載的tensorflow pb檔案。
下一步我們則可以利用OpenVINO內(nèi)建的「model_optimizer」模塊進(jìn)行優(yōu)化及模型轉(zhuǎn)換,一般是在「/opt/intel/openvino_安裝版本/deployment_tools/model_optimizer/」文件夾內(nèi),我們將會(huì)選用的轉(zhuǎn)換程序?yàn)?/span>mo_tf.py,而語(yǔ)法如下
python3 mo_tf.py --saved_model_dir <<模型檔案存放文件夾路徑>>--output_dir <
舉例來(lái)說(shuō),假設(shè)我的pb模型文件存放在「Tensorflow/SaveModel」文件夾內(nèi),而要輸出到「IR」文件夾,而第一層架構(gòu)為[1,224,224,3](此代表輸入1張圖,長(zhǎng)寬為224×224,有RGB三色),選用FP32(默認(rèn)值)為數(shù)據(jù)格式,此時(shí)語(yǔ)法為
python3 mo_tf.py --saved_model_dirTensorflow/SaveModel --output_dir IR --input_shape [1,224,224,3] --data_typeFP32
轉(zhuǎn)換完成會(huì)出現(xiàn)的訊息。
轉(zhuǎn)換完成的IR模型檔案。
當(dāng)轉(zhuǎn)換完成的訊息出現(xiàn)后,就可以在IR文件夾中看到三個(gè)檔案「saved_model.bin」、「saved_model.mapping」、「saved_model.xml」,這樣就代表轉(zhuǎn)換完成了。
若您原本是使用Keras的h5 model檔案的話那該怎么辦,先轉(zhuǎn)成pb文件結(jié)構(gòu),再轉(zhuǎn)換成IR即可,以下為h5轉(zhuǎn)換pb的python語(yǔ)法。
import tensorflow as tf
model =tf.keras.models.load_model('saved_model.h5') #h5的檔案路徑
tf.saved_model.save(model,'modelSavePath')#'modelSavePath'為pb模型檔案輸出路徑
將h5轉(zhuǎn)換成pb檔案后,就可以依照前述方式將再將pb轉(zhuǎn)換成IR檔案。除了TensorFlow之外,其他模型的轉(zhuǎn)換方式,可以參考OpenVINO官方網(wǎng)頁(yè)說(shuō)明。
https://docs.openvinotoolkit.org/latest/openvino_docs_MO_DG_prepare_model_Config_Model_Optimizer.html
模型轉(zhuǎn)換效率比較
當(dāng)使用OpenVINO進(jìn)行模型轉(zhuǎn)換時(shí),并非單純轉(zhuǎn)換而已,事實(shí)上OpenVINO在轉(zhuǎn)換過(guò)程會(huì)對(duì)模型進(jìn)行優(yōu)化(算是偷吃步嗎?哈哈),優(yōu)化部份包括以下兩種:
1.修剪:剪除訓(xùn)練過(guò)程中的網(wǎng)絡(luò)架構(gòu),保留推理過(guò)程需要的網(wǎng)絡(luò),例如說(shuō)剪除DropOut網(wǎng)絡(luò)層就是這種一個(gè)例子。
2.融合:有些時(shí)候多步操作可以融合成一步,模型優(yōu)化器檢測(cè)到這種就會(huì)進(jìn)行必要的融合。
如果要比較優(yōu)化后的類神經(jīng)網(wǎng)絡(luò)差異,我們可以透過(guò)在線模型可視化工具,開啟兩個(gè)不同模型檔案來(lái)查看前后的變化。下圖為利用netron分別開啟原始pb模型及轉(zhuǎn)換后的IR模型的網(wǎng)絡(luò)架構(gòu)圖,讀者可以發(fā)現(xiàn)經(jīng)過(guò)轉(zhuǎn)換后的模型與原始TensorFlow模型有很大的差別,IR模型會(huì)將多個(gè)網(wǎng)絡(luò)進(jìn)行剪除及融合,減少網(wǎng)絡(luò)層數(shù)提升運(yùn)算效能。
https://netron.app/
以下圖為例,左側(cè)為IR模型,右側(cè)為TF模型,兩者比較后可以發(fā)現(xiàn),原先使用的Dropout層已經(jīng)在IR中被刪除。
模型轉(zhuǎn)后前后比較圖左圖為IR模型,右圖為原始TensorFlow模型(由于模型都相當(dāng)大,此處僅呈現(xiàn)差異的一小部份)
在OpenVINO轉(zhuǎn)換工作結(jié)束后,就會(huì)告知優(yōu)化前后所造成的差異,以本例而言,原本995個(gè)節(jié)點(diǎn)、1496個(gè)路徑的類神經(jīng)網(wǎng)絡(luò)就被優(yōu)化為729個(gè)節(jié)點(diǎn)、1230個(gè)路徑,因此能提升運(yùn)算效率。
解模型轉(zhuǎn)換過(guò)程之后,接下來(lái)就是測(cè)試OpenVINO在執(zhí)行上是否有效能上的優(yōu)勢(shì)。以下會(huì)有二個(gè)測(cè)試,測(cè)試項(xiàng)目包括效能及正確率,以了解OpenVINO是否能具有實(shí)用性,也就是說(shuō)在獲得效能的同時(shí),是否能保有相同的正確性,讓讀者對(duì)于后續(xù)是否采購(gòu)支持OpenVINO機(jī)器有比較的依據(jù):
?在RQP-T37上測(cè)試IR模型及TensorFlow Keras h5模型效能比較
?OpenVINO iGPU及Colab的 GPU效能比較
1.在RQP-T37上測(cè)試IR模型及Tensorflow上的差異
本測(cè)試是同一臺(tái)機(jī)器(RQP-T37)及環(huán)境(Ubuntu 20.04.2 LTS)之下進(jìn)行,模型則采用Google TeachableMachine所制作的手勢(shì)分類器(猜拳游戲:剪刀石頭布),辨識(shí)對(duì)象為800張224x224x3的手勢(shì)照片,模型采用FP32進(jìn)行分析辨識(shí)總時(shí)間及正確率。
為了避免單次測(cè)試可能造成的誤差,測(cè)試取100次的平均及標(biāo)準(zhǔn)偏差,并繪制盒型圖(Box plot),本測(cè)試并不使用其他測(cè)試常采用的fps(Frame per second),而僅計(jì)算的是辨識(shí)(inference)總時(shí)間,不計(jì)算檔案讀取、數(shù)據(jù)轉(zhuǎn)換過(guò)程所耗費(fèi)的時(shí)間。因?yàn)楸緶y(cè)試主要要了解模型轉(zhuǎn)換后的差異,避免受到其他因素的影響因此不使用fps。
(a) IR模型代碼段,顯示僅計(jì)算推論時(shí)間。(評(píng)估標(biāo)準(zhǔn)為Inference總時(shí)間)
(b) TensorFlow模型程序片段,顯示僅計(jì)算推論時(shí)間。(評(píng)估標(biāo)準(zhǔn)為Inference總時(shí)間)
在完成100次執(zhí)行之后,我們先看原始TensorFlow模型的執(zhí)行狀況如下表,做完800張照片的手勢(shì)推論,平均時(shí)間為38.941,換算辨識(shí)一張的時(shí)間約0.04秒,而標(biāo)準(zhǔn)偏差0.103,大致?lián)Q算fps的上限約25,這樣的結(jié)果算是中規(guī)中矩。
另一方面IR模型進(jìn)行推論結(jié)果則呈現(xiàn)在下圖,可以發(fā)現(xiàn)效能非常高,分析800張照片平均只要1.332秒,也就是一張224×224的照片僅需要0.00166秒,非常不可思議,換算fps上限約為602,若看標(biāo)準(zhǔn)偏差也只有0.008,代表耗費(fèi)時(shí)間也相當(dāng)穩(wěn)定,并無(wú)太大起伏。
相對(duì)于原始的Tensorflow pb模型來(lái)說(shuō),效能大約提升了30倍,相當(dāng)令人驚艷。
雖然效能提升如此之多,讀者應(yīng)該會(huì)覺(jué)得OpenVINO的Inference引擎可能會(huì)在「效能」與「正確性」之間進(jìn)行trade off,是否在大幅提升效能后,卻喪失了最重要的推論正確性?此時(shí)觀察兩次測(cè)試時(shí)的混淆矩陣可以發(fā)現(xiàn),在TensorFlow模型時(shí)800次只有3次將布看成剪刀,正確率為797/800大約0.996。
而在IR模型時(shí),800次辨識(shí)有9次將石頭看成剪刀,所以其正確率為793/800=0.991,事實(shí)上兩者相差無(wú)幾,不過(guò)有趣的是兩個(gè)模型所辨識(shí)錯(cuò)誤的項(xiàng)目不太一樣,值得后續(xù)再深入討論。
筆者在此必須強(qiáng)調(diào),OpenVINO架構(gòu)的效能提升如此之多,個(gè)人認(rèn)為主要在于模型優(yōu)化(model_optimizer)的過(guò)程,雖然Intel CPU及GPU雖然有所幫助,但不可能把效能提升到30倍之多。
TensorFlow模型辨識(shí)混淆矩陣
IR模型辨識(shí)混淆矩陣
測(cè)試小結(jié):
?經(jīng)過(guò)優(yōu)化的IR比TensorFlow模型效能上大幅提升,差異約30倍
?經(jīng)過(guò)優(yōu)化的IR與TensorFlow模型正確率幾乎相當(dāng)
2.比較OpenVINO iGPU及Colab的 GPU
本測(cè)試則是使用Colab上的GPU進(jìn)行加速運(yùn)算,Google Colab可以說(shuō)是近幾年來(lái)最受歡迎的程序開發(fā)平臺(tái)了,尤其是提供免費(fèi)的GPU加速,可以讓使用者在AI運(yùn)算上獲得相當(dāng)好的效能。因此本次也針對(duì)Colab平臺(tái)進(jìn)行測(cè)試,測(cè)試之前查詢Colab所提供的GPU規(guī)格為Tesla T4。
而根據(jù)NVIDIA的規(guī)格表,T4具有2,560個(gè)CUDA核心,FP32的算力為8.1 TFLOPS。
NVIDIA T4規(guī)格
與前次測(cè)試相同,推論對(duì)象為800張224x224x3的圖片,采用原始的TensorFlow pb模型,且確認(rèn)有開啟GPU加速。
經(jīng)過(guò)100次分析后,獲得上表可以得知,Colab的指令周期比本次測(cè)試用的計(jì)算機(jī)采用的Intel CPU時(shí)效能高,平均一次約28.52秒,相當(dāng)于分類1張照片只花0.035秒,換算fps上限28.05,這個(gè)效能符合Colab 所提供的GPU規(guī)格。
讀者可能會(huì)想到在Colab上的照片讀取效能比Local端差多了,這樣評(píng)估不公平,這里要注意的是,我們測(cè)試都僅加總推論時(shí)間,并沒(méi)有計(jì)算檔案讀取的時(shí)間。此次測(cè)試比較后,OpenVINO效能還是明顯較好。不過(guò)一樣的,筆者認(rèn)為效能提升是來(lái)自于OpenVINO的模型優(yōu)化。
測(cè)試小結(jié):
?同樣在pb模型下,Colab采用的GPU加速后,效能大于Intel CPU
?IR模型在OpenVINO模型優(yōu)化及加速后,效能超過(guò)NVIDIA CUDA
結(jié)論
本次文章主要讓讀者了解OpenVINO架構(gòu)的效能與正確性的比較,另外也說(shuō)明自制模型的轉(zhuǎn)換過(guò)程。測(cè)試時(shí)雖硬件上有明顯差距,以及并未使用TensorRT做模型優(yōu)化,但本測(cè)試還是有一定的代表性,也就是說(shuō)當(dāng)讀者擁有一臺(tái)Intel計(jì)算機(jī)時(shí),透過(guò)安裝OpenVINO ToolKit來(lái)進(jìn)行模型優(yōu)化,一樣可以獲得性能相當(dāng)好的AI辨識(shí)引擎,不一定要購(gòu)買超高等級(jí)的顯示適配器才能進(jìn)行AI項(xiàng)目開發(fā)。
畢竟一般讀者購(gòu)買計(jì)算機(jī)一定有CPU,卻不一定會(huì)購(gòu)買獨(dú)立GPU顯示適配器,或者像是無(wú)法加裝顯示適配器的筆記本電腦,以往沒(méi)有獨(dú)立顯卡的計(jì)算機(jī)以CPU進(jìn)行AI推論時(shí)都會(huì)花費(fèi)大量時(shí)間,系統(tǒng)無(wú)法實(shí)時(shí)反應(yīng),因此缺乏實(shí)用性。而本次測(cè)試則是證明在OpenVINO架構(gòu)下,就可以透過(guò)模型優(yōu)化程序及Intel GPU加速,進(jìn)而在幾乎不影響正確率的結(jié)果下得到非常好的效能,這個(gè)效能甚至超越 NVIDIA架構(gòu)。
不過(guò)筆者必須提醒讀者,目前OpenVINO只有提供Inferencing,尚不提供Training的功能,所以讀者必須先透過(guò)其他方式進(jìn)行訓(xùn)練獲得模型后,才可以在OpenVINO中進(jìn)行實(shí)地推論。雖然如此,無(wú)論是采用Intel的計(jì)算機(jī),還是標(biāo)榜低價(jià)的文書計(jì)算機(jī),都可以快速進(jìn)行AI運(yùn)算,可以說(shuō)是實(shí)做AI系統(tǒng)非常好的工具。
-
架構(gòu)
+關(guān)注
關(guān)注
1文章
505瀏覽量
25422 -
分類器
+關(guān)注
關(guān)注
0文章
152瀏覽量
13159 -
cnn
+關(guān)注
關(guān)注
3文章
350瀏覽量
22094
原文標(biāo)題:OpenVINO模型優(yōu)化實(shí)測(cè):PC/NB當(dāng)AI辨識(shí)引擎沒(méi)問(wèn)題!
文章出處:【微信號(hào):易心Microbit編程,微信公眾號(hào):易心Microbit編程】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論