NVIDIA的DeepStream是目前業(yè)界最好開發(fā)而且功能強(qiáng)大的AI視頻分析工具,在NGC上https://catalog.ngc.nvidia.com/orgs/nvidia/containers/deepstream-l4t為 Jetson 提供 4 個可使用的版本,分別如下:
-
Base 版(deepstream-l4t:6.1-base):作為 DeepStream SDK 一部分的插件、庫以及依賴項(xiàng),如 CUDA、TensorRT、GStreamer 等,希望為自己創(chuàng)建 Docker 版的 DeepStream 應(yīng)用程序用戶,建議使用此映像。請注意,這個鏡像不包含示例內(nèi)容。
-
Samples 版(deepstream-l4t:6.1-samples):在 Base 版的基礎(chǔ)上添加范例的內(nèi)容,包括 C/C++ 開源代碼、deepstream-app 范例配置文件、模型文件與測試視頻等,適合體驗(yàn)與學(xué)習(xí)用途的初學(xué)者使用。
-
IoT 版(deepstream-l4t:6.1-iot):在 Base 版上擴(kuò)充 IoT 應(yīng)用所需的環(huán)境,包括 Kafka、Azure IoT、REDIS 和 MQTT 等協(xié)議、DeepStream test5 應(yīng)用程序以及相關(guān)配置和模型,可啟用多視頻流應(yīng)用程序,并將各種消息傳遞到服務(wù)器端進(jìn)行統(tǒng)計(jì)分析。
-
Triton 部署版(deepstream-l4t:6.1-triton):這是配合 Triton 推理服務(wù)器使用的環(huán)境,開發(fā)者可以直接使用 TensorFlow、TensorFlow-TensorRT 與 ONNX-RT 等方式進(jìn)行推理計(jì)算。
從上面的描述中可以看出 Samples 版本鏡像適合絕大部分初學(xué)者的使用,現(xiàn)在就以這個鏡像來做說明。
1、下載鏡像:
這里使用 JetPack 5.0 版的 Jetson Orin 開發(fā)套件,可以使用 DeepStream-6.1 版的容器,可以從 https://catalog.ngc.nvidia.com/orgs/nvidia/containers/deepstream-l4t網(wǎng)頁右上角 “Pull Tag” 按鈕中,選擇 “6.1-samples” 選項(xiàng),這時就已經(jīng)將執(zhí)行指令復(fù)制到緩沖區(qū),然后粘貼在 Jetson 上的命令終端,指令內(nèi)容如下:
docker pull nvcr.io/nvidia/deepstream-l4t:6.1-samples
這樣就能從 NGC 服務(wù)器將 deepstream-l4t:6.1-samples 鏡像文件下載到 Jetson 設(shè)備上。下載完畢之后,執(zhí)行以下指令看看結(jié)果:
docker images
如下圖 TAG 欄中顯示 “6.1-samples” 就表示鏡像文件下載成功。
到此只是將鏡像文件下載到本地,但還不是可執(zhí)行的容器狀態(tài),接著就要使用 Docker 指令來創(chuàng)建工作容器。
如果是使用 JetPack 4.6.x 版的其他 Jetson 設(shè)備時,目前只能使用 DeepStream-6.0.1 版本,請使用以下指令下載鏡像文件到 Jetson 設(shè)備上:
docker pull nvcr.io/nvidia/deepstream-l4t:6.0.1-samples
2、創(chuàng)建臨時容器的指令:
以下是 NVIDIA 官方所提供的創(chuàng)建容器指令,由于指令內(nèi)容較長,建議寫入 .sh 腳本中會比較方便執(zhí)行:
# 允許外部應(yīng)用程序連接到主機(jī)的X顯示器:
xhost +
# 允許外部應(yīng)用程序連接到主機(jī)的X顯示器:
dockerrun-it--rm--net=host--runtimenvidia-eDISPLAY=$DISPLAY-w/opt/nvidia/deepstream/deepstream-6.1-v/tmp/.X11-unix/:/tmp/.X11-unixnvcr.io/nvidia/deepstream-l4t:6.1-samples
以下對這段指令進(jìn)行基本說明:
-
使用 “docker run” 組合指令來創(chuàng)建容器;
-
中間的參數(shù)可以用 “docker run --help” 查看,這里使用以下幾個參數(shù):
-it:啟動互動式(-i)的終端(-t);
--rm:退出容器之后自動移除;
--net:讓容器內(nèi)網(wǎng)絡(luò)使用指定網(wǎng)絡(luò),這里指定 “host” 表示共用 Jetson 設(shè)備網(wǎng)絡(luò);
--runtime:指定執(zhí)行時的方式,這里指定為 “nvidia” 其實(shí)可以省略;
-e:配置環(huán)境變量,這里指定容器內(nèi) DISPLAY 變量為設(shè)備的 $DISPLAY 變量內(nèi)容;
-w:指定容器內(nèi)的工作目錄,進(jìn)入容器就會直接進(jìn)入到這個工作目錄下;
-v:將容器內(nèi)的目錄與容器外的目錄形成映射;
-
鏡像的完整路徑(nvcr.io/nvidia/deepstream-l4t:6.1-samples),放在最后面。
這樣的指令有個最大的缺點(diǎn),就是每次啟動都只能是個臨時用途的容器,一旦退出之后就會刪除工作容器,表示過程中所有執(zhí)行修改與步驟都將付之一炬,因此這樣指令適合做簡單的測試用途,但并不適合作為開發(fā)階段的使用,必須做些調(diào)整。
3、將源代碼與范例復(fù)制到容器外:
在容器中的 DeepStream 源代碼有兩個部分:
-
Sources:在容器內(nèi) /opt/nvidia/deepstream/deepstream/sources 下
-
Samples:在容器內(nèi) /opt/nvidia/deepstream/deepstream/samples 下
我們先將這兩個部分的內(nèi)容復(fù)制到容器外,然后啟動容器的時候再用 “-v” 進(jìn)行路徑映射,這樣過程中修改的內(nèi)容就會保存在容器外,即便退出后銷毀容器也沒關(guān)系。不過這個復(fù)制的過程必須在 “容器啟動” 的狀態(tài)下執(zhí)行,可以先執(zhí)行下面最簡單的容器啟動指令:
# 在第一個命令終端
dockerrun-it--rmnvcr.io/nvidia/deepstream-l4t:6.1-samples
現(xiàn)在進(jìn)入容器之內(nèi),可能看到以下的顯示信息:
root@1c03f4d7628a:/opt/nvidia/deepstream/deepstream-6.1#
“1c03f4d7628a” 是這個容器目前的編號,現(xiàn)在需要開啟一個指令終端進(jìn)行操作,這個過程是在容器外進(jìn)行處理,請執(zhí)行以下指令列出執(zhí)行中的容器編號與狀態(tài):
# 在第二個命令終端
dockerps
下圖顯示目前有個正在執(zhí)行的容器,其編號(CONTAINER ID)為 1c03f4d7628a,正好是上面看到容器內(nèi)所顯示的編號。
現(xiàn)在執(zhí)行以下指令,將容器內(nèi)的 sources 與 samples 目錄內(nèi)容,復(fù)制到容器外的指定路徑之下,例如 ~/deepstream/sources 與 ~/deepstream/samples:
# 在第二個命令終端
mkdir -p ~/deepstream
export CONTAINER_ID=’根據(jù)實(shí)際編號’
docker cp $CONTAINER_ID:/opt/nvidia/deepstream/deepstream/sources ~/deepstream/sources
dockercp$CONTAINER_ID:/opt/nvidia/deepstream/deepstream/samples~/deepstream/samples
現(xiàn)在看看在 Jetson 設(shè)備上 ~/deepstream 目錄下是否多了 sources 與 samples 兩個目錄?比對一下里面的內(nèi)容是否與容器內(nèi)的一致。
接下來就可以調(diào)整一下執(zhí)行的指令,讓所有的代碼與配置文件的修改部分,保留在容器外面,這樣過程中的修改就不會白白浪費(fèi)。請執(zhí)行以下指令創(chuàng)建另一容器:
# 在第二個命令終端
sudo xhost +
docker run -it --rm --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-samples
現(xiàn)在再開啟一個指令窗口,執(zhí)行以下指令檢查以下容器的狀態(tài):
# 在第三個命令終端
dockerps
應(yīng)該會看到類似下面截屏中的兩個 “執(zhí)行中容器” 的信息:
在容器外試著在 ~/deepstream/sources 目錄下添加個子目錄:
# 在第三個命令終端
mkdir-p~/deepstream/sources/outsideContainer
然后到第二個終端里執(zhí)行以下指令,看看是否也多了 “outsideContainer” 目錄?
# 在第二個命令終端
ls/opt/nvidia/deepstream/deepstream/sources
如果能對應(yīng)的上,就表示后面在容器內(nèi)修改的代碼文件,都存放在容器外面的指定路徑下,這樣就不用擔(dān)心每次退出容器之后的問題。
4、在容器內(nèi)執(zhí)行范例:
現(xiàn)在就在第二個終端里執(zhí)行 DeepStream 的標(biāo)準(zhǔn)范例,請執(zhí)行以下指令:
# 在第二個命令終端
cd /samples/configs/deepstream-app
deepstream-app-csource4_1080p_dec_infer-resnet_tracker_sgie_tiled_display_int8.txt
就能看到下面這個大家相當(dāng)熟悉的執(zhí)行結(jié)果。
以上就完成 DeepStream Samples 版的操作環(huán)境調(diào)試過程,開發(fā)人員可以在容器外用編輯器去修改配置文件或 C/C++ 源代碼,然后在容器內(nèi)執(zhí)行編譯或操作,這樣就會非常方便。
審核編輯:湯梓紅
-
NVIDIA
+關(guān)注
關(guān)注
14文章
5072瀏覽量
103520 -
容器
+關(guān)注
關(guān)注
0文章
499瀏覽量
22092 -
鏡像
+關(guān)注
關(guān)注
0文章
170瀏覽量
10775
原文標(biāo)題:NVIDIA Jetson 系列文章(6):使用容器版DeepStream
文章出處:【微信號:NVIDIA-Enterprise,微信公眾號:NVIDIA英偉達(dá)企業(yè)解決方案】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論