KubeEdge助力边缘AI应用,实现GPU算力加速

举报
云容器大未来 发表于 2024/12/19 10:31:05 2024/12/19
【摘要】 随着边缘计算的发展,人工智能在边缘侧的应用日益增多,对计算资源的需求也越来越高,尤其 GPU 算力的需求增长迅速。KubeEdge 作为基于 Kubernetes 的开源边缘计算平台,除提供高效的边缘设备管理和边缘应用容器化服务外,还提供了边云协同 AI 框架 Sedna,助力边缘 AI 发展。

作者唐明&王彬丞

   引言   

随着边缘计算的发展,人工智能在边缘侧的应用日益增多,对计算资源的需求也越来越高,尤其 GPU 算力的需求增长迅速。KubeEdge 作为基于 Kubernetes 的开源边缘计算平台,除提供高效的边缘设备管理和边缘应用容器化服务外,还提供了边云协同 AI 框架 Sedna,助力边缘 AI 发展。

kubeedge.png

然而由于边缘计算环境复杂,将 GPU 资源纳入 KubeEdge 集群管理并让其与边缘 AI 应用协同工作成为重要问题。本篇文章将介绍如何将 GPU 边缘节点接入 KubeEdge 集群并支持边缘 AI 应用使用 GPU 资源,以应对边缘 AI 应用的计算需求。


   GPU 运行环境构建   

本文实验环境 

11-1.png

💭 注:Node 1、Node 2 均为边缘节点,分别使用 Containerd 和 Docker 作为容器运行时进行演示

在边缘节点上使用 GPU 需要先构建 GPU 运行环境,主要包括以下几个步骤:

1、安装 GPU 驱动

首先需要确定边缘节点机器是否有 GPU,可以使用 lspci | grep NVIDIA 命令来检查。根据具体 GPU 型号下载合适的 GPU 驱动并完成安装,安装完成后可以使用 nvidia-smi 命令检查驱动是否安装成功。安装方法可以参考[1]

2、安装容器运行时

将 GPU 节点接入 KubeEdge 集群,需要先安装如 Docker、Containerd 之类的容器运行时,具体的安装指南可以参考 KubeEdge官方文档[2]。需要特别注意的是,自 KubeEdge v1.14 版本起,已经移除了对 Dockershim 的支持,不再支持直接使用 Docker 运行时管理边缘容器。如仍需使用 Docker,在安装 Docker 后还需安装 cri-dockerd[3]

3、安装 Nvidia-Container-Toolkit

NVIDIA Container Toolkit 是一个专为构建和运行 GPU 容器设计的工具包。它通过一系列的功能和组件,使得在容器环境中充分利用 NVIDIA GPU 资源变得更加简单和高效。由于边缘节点网络连接情况不同,有两种方式安装 NVIDIA Container Toolkit:

▷ 边缘节点能直接访问外部网络

若边缘节点能直接访问外部网络,推荐按照官方文档,使用 apt、yum 等工具进行安装[4]

▷ 边缘节点无法直接访问外部网络

边缘节点若无法直接访问外部网络,则需要在网络可以联通的机器上下载官方离线安装包[5],将安装包传入边缘节点完成解压。 解压后目录中应该出现如下的文件:

root@user:~/release-v1.16.0-rc.1-experimental/packages/ubuntu18.04/amd64# ls
   libnvidia-container1_1.16.0~rc.1-1_amd64.deb      libnvidia-container-tools_1.16.0~rc.1-1_amd64.deb      nvidia-container-toolkit-operator-extensions_1.16.0~rc.1-1_amd64.deb
   libnvidia-container1-dbg_1.16.0~rc.1-1_amd64.deb  nvidia-container-toolkit_1.16.0~rc.1-1_amd64.deb
   libnvidia-container-dev_1.16.0~rc.1-1_amd64.deb   nvidia-container-toolkit-base_1.16.0~rc.1-1_amd64.deb

在该目录中执行下方的命令完成安装:

 root@user:~# sudo apt install ./*

这里我们提供的案例是基于 Ubuntu 系统的(如果使用 CentOS,可以在链接[5]下载对应的 rpm 包,使用 rpm 命令进行安装)。

4、配置容器运行时支持 GPU

成功安装 Nvidia-Container-Toolkit 后,可以使用 nvidia-ctk 来配置各个容器运行时支持 GPU:

# containerd (node1)
root@user:~# sudo nvidia-ctk runtime configure --runtime=containerd --set-as-default
# docker (node2)
root@user:~# sudo nvidia-ctk runtime configure --runtime=docker --set-as-default

5、重启容器运行时

重启容器运行时,并且确认是否已经支持 GPU:

# containerd (node1)
root@user:~# systemctl daemon-reload && systemctl restart containerd
# 检查运行时是否已经修改为 nvidia
root@user:~# cat /etc/containerd/config.toml |grep nvidia
      default_runtime_name = "nvidia"
        [plugins."io.containerd.grpc.v1.cri".containerd.runtimes.nvidia]
          [plugins."io.containerd.grpc.v1.cri".containerd.runtimes.nvidia.options]
            BinaryName = "/usr/bin/nvidia-container-runtime"

