對(duì)于熟悉 C++ 的開(kāi)發(fā)人員來(lái)說(shuō),前一篇文章將 DeepStreamSamples 版容器的范例搬到本機(jī)上,再搭配 Docker 路徑映射方式就能輕松搭建開(kāi)發(fā)環(huán)境。但這種方式只適用于 C / C++ 范例,并不適用于 DeepStream 的 Python 環(huán)境,因?yàn)檫€需要安裝 Gstreamer 的 Gst-Python 與 DeepStream 的 PyBinding 與兩個(gè)元件。
我們可以在容器內(nèi)安裝這兩個(gè)元件,但是前面提供的 Docker 指令中使用 “--rm” 參數(shù),一旦退出容器之后就會(huì)銷(xiāo)毀這個(gè)調(diào)試好的環(huán)境,這對(duì)于使用來(lái)說(shuō)是非常不方便的,因此必須做出調(diào)整,將調(diào)試好的環(huán)境保留下來(lái),甚至于存成一個(gè)獨(dú)立的鏡像文件,就能方便日后的重復(fù)使用或移植工作。
1、將容器調(diào)整為 “后臺(tái)運(yùn)行” 執(zhí)行:
在 NGC 官方提供的指令中使用 “--it” 與 “--rm” 是為了能快速啟用容器,并且在使用完畢后刪除容器以避免占用不必要的資源,現(xiàn)在我們來(lái)做以下調(diào)整:
-
將 “-it” 參數(shù)改成 “-id”參數(shù):這樣雖然不會(huì)第一時(shí)間進(jìn)入容器內(nèi)執(zhí)行,但是會(huì)讓這個(gè)容器在后臺(tái)運(yùn)行,并且打印容器 ID,后面在使用 “dockerexec” 指令來(lái)進(jìn)入容器操作,這是個(gè)非常實(shí)用的方式,大家可以好好學(xué)習(xí)使用方法;
-
去除 “--rm” 參數(shù):退出容器之后自動(dòng)移除;
-
添加 “--name” 參數(shù):為了便于管理,不需要去面對(duì)長(zhǎng)達(dá) 12 碼的容器編號(hào),我們可以用這個(gè)參數(shù)去指定容器名稱(chēng),方便后面的操作;
-
為了配合Python的iot應(yīng)用范例,建議選擇iot版容器的適用性會(huì)比較高。
現(xiàn)在試著執(zhí)行以下指令,創(chuàng)建一個(gè)要配置 Python 開(kāi)發(fā)環(huán)境的 DeepStream 容器:
docker run -id --name=ds_python --net=host --runtime=nvidia -e DISPLAY=$DISPLAY
-w /opt/nvidia/deepstream/deepstream -v /tmp/.X11-unix/:/tmp/.X11-unix
-v ~/deepstream/sources:/opt/nvidia/deepstream/deepstream/sources
-v ~/deepstream/samples:/opt/nvidia/deepstream/deepstream/samples
nvcr.io/nvidia/deepstream-l4t:6.1-iot
執(zhí)行之后,會(huì)發(fā)現(xiàn)命令終端并未進(jìn)入容器里面,依舊在本機(jī)(容器外)的狀態(tài),現(xiàn)在執(zhí)行 “docker ps” 指令,會(huì)看到如以下的狀態(tài):
這里顯示有個(gè)名為 “ds_python” 的容器處于運(yùn)行狀態(tài),但是我們還沒(méi)有進(jìn)入這個(gè)容器的操作環(huán)境中。
2、使用 docker exec 指令進(jìn)入容器:
現(xiàn)在以 deepstream-l4t:6.1-iot 創(chuàng)建的 ds_python 容器已經(jīng)在后臺(tái)啟動(dòng),我們只要使用 “docker exec” 指令就能進(jìn)入容器內(nèi)操作,請(qǐng)執(zhí)行以下指令:
docker exec -it ds_python bash
這樣就能進(jìn)到容器里面。現(xiàn)在試試在容器內(nèi)做些事情,例如創(chuàng)建一個(gè)目錄、添加一個(gè)文件,然后執(zhí)行 “exit” 退出容器,然后再執(zhí)行前面的指令重新進(jìn)入容器內(nèi),檢查看看剛剛所做的修改應(yīng)該還存在,這樣就能確保我們?yōu)槿萜靼惭b的內(nèi)容可以保留。
3、重啟系統(tǒng)之后的容器啟動(dòng):
這種容器創(chuàng)建的方式,在系統(tǒng)重啟之后還能保留前面的設(shè)定嗎?重啟一次系統(tǒng)就知道了,然后執(zhí)行 “docker ps” 指令檢查狀態(tài),發(fā)現(xiàn)看不到前面所創(chuàng)建的 ds_python 容器了,怎么辦呢?
不用緊張,現(xiàn)在執(zhí)行 “docker ps -a” 指令,就會(huì)發(fā)現(xiàn)這個(gè)容器依舊存在于背景資源中,只是沒(méi)有啟動(dòng)而已,現(xiàn)在執(zhí)行以下指令:
docker start ds_python
dockerps
現(xiàn)在再重新執(zhí)行下面指令,就能進(jìn)入容器里:
docker exec -it ds_python bash
再檢查看看前面所做的修改是否依然存在?現(xiàn)在就能確認(rèn)這種方式能將容器的修改長(zhǎng)期保留,是一種更加實(shí)在的用法。
4、為容器安裝 Python 開(kāi)發(fā)環(huán)境:
現(xiàn)在可以在容器內(nèi)按照 <https://github.com/NVIDIA-AI-IOT/deepstream_python_apps>的 “HOW-TO Guide” 安裝步驟,調(diào)試 DeepStream 的 Python 開(kāi)發(fā)環(huán)境:
-
安裝依賴(lài)庫(kù):
如果 Jetson 的操作系統(tǒng)是 Ubuntu 20.04(JetPack 5.0 以上),請(qǐng)執(zhí)行以下的依賴(lài)庫(kù)安裝步驟:
apt install python3-gi python3-dev python3-gst-1.0 python-gi-dev git python-dev
python3 python3-pip python3.8-dev cmake g++ build-essential libglib2.0-dev
libglib2.0-dev-binlibgstreamer1.0-devlibtoolm4autoconfautomakelibgirepository1.0-devlibcairo2-dev
-
從 GITHUB 倉(cāng)下載源碼到指定目錄:
cd sources
git clone https://github.com/NVIDIA-AI-IOT/deepstream_python_apps
cd deepstream_python_apps
gitsubmoduleupdate--init
-
安裝 Gst-Python
apt update
apt-get install -y apt-transport-https ca-certificates -y
update-ca-certificates
cd 3rdparty/gst-python/
./autogen.sh
make&&makeinstall
-
安裝PyBinding:
請(qǐng)參照如下鏈接:
現(xiàn)在就完成了 Python 環(huán)境的配置。
5、測(cè)試 Python 范例
要驗(yàn)證環(huán)境是否調(diào)試完成的最簡(jiǎn)單方法,就是執(zhí)行一個(gè)最基礎(chǔ)的 deepstream-test1 范例,請(qǐng)?jiān)谌萜鲀?nèi)執(zhí)行以下指令:
cd /opt/nvidia/deepstream/deepstream/
cd sources/deepstream_python_apps/apps/deepstream-test1
./deepstream_test_1.py../../../../samples/streams/sample_720p.h26
正常運(yùn)行會(huì)看到如下圖的執(zhí)行結(jié)果。
這樣就表示 DeepStream 容器的 Python 開(kāi)發(fā)環(huán)境已經(jīng)安裝成功。
6、重復(fù)使用調(diào)試好的容器:
接下來(lái)就是要將前面調(diào)試好的容器環(huán)境存儲(chǔ)起來(lái),以后就不需要每次調(diào)試一次環(huán)境。這部分分成三個(gè)階段:
(1)臨時(shí)性保存:
事實(shí)上前面使用 “-id” 指令之后,這個(gè)容器就會(huì)一直保留在背景中執(zhí)行,即便重啟系統(tǒng)后也是存在的,如同前面所提供的,只要執(zhí)行以下指令就能重新進(jìn)入這個(gè)容器:
sudo xhost +si:localuser:root
dockerstartds_python&&dockerexec-itds_pythonbash
(2)儲(chǔ)存成 Docker 鏡像:
現(xiàn)在需要在打開(kāi)一個(gè)命令終端,使用 “docker commit <容器名> <鏡像名>” 指令,將目前執(zhí)行的容器存成一個(gè)鏡像,請(qǐng)執(zhí)行以下指令:
docker commit ds_python deepstream-l4t:6.1-python
現(xiàn)在執(zhí)行 “docker images” 指令,可以看到多了一個(gè) “deepstream-l4t:6.1-python” 鏡像,如下圖所示:
只要不重裝系統(tǒng)或者刪除這個(gè)鏡像,那么這個(gè)鏡像就會(huì)一直保留在系統(tǒng)里面,以后如果需要再次使用,只要執(zhí)行以下指令即可:
sudo xhost +si:localuser:root
sudodockerrun-it--rm--net=host--runtimenvidia-eDISPLAY=$DISPLAY-w/opt/nvidia/deepstream/deepstream-v/tmp/.X11-unix/:/tmp/.X11-unix-v~/nvme/deepstream/sources:/opt/nvidia/deepstream/deepstream/sources-v~/nvme/deepstream/samples:/opt/nvidia/deepstream/deepstream/samplesdeepstream-l4t:6.1-python
或者可以同時(shí)啟動(dòng)多個(gè)獨(dú)立的 Python 環(huán)境 DeepStream 容器,如下指令:
sudo xhost +si:localuser:root
sudodockerrun-id--name=ds_python2--net=host--runtimenvidia-eDISPLAY=$DISPLAY-w/opt/nvidia/deepstream/deepstream-v/tmp/.X11-unix/:/tmp/.X11-unix-v~/nvme/deepstream/sources:/opt/nvidia/deepstream/deepstream/sources-v~/nvme/deepstream/samples:/opt/nvidia/deepstream/deepstream/samplesdeepstream-l4t:6.1-python
(3)導(dǎo)出成文件:
最保險(xiǎn)的方式,就是將這個(gè) deepstream-l4t:6.1-python 鏡像導(dǎo)出成文件,自行保存好,這樣即便系統(tǒng)重新安裝后,也能直接從這個(gè)文件載入鏡像,然后開(kāi)啟工作容器:
# 將鏡像導(dǎo)出成文件
sudo docker save deepstream-l4t:6.1-python -o jp50dp_ds61_python
# 將文件載入成鏡像
sudodockerload-ijp50dp_ds61_python
現(xiàn)在,這個(gè)導(dǎo)出的 jp50dp_ds61_python 壓縮文件,也能部署到其他 JetPack5.0 DP 所安裝的 Jetson 設(shè)備上使用,不需要在每臺(tái)機(jī)器上重復(fù)調(diào)試 Python 開(kāi)發(fā)環(huán)境。
-
NVIDIA
+關(guān)注
關(guān)注
14文章
5309瀏覽量
106418 -
容器
+關(guān)注
關(guān)注
0文章
511瀏覽量
22457 -
python
+關(guān)注
關(guān)注
56文章
4827瀏覽量
86761
原文標(biāo)題:NVIDIA Jetson 系列文章(7):配置DS容器Python開(kāi)發(fā)環(huán)境
文章出處:【微信號(hào):NVIDIA-Enterprise,微信公眾號(hào):NVIDIA英偉達(dá)企業(yè)解決方案】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
評(píng)論