0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

如何简化Kubernetes中的GPU管理

星星科技指导员 ? 来源:NVIDIA ? 作者:Pramod Ramarao ? 2022-04-27 14:44 ? 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

在过去的几年里, NVIDIA 以各种方式利用 GPU 容器来测试、开发和大规模运行生产中的 AI 工作负载。为 NVIDIA GPUs 优化的容器和 DGX 和 OEM NGC Ready 服务器等系统可作为 NGC 的一部分提供。

但是用 GPUs 可靠地提供服务器并扩展人工智能应用程序可能会很棘手。 Kubernetes 凭借其丰富的应用程序可扩展性和高性能特性迅速构建在其平台上。

Kubernetes 通过设备插件 框架 提供对特殊硬件资源的访问,如 NVIDIA GPUs 、 NICs 、 Infiniband 适配器和其他设备。但是,使用这些硬件资源配置和管理节点需要配置多个软件组件,例如驱动程序、容器运行时或其他库,这些组件很难并且容易出错。

Kubernetes 中的 运营商框架 采用操作业务逻辑,并允许使用标准的 Kubernetes API 和 kubectl 创建用于在 Kubernetes 内部署应用程序的自动化框架。这里介绍的 NVIDIA GPU 操作程序基于操作员框架,并自动管理所有 NVIDIA 软件在 Kubernetes 中提供 GPUs 所需的组件。 NVIDIA 、 redhat 和社区中的其他人合作创建了 GPU 操作符。 GPU 运营商是 NVIDIA EGX 软件定义平台的一个重要组成部分,该平台旨在使大规模混合云和边缘操作成为可能和高效。

NVIDIA GPU 操作员

要在 Kubernetes 集群中配置 GPU 个工作节点,需要以下 NVIDIA 软件组件 – 驱动程序、容器运行时、设备插件和监控。如图 1 所示,这些组件需要在集群可用的 GPU 资源之前手动配置,并且在集群运行期间也需要进行管理。 GPU 运营商通过将所有组件打包并使用标准 Kubernetes api 自动化和管理这些组件(包括版本控制和升级),简化了组件的初始部署和管理。 GPU 操作符是完全开源的,可以在我们的 GitHub 库 上使用。

pYYBAGJo6O6Af7zrAABTvi4oosg452.png

图 1 手动安装(某些组件需要安装在裸金属上)与 GPU 操作员使用全集装箱化组件进行自动化的对比

操作员状态机

GPU 运算符基于 Kubernetes 中的 运营商框架 。操作符被构建为一个新的自定义资源定义( CRD ) API ,并带有相应的控制器。该操作符在自己的命名空间(称为“ GPU -operator ”)中运行,底层的 NVIDIA 组件在单独的命名空间中编排(称为“ GPU -operator resources ”)。与 Kubernetes 中的任何标准操作符一样,控制器监视名称空间的更改,并使用协调循环(通过 reconcile ()函数)来实现一个简单的状态机来启动每个 NVIDIA 组件。状态机在每个状态下都包含一个验证步骤,如果失败,协调循环将退出并返回错误。如图 2 所示。

poYBAGJo6PSAdKLoAABfc5b3gPQ207.png

图 2 GPU 操作员状态机

GPU 运算符应该在配备了 GPUs 的节点上运行。为了确定哪些节点具有 GPUs ,操作符依赖于 Kubernetes 中的 节点功能发现 ( NFD )。 NFD worker 检测节点上的各种硬件功能–例如, PCIe 设备标识、内核版本、内存和其他属性。然后它使用节点标签向 Kubernetes 发布这些特性。然后, GPU 操作员使用这些节点标签(通过检查 PCIe 设备 id )来确定是否应在节点上配置 NVIDIA 软件组件。在这个初始版本中, GPU 操作员当前部署了 NVIDIA 容器运行时 、 NVIDIA 集装箱驱动程序 和 NVIDIA 调速器设备插件 。未来,运营商还将管理其他组件,如 基于 DCGM 监控。