# docker (node2)
root@user:~# systemctl daemon-reload && systemctl restart docker
# 检查运行时是否已经修改为 nvidia
root@user:~# docker info |grep Runtime
 Runtimes: io.containerd.runc.v2 io.containerd.runtime.v1.linux nvidia runc
 Default Runtime: nvidia

经过第一部分 GPU运行环境构建的操作,边缘节点已经拥有 GPU 驱动,容器运行时也具备了 GPU 设备的调用能力,接下来需要将边缘节点正式纳管进 KubeEdge 集群。

   边缘 GPU 节点纳管   

将边缘 GPU 节点纳管至 KubeEdge 集群主要包括以下几个步骤:

1、节点接入

推荐使用 keadm 工具将边缘节点接入 KubeEdge 集群,接入方式与普通边缘节点一致,详细信息可参考 KubeEdge 官方文档[6]下面以 Docker 和 Containerd 容器运行时作为边缘 GPU 节点接入示例:

# containerd (node1)
root@user:~# keadm join --cgroupdriver=cgroupfs \
 --cloudcore-ipport="THE-EXPOSED-IP":10000 \
 --kubeedge-version=v1.17.0 \
 --token="YOUR TOKEN"
 --remote-runtime-endpoint=unix:///run/containerd/containerd.sock

# docker (node2)
root@user:~# keadm join --cgroupdriver=systemd \
 --cloudcore-ipport="THE-EXPOSED-IP":10000 \
 --kubeedge-version=v1.17.0 \
 --token="YOUR TOKEN"
 --remote-runtime-endpoint=unix:///var/run/cri-dockerd.sock

运行 systemctl status edgecore 命令确认边缘节点 EdgeCore 是否运行成功:

root@user:~# systemctl status edgecore
● edgecore.service
   Loaded: loaded (/etc/systemd/system/edgecore.service; enabled; vendor preset: enabled)
   Active: active (running) since Wed 2022-10-26 11:26:59 CST; 6s ago
 Main PID: 2745865 (edgecore)
    Tasks: 13 (limit: 4915)
   CGroup: /system.slice/edgecore.service
           └─2745865 /usr/local/bin/edgecore

2、部署 k8s-device-plugin

可以按照下方的 yaml 文件部署 k8s-device-plugin DaemonSet

apiVersion: apps/v1
kind: DaemonSet
metadata:
   name: nvidia-device-plugin-daemonset
   namespace: kube-system
spec:
   revisionHistoryLimit: 10
   selector:
      matchLabels:
         name: nvidia-device-plugin-ds
   template:
      metadata:
         labels:
            name: nvidia-device-plugin-ds
      spec:
         containers:
            - env:
                 - name: FAIL_ON_INIT_ERROR
                   value: "false"
              image: nvcr.io/nvidia/k8s-device-plugin:v0.14.3
              imagePullPolicy: IfNotPresent
              name: nvidia-device-plugin-ctr
              resources: {}
              securityContext:
                 allowPrivilegeEscalation: false
                 capabilities:
                    drop:
                       - ALL
              terminationMessagePath: /dev/termination-log
              terminationMessagePolicy: File
              volumeMounts:
                 - mountPath: /var/lib/kubelet/device-plugins
                   name: device-plugin
         dnsPolicy: ClusterFirst
         priorityClassName: system-node-critical
         restartPolicy: Always
         schedulerName: default-scheduler
         securityContext: {}
         terminationGracePeriodSeconds: 30
         tolerations:
            - effect: NoSchedule
              key: nvidia.com/gpu
              operator: Exists
         volumes:
            - hostPath:
                 path: /var/lib/kubelet/device-plugins
                 type: ""
              name: device-plugin

检查 k8s-device-plugin 是否成功部署:

root@user:~# kubectl get po -n kube-system -owide|grep nvidia
nvidia-device-plugin-daemonset-d5nbc   1/1     Running   0                22m    10.88.0.4      nvidia-edge-node      <none>           <none>
nvidia-device-plugin-daemonset-qbwdd   1/1     Running   0                2d6h   10.88.0.2      nano-1iamih8np        <none>           <none>

使用 kubectl describe node 命令验证节点 GPU 信息是否正确上报。

root@user:~# kubectl describe node {YOUR EDGENODE NAME}
Name:               nvidia-edge-node
Roles:              agent,edge
Labels:             beta.kubernetes.io/arch=amd64
...
Capacity:
  cpu:                12
  ephemeral-storage:  143075484Ki
  hugepages-1Gi:      0
  hugepages-2Mi:      0
  memory:             40917620Ki
  nvidia.com/gpu:     1
  pods:               110
Allocatable:
  cpu:                12
  ephemeral-storage:  131858365837
  hugepages-1Gi:      0
  hugepages-2Mi:      0
  memory:             40815220Ki
  nvidia.com/gpu:     1
  pods:               110

