NVIDIA GPU Operator分析三:NVIDIA Device Plugin安装

简介: 背景我们知道,如果在Kubernetes中支持GPU设备调度,需要做如下的工作:节点上安装nvidia驱动节点上安装nvidia-docker集群部署gpu device plugin,用于为调度到该节点的pod分配GPU设备。除此之外,如果你需要监控集群GPU资源使用情况,你可能还需要安装DCCM exporter结合Prometheus输出GPU资源监控信息。要安装和管理这么多的组件,对于运维

背景

我们知道,如果在Kubernetes中支持GPU设备调度,需要做如下的工作:

  • 节点上安装nvidia驱动
  • 节点上安装nvidia-docker
  • 集群部署gpu device plugin,用于为调度到该节点的pod分配GPU设备。

除此之外,如果你需要监控集群GPU资源使用情况,你可能还需要安装DCCM exporter结合Prometheus输出GPU资源监控信息。

要安装和管理这么多的组件,对于运维人员来说压力不小。基于此,NVIDIA开源了一款叫NVIDIA GPU Operator的工具,该工具基于Operator Framework实现,用于自动化管理上面我们提到的这些组件。

NVIDIA GPU Operator有以下的组件构成:

  • 安装nvidia driver的组件
  • 安装nvidia container toolkit的组件
  • 安装nvidia devcie plugin的组件
  • 安装nvidia dcgm exporter组件
  • 安装gpu feature discovery组件

本系列文章不打算一上来就开始讲NVIDIA GPU Operator,而是先把各个组件的安装详细的分析一下,然后手动安装这些组件,最后再来分析NVIDIA GPU Operator就比较简单了。

在本篇文章中,我们将介绍NVIDIA GPU Operator安装NVIDIA Device Plugin的原理。

NVIDIA Device Plugin介绍

本小节简单的介绍一下什么是NVIDIA Device Plugin(如果需要更详细的了解k8s device plugin机制,请参考网上其他文档)。在介绍NVIDIA Container Toolkit时,我们提到过,当启动docker容器时,可以通过环境变量指定容器所需的GPU,例如:

$ docker run -d --name gpu-test -e NVIDIA_VISIBLE_DEVICES=0,1 centos:7 sleep 5000

但是在Kubernetes集群中应该如何给一个应用指定使用GPU呢?可以通过给pod的容器指定环境变量NVIDIA_VISIBLE_DEVICES实现吗?可以,但是这样做有一些问题:

  • 因为kubernetes集群中有很多节点,每个节点的GPU数量可能不同,假设指定pod的容器的环境变量为”“NVIDIA_VISIBLE_DEVICES=3,4”,但是pod调度到节点是随机的,最终pod所在的节点如果只有一张GPU卡,那么pod将启动失败。
  • 直接在pod的容器中指定环境变量NVIDIA_VISIBLE_DEVICES,用户无法维护哪些节点的哪些GPU已经使用,哪些未使用。

Kubernetes从1.8开始支持设备插件机制,只要用户实现与设备相对应的device plugin,然后在pod提交时指定需要使用多少个设备,kubernetes就能为pod自动挂载设备并且维护节点上设备状态(即哪些设备已使用,哪些设备未使用)。

NVIDIA Device Plugin的工作原理简单的概况为:

  • pod spec中的resources.limits字段写入运行该pod需要多少个GPU设备,像下面这样:
kind: Pod
metadata:
  name: gpu-pod