让我们简单地看一下不同的状态。

状态容器工具包

此状态将部署一个守护进程,该守护进程通过 容器 在主机系统上安装 NVIDIA 容器运行时。守护进程使用 NFD 标签中的 PCIe 设备 id ,仅在具有 GPU 资源的节点上安装运行时。 PCIe 设备 id 0x10DE 是 NVIDIA 的供应商 id 。

nodeSelector: feature.node.kubernetes.io/pci-10de.present: “true”

状态驱动程序

此状态将部署一个带有容器化的 NVIDIA 驱动程序的守护进程。您可以阅读有关驱动程序容器 在这里 的更多信息。在启动时,驱动程序容器可以构建最终的 NVIDIA 内核模块,并将它们加载到主机上的 Linux 内核中,以准备运行 CUDA 应用程序并在后台运行。驱动程序容器包括应用程序所需的驱动程序的用户模式组件。同样,守护进程使用 NFD 标签来选择要在其上部署驱动程序容器的节点。

状态驱动程序验证

如上所述,操作员状态机包括验证步骤,以确保组件已成功启动。操作员调度一个简单的 CUDA 工作负载(在本例中是一个 vectorAdd 示例)。如果应用程序运行时没有任何错误,则容器状态为“成功”。

状态设备插件

此状态为 NVIDIA Kubernetes 设备插件部署守护进程。它将节点上的 GPUs 列表注册到 kubelet 中,这样就可以将 GPUs 分配给 CUDA 个工作负载。

状态设备插件验证

在这种状态下,验证容器请求 Kubernetes 分配 GPU ,并运行一个简单的 CUDA 工作负载(如上所述),以检查设备插件是否注册了资源列表以及工作负载是否成功运行(即容器状态为“ Success ”)。

为了简化 GPU 操作员本身的部署, NVIDIA 提供了一个舵图。用户可以使用驱动程序自定义的插件版本(值。 yaml )在舵图上。然后,操作员使用模板值在节点上提供所需的软件版本。这为用户提供了一个参数化级别。

运行 GPU 运算符

让我们快速了解一下如何部署 GPU 操作符并运行 CUDA 工作负载。在这一点上,我们假设您有一个 Kubernetes 集群在运行(即主控制平面可用,工作节点已经加入集群)。为了让这篇博文更简单,我们将使用一个运行 ubuntu18.04 。 3lts 的 NVIDIA Tesla T4GPU 的单节点 Kubernetes 集群。

GPU 操作符本身并没有解决 Kubernetes 集群的设置问题,目前有很多解决方案 可获得的 可以用于此目的。 NVIDIA 正在与不同的合作伙伴合作,将 GPU 运营商整合到他们管理 GPUs 的解决方案中。

让我们验证一下我们的 Kubernetes 集群(以及带有 Tiller 的 Helm 设置)是否可以运行。请注意,虽然节点有一个 GPU ,但节点上没有部署 NVIDIA 软件组件–我们将使用 GPU 操作符来配置组件。

$ sudo kubectl get pods --all-namespaces NAMESPACE NAME READY STATUS RESTARTS AGE
kube-system calico-kube-controllers-6fcc7d5fd6-n2dnt 1/1 Running 0 6m45s
kube-system calico-node-77hjv 1/1 Running 0 6m45s
kube-system coredns-5c98db65d4-cg6st 1/1 Running 0 7m10s
kube-system coredns-5c98db65d4-kfl6v 1/1 Running 0 7m10s
kube-system etcd-ip-172-31-5-174 1/1 Running 0 6m5s
kube-system kube-apiserver-ip-172-31-5-174 1/1 Running 0 6m11s
kube-system kube-controller-manager-ip-172-31-5-174 1/1 Running 0 6m26s
kube-system kube-proxy-mbnsg 1/1 Running 0 7m10s
kube-system kube-scheduler-ip-172-31-5-174 1/1 Running 0 6m18s
kube-system tiller-deploy-8557598fbc-hrrhd 1/1 Running 0 21s

