三年前剛接觸OpenVINO的時候,開始感覺機器學習發(fā)展的生態(tài)似乎有許多的轉(zhuǎn)變,隨著執(zhí)行許多范例的過程中,漸漸了解Open Model Zoo的Github支持了許多可以下載的模型,有種感覺是不是模型加載與使用,會變成即插即用的狀態(tài)。
以前要自己看許多論文,花時間搜集各種模型的執(zhí)行方法,今年實驗的模型,過一陣子想再執(zhí)行時常會忘記如何使用,就算記得但碰到模型本身運作環(huán)境升級,或者平臺不再支持某個方法,辛苦弄完的模型跟寫好的程序又要重新再來一次,這樣的感覺在接觸OpenVINO之前,會覺的似乎是做機器學習的無奈與必然。
接觸OpenVINO后,讓人感覺是一個有趣的環(huán)境,過去在教學現(xiàn)場很難與學生介紹機器學習要怎么學跟用,雖然有云端的架構(gòu)可以直接運作準備好的教學環(huán)境,實際現(xiàn)場要使用時,還是會碰到不知道如何安裝跟配置的問題。
雖然一般的安裝文件嘗試盡可能寫清楚了,但其實許多操作系統(tǒng)環(huán)境差異,或開發(fā)工具包兼容性的狀態(tài),常會造成這個月可以執(zhí)行的模型跟架構(gòu),過幾個月又開始不太支持,還好這兩年容器環(huán)境相對更成熟,系統(tǒng)安裝的生態(tài)也開始發(fā)生轉(zhuǎn)變,透過容器化技術(shù)許多套件安裝的流程跟問題,也隨著容器化技術(shù)得到緩解。
本文嘗試從兩個觀點出發(fā),第一個是如何能夠較為方便快速使用OpenVINO,主要的目的是介紹容器化的方式使用OpenVINO,相對過去需要閱讀大量安裝文件,目前已經(jīng)有較為成熟穩(wěn)定的容器化環(huán)境可以直接安裝與啟動OpenVINO。
第二個是了解如何利用OpenVINO跟Open Model Zoo所提供訓練好的模型,在運作OpenVINO的過程,透過不同參數(shù)設定值,觀察系統(tǒng)預測效率的改變,對于機器學習運作環(huán)境,除了程序設計技巧與架構(gòu)整合外,累積模型運作與不同參數(shù)設定狀態(tài)下需要具備的觀念。
相對于操作系統(tǒng)調(diào)校的觀念,在OpenVINO運作時可以觀察系統(tǒng)在模型運作時預測效能的變化,這個部份可做為后續(xù)使用模型時經(jīng)驗的提升,在機器運作時累積更好的模型使用經(jīng)驗,觀察同一臺機器運作OpenVINO時,可以思考與注意的部份。
透過容器化技術(shù)快速部署OpenVINO運作環(huán)境
透過容器啟動OpenVINO,可以快速方便的達成OpenVINO上線狀態(tài),相對省下非常多套件安裝過程的時間,過去常認為要執(zhí)行機器學習推論的環(huán)境會很復雜,或者需要許多步驟的執(zhí)行過程。透過Docker容器的架構(gòu)來執(zhí)行OpenVINO,可以將過去系統(tǒng)在操作系統(tǒng)不同版本間運作環(huán)境產(chǎn)生問題的數(shù)量降低,大量減少系統(tǒng)除錯、兼容性測試與環(huán)境安裝配置的問題與步驟。
本文使用的運作環(huán)境是Ubutnu20.04.2 LTS,OpenVINO的docker容器是openvino/ubuntu20_data_dev:2021.4_tgl,使用docker在Linux運作OpenVINO最大的好處是幾乎沒有兼容性的問題,下載之后就可以直接執(zhí)行,對于要直接使用或?qū)W習OpenVINO,相對過去容易非常非常多,透過下面的指令就可以執(zhí)行OpenVINO的容器環(huán)境。
如果機器上面沒有docker的環(huán)境,要先安裝docker容器環(huán)境,在Linux上面執(zhí)行以下指令,前面的指令會先把原來的docker環(huán)境移除,如果你已經(jīng)安裝過docker環(huán)境,可以跳過這個步驟,直接執(zhí)行下載OpenVINO docker的pull指令:
sudo aptupdate
sudoapt-get remove docker docker-engine docker.io containerd runc
sudo aptinstall curl
curl-fsSL https://get.docker.com -o get-docker.sh
sudo shget-docker.sh
sudousermod -aG docker $USER
## Needto logout or reboot to run docker as non-root user
dockerrun hello-world
上面安裝好docker的容器環(huán)境以后,可以用底下的指令直接下載OpenVINO的docker環(huán)境。
dockerpull openvino/ubuntu20_data_dev:2021.4_tgl
要執(zhí)行docker環(huán)境的時候,如果是使用ubuntu桌面版內(nèi)建的vnc環(huán)境,可以使用底下的指令來啟動OpenVINO docker環(huán)境,這樣之后在docker環(huán)境內(nèi)如果需要使用到窗口環(huán)境,會比較方便做后續(xù)的測試。
要進入docker環(huán)境下命令測試OpenVINO時,可以使用底下的指令,就可以順利的在ubuntu桌面環(huán)境下同時使用多個OpenVINO docker環(huán)境終端做測試。
dockerexec -it openvino-ubuntu20_tgl /bin/bash
參數(shù)設定在模型運作時效能的變化
OpenVINO效能量測工具名稱為benchmark_app,可以在機器上量測模型的執(zhí)行效能,OpenVINO 2021.4的benchmark_app提供許多參數(shù)設定,另一個思考方向是自己寫程序加載模型時,實際的效能是如何,或者日后如何能在自己寫的程序達到測試環(huán)境相同的效能,如常用的ssd模型在執(zhí)行object model zoo的范例時,運作過程中可以設定許多參數(shù),例如nireq、nthreads、nstreams等,device參數(shù)可以設定運作的硬件環(huán)境CPU、GPU、同時使用CPU與GPU的MULTI: CPU,GPU等,令人好奇這些參數(shù)之間實際運作的情況,在運作過程中要如何設定,或者朝哪個方向去思考調(diào)整會有相對較好的執(zhí)行結(jié)果。
圖1 – OpenVINO效能評估程序benchmark_app提供的部份參數(shù)
benchmark_app提供許多參數(shù)進行效能量測,相對當執(zhí)行范例程序時,nireq、nthreads這樣的參數(shù)做調(diào)整,會觀察到什么結(jié)果,以下說明一些紀錄與觀察過程,同時可以更了解OpenVINO在docker環(huán)境下執(zhí)行的方式。
在docker環(huán)境中包含OpenVINO2021.4.582的執(zhí)行版本,并且提供許多模型運作范例,在Open Model Zoo中內(nèi)含Object_sample_ssd的范例,內(nèi)含models.lst檔案。表1為models.lst檔案里面支持部份的ssd模型列表,跟過去版本最大差異是多了-at參數(shù)設定,在models.lst中說明各種模型對應-at參數(shù)的設定值。
使用模型的時候可以使用download.py下載模型,如果下載的不是OpenVINO的IR格式(附檔名為.xml與.bin),需要透過convert.py轉(zhuǎn)換成OpenVINO的IR格式。
OpenVINO系統(tǒng)目錄內(nèi)定會安裝在/opt/intel/openvino,內(nèi)含子目錄deployment_tools/open_model_zoo/demos/object_detection_demo/python,此目錄主要為對象偵測的python范例程序,可以執(zhí)行許多機器學習開發(fā)架構(gòu)已經(jīng)訓練好的模型,包含 centernet、ctpn、faceboxes、ssd、yolo、yolov4等機器學習框架所訓練好的對象偵測模型。
表1 – OpenVINOobject_detection_demo可以執(zhí)行的機器學習模型
參數(shù)與預測效能之間的觀察
兩年前剛學習使用OpenVINO的時候,有很多時候覺得模型會動就好了,但是有些時候希望效能能夠變快一點,嘗試把某些參數(shù)調(diào)大,但是又感覺好像不是這樣,本文透過object_detecion_demo運作觀察,參數(shù)設定過程如何影響模型在同一臺機器上推論效率的變化,接下來的內(nèi)容為觀察到的現(xiàn)象,可以作為日后模型推論在配置時參數(shù)設定的一些參考。
這兩年間比較有趣的變化是同一個模型有FP32、FP16、FP16-INT8的版本可以選擇,因此同一個模型在內(nèi)存空間的使用量、運作效能以及預測的精確度,有許多部份可進一步觀察運作過程中的變化。
本文針對object_detection_demo.py指令的參數(shù),在執(zhí)行person-detection-retail-0013模型中進行效能量測,分別就FP32、FP16、FP16-INT8等模型格式,在CPU、GPU、CPU+GPU的硬件條件下,分別進行不同的nireq以及nthreads參數(shù)設定,觀察FPS(Frame per second)變化情形進行描述與討論。
要注意的是本文所使用的是M.2 Key MSSD硬盤作為結(jié)果輸出裝置,用一般的USB隨身碟作為預測檔案結(jié)果輸出時,會影響檔案輸出的效能,進而影響效能觀察的結(jié)果。
在本文效能量測的結(jié)果呈現(xiàn)前,要注意的是FP16-INT8模型的運作方式,OpenVINO中POT套件轉(zhuǎn)換FP16模型為INT8模型的方式,是經(jīng)由在FP16模型各層間插入INT8格式的FakeQuantize,對于設定不同的POT模型優(yōu)化參數(shù), FakeQuantize將會自動調(diào)整的INT8的模型數(shù)值,或刪除一些不需要的模型計算步驟,在可以滿足精度要求的狀態(tài)下,達成模型運作時真正的轉(zhuǎn)換為INT8低精度模型,雖然層數(shù)相對可能會增加,但是因為INT8所需空間較小且執(zhí)行效能相對快很多,因而能夠獲得真正的模型空間縮小與效能提升。
因此在FP16-INT8模型的運作過程中,透過了FP16與INT8整數(shù)運算于不同層之間的切換的運算過程,如果許多的FP16層級被轉(zhuǎn)換為INT8,有機會得到儲存空間的較小模型及較快速指令周期的推論效能。同時INT8的運算過程于i7第11代CPU中因為支持了AVX512的指令集,以及i7第11代所使用的內(nèi)顯GPU支持INT8運算處理,因此在本文量測的結(jié)果中FP16-INT8的效能將大幅度相對提升s。
object_detection_demo.py程序執(zhí)行的參數(shù)如下:
指令執(zhí)行的參數(shù)常用的范例如下:
其中${1}、${2}分別代表nireq與nthreads的參數(shù)設定值,${3}表示32、16、16-INT8等設定值,${4}代表使用的是CPU、GPU、MULTI:CPU,GPU等設定值,透過這些設定值的更改,最后將執(zhí)行過程輸出至各個條件的文本文件,范例程序執(zhí)行結(jié)束時,于各文本文件的尾端會得到此次執(zhí)行的FPS數(shù)值結(jié)果,最后以這個FPS數(shù)值作為相關的量測效能結(jié)果進行討論,詳細的參數(shù)設定值說明如表2。
表2 –object_detection_demo.py相關的參數(shù)設定說明
本文量測數(shù)值使用之硬件環(huán)境
圖2為本文以東擎NUCBOX-1165G7工業(yè)用計算機,硬件環(huán)境為Intel i7第11代CPU,軟件環(huán)境使用Ubuntu 20.04.2 LTS為操作系統(tǒng),執(zhí)行OpenVINO 2021.4.582作為系統(tǒng)量測的運作環(huán)境,CPU型號為11th Gen Intel(R) Core(TM) i7-1185G7E @ 2.80GHz、cache 12288KB,共有8個Hyper-threading,內(nèi)存為16GByte、硬盤型號為KINGSTON OM8PDP3256B-A01(NVM容量256GByte)。
特別要說明的是Intel第11代Core CPU內(nèi)建的GPU,是第一個可以執(zhí)行INT8的內(nèi)建GPU,利用這個特性在執(zhí)行OpenVINO時可以獲得更好的效能提升。
圖2 – 本文量測使用之工業(yè)用計算機,內(nèi)含Intel第11代CPU與Wifi-6無線網(wǎng)絡芯片
CPU執(zhí)行person-detection-retail-0013模型效能變化情形
圖3為CPU使用person-detection-retail-0013FP32模型的執(zhí)行結(jié)果,可以觀察當nireq(nr)為1、nthreads(nt)為1時,每秒鐘可以辨識的畫面張數(shù)為35.1 FPS(每秒鐘能預測35.1張影像),進一步調(diào)整nireq、nthreads參數(shù)的數(shù)值進行預測,會發(fā)現(xiàn)nireq(nr)與nthreads(nt)設定不同數(shù)值時,會影響每秒所能預測的FPS效能。
圖3 – CPU執(zhí)行person-detection-retail-0013FP32模型結(jié)果
圖3中可以觀察到一個現(xiàn)象,當nthreads設定的值為3時,會得到相對最高的FPS結(jié)果,圖4為將圖3放大之后,由nthreads(nt)數(shù)值為2到8的設定值,分別在不同的nireq(nr)條件下,nireq(nr)數(shù)值為3到8的執(zhí)行結(jié)果。
圖4 – CPU執(zhí)行person-detection-retail-0013.xmlFP32模型,nthreads(nt)數(shù)值為2到8、nireq(nr)為3到8的FPS變化情形
由圖4中可以觀察到當nthreads設定值為3、nireq等于8,CPU執(zhí)行FP32模型FPS此時為85.1 FPS,之后無論nthreads與nireq調(diào)整為其他數(shù)值,執(zhí)行結(jié)果都無法超過此FPS,一般概念上會認為同時輸入的影像稍微多一點比較好,因為同時處理多一點影像,在機器有能力響應的狀態(tài)下,執(zhí)行結(jié)果的效能相對應該會高一些,從這個觀點得到的FPS為nthreads為3與nireq為8時,表示一次輸入8張影像時,同時使用3個CPU的處理程序來處理person-detection-retail-0013模型的運作過程,會有較好的執(zhí)行效能。
圖4同時顯示如果我們認為將nireq與nthreads的值設的越大越好可以得到更好的效能,結(jié)果顯示并不會有這樣的狀態(tài)產(chǎn)生,甚至當nthreads(nt)為19時,不管nireq(nr)設定多大的值,會發(fā)現(xiàn)此時約為25.1FPS,這樣的執(zhí)行效能相對nthreads(nt)為3時的85.1 FPS,相當于只能得到最高效能的1/3執(zhí)行效率,可以觀察到很明顯的,單純將nthreads與nireq值調(diào)大,只會效能更差而不會變好。
圖5 – CPU執(zhí)行person-detection-retail-0013FP16模型效能的變化情形
圖5為CPU執(zhí)行person-detection-retail-0013FP16模型的結(jié)果,相對CPU執(zhí)行FP32模型效能的情形,觀察圖3與圖5可以發(fā)現(xiàn)最高的FPS都約為86 FPS,圖3與圖5的效能變化非常相似,這個狀態(tài)顯示CPU在FP32與FP16的執(zhí)行具有相同的效能變化趨勢,nthreads為9時同樣會有一個很大的效能下降,原因與執(zhí)行環(huán)境所采用的硬件有關,本文章所使用硬件為i7第11代核心,包含4核心共8個Hyper-threading,發(fā)現(xiàn)nthreads分別在9與17的設定值時,會產(chǎn)生一個相對陡降的FPS結(jié)果。
圖6 – CPU執(zhí)行person-detection-retail-0013FP16模型效能的變化情形,nthreads(nt)數(shù)值為2到8、nireq(nr)為3到8的FPS變化情形
由圖6中會發(fā)現(xiàn)最高效能的值雖然在nthreads為3的時候,但是相對的此時的nireq為5,與圖4的nireq為8的情況并不同,此種最佳效能點的差異在各個模型選用時,可以再針對不同的nireq的數(shù)值做最后的量測進行尋找最佳參數(shù)點。
觀察CPU執(zhí)行FP32與FP16的模型效能變化狀態(tài)后,圖7中為CPU模式執(zhí)行person-detection-retail-0013FP16-INT8模型的結(jié)果,當nthreads(nt)設定的值為4、nireq(nr)等于20,量測范圍中最高的效能為116.5 FPS,很明顯的相較于FP32條件下最高為86 FPS高出許多。
從圖7中也可以觀察到nireq等于1,每次輸入1個影像,可以發(fā)現(xiàn)nthreads為4時,最高的效能為68.3FPS,無論nthreads設定多大,預測的FPS效能也無法提升,從這個結(jié)果可以觀察到,就算是硬件有很大的效能,nireq控制同時輸入數(shù)據(jù)的數(shù)量,nireq太小相對也會影響整體工作效能。
圖7 – CPU執(zhí)行person-detection-retail-0013FP16-INT8模型效能的變化情形
圖8 – CPU執(zhí)行person-detection-retail-0013FP16-INT8模型效能的變化情形,nthreads(nt)數(shù)值為2到8、nireq(nr)為2到20的FPS變化情形
圖8為圖7詳細的變化情形,可以觀察到當nthreads(nt)的數(shù)值是4的時候,nireq設定值大于等于3之后,相對每秒可以執(zhí)行推論的影像效能,相對高于其他的nthreads數(shù)值的推論效能,可以很明顯的感覺在CPU執(zhí)行FP16-INT8的條件下,CPU的核心數(shù)量、nthreads設定數(shù)值,與推論效能最高點較為一致,進一步要注意的是,雖然印象上FP16-INT8執(zhí)行效率相對會好很多,可是同樣的在nthreads為9的時候,一樣會有很大的效能陡降現(xiàn)象出現(xiàn),在模型實際上線運作時候,需要先注意到這樣的現(xiàn)象對應于所使用的硬件運作條件(如核心數(shù)量、最大的Hyper-threading數(shù)量)。
GPU執(zhí)行person-detection-retail-0013模型效能變化情形
圖9 – GPU執(zhí)行person-detection-retail-0013FP32模型效能的變化情形
圖9為GPU執(zhí)行person-detection-retail-0013FP32模型效能的變化情形,相對CPU的運作狀態(tài),以nthreads的形式為橫軸坐標軸時,會觀察到nireq為1的時候,系統(tǒng)的運作效能相對是最低的,nireq大于1以上很明顯FPS效率好很多,有趣的情況是將圖9轉(zhuǎn)換坐標軸,以nireq作為橫軸的狀態(tài)下,可以得到圖10的結(jié)果,此時會發(fā)現(xiàn)有趣的現(xiàn)象,當nireq大于3之后,在nireq持續(xù)增加相當于不斷的將同時輸入的影像數(shù)量提高時,在同樣的nthreads的情況下,GPU執(zhí)行FP32模型的狀態(tài),效能其實會持續(xù)降低。
圖10 – GPU執(zhí)行person-detection-retail-0013FP32模型效能的變化情形
由圖10的結(jié)果可以得到一個概念,在單純使用GPU狀態(tài)下執(zhí)行FP32模型的時候,同時輸入影像的數(shù)量增大并沒有幫助,GPU執(zhí)行FP32的效能最高為102.7FPS,相對CPU執(zhí)行FP32的效能為86 FPS的狀態(tài)下,單純使用GPU執(zhí)行FP32模型對于單獨CPU執(zhí)行FP32模型約為1.18倍的效能,相對另一個有趣的狀態(tài)是,nthreads設定的數(shù)值超過8之后,似乎在單純GPU執(zhí)行FP32模型的狀態(tài)下似乎對于推論效能不會有太大的影響,似乎此時設定nthreads的值,沒有真正的對應多個CPU核心運作的效能。
圖11- GPU執(zhí)行person-detection-retail-0013FP16模型效能的變化情形
圖11為GPU執(zhí)行person-detection-retail-0013FP16模型效能的變化情形,由圖11的結(jié)果可以得到一個概念,在單純使用GPU狀態(tài)執(zhí)行FP16模型的時候,nireq在小于3的狀態(tài)下,GPU相對的執(zhí)行效能并沒有達到滿載的狀態(tài),相對GPU執(zhí)行FP32模型效能最高為102.7FPS,很明顯GPU 在執(zhí)行FP16模型nireq等于2時就已經(jīng)接近130 FPS。
圖12- GPU執(zhí)行person-detection-retail-0013FP16模型,顯示nireq(nr)為3到20,nthreads(nt)為1到20的效能變化情形
由圖12的結(jié)果可以觀察到,當GPU執(zhí)行nireqperson-detection-retail-0013 FP16模型,最高的效能在nireq為5、nthreads(nt)為17此時為148.2FPS,相對在FP32的GPU與CPU運作條件下已有大幅度性能提升,可以觀察到nireq大于等于5之后效能會微幅的下降,nthreads的設定值大小對于效能的影響并不算太明顯,總結(jié)來說nireq大于3、nthreads設定值不論是多少,效能都會大于140FPS。
圖13 – GPU執(zhí)行person-detection-retail-0013FP16-INT8模型效能變化
圖13為GPU執(zhí)行person-detection-retail-0013FP16-INT8模型效能變化,與GPU執(zhí)行person-detection-retail-0013 FP16模型比較時,會發(fā)現(xiàn)GPUFP16-INT8之nireq為1與2時,執(zhí)行的FPS與GPU FP16時nireq為1與2的結(jié)果相當,而nireq為3時,執(zhí)行效能與GPU執(zhí)行FP16模型的最高FPS相當,進一步的當nireq持續(xù)增加大于5時,nthreads無論是哪種數(shù)值,均可達到150FPS以上,此結(jié)果顯示GPU執(zhí)行FP16-INT8的效能相對在CPU與其他的GPU模式下,有著非常高的FPS執(zhí)行效率。
圖14 – GPU執(zhí)行person-detection-retail-0013FP16-INT8模型效能變化
由圖14的結(jié)果可以觀察到GPU執(zhí)行person-detection-retail-0013FP16-INT8模型效能,與GPU執(zhí)行nireq person-detection-retail-0013 FP16模型比較時會發(fā)現(xiàn),最高效能為nireq為7、nthreads(nt)為11,此時效能為159.2FPS,明顯高于GPU執(zhí)行FP16模型的148.2FPS的效能。
CPU+GPU執(zhí)行person-detection-retail-0013模型效能變化情形
圖15的結(jié)果可以觀察到CPU+GPU執(zhí)行person-detection-retail-0013FP32模型效能的變化,要注意的是OpenVINO在同時使用CPU與GPU運作時,nthreads最大的數(shù)值在使用本硬件時只能設定到7,超過8之后會顯示只能最大設定到7的訊息,nthreads超過8之后就會顯示會將nthreads 自動設定為7進行預測,因此CPU+GPU同時運作的環(huán)境,nthreads的量測結(jié)果只有1到8的范圍,而nireq維持1到20的設定值。另外,在運作的參數(shù)-d中,采用的設定值是MULTI:GPU,CPU,這樣的條件下會將輸入數(shù)據(jù)優(yōu)先派送GPU,之后再給CPU進行處理。
圖15 – CPU+GPU執(zhí)行person-detection-retail-0013FP32模型效能變化
圖15的結(jié)果可以觀察到CPU+GPU執(zhí)行person-detection-retail-0013FP32模型效能的變化,與單純使用GPU執(zhí)行nireq person-detection-retail-0013 FP32模型比較時,將圖15放大為圖16,會發(fā)現(xiàn)最高的效能為nireq為14、nthreads(nt)為3,此時效能為106.4FPS,綜合圖15與圖16并且比較單純 CPU執(zhí)行FP32的模型時,當nireq大于3時,nthreads持續(xù)增加效能同樣無法繼續(xù)提升。
圖16 – CPU+GPU執(zhí)行person-detection-retail-0013FP32模型,nireq由5到20,nthreads由1到8的效能變化
圖16的結(jié)果會發(fā)現(xiàn)CPU+GPU執(zhí)行FP32模型最高的106.4FPS,與CPU執(zhí)行FP32的最高85.1FPS相比多了約20FPS,另一方面如果與單純GPU執(zhí)行FP32模型最高95.3FPS相比,大約多10FPS。因此可以得到CPU+GPU的執(zhí)行person-detection-retail-0013 FP32的模型的狀態(tài)下,為FP32模型下最高的執(zhí)行效能(106.4FPS)。
因此如果要求預測精度為FP32,能夠預期最好的FPS會在106附近。(nthreads設定為3、nireq設定為14、運作裝置為MULTI:GPU,CPU)。
圖17 – CPU+GPU執(zhí)行person-detection-retail-0013FP16模型效能變化
相對圖CPU+GPU執(zhí)行FP32的結(jié)果,圖17與18為CPU+GPU執(zhí)行person-detection-retail-0013F16模型效能的變化。圖18中顯示nthreads為1的狀態(tài)下,nireq為11與19時分別為149與149.5FPS,這兩個數(shù)值都非常高,但是由圖18會發(fā)現(xiàn)與單純GPU執(zhí)行FP16的模型(圖12)有著幾乎相同的最高執(zhí)行FPS,同時nthreads持續(xù)變大時FPS呈現(xiàn)持續(xù)下降,這種結(jié)果呈現(xiàn)CPU+GPU執(zhí)行FP16模型的情況下,GPU與CPU+GPU執(zhí)行的最高效能似乎非常接近。
圖18 – CPU+GPU執(zhí)行person-detection-retail-0013FP16模型,nireq由4到20,nthreads由1到8的效能變化
進一步的回頭觀察CPU執(zhí)行FP16模型最高為86.3 FPS,由此也可以發(fā)現(xiàn)單純執(zhí)行GPU或GPU+CPU執(zhí)行FP16的效能,約提高1.73倍的效率,每秒鐘多63FPS。我們可以從上述的觀察中發(fā)現(xiàn),GPU的運作環(huán)境下,其實nthreads為1的效能就是最好的狀態(tài),至于nireq要設定多少,如果在不能夠有太多延遲畫面時間輸入的狀態(tài)下,建議一次輸入6張數(shù)據(jù)以上會有不錯的整體預測輸出效能,推論速度可以到140 FPS以上。
最后來看圖19中,顯示GPU+CPU執(zhí)行FP16-INT8的模型狀態(tài),會發(fā)現(xiàn)在nireq小于5的情形下,最高的預測效能都無法大于160FPS,可以明顯的看到,當nthreads為1、nireq大于5的條件下,觀察FPS效能會發(fā)現(xiàn)nireq為14、nthreads為1的狀態(tài)下,可跑出176.9FPS的最高效能,此效能值相對也是CPU、GPU、CPU+GPU執(zhí)行FP16-INT8狀態(tài)下最高的結(jié)果。
圖19 – CPU+GPU執(zhí)行person-detection-retail-0013FP16-INT8模型效能變化
進一步討論CPU+GPU執(zhí)行FP16-INT8的結(jié)果,會發(fā)現(xiàn)其實隨著nthreads的增大,在nthreads由2到8之間,其實對nireq為1到5以下似乎沒有變快的效果,另外在nireq為6到20的情況下,在nthreads大于1之后,明顯的預測的效能不升反將,推想這種情形發(fā)生的原因在于nireq其實也是需要CPU的執(zhí)行資源,當把nthreads增大的時候,CPU的資源被瓜分至進行預測處理的后續(xù)工作的部份,然而實際上從數(shù)據(jù)執(zhí)行結(jié)果的現(xiàn)象觀察,似乎只要nthreads設定為1,讓其他的CPU專心的進行數(shù)據(jù)讀取的動作把數(shù)據(jù)喂給GPU,然后CPU只需要用1個核心,專心的把GPU預測完的結(jié)果進行后續(xù)的處理,這樣的協(xié)同狀態(tài)下的工作組合,就可以達到很高的效率了。
結(jié)論
將目前觀察到的結(jié)果做一個總結(jié),你的機器上面如果只有CPU,當然的狀態(tài)只能執(zhí)行CPU運作FP32、FP16、FP16-INT8模型,F(xiàn)P16與FP32的模型在CPU模式下有同樣的效能,主要是系統(tǒng)會先將FP16轉(zhuǎn)換成FP32之后執(zhí)行,要注意的是nthreads的值不能設定超過核心的Hyper-threading的最大總數(shù)量,否則會有效能陡降的情形。
本文目前測試的模型顯示nthreads的數(shù)量設定在CPU的核心數(shù)量減1,這個時候的CPU預測效能會是最好的狀態(tài),當然部份的時候也可以試試看nthreads的數(shù)值設定與CPU的核心數(shù)量一樣,因為nthreads的數(shù)值超過CPU核心數(shù)目之后,F(xiàn)PS就只會變慢而不會變快了。
如果你的機器上面有Intel GPU的顯示芯片,目前許多桌上型機器內(nèi)建Intel GPU顯示芯片,過去只能用來作為顯示適配器使用,其實這時可以將這樣的機器作為機器學習預測使用,在本文中所測試的狀態(tài),單純使用GPU實際上有著非常好的運作效能,如果需要維持預測精準度又不希望占用CPU的運算效能,可以單純使用GPU執(zhí)行FP32模型,相對已經(jīng)可以快過單純使用CPU執(zhí)行FP32預測的效能。
最后如果你可以提供機器全部的效能進行機器學習的預測,在這樣的狀態(tài)CPU+GPU同時協(xié)作,如果你使用的機器學習模型在FP16-INT8的狀態(tài)下可以維持預測的精確度,則使用CPU+GPU的狀態(tài)下,運作FP16-INT8將大幅度提升預測的FPS效率,相對CPU FP32格式的模型,CPU+GPU執(zhí)行FP16-INT8相當于在同一臺機器上獲得2倍的預測效能。
后記
初學者透過MakerPRO系列文章可以學習OpenVINO操作,本文描述了參數(shù)調(diào)整的概念如何的影響OpenVINO模型上線時注意的事項,希望能夠讓系統(tǒng)上線運作模型時,有一定比較清楚要注意的觀念。
本文并沒有提及如何將模型換成FP16-INT8,以及使用benchmark_app比較FP32、FP16、FP16-INT8的結(jié)果,benchmark_app內(nèi)定可以使用隨機值作為輸入,并單純的測試硬件計算效能對應模型推論的FPS結(jié)果。最后,對于多攝影機、多模型同時運作在OpenVINO的狀態(tài),之后有機會再分享了。
審核編輯:湯梓紅
-
機器學習
+關注
關注
66文章
8418瀏覽量
132646 -
Docker
+關注
關注
0文章
458瀏覽量
11857
原文標題:優(yōu)化OpenVINO模型效能:參數(shù)設定影響實測
文章出處:【微信號:易心Microbit編程,微信公眾號:易心Microbit編程】歡迎添加關注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關推薦
評論