隨着越來越多功能強大的新設備開始支持GPU,邊緣場景的用例不斷擴展到各行各業。隨着技術的發展,邊緣的規模越來越大,效率越來越高。NVIDIA憑藉其行業領先的GPU攜手領先的處理器IP技術提供商ARM在邊緣生態系統領域進行重大創新和投資。NVIDIA Jetson Nano便是其中的代表產品之一,它功能強大但花銷極低,它可以運行支持GPU的工作負載並處理AI / ML數據處理任務。此外,Kubernetes等雲原生技術還使開發人員能夠使用容器爲邊緣構建輕量級應用程序。爲了在整個計算多樣化的邊緣生態系統中實現無縫的雲原生軟件體驗,Arm推出了Cassini項目
(https://www.arm.com/solutions/infrastructure/edge-computing/project-cassini)——基於標準的開放式協作計劃。它利用這些基於Arm的異構平臺的功能爲邊緣應用程序創建安全的基礎。
K3s最初由Rancher Labs 在2019年年初推出,於2020年8月成爲CNCF沙箱項目,目前Github Star超過16,000顆,已經成爲小型設備的關鍵編排平臺。 作爲專爲邊緣而建的Kubernetes發行版, 它足夠輕巧,不會給設備RAM和CPU帶來壓力。利用Kubernetes設備插件框架,運行在這些設備上的工作負載可以高效地訪問GPU功能。
在邊緣典型場景下,邊緣設備主要用於收集數據,然後在雲端對數據進行分析以及解碼。但是隨着邊緣設備變得越來越強大,我們現在可以直接在邊緣端執行AI/ML流程。
在此前的文章中,我們瞭解到使用GPU在雲端部署Rancher Kubernetes集羣是極爲高效的。
在本文中,我們將瞭解NVIDIA的Jetson Nano如何與K3s結合並且在邊緣啓用GPU功能,最終我們將會擁有一個極爲出色的邊緣平臺。下圖描述了案例中的整體架構:
圖1:邊緣對象檢測和視頻分析
從上圖中,我們可以看到在邊緣端的攝像機連接到Jetson Nano設備。NVIDIA Jetson Nano上搭載JetPack OS ——一組啓用GPU設備的堆棧。在此設置中,我們有兩個視頻流作爲輸入傳遞到NVIDIA DeepStream容器:
- 來自攝像機的實時視頻源與停車場成一定角度
- 第二個視頻是帶有不同類型對象(汽車、自行車、人等)的預製視頻。
- 我們還在Jetson Nano上部署了一個K3s集羣,該集羣託管NVIDIA DeepStream
Pod。當視頻流傳遞到DeepStream Pod時,設備將進行分析。 - 然後將輸出傳遞到與連接的Jetson Nano的顯示器上。
- 在顯示屏上,我們可以看到對象分類——汽車、人等。
配置
前期準備:本教程需要安裝和配置以下組件:
- Jetson Nano board
- Jetson OS(Tegra)
- 通過HDMI連接到Jetson Nano的顯示器
- 通過USB連接到Jetson Nano的網絡攝像頭
- 將Docker運行時更改爲Nvidia運行時並安裝K3s
Jetson OS開箱即用地安裝了Docker。我們需要使用最新的Docker版本,因爲它與GPU兼容。請使用以下命令檢查默認的運行時:
sudo docker info | grep Runtime
您還可以通過檢查docker daemon來查看當前運行時:
cat /etc/docker/daemon.json
現在,將docker daemon的內容更改爲以下內容:
{
"default-runtime": "nvidia",
"runtimes": {
"nvidia": {
"path": "nvidia-container-runtime", "runtimeArgs": []
} }
}
編輯daemon.json後,重新啓動docker服務。然後,您應該能夠看到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 –
執行以下命令檢查安裝的版本:
sudo kubectl version
現在,讓我們使用Deepstream SDK示例容器創建一個pod,然後運行示例應用。
使用您選擇的文本編輯器創建一個pod manifest文件。將以下內容添加到文件中:
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創建pod。
sudo kubectl apply -f pod.yaml
pod使用的是deepstream-l4t:5.0-20.07-samples container,需要先拉取它,然後才能啓動容器。
使用sudo kubectl get pods命令檢查pod狀態。請等待它開始運行。
部署和運行Pod後,請使用以下命令登錄並取消設置Pod內部的Display變量:
sudo kubectl exec -ti demo-pod /bin/bash unset DISPLAY
“unset DISPLAY”命令應在pod中運行。
輸入以下命令,以在pod內運行示例應用:
deepstream-app -c /opt/nvidia/deepstream/deepstream-5.0/samples/configs/deepstream-app/source1_usb_dec_infer_resnet_int8.txt
視頻流可能要花幾分鐘才能開始運行。
您的視頻分析應用程序現在正在使用網絡攝像頭輸入端,並在連接到Jetson Nano board上的顯示屏上提供實時結果。要退出該應用,只需按在Pod中按“q”。
要退出pod,請使用“exit”命令。
要獲取Jetson Nano的完整硬件詳細信息,請使用以下命令運行另一個Pod:
kubectl run -i -t nvidia --image=jitteam/devicequery --restart=Never
總結
正如我們在上文中所看到的,使用基於Arm的NVIDIA Jetson Nano和K3s可以在邊緣無縫運行AI和進行數據分析。這些花銷低同時功能強大的設備可以快速部署,並且提供一種高效的方式進行視頻分析,實現邊緣AI。
在實踐過程中,如果有任何問題,也歡迎掃描文末二維碼,添加小助手爲好友,進入K3s官方技術交流羣與各位K3s用戶一起交流。
作者簡介
Pranay Bakre
Arm的首席解決方案工程師。他熱衷於將Arm的Neoverse平臺與Kubernetes、Docker等雲原生技術相結合。他喜歡與合作伙伴一起在基於Arm的雲和邊緣產品上搭建各類解決方案。