一个单节点 Kubernetes 集群(主节点未被污染,因此可以运行工作负载)

$ kubectl get nodes
NAME STATUS ROLES AGE VERSION
ip-172-31-5-174 Ready master 3m2s v1.15.3

我们可以看到节点有一个 NVIDIA GPU ,但没有安装驱动程序或其他软件工具。

$ lspci | grep -i nvidia
00:1e.0 3D controller: NVIDIA Corporation Device 1eb8 (rev a1) $ nvidia-smi
nvidia-smi: command not found

作为先决条件,让我们确保在系统上设置了一些内核模块。这些模块的 NVIDIA 依赖于某些驱动程序。

$ sudo modprobe -a i2c_core ipmi_msghandler

现在,让我们继续部署 GPU 操作符。为此,我们将使用 NGC 提供的舵面图。首先,添加 Helm 回购:

$ helm repo add nvidia https://helm.ngc.nvidia.com/nvidia
"nvidia" has been added to your repositories $ helm repo update
Hang tight while we grab the latest from your chart repositories...
...Skip local chart repository
...Successfully got an update from the "nvidia" chart repository
...Successfully got an update from the "stable" chart repository
Update Complete.

然后用图表部署操作员

$ helm install --devel nvidia/gpu-operator -n test-operator --wait
$ kubectl apply -f https://raw.githubusercontent.com/NVIDIA/gpu-operator/master/manifests/cr/sro_cr_sched_none.yaml
specialresource.sro.openshift.io/gpu created

我们可以验证 GPU 操作符是否在它自己的命名空间中运行,并且正在监视另一个命名空间中的组件。

$ kubectl get pods -n gpu-operator
NAME READY STATUS RESTARTS AGE
special-resource-operator-7654cd5d88-w5jbf 1/1 Running 0 98s

几分钟后, GPU 操作员将部署所有 NVIDIA 软件组件。输出还显示了作为 GPU 操作符状态机一部分运行的验证容器。示例 CUDA 容器( vectorAdd )已作为状态机的一部分成功完成。

$ kubectl get pods -n gpu-operator-resources
NAME READY STATUS RESTARTS AGE
nvidia-container-toolkit-daemonset-wwzfn 1/1 Running 0 3m36s
nvidia-device-plugin-daemonset-pwfq7 1/1 Running 0 101s
nvidia-device-plugin-validation 0/1 Completed 0 92s
nvidia-driver-daemonset-skpn7 1/1 Running 0 3m27s
nvidia-driver-validation 0/1 Completed 0 3m $ kubectl -n gpu-operator-resources logs -f nvidia-device-plugin-validation
[Vector addition of 50000 elements]
Copy input data from the host memory to the CUDA device
CUDA kernel launch with 196 blocks of 256 threads
Copy output data from the CUDA device to the host memory
Test PASSED
Done

我们还可以看到 NFD 用不同的属性标记了节点。已为 NVIDIA GPU 设置了具有 PCIe 设备 id 0x10DE 的节点标签。