spec:
  containers:
    - name: gpu-container-1
      image: centos:7
      resources:
        limits:
          nvidia.com/gpu: 2 # 代表为该Pod申请了2个GPU。
  • 每个节点的kubelet组件维护该节点的GPU设备状态(哪些已用,哪些未用)并定时报告给调度器,调度器知道每一个节点有多少张GPU卡可用。
  • 调度器为pod选择节点时,从符合条件的节点中选择一个节点。
  • 当pod调度到节点上后,kubelet组件为pod分配GPU设备ID,并将这些ID作为参数传递给NVIDIA Device Plugin
  • NVIDIA Device Plugin将分配给该pod的容器的GPU设备ID写入到容器的环境变量NVIDIA_VISIBLE_DEVICES中,然后将信息返回给kubelet。
  • kubelet启动容器。
  • NVIDIA Container Toolkit检测容器的spec中存在环境变量NVIDIA_VISIBLE_DEVICES,然后根据环境变量的值将GPU设备挂载到容器中。

在集群中部署NVIDIA Device Plugin

接下来演示一下怎样在集群中部署nvidia device plugin。

前提条件

在进行操作之前,请确认下面的条件是否满足:

  • 集群的版本 > 1.8。
  • 集群中的GPU节点已经安装了GPU驱动,如果没有安装驱动,请参考本系列文件中关于NVIDIA驱动的安装。
  • 集群中的GPU节点已经安装NVIDIA Container Toolkit,如果没有安装,请参考本系列文件中关于NVIDIA Container Toolkit的安装。

安装步骤

1.下载gpu-operator源码。

$ git clone -b 1.6.2 https://github.com/NVIDIA/gpu-operator.git
$ cd gpu-operator
$ export GPU_OPERATOR=$(pwd) 

2.确认节点已经打了标签nvidia.com/gpu.present=true。

$ kubectl get nodes -L nvidia.com/gpu.present
NAME                       STATUS   ROLES    AGE   VERSION            GPU.PRESENT
cn-beijing.192.168.8.44    Ready    <none>   13d   v1.16.9-aliyun.1   true
cn-beijing.192.168.8.45    Ready    <none>   13d   v1.16.9-aliyun.1   true
cn-beijing.192.168.8.46    Ready    <none>   13d   v1.16.9-aliyun.1   true
cn-beijing.192.168.9.159   Ready    master   13d   v1.16.9-aliyun.1
cn-beijing.192.168.9.160   Ready    master   13d   v1.16.9-aliyun.1
cn-beijing.192.168.9.161   Ready    master   13d   v1.16.9-aliyun.1

3.修改assets/state-device-plugin/0300_rolebinding.yaml,注释两个字段,否则无法提交:

  • 将userNames这一行和其后面的一行注释。
#userNames:
#- system:serviceaccount:gpu-operator:nvidia-device-plugin
  • 将roleRef.namespace这一行注释。
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: Role
  name: nvidia-device-plugin
# namespace: gpu-operator-resources

4.修改assets/state-device-plugin/0400_device_plugin.yml,填入正确的镜像。

  • 更改container nvidia-device-plugin-ctr的镜像为nvcr.io/nvidia/k8s-device-plugin:v0.8.2-ubi8。
      containers:
      - image: "nvcr.io/nvidia/k8s-device-plugin:v0.8.2-ubi8"
        name: nvidia-device-plugin-ctr
        securityContext:
          privileged: true
  • 更改initContainer toolkit-validation的镜像为nvcr.io/nvidia/k8s/cuda-sample:vectoradd-cuda10.2。
      initContainers:
      - name: toolkit-validation
        image: "nvcr.io/nvidia/k8s/cuda-sample:vectoradd-cuda10.2"
        command: ['sh', '-c']
        args: ["/tmp/vectorAdd"]
        securityContext:
          privileged: true

5.部署device plugin。

$ kubectl apply -f assets/state-device-plugin

6.查看pod是否已经处于running。

$ kubectl get po -n gpu-operator-resources -l  app=nvidia-device-plugin-daemonset
NAME                                   READY   STATUS    RESTARTS   AGE
nvidia-device-plugin-daemonset-kllvw   1/1     Running   0          78s
nvidia-device-plugin-daemonset-lxdl6   1/1     Running   0          78s
nvidia-device-plugin-daemonset-pwqb4   1/1     Running   0          78s

7.查看pod日志。

