簡介 2012 年 Alex Krizhevsky 利用卷積神經網路 (Convolutional Neural Network, CNN) AlexNet以15.3% Top5 錯誤率遠甩第二名好幾條街 (26.1%),贏得 ImageNet 大規模視覺辨識挑戰賽(ILSVRC)首獎,從此開啟人工智慧、神經網路、深度學習的新世代。自此各個廠商也紛紛推出自家的開發工具,搶食人工智慧這塊大餅。 2018 年 5 月 INTEL 有鑑於邊緣智能(Edge AI)設備的硬體效能遠低於雲端機房,且不同硬體、開發工具間存在嚴重差異,造成工程師學習上極大的困擾,因此推出開放(免費)電腦視覺推論及神經網路(深度學習)優化工具包「OpenVINO」(Open Visual Inference & Neural Network Optimization Toolkit)。 可參考: Get the Intel® Distribution of OpenVINO™ Toolkit OpenVINO™ Toolkit Overview OpenVINO 整合了 OpenCV、OpenCL 等開源電腦視覺及加速運算函式庫,並可運行在多種作業系統(Windows, Linux),輕鬆搭配自家各種不同硬體加速運算平台(Inetl CPU, GPU, FPGA, VPU, GNA),且支援各種常見AI開發框架(TensorFlow, Caffe, MXNet, ONNX, KALDI) 訓練出的模型及參數,更有提供模型的優化工具使運算效能及模型大小得到更佳的輸出,最重要的是工程師只需寫一次程式就能在不同平台上執行,大大降低學習及佈署的負擔。 早先 OpenVINO 的版本彈性雖然較大,但安裝程序冗長,一不小心容易造成步驟缺失導致系統無法正確運行。為解決這項問題,OpenVINO 也有推出 Docker 安裝方式,輕鬆搞定安裝及執行問題,且可有效隔離不同版本及其它開發環境。 接著就簡單說明「什麼是 Docker?和虛擬機 VM 有何不同?」、「如何安裝 Docker 工作環境」及「如何使用 Docker 安裝 OpenVINO 」,最後再以一個範例來說明「如何利用公開模型 mobilenet 執行影像分類」。 什麼是 Docker?和虛擬機 VM 有何不同? 一般大家買來的電腦上大部份都是安裝微軟的 Windows 作業系統,如果遇到要開發 Liunx 相關應用程式時,可能有人會選擇安裝二個作業系統,在重新開機時選擇要執行那一種。雖然這種方式可完全掌控硬體資源(如CPU, GPU, HDD, RAM)及開發環境(相依套件、函式庫),但每次切換作業系統都要重新開機,實在太麻煩。 為解決這個問題,於是就有人提出在主作業系統(Host OS)上安裝一個虛擬機(Virtual Machine, VM)監視器(Hypervisor),如 VMWare, VirtualBox 這類工具,方便安裝其它作業系統或者多種不同的開發環境,如 Fig. 1 左圖所示。雖然這樣很方便同時使用兩種以上作業環境,但硬體資源要和主系統共享且額外多了一些虛擬化轉換工作,所以執行效能較差,甚至有些硬體(如GPU)無法直接使用,導致部份應用程式無法運作。 很多在 Linux 環境下開發程式的人都知道,它的應用程式比較不像在 Windows 下一個執行檔(.exe)或搭配幾個動態函式庫(.dll)就能順利執行,各種開發工具及相依套件包常會有版本不相容問題。本來在 Linux 上也可以執行虛擬機(VM)來區隔不同開發環境,但效能實在太差,所以便有人開發出以一種類似大船載送貨櫃,貨櫃裝載各種不同大小、形狀貨物的執行環境,稱為 Docker。 如 Fig. 1 中圖所示,容器(Containers)就像貨櫃是用來裝載映像檔(Images)這樣的貨物,再由 Docker 引擎(大船承載)執行的概念。表面上看起來和 VM 沒什麼不同,但最大差別就是它很輕量,不透過虛擬化,直接驅動硬體資源,共用作業系統資源,所以啟用一個容器和映像檔僅須數秒和載入一個 VM 客作業系統核心要數分鐘差異頗大。以往 Docker 只能在 Linux 上運作,近年來已有支援 Window 及 Mac OS 的版本出現了。 一般 Docker 使用上極為方便,供應商僅需將欲提供的映像檔(Images)推上(Push) 公開映像檔倉儲(Repository / Docker Hub),使用者再去拉下(Pull)想要的映像檔即可執行,如 Fig. 1 右圖所示。 Fig. 1 VM 和 Docker 架構差異比較圖。(OmniXRI, Jan. 2021整理製作) 如何安裝 Docker 工作環境 為了後面能使用Docker快速安裝Intel OpenVINO工具包及相關環境,這裡先介紹如何在Ubuntu 18.04 / 20.04 (Linux)環境下安裝Docker。 首先啟動終端機(Terminal)進入命令列操作模式,然後要確定是否有安裝舊版的Docker(docker, docker-engine, docker.io等),若有,則執行下列命令進行移除,因為最新版的Docker名稱已經變更了。 sudo apt-get remove docker docker-engine docker.io containerd runc 由於 Docker 預設只能在 root(sudo) 的權限下執行,為了方便一般使用者也能直接呼叫使用,可使用下列命令創建一個 Docker 群組並將目前使用者添加至該群組中,登出系統後再重新登入,後續執行 Docker 相關命令就不用再加上 sudo 了。 curl -fsSL https://get.docker.com -o get-docker.sh sudo sh get-docker.sh 重新登入後,便可執行下列命令測試 Docker 是否正常。 docker run hello-world 由於第一次執行,本機端並沒 hello-world 這個映像檔,所以會自動到 Docker Hub 去找,並下載回來。如果成功會看到下面畫面。 Fig. 2 Docker 執行 hello-world 映像檔執行結果。(OmniXRI Jan. 2021整理製作) 後續若有需要除移 Docker Engine 及手動刪除相關路徑時,則可執行下列命令。 sudo apt-get purge docker-ce docker-ce-cli containerd.io sudo rm -rf /var/lib/docker 另外這裡補充幾個 Docker 常用指令,想了解更多 Docker 操作指令,可參考Docker docs 官網。 從Docker Hub拉下(下載)映像檔 [映像檔名稱xxxxx] docker pull xxxxx 檢查目前已下載之映像檔 docker images 檢查目前正在執行的映像檔 docker ps 開始執行映像檔 [映像檔名稱xxxxx] docker start xxxxx 停止執行映像檔 [映像檔名稱xxxxx] docker stop xxxxx 如果想要知道更多 Docker 安裝資訊,可參考 Install Docker Engine on Ubuntu。 另外想在 Windows 上安裝 Docker 的人,可參考 Install Docker Desktop on Windows。 如何使用 Docker 安裝 OpenVINO Intel OpenVINO 對應不同作業系統(Windows, Linux, macOS, RaspbianOS) 提供很多種安裝方式。近年來隨著各種容器技術興起,也開始支援像 Docker 這類直接安裝映像檔方式,充份解決使用者不熟悉安裝步驟及滿足開發者需要不同版本或開發環境隔離需求。 Intel OpenVINO 目前在 Docker Hub 上有提供多個映像檔讓使用者下載(pull),其中有兩組使用率較高, openvino/workbench 使用者不需寫程式直接操作圖型化介面就可測試各種模型效能, openvino/ubuntu18_dev 則提供一般Ubuntu 18.04 (Linux) 開發環境,本次測試將以後者為例。 首先執行下列指令將映像檔 openvino/ubuntu18_dev 從 Docker Hub 拉下(下載)至本機端。由於檔案頗多且大(解壓縮後約 7.22GByte),所以根據網路速度需要等待時間可能從數分鐘到數十分鐘不等。 docker pull openvino/ubuntu18_dev 若想啟動映像檔,依不同硬體執行下列命令。 Intel CPU docker run -it --rm openvino/ubuntu18_dev Intel GPU docker run -it --rm --device /dev/dri openvino/ubuntu18_dev NCS2(單個VPU) docker run -it --rm --device-cgroup-rule='c 189:* rmw' -v /dev/bus/usb:/dev/bus/usb openvino/ubuntu18_dev HDDL(多個VPU) docker run -it --rm --device=/dev/ion:/dev/ion -v /var/tmp:/var/tmp openvino/ubuntu18_dev 啟動 Docker 並指定執行的映像檔後命令列提示字元會顯示目前 OpenVINO 版本,預設啟動時就會執行環境變數設定(setupvars.sh),且安裝好 Python 3.6.9 及 OpenCV 4.5.1_OpenVINO (OpenVINO 刪減版)。若想離開 Docker,則輸入 exit 再按 Enter 鍵即可回到正常命令列狀態,如 Fig. 3 所示。若想更完整了解 Docker 在 Linux 上安裝方式,可參考官網說明:Install Intel® Distribution of OpenVINO™ toolkit for Linux* from a Docker* Image。而 Docker 在 Windows 上安裝方式則參考另一份官網說明:Install Intel® Distribution of OpenVINO™ toolkit for Windows* from Docker* Image。 Fig. 3 檢查 Docker 本地端映像檔,啟動及離開 Docker 環境。(OmniXRI Jan. 2021整理製作) 若不想使用 Docker 安裝,而想直接在 Linux 上安裝 OpenVINO,則可參考另一篇官網說明:Install Intel® Distribution of OpenVINO™ toolkit for Linux*。 另外貼心提醒一下,如果使用 Docker 進行推論前要注意不同作業系統有不同硬體的最低基本要求,可參考:Install the DL Workbench,可以參考 Fig. 4 所示。 Fig. 4 OpenVINO 建議最低推論要求。 如何利用公開模型 MobileNet 執行影像分類 利用 Docker 安裝好 OpenVINO 工作環境後就可以開始進行推論(Inference)工作了。OpenVINO 除了提供多種預訓練好的模型外(可參考:Overview of OpenVINO™ Toolkit Intel’s Pre-Trained Models),另外也支援很多不同框架 (Caffe/Caffe2, PyTorch, TensorFlow, MXNet, ONNX等)產生的公開模型(可參考:Overview of OpenVINO™ Toolkit Public Models),亦稱為「Open Model Zoo」,其中包含影像分類、物件偵測、影像分割、人臉辨識、人體姿態、深度估測、影像填補、風格轉移、動作辨識、影像著色、聲音分類、語音辨識、影像翻譯等公開模型。 使用這些模型前須先下載並執行優化,最後產生 OpenVINO 推論時所需的中間表示檔(Intermediate Representation, IR),即模型描述檔(.xml)及參數權重檔(.bin),存放在 /opt/intel/openvino/public/ 模型名稱 /FP16(或FP32, INT8) 路徑下。接下來就舉一個 mobilenet 影像分類的例子來說明。 啟動Docker並指定映像檔在Intel CPU上執行,以root身份執行,同時指令顯示器和系統共用,方便OpenCV執行 imshow() 時能正常工作 docker run -itu root:root --rm -v /tmp/.X11-unix:/tmp/.X11-unix -e DISPLAY=$DISPLAY openvino/ubuntu18_dev 下載公開模型mobilenet-v1-1.0-224 python3 \ /opt/intel/openvino/deployment_tools/tools/model_downloader/downloader.py \ --name mobilenet-v1-1.0-224 優化模型mobilenet-v1-1.0-224並產出中間表示(*.xml, *.bin)檔,FP16/FP32格式於 /opt/intel/openvino/deployment_tools/public/模型名稱 路徑下 python3 \ /opt/intel/openvino/deployment_tools/tools/model_downloader/converter.py \ --name mobilenet-v1-1.0-224 Fig. 5 推論測試用影像。 接著輸入一張汽車影像(如 Fig. 5 所示),經 mobilenet-v1 PF16 格式推論輸出結果,Top 1 為 Car, Sport Car 0.4242045 (42.42% 置信度),成功完成範例。 以 classification_sample_async.py進行「影像分類」非同步推論 -m 指定mobilenet-v1-1.0-224模型為FP16格式進行推論 -I 指定待測試之輸入影像 --labels 指定輸出ImageNet 1000分類對應的標籤檔 python3 \ /opt/intel/openvino/inference_engine/samples/python/classification_sample_async/classification_sample_async.py \ -m /opt/intel/openvino/public/mobilenet-v1-1.0-224/FP16/mobilenet-v1-1.0-224.xml \ -i /opt/intel/openvino/deployment_tools/demo/car.png \ --labels /opt/intel/openvino/deployment_tools/demo/squeezenet1.1.labels 輸出結果(部份省略,僅顯示Top 10結果標籤及置信度0.0~1.0) [ INFO ] Top 10 results: Image /opt/intel/openvino/deployment_tools/demo/car.png classid probability ###draft_code_symbol_lessthen###hr /> car, sport car 0.4242045 convertible0.2728052 wheel 0.1330036 wagon, station wagon, wagon, estate car, beach waggon, station waggon, waggon 0.0699500 race car, racing car0.0339605 radiator grille0.0263465 pickup truck0.0155464 hack, taxi, taxicab0.0127090 minivan 0.0051457 T 0.0018786 小結 Intel OpenVINO 目前大約一季就會有一版更新,官方也有專門的論壇在解決大家的疑難雜症,支援的公開模型也越來越多,若再配合像 Docker 這類容器方式的安裝,新手們就更容易上手,使用上也更加方便了。所以,各位有滿腦子AI應用不知如何發揮的朋友,還不趕快來試試。 貼心提醒: 目前 OpenVINO 最新版本為 2021.2,自 2020.4 版本後就不再支援神經運算棒(Movidius Neural Computing Stick, NCS)第一代產品,而 NCS2 第二代產品則不受影響。 詳細內容 如何利用Docker快速建置OpenVINO™ Toolkit開發環境 - 引領創新的科技實作社群媒體為解決安裝步驟系統無法運行,OpenVINO推出Docker安裝方式,輕鬆搞定安裝及執行問題,本篇簡單說明Do...makerpro.cc