k3s中文社区 · 2021年04月26日

K3s+Jetson Nano,在边缘端实现实时视频分析!

随着越来越多功能强大的新设备开始支持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的云和边缘产品上搭建各类解决方案。
推荐阅读
关注数
1717
内容数
42
K3s是一款轻量级的Kubernetes发行版,安装简单易上手,完美应对资源有限环境。
目录
极术微信服务号
关注极术微信号
实时接收点赞提醒和评论通知
安谋科技学堂公众号
关注安谋科技学堂
实时获取安谋科技及 Arm 教学资源
安谋科技招聘公众号
关注安谋科技招聘
实时获取安谋科技中国职位信息