$ kubectl -n node-feature-discovery logs -f nfd-worker-zsjsp
2019/10/21 00:46:25 cpu-cpuid.AVX512F = true
2019/10/21 00:46:25 cpu-hardware_multithreading = true
2019/10/21 00:46:25 cpu-cpuid.AVX = true
2019/10/21 00:46:25 cpu-cpuid.AVX512VL = true
2019/10/21 00:46:25 cpu-cpuid.AVX512CD = true
2019/10/21 00:46:25 cpu-cpuid.AVX2 = true
2019/10/21 00:46:25 cpu-cpuid.FMA3 = true
2019/10/21 00:46:25 cpu-cpuid.ADX = true
2019/10/21 00:46:25 cpu-cpuid.AVX512DQ = true
2019/10/21 00:46:25 cpu-cpuid.AESNI = true
2019/10/21 00:46:25 cpu-cpuid.AVX512BW = true
2019/10/21 00:46:25 cpu-cpuid.MPX = true
2019/10/21 00:46:25 kernel-config.NO_HZ = true
2019/10/21 00:46:25 kernel-config.NO_HZ_IDLE = true
2019/10/21 00:46:25 kernel-version.full = 4.15.0-1051-aws
2019/10/21 00:46:25 kernel-version.major = 4
2019/10/21 00:46:25 kernel-version.minor = 15
2019/10/21 00:46:25 kernel-version.revision = 0
2019/10/21 00:46:25 pci-10de.present = true
2019/10/21 00:46:25 pci-1d0f.present = true
2019/10/21 00:46:25 storage-nonrotationaldisk = true
2019/10/21 00:46:25 system-os_release.ID = ubuntu
2019/10/21 00:46:25 system-os_release.VERSION_ID = 18.04
2019/10/21 00:46:25 system-os_release.VERSION_ID.major = 18
2019/10/21 00:46:25 system-os_release.VERSION_ID.minor = 04

让我们启动一个 TensorFlow 笔记本。 GitHub repo 上有一个示例清单,让我们使用它

$ kubectl apply -f https://nvidia.github.io/gpu-operator/notebook-example.yml

一旦 pod 被创建,我们就可以使用令牌在浏览器窗口中查看笔记本。

$ kubectl logs -f tf-notebook
[C 02:52:44.849 NotebookApp] Copy/paste this URL into your browser when you connect for the first time, to login with a token: http://localhost:8888/?token=b7881f90dfb6c8c5892cff7e8232684f201c846c48da81c9

我们可以使用端口转发或使用节点端口 30001 到达容器。使用上面日志中的 URL 在浏览器中打开 Jupyter 笔记本。

$ kubectl port-forward tf-notebook 8888:8888

现在您可以看到 Jupyter 主页并继续您的工作流 – 所有这些都在 Kubernetes 中运行,并通过 GPUs 加速!

结论

如果您有任何问题或意见,请在下面的评论部分留下。对于有关安装和使用的技术问题,我们建议在 GitHub 上提交一个问题。

关于作者

Pramod Ramarao 是 NVIDIA 加速计算的产品经理。他领导 CUDA 平台和数据中心软件的产品管理,包括容器技术。

