写点什么

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

  • 2024-12-19
    中国香港
  • 本文字数:5884 字

    阅读完需:约 19 分钟

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

作者:唐明 &王彬丞

   引言   

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



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


   GPU 运行环境构建   

本文实验环境 



💭 注: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# 检查运行时是否已经修改为 nvidiaroot@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# 检查运行时是否已经修改为 nvidiaroot@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/v1kind: DaemonSetmetadata:   name: nvidia-device-plugin-daemonset   namespace: kube-systemspec:   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 nvidianvidia-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-nodeRoles:              agent,edgeLabels:             beta.kubernetes.io/arch=amd64...Capacity:  cpu:                12  ephemeral-storage:  143075484Ki  hugepages-1Gi:      0  hugepages-2Mi:      0  memory:             40917620Ki  nvidia.com/gpu:     1  pods:               110Allocatable:  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: DeploymentapiVersion: apps/v1metadata:   name: test-gpu   namespace: defaultspec:   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 psCONTAINER           IMAGE               CREATED             STATE               NAME                       ATTEMPT             POD ID              PODde1f1e60abc0a       0dd75116a8ce8       2 minutes ago       Running             container-1                0                   6beffb412af3f       test-gpu-6bfbdc9449-jfbrlroot@user:~# crictl exec -it de1f1e60abc0a /bin/bashroot@test-gpu-6bfbdc9449-jfbrl:/workspace# python3Python 3.10.13 (main, Sep 11 2023, 13:44:35) [GCC 11.2.0] on linuxType "help", "copyright", "credits" or "license" for more information.>>> import torch>>> torch.cuda.is_available()True
# docker (node2)root@user:~# docker psCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMESe7e3804626a5 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_0root@user:~# docker exec -it e7e3804626a5 /bin/bashroot@test-gpu-arm64-nano-7f8fd7f79f-hzvp5:/# python3Python 3.8.10 (default, Nov 14 2022, 12:59:47)[GCC 9.4.0] on linuxType "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/

用户头像

还未添加个人签名 2020-02-11 加入

还未添加个人简介

评论

发布
暂无评论
KubeEdge助力边缘AI应用,实现GPU算力加速_云计算_华为云原生团队_InfoQ写作社区