如果节点信息中出现了 nvidia.com/gpu 资源,说明 device-plugin 正常运行,可以将 GPU 挂载至边缘 GPU 应用容器中。第三部分提供测试应用的部署方法,能够验证 GPU 调用能力。


   测试 GPU 资源调用能力  

1、部署 GPU 测试应用

可以使用下方所示的示例 yaml,部署一个 pytorch 的边缘应用,该应用使用一个 GPU 资源。

kind: Deployment
apiVersion: apps/v1
metadata:
   name: test-gpu
   namespace: default
spec:
   replicas: 1
   selector:
      matchLabels:
         app: test-gpu
   template:
      metadata:
         labels:
            app: test-gpu
      spec:
         containers:
            - name: container-1
              image: pytorch/pytorch:2.2.0-cuda12.1-cudnn8-devel
              command:
                 - tail
                 - '-f'
                 - /dev/null
              resources:
                 limits:
                    nvidia.com/gpu: '1'
                 requests:
                    nvidia.com/gpu: '1'
              imagePullPolicy: IfNotPresent
         nodeName: nvidia-edge-node # replace to your GPU edge node name

2、验证 GPU 是否成功挂载

进入这个应用创建的容器中,调用 pytorch 中的 torch.cuda.is_available() 命令验证 GPU 是否成功挂载。

# containerd (node1)
root@user:~# crictl ps
CONTAINER           IMAGE               CREATED             STATE               NAME                       ATTEMPT             POD ID              POD
de1f1e60abc0a       0dd75116a8ce8       2 minutes ago       Running             container-1                0                   6beffb412af3f       test-gpu-6bfbdc9449-jfbrl
root@user:~# crictl exec -it de1f1e60abc0a /bin/bash
root@test-gpu-6bfbdc9449-jfbrl:/workspace# python3
Python 3.10.13 (main, Sep 11 2023, 13:44:35) [GCC 11.2.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import torch
>>> torch.cuda.is_available()
True

# docker (node2)
root@user:~# docker ps
CONTAINER ID   IMAGE                       COMMAND                  CREATED          STATUS          PORTS     NAMES
e7e3804626a5   853b58c1dce6                "tail -f /dev/null"      53 seconds ago   Up 45 seconds             k8s_container-1_test-gpu-arm64-nano-7f8fd7f79f-hzvp5_default_64fb7a90-b0e6-4b46-a34f-8a06b24b9169_0
root@user:~# docker exec -it e7e3804626a5 /bin/bash
root@test-gpu-arm64-nano-7f8fd7f79f-hzvp5:/# python3
Python 3.8.10 (default, Nov 14 2022, 12:59:47)
[GCC 9.4.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import torch
>>> torch.cuda.is_available()
True

通过本文的介绍,我们详细探讨了如何将边缘 GPU 节点接入 KubeEdge 集群,并支持边缘应用使用 GPU 资源。将 GPU 资源集成至 KubeEdge 集群中可以大大提升边缘设备的计算能力,推动边缘 AI 技术的发展,助力实现高效的边缘计算解决方案。欢迎大家持续关注 KubeEdge 社区。


相关链接

[1] 安装GPU驱动参考文档:https://www.nvidia.cn/drivers/lookup/

[2] KubeEdge容器运行时文档:https://kubeedge.io/docs/setup/prerequisites/runtime

[3] cri-dockerd参考文档:https://kubeedge.io/docs/setup/prerequisites/runtime#docker-engine

[4] NVIDIA Container Toolkit官方文档:https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/latest/install-guide.html

[5] NVIDIA Container Toolkit官方离线安装包https://github.com/NVIDIA/nvidia-container-toolkit/releases

[6] 节点接入参考文档:https://kubeedge.io/docs/setup/install-with-keadm

【更多KubeEdge资讯推荐】玩转KubeEdge保姆级攻略——环境搭建篇


玩转KubeEdge保姆级攻略——环境搭建篇

《玩转KubeEdge保姆级攻略——环境搭建篇》课程主要介绍如何通过华为云服务快速搭建一套KubeEdge边缘计算开发平台及部署Sedna、EdgeMesh等KubeEdge生态组件。

课程免费学习链接:https://connect.huaweicloud.com/courses/learn/course-v1:HuaweiX+CBUCNXNX022+Self-paced/about

KubeEdge社区介绍:KubeEdge是业界首个云原生边缘计算框架、云原生计算基金会(CNCF)唯一毕业级边缘计算开源项目,社区已完成业界最大规模云原生边云协同高速公路项目(统一管理10万边缘节点/50万边缘应用)、业界首个云原生星地协同卫星、业界首个云原生车云协同汽车、业界首个云原生油田项目,开源业界首个分布式协同AI框架Sedna及业界首个边云协同终身学习范式,并在持续开拓创新中。

KubeEdge网站 :  https://kubeedge.io

GitHub地址 : https://github.com/kubeedge/kubeedge

Slack地址 : https://kubeedge.slack.com

邮件列表 : https://groups.google.com/forum/#!forum/kubeedge

每周社区例会 : https://zoom.us/j/4167237304

Twitter : https://twitter.com/KubeEdge

文档地址 : https://docs.kubeedge.io/en/latest/

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。