2021年4月20日 |作者:普拉奈·巴克尔(Pranay Bakre)
随着新的、功能强大的GPU设备的出现,我们可以在边缘执行的可能用例正在扩展。随着技术的进步,这种优势的规模越来越大,效率也越来越高。拥有业界领先GPU的NVIDIA和处理器IP的领先技术提供商Arm正在边缘生态系统领域进行重大创新和投资。例如,nvidia jetson nano是最具成本效益的设备,它可以运行GPU支持的工作负载,并可以处理AI/ML数据处理作业。此外,像Kubernetes这样的云本地技术使开发人员能够使用边缘容器构建轻量级应用程序。为了在计算多样的边缘生态系统中实现无缝的云本地软件体验,Arm启动了Cassini项目——一个开放的、基于标准的协作计划。它利用这些异构的基于ARM的平台的能力为边缘应用创建安全的基础。
K3s由Rancher Labs开发,现在是CNCF沙盒项目,已经成为这些紧凑型footprint edge设备的关键协调平台。作为为edge构建的Kubernetes发行版,它足够轻,不会给设备RAM和CPU带来压力。利用Kubernetes设备插件框架,运行在这些设备上的工作负载可以高效地访问GPU功能。
在典型的场景中,边缘的设备被用来收集数据,而分析和解码则是通过云计算来完成的。随着边缘设备变得越来越强大,我们现在可以在边缘位置本身执行AI/ML处理。
正如SUSE的Mark Abrams在上一篇关于如何在部署在云上的Rancher Kubernetes集群上使用gpu的博客中强调的那样,它非常无缝和高效。
在这个博客中,我们将看到NVIDIA的Jetson Nano和K3s的结合如何在边缘实现gpu,并成为一个引人注目的平台。下图描述了用例的高级架构:
边缘对象检测和视频分析
我们看到一个边缘位置,摄像机连接到Jetson Nano设备。NVIDIA Jetson Nano芯片与JetPack操作系统-一组库启用GPU设备。
在此设置中,我们有两个视频流作为输入传递到 NVIDIA DeepStream容器:
摄像机向停车场倾斜的实时视频源
第二个视频源是预构建的视频,其中具有不同类型的对象-汽车、自行车、人类等。
我们还有一个 K3s 集群部署在Jetson Nano上, 承载着 Nvidia 深流舱。当视频流传递到深度流吊舱时,分析在设备本身完成。
然后,输出传递到附加到Jetson Nano的显示器上。在显示屏上,我们可以看到对象分类-汽车,人类等。
有关架构和使用案例演示的更多详细信息,请查看此视频:边缘的对象检测和视频分析(https://www.youtube.com/watch?v=LVLllVIQUDA)
配置
先决条件:应安装和配置以下组件
- Jetson Nano板
- Jetson 操作系统 (Tegra)
- 通过 HDMI 连接到Jetson Nano的显示屏
- 通过 USB 连接到Jetson Nano的网络摄像头
- 将Docker的运行时间更改为 Nvidia 运行时间并安装 K3s
Jetson 操作系统附带的码头安装开箱即用。我们需要使用最新的Docker版本,因为它是GPU兼容的。要检查默认的运行时间,请使用以下命令:
sudo docker info | grep Runtime
您还可以通过检查docker守护进程来查看当前运行时:
cat /etc/docker/daemon.json
现在,将docker守护进程的内容更改为:
{
"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
现在,让我们用deepstreamsdk示例容器创建一个pod并运行示例应用程序。
使用您选择的文本编辑器创建一个pod清单文件。向文件中添加以下内容:
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清单创建pod。
sudo kubectl apply -f pod.yaml
Pod使用的是deepstream-l4t:5.0-20.07-samples容器,需要在容器启动前将其拉出。
使用sudo kubectl get pods命令检查pod状态。请等到它开始运行。
当pod部署并运行时,使用以下命令登录并取消设置pod内的显示变量:
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板的显示器上提供实时结果。要退出应用程序,只需在pod中按“q”。
要退出pod,请使用“退出”命令。
要提供Jetson Nano的完整硬件详细信息,请使用以下命令运行另一个pod:
kubectl run -i -t nvidia --image=jitteam/devicequery --restart=Never
结论
正如我们在博客中看到的,使用基于Arm的nvidia jetson nano和K3s在边缘运行人工智能和分析是非常无缝的。这些具有成本效益的设备可以快速部署,并且仍然提供执行视频分析和人工智能的有效方式。
欢迎随时联系我们sw-ecosystem@arm.com 关于在基于Arm Neoverse的设备上运行AI和分析的查询。
你如何在边缘使用人工智能?加入SUSE&Rancher社区的对话。https://community.suse.com/?_ga=2.84414425.1968515409.1619879217-847090527.1619879217
Pranay Bakre是Arm的首席解决方案工程师。他热衷于将Kubernetes、Docker等云本地技术融入Arm的Neoverse平台。他喜欢与合作伙伴合作,在基于Arm的云和边缘产品上构建解决方案/演示。他撰写了多篇关于容器编排和相关用例的博客。