如何利用Docker快速建置OpenVINO™ Toolkit開發環境

作者:許哲豪(Jack)

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)[1][2]。

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名稱已經變更了。

1
sudo apt-get remove docker docker-engine docker.io containerd runc

接著下載官方建議的快速安裝腳本並進行安裝。

1
2
curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh

由於Docker預設只能在root(sudo)的權限下執行,為了方便一般使用者也能直接呼叫使用,可使用下列命令創建一個Docker群組並將目前使用者添加至該群組中,登出系統後再重新登入,後續執行Docker相關命令就不用再加上sudo了。

1
2
sudo groupadd docker
sudo usermod -aG docker $USER

重新登入後,便可執行下列命令測試Docker是否正常。

1
docker run hello-world

由於第一次執行,本機端並沒hello-world這個映像檔,所以會自動到Docker Hub去找,並下載回來。如果成功會看到下面畫面。

Fig. 2 Docker執行hello-world映像檔執行結果。(OmniXRI Jan. 2021整理製作)

後續若有需要除移Docker Engine及手動刪除相關路徑時,則可執行下列命令。

1
2
sudo apt-get purge docker-ce docker-ce-cli containerd.io
sudo rm -rf /var/lib/docker

另外這裡補充幾個Docker常用指令,想了解更多Docker操作指令,可參考官網[3]。

1
2
3
4
5
6
7
8
9
10
從Docker Hub拉下(下載)映像檔 [映像檔名稱xxxxx]
docker pull xxxxx
檢查目前已下載之映像檔
docker images
檢查目前正在執行的映像檔
docker ps
開始執行映像檔 [映像檔名稱xxxxx]
docker start xxxxx
停止執行映像檔 [映像檔名稱xxxxx]
docker stop xxxxx

如果想要知道更多Docker安裝資訊,可參考官網[4]。另外想在Windows上安裝Docker的人,可參考官網[5]。

如何使用Docker安裝OpenVINO

Intel OpenVINO對應不同作業系統(Windows, Linux, macOS, RaspbianOS)提供很多種安裝方式。近年來隨著各種容器技術興起,也開始支援像Docker這類直接安裝映像檔方式,充份解決使用者不熟悉安裝步驟及滿足開發者需要不同版本或開發環境隔離需求。

Intel OpenVINO目前在Docker Hub上有提供多個映像檔[6]讓使用者下載(pull),其中有兩組使用率較高,openvino/workbench使用者不需寫程式直接操作圖型化介面就可測試各種模型效能,openvino/ubuntu18_dev則提供一般Ubuntu 18.04 (Linux) 開發環境,本次測試將以後者為例。

首先執行下列指令將映像檔openvino/ubuntu18_dev從Docker Hub拉下(下載)至本機端。由於檔案頗多且大(解壓縮後約7.22GByte),所以根據網路速度需要等待時間可能從數分鐘到數十分鐘不等。

1
docker pull openvino/ubuntu18_dev

若想啟動映像檔,依不同硬體執行下列命令。

1
2
3
4
5
6
7
8
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上安裝方式,可參考官網說明[7]。而Docker在Windows上安裝方式則參考另一份官網說明[8]。

Fig. 3 檢查Docker本地端映像檔,啟動及離開Docker環境。(OmniXRI Jan. 2021整理製作)

若不想使用Docker安裝,而想直接在Linux上安裝OpenVINO,則可參考另一篇官網說明[9]。

另外貼心提醒一下,如果使用Docker進行推論前要注意不同作業系統有不同硬體的最低基本要求[10],可以參考Fig. 4所示。

Fig. 4 OpenVINO建議最低推論要求[10]。

如何利用公開模型MobileNet執行影像分類

利用Docker安裝好OpenVINO工作環境後就可以開始進行推論(Inference)工作了。OpenVINO除了提供多種預訓練好的模型外[11],另外也支援很多不同框架(Caffe/Caffe2, PyTorch, TensorFlow, MXNet, ONNX等)產生的公開模型[12],亦稱為「Open Model Zoo」,其中包含影像分類、物件偵測、影像分割、人臉辨識、人體姿態、深度估測、影像填補、風格轉移、動作辨識、影像著色、聲音分類、語音辨識、影像翻譯等公開模型。

使用這些模型前須先下載並執行優化,最後產生OpenVINO推論時所需的中間表示檔(Intermediate Representation, IR),即模型描述檔(.xml)及參數權重檔(.bin),存放在/opt/intel/openvino/public/模型名稱/FP16(或FP32, INT8)路徑下。接下來就舉一個mobilenet影像分類的例子來說明。

1
2
3
4
5
6
7
8
9
10
11
啟動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%置信度),成功完成範例。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
以 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

<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相關應用可參考下方【延伸閱讀】項目)

貼心提醒:目前OpenVINO最新版本為2021.2,自2020.4版本後就不再支援神經運算棒(Movidius Neural Computing Stick, NCS)第一代產品,而NCS2第二代產品則不受影響。

延伸閱讀

[A] 許哲豪,【AI_Column】運用Intel OpenVINO土炮自駕車視覺系統

[B] 許哲豪,【OpenVINO™教學】土炮影像實例分割型智慧監控系統

[C] 許哲豪,【OpenVINO™教學】土炮體感控制系統

[D] 許哲豪,【課程簡報分享】20191019_2019 Intel OpenVINO™ x Edge AI創意應用自造松_OpenVINO平台運用要領

[E] 許哲豪,【課程簡報分享】20191026_2019 Intel OpenVINO™ x Edge AI創意應用自造松_OpenVINO預訓模型使用及應用實例開發

[F] 許哲豪,OpenVINO與OpenCV搭配─幹電腦視覺的活一點都不累

[G] 許哲豪,【OpenVINO™+RealSense™教學】土炮智能機器手臂之視覺系統

[H] 許哲豪,如何在Google Colab上安裝執行Intel OpenVINO的範例

(責任編輯:林亮潔)

Author: 許 哲豪

工作經驗超過二十年,主要專長機電整合、電腦視覺、人機互動、人工智慧、專利分析及新創輔導。曾任機電整合工程師、機器視覺研發副理、技轉中心商業發展經理。目前擔任多家公司兼任技術顧問並積極推廣實境互動相關技術。 主持歐尼克斯實境互動工作室(OmniXRI):http://omnixri.blogspot.com Edge AI Taiwan邊緣智能交流區:https://www.facebook.com/groups/edgeaitw/

Share This Post On

發表

跳至工具列