审核编辑:郭婷

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • NVIDIA
    +关注

    关注

    14

    文章

    5363

    浏览量

    106911
  • gpu
    gpu
    +关注

    关注

    28

    文章

    4985

    浏览量

    132220
  • CUDA
    +关注

    关注

    0

    文章

    124

    浏览量

    14189
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    Kubernetes安全加固的核心技术

    在生产环境Kubernetes集群的安全性直接关系到企业数据安全和业务稳定性。本文将从实战角度,带你掌握K8s安全加固的核心技术。
    的头像 发表于 08-18 11:18 ?111次阅读

    高效管理Kubernetes集群的实用技巧

    作为一名经验丰富的运维工程师,我深知在日常的Kubernetes集群管理,熟练掌握kubectl命令是提升工作效率的关键。今天,我将分享15个经过实战检验的kubectl实用技巧,帮助你像艺术家一样优雅地
    的头像 发表于 08-13 15:57 ?159次阅读

    生产环境Kubernetes容器安全的最佳实践

    随着容器化技术的快速发展,Kubernetes已成为企业级容器编排的首选平台。然而,在享受Kubernetes带来的便利性和可扩展性的同时,安全问题也日益凸显。本文将从运维工程师的角度,深入探讨生产环境
    的头像 发表于 07-14 11:09 ?202次阅读

    详解Kubernetes的Pod调度亲和性

    Kubernetes(K8s),Pod 调度亲和性(Affinity) 是一种高级调度策略,用于控制 Pod 与节点(Node)或其他 Pod 之间的关联(亲和)或反关联(反亲和)关系。通过亲和性规则,管理员可以更精细地控
    的头像 发表于 06-07 13:56 ?360次阅读

    Kubernetes Helm入门指南

    Helm 是 Kubernetes 的包管理工具,它允许开发者和系统管理员通过定义、打包和部署应用程序来简化 Kubernetes 应用的
    的头像 发表于 04-30 13:42 ?2591次阅读
    <b class='flag-5'>Kubernetes</b> Helm入门指南

    Portainer的安装与使用

    Portainer 是一个开源的 Docker 和 Kubernetes 管理工具,提供了一个直观的 Web 界面,用于简化容器、镜像、网络、卷等资源的管理
    的头像 发表于 03-18 16:48 ?559次阅读
    Portainer的安装与使用

    Kubernetes中部署MySQL集群

    一般情况下 Kubernetes 可以通过 ReplicaSet 以一个 Pod 模板创建多个 pod 副本,但是它们都是无状态的,任何时候它们都可以被一个全新的 pod 替换。
    的头像 发表于 03-18 16:22 ?351次阅读
    <b class='flag-5'>Kubernetes</b>中部署MySQL集群

    Kubernetes管理工具Helm的安装和使用

    Helm 可以帮助我们管理 Kubernetes 应用程序 - Helm Charts 可以定义、安装和升级复杂的 Kubernetes 应用程序,Charts 包很容易创建、版本管理
    的头像 发表于 03-13 16:06 ?1319次阅读

    Kubernetes Pod常用管理命令详解

    Kubernetes Pod常用管理命令详解
    的头像 发表于 02-17 14:06 ?634次阅读
    <b class='flag-5'>Kubernetes</b> Pod常用<b class='flag-5'>管理</b>命令详解

    Kubernetes:构建高效的容器化应用平台

    Kubernetes 作为容器编排的事实标准,在容器化应用部署中发挥着关键作用。 搭建 Kubernetes 集群是应用的基础。可以使用kubeadm工具快速搭建。在主节点执行kubeadm
    的头像 发表于 01-23 15:22 ?395次阅读

    使用 Flexus 云服务器 X 实例部署 Kubernetes 图形化管理平台

    Kubernetes 作为当今最流行的容器编排平台,随着云计算、微服务架构和 DevOps 文化的普及,Kubernetes 在自动化部署、扩展和管理容器化应用程序方面扮演着越来越重要的角色。未来
    的头像 发表于 01-21 16:14 ?403次阅读
    使用 Flexus 云服务器 X 实例部署 <b class='flag-5'>Kubernetes</b> 图形化<b class='flag-5'>管理</b>平台

    Kubernetes的CNI网络插件之flannel

    Kubernetes设计了网络模型,但却将它的实现讲给了网络插件,CNI网络插件最重要的功能就是实现Pod资源能够跨主机通信。
    的头像 发表于 01-02 09:43 ?913次阅读

    艾体宝与Kubernetes原生数据平台AppsCode达成合作

    虹科姐妹公司艾体宝宣布与Kubernetes 原生数据平台 AppsCode达成正式合作,致力于将其核心产品KubeDB引入中国市场,为企业提供专业、高效的云原生数据库管理解决方案。
    的头像 发表于 12-16 15:07 ?736次阅读

    《CST Studio Suite 2024 GPU加速计算指南》

    GPU不能在单个主机系统组合使用。 - AMD GPU:目前只有时域求解器(FIT)支持AMD GPU,如Instinct MI 210、Radeon VII等,并给出了相关规格
    发表于 12-16 14:25

    【「算力芯片 | 高性能 CPU/GPU/NPU 微架构分析」阅读体验】--了解算力芯片GPU

    本篇阅读学习第七、八章,了解GPU架构演进及CPGPU存储体系与线程管理 █从图形到计算的GPU架构演进 GPU图像计算发展 ●从三角形开始的几何阶段 在现代图形渲染
    发表于 11-03 12:55