logo
Loading...

優化 OpenVINO 模型效能:參數設定影響實測 - 【教材專區】再訪OpenVINO 模型優化器,Runtime API 與度量深度學習模型效能與準確度 - Cupoy

簡介 兩年前剛接觸 OpenVINO 的時候,開始感覺機器學習發展的生態似乎有許多的轉變,隨著執行許多範例的過程中,漸漸了解 Open Model Zoo 的 Github 支援了許多可以下載的模型,...

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