$ kubectl logs nvidia-device-plugin-daemonset-kllvw -n gpu-operator-resources --tail=20
2021/03/26 07:11:02 Loading NVML
2021/03/26 07:11:02 Starting FS watcher.
2021/03/26 07:11:02 Starting OS watcher.
2021/03/26 07:11:02 Retreiving plugins.
2021/03/26 07:11:02 Starting GRPC server for 'nvidia.com/gpu'
2021/03/26 07:11:02 Starting to serve 'nvidia.com/gpu' on /var/lib/kubelet/device-plugins/nvidia-gpu.sock
2021/03/26 07:11:02 Registered device plugin for 'nvidia.com/gpu' with Kubelet

验证

为了验证集群节点的GPU是否可用,可以提交一个tensorfolw任务(该任务申请了一个GPU,即nvidia.com/gpu: 1),任务的yaml如下:

$ cat /tmp/gpu-test.yaml

apiVersion: v1
kind: Pod
metadata:
  name: test-gpu
  labels:
    test-gpu: "true"
spec:
  containers:
  - name: training
    image: registry.cn-beijing.aliyuncs.com/ai-samples/tensorflow:1.5.0-devel-gpu
    command:
    - python
    - tensorflow-sample-code/tfjob/docker/mnist/main.py
    - --max_steps=300
    - --data_dir=tensorflow-sample-code/data
    resources:
      limits:
        nvidia.com/gpu: 1
    workingDir: /root
  restartPolicy: Never

1.提交任务。

$ kubectl apply -f /tmp/gpu-test.yaml

2.查看pod是否处于Running。

$ kubectl get po -l test-gpu=true
NAME       READY   STATUS    RESTARTS   AGE
test-gpu   1/1     Running   0          2m54s

3.查看pod日志。

$ kubectl logs test-gpu  --tail 10
Accuracy at step 220: 0.9288
Accuracy at step 230: 0.936
Accuracy at step 240: 0.9393
Accuracy at step 250: 0.9405
Accuracy at step 260: 0.9409
Accuracy at step 270: 0.9428
Accuracy at step 280: 0.9399
Accuracy at step 290: 0.9408
Adding run metadata for 299
Total Train-accuracy=0.9408

说明各个组件(nvidia driver,nvidia container toolkit, nvidia device plugin)能够正常工作。

总结

本篇文章简单介绍了nvidia device plugin并尝试在k8s集群中以daemonset方式部署nvidia device plugin,最后通过运行一个tensorflow任务验证nvidia device plugin是否正常工作。

