K3s+Jetson Nano,在邊緣端實現(xiàn)實時視頻分析!
隨著越來越多功能強大的新設(shè)備開始支持GPU,邊緣場景的用例不斷擴展到各行各業(yè)。隨著技術(shù)的發(fā)展,邊緣的規(guī)模越來越大,效率越來越高。NVIDIA憑借其行業(yè)領(lǐng)先的GPU攜手領(lǐng)先的處理器IP技術(shù)提供商ARM在邊緣生態(tài)系統(tǒng)領(lǐng)域進行重大創(chuàng)新和投資。NVIDIA Jetson Nano便是其中的代表產(chǎn)品之一,它功能強大但花銷極低,它可以運行支持GPU的工作負載并處理AI / ML數(shù)據(jù)處理任務(wù)。此外,Kubernetes等云原生技術(shù)還使開發(fā)人員能夠使用容器為邊緣構(gòu)建輕量級應(yīng)用程序。為了在整個計算多樣化的邊緣生態(tài)系統(tǒng)中實現(xiàn)無縫的云原生軟件體驗,Arm推出了Cassini項目
(https://www.arm.com/solutions/infrastructure/edge-computing/project-cassini)——基于標(biāo)準(zhǔn)的開放式協(xié)作計劃。它利用這些基于Arm的異構(gòu)平臺的功能為邊緣應(yīng)用程序創(chuàng)建安全的基礎(chǔ)。
K3s最初由Rancher Labs 在2019年年初推出,于2020年8月成為CNCF沙箱項目,目前Github Star超過16,000顆,已經(jīng)成為小型設(shè)備的關(guān)鍵編排平臺。 作為專為邊緣而建的Kubernetes發(fā)行版, 它足夠輕巧,不會給設(shè)備RAM和CPU帶來壓力。利用Kubernetes設(shè)備插件框架,運行在這些設(shè)備上的工作負載可以高效地訪問GPU功能。
在邊緣典型場景下,邊緣設(shè)備主要用于收集數(shù)據(jù),然后在云端對數(shù)據(jù)進行分析以及解碼。但是隨著邊緣設(shè)備變得越來越強大,我們現(xiàn)在可以直接在邊緣端執(zhí)行AI/ML流程。
在此前的文章中,我們了解到使用GPU在云端部署Rancher Kubernetes集群是極為高效的。
在本文中,我們將了解NVIDIA的Jetson Nano如何與K3s結(jié)合并且在邊緣啟用GPU功能,最終我們將會擁有一個極為出色的邊緣平臺。下圖描述了案例中的整體架構(gòu):

圖1:邊緣對象檢測和視頻分析
從上圖中,我們可以看到在邊緣端的攝像機連接到Jetson Nano設(shè)備。NVIDIA Jetson Nano上搭載JetPack OS ——一組啟用GPU設(shè)備的堆棧。在此設(shè)置中,我們有兩個視頻流作為輸入傳遞到NVIDIA DeepStream容器:
- 來自攝像機的實時視頻源與停車場成一定角度
- 第二個視頻是帶有不同類型對象(汽車、自行車、人等)的預(yù)制視頻。
- 我們還在Jetson Nano上部署了一個K3s集群,該集群托管NVIDIA DeepStream
Pod。當(dāng)視頻流傳遞到DeepStream Pod時,設(shè)備將進行分析。 - 然后將輸出傳遞到與連接的Jetson Nano的顯示器上。
- 在顯示屏上,我們可以看到對象分類——汽車、人等。
配置
前期準(zhǔn)備:本教程需要安裝和配置以下組件:
- Jetson Nano board
- Jetson OS(Tegra)
- 通過HDMI連接到Jetson Nano的顯示器
- 通過USB連接到Jetson Nano的網(wǎng)絡(luò)攝像頭
- 將Docker運行時更改為Nvidia運行時并安裝K3s
Jetson OS開箱即用地安裝了Docker。我們需要使用最新的Docker版本,因為它與GPU兼容。請使用以下命令檢查默認的運行時:
sudo docker info | grep Runtime
您還可以通過檢查docker daemon來查看當(dāng)前運行時:
cat /etc/docker/daemon.json
現(xiàn)在,將docker daemon的內(nèi)容更改為以下內(nèi)容:
{
"default-runtime": "nvidia",
?
"runtimes": {
?
"nvidia": {
"path": "nvidia-container-runtime", "runtimeArgs": []
?
} }
?
}

編輯daemon.json后,重新啟動docker服務(wù)。然后,您應(yīng)該能夠看到Nvidia的默認運行時。
sudo systemctl restart docker
sudo docker info | grep Runtime
在安裝K3s之前,請運行以下命令:
sudo apt update sudo apt upgrade -y sudo apt install curl
這將確保我們使用的是最新版本。
要安裝K3s,請使用以下命令:
curl -sfL https://get.k3s.io/ | INSTALL_K3S_EXEC="--docker" sh -s –
執(zhí)行以下命令檢查安裝的版本:
sudo kubectl version
現(xiàn)在,讓我們使用Deepstream SDK示例容器創(chuàng)建一個pod,然后運行示例應(yīng)用。
使用您選擇的文本編輯器創(chuàng)建一個pod manifest文件。將以下內(nèi)容添加到文件中:
apiVersion: v1
?
kind: Pod
?
metadata:
?
name: demo-pod
?
labels:
?
name: demo-pod
?
spec:
?
hostNetwork: true
?
containers:
?
- name: demo-stream
?
image: nvcr.io/nvidia/deepstream-l4t:5.0-20.07-samples
?
securityContext:
?
privileged: true
?
allowPrivilegeEscalation: true
?
command:
?
- sleep
?
- "150000"
?
workingDir: /opt/nvidia/deepstream/deepstream-5.0
?
volumeMounts:
?
- mountPath: /tmp/.X11-unix/
?
name: x11
?
- mountPath: /dev/video0
?
name: cam
?
volumes:
?
- name: x11
?
hostPath:
?
path: /tmp/.X11-unix/
?
- name: cam
?
hostPath:
?
path: /dev/video0
使用上一步中的YAML manifest創(chuàng)建pod。
sudo kubectl apply -f pod.yaml
pod使用的是deepstream-l4t:5.0-20.07-samples container,需要先拉取它,然后才能啟動容器。
使用sudo kubectl get pods命令檢查pod狀態(tài)。請等待它開始運行。
部署和運行Pod后,請使用以下命令登錄并取消設(shè)置Pod內(nèi)部的Display變量:
sudo kubectl exec -ti demo-pod /bin/bash unset DISPLAY
“unset DISPLAY”命令應(yīng)在pod中運行。
輸入以下命令,以在pod內(nèi)運行示例應(yīng)用:
deepstream-app -c /opt/nvidia/deepstream/deepstream-5.0/samples/configs/deepstream-app/source1_usb_dec_infer_resnet_int8.txt
視頻流可能要花幾分鐘才能開始運行。
您的視頻分析應(yīng)用程序現(xiàn)在正在使用網(wǎng)絡(luò)攝像頭輸入端,并在連接到Jetson Nano board上的顯示屏上提供實時結(jié)果。要退出該應(yīng)用,只需按在Pod中按“q”。
要退出pod,請使用“exit”命令。
要獲取Jetson Nano的完整硬件詳細信息,請使用以下命令運行另一個Pod:
kubectl run -i -t nvidia --image=jitteam/devicequery --restart=Never
總結(jié)
正如我們在上文中所看到的,使用基于Arm的NVIDIA Jetson Nano和K3s可以在邊緣無縫運行AI和進行數(shù)據(jù)分析。這些花銷低同時功能強大的設(shè)備可以快速部署,并且提供一種高效的方式進行視頻分析,實現(xiàn)邊緣AI。
在實踐過程中,如果有任何問題,也歡迎掃描文末二維碼,添加小助手為好友,進入K3s官方技術(shù)交流群與各位K3s用戶一起交流。
作者簡介
Pranay Bakre
Arm的首席解決方案工程師。他熱衷于將Arm的Neoverse平臺與Kubernetes、Docker等云原生技術(shù)相結(jié)合。他喜歡與合作伙伴一起在基于Arm的云和邊緣產(chǎn)品上搭建各類解決方案。
浙公網(wǎng)安備 33010602011771號