相关实践学习
在云上部署ChatGLM2-6B大模型(GPU版)
ChatGLM2-6B是由智谱AI及清华KEG实验室于2023年6月发布的中英双语对话开源大模型。通过本实验,可以学习如何配置AIGC开发环境,如何部署ChatGLM2-6B大模型。
目录
相关文章
|
Kubernetes 安全 异构计算
K8S 部署 Deepseek 要 3 天?别逗了!Ollama+GPU Operator 1 小时搞定
最近一年我都在依赖大模型辅助工作,比如 DeepSeek、豆包、Qwen等等。线上大模型确实方便,敲几个字就能生成文案、写代码、做表格,极大提高了效率。但对于企业来说:公司内部数据敏感、使用外部大模型会有数据泄露的风险。
K8S 部署 Deepseek 要 3 天?别逗了!Ollama+GPU Operator 1 小时搞定
|
Kubernetes 调度 异构计算
一文搞懂 GPU 共享方案: NVIDIA Time Slicing
本文主要分享 GPU 共享方案,包括如何安装、配置以及使用,最后通过分析源码了 TImeSlicing 的具体实现。通过配置 TImeSlicing 可以实现 Pod 共享一块物理 GPU,以提升资源利用率。
789 11
|
并行计算 PyTorch 算法框架/工具
融合AMD与NVIDIA GPU集群的MLOps:异构计算环境中的分布式训练架构实践
本文探讨了如何通过技术手段混合使用AMD与NVIDIA GPU集群以支持PyTorch分布式训练。面对CUDA与ROCm框架互操作性不足的问题,文章提出利用UCC和UCX等统一通信框架实现高效数据传输,并在异构Kubernetes集群中部署任务。通过解决轻度与强度异构环境下的挑战,如计算能力不平衡、内存容量差异及通信性能优化,文章展示了如何无需重构代码即可充分利用异构硬件资源。尽管存在RDMA验证不足、通信性能次优等局限性,但该方案为最大化GPU资源利用率、降低供应商锁定提供了可行路径。源代码已公开,供读者参考实践。
1495 3
融合AMD与NVIDIA GPU集群的MLOps:异构计算环境中的分布式训练架构实践
|
并行计算 TensorFlow 算法框架/工具
Windows11+CUDA12.0+RTX4090如何配置安装Tensorflow2-GPU环境?
本文介绍了如何在Windows 11操作系统上,配合CUDA 12.0和RTX4090显卡,通过创建conda环境、安装特定版本的CUDA、cuDNN和TensorFlow 2.10来配置TensorFlow GPU环境,并提供了解决可能遇到的cudnn库文件找不到错误的具体步骤。
2848 3
|
Linux TensorFlow 算法框架/工具
安装GPU版本的TensorFlow
【7月更文挑战第3天】安装GPU版本的TensorFlow。
726 1
|
并行计算 TensorFlow 算法框架/工具
Window安装TensorFlow-GPU版本
Window安装TensorFlow-GPU版本
650 0
|
机器学习/深度学习 人工智能 弹性计算
阿里云GPU服务器全解析_GPU服务器租用费用_NVIDIA A10、V100、T4、P4、P100 GPU卡
阿里云GPU云服务器提供NVIDIA A10、V100、T4、P4、P100等多种GPU卡,结合高性能CPU,单实例计算性能高达5PFLOPS。支持2400万PPS及160Gbps内网带宽。实例规格多样,如A10卡GN7i(3213.99元/月)、V100-16G卡GN6v(3830.00元/月)等。适用于深度学习、科学计算、图形处理等场景。GPU软件如AIACC-Training、AIACC-Inference助力性能优化。购买方式灵活,客户案例包括深势科技、流利说、小牛翻译。
3677 0
|
9月前
|
人工智能 算法 调度
阿里云ACK托管集群Pro版共享GPU调度操作指南
本文介绍在阿里云ACK托管集群Pro版中,如何通过共享GPU调度实现显存与算力的精细化分配,涵盖前提条件、使用限制、节点池配置及任务部署全流程,提升GPU资源利用率,适用于AI训练与推理场景。
726 1
|
9月前
|
人工智能 城市大脑 运维
喜讯!阿里云国产异构GPU云平台技术荣获“2025算力中国·年度重大成果”
2025年8月23日,在工业和信息化部新闻宣传中心、中国信息通信研究院主办的2025中国算力大会上,阿里云与浙江大学联合研发的“国产异构GPU云平台关键技术与系统”荣获「算力中国·年度重大成果」。该评选旨在选拔出算力产业具有全局性突破价值的重大成果,是业内公认的技术创新“风向标”。
933 0
|
存储 机器学习/深度学习 数据库
阿里云服务器X86/ARM/GPU/裸金属/超算五大架构技术特点、场景适配参考
在云计算技术飞速发展的当下,云计算已经渗透到各个行业,成为企业数字化转型的关键驱动力。选择合适的云服务器架构对于提升业务效率、降低成本至关重要。阿里云提供了多样化的云服务器架构选择,包括X86计算、ARM计算、GPU/FPGA/ASIC、弹性裸金属服务器以及高性能计算等。本文将深入解析这些架构的特点、优势及适用场景,以供大家了解和选择参考。
1650 61

热门文章

最新文章