NVIDIA GPU Operator分析四:DCGM Exporter安装

本文涉及的产品
容器服务 Serverless 版 ACK Serverless,952元额度 多规格
可观测监控 Prometheus 版,每月50GB免费额度
可观测可视化 Grafana 版,10个用户账号 1个月
简介: 背景我们知道,如果在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 DCGM Exporter的原理。

DCGM Exporter简介

DCGM Exporter是一个用golang编写的收集节点上GPU信息(比如GPU卡的利用率、卡温度、显存使用情况等)的工具,结合Prometheus和Grafana可以提供丰富的仪表大盘。

从1.13开始,kubelet通过/var/lib/kubelet/pod-resources下的Unix套接字来提供pod资源查询服务,dcgm-exporter可以访问/var/lib/kubelet/pod-resources/下的套接字服务查询为每个pod分配的GPU设备,然后将GPU的pod信息附加到收集的度量中。

DCGM Exporter服务在每个节点上都存在一个,当Prometheus使用拉数据这种模式时,每隔一段时间(用户可设置时间间隔)就访问该节点GCGM Exporter的服务获取该节点GPU相关指标,然后存入的Prometheus的数据库中,grafana每隔一段时间(用户可设置时间间隔)从Prometheus数据库中拿取该节点GPU指标,然后在浏览器中通过各种仪表盘展示出来。

k8s集群节点安装DCGM Exporter

接下来演示一下如何在集群中安装DCGM Exporter。

前提条件

在执行安装操作前,你需要确认以下的条件是否满足:

  • k8s集群的版本 > 1.8。
  • 集群中的GPU节点已经安装了GPU驱动,如果没有安装驱动,请参考本系列文章《NVIDIA GPU Operator分析一:NVIDIA驱动安装》。
  • 集群中的GPU节点已经安装NVIDIA Container Toolkit,如果没有安装,请参考本系列文章《NVIDIA GPU Operator分析二:NVIDIA Container Toolkit安装》。
  • 集群中的GPU节点已经安装NVIDIA Device Plugin,如果没有安装,请参考本系列文章《NVIDIA GPU Operator分析三:NVIDIA Device Plugin安装》。
  • 集群已经安装Prometheus和Grafana,如果没有安装,请参考 GPU Telemetry

安装DCGM Exporter

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-monitoring/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-monitoring/0900_daemonset.yaml,补充镜像名称。

  • 修改initContainers中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']
  • 修改containers中nvidia-dcgm-exporter的镜像名称为nvcr.io/nvidia/k8s/dcgm-exporter:2.1.4-2.2.0-ubuntu20.04
      containers:
      - image: "nvcr.io/nvidia/k8s/dcgm-exporter:2.1.4-2.2.0-ubuntu20.04"
        name: nvidia-dcgm-exporter

5.部署DCGM Exporter。

$ cd assets/state-monitoring
$ rm -rf  *openshift*
$ kubectl apply -f ./

6.查看pod是否处于Running。

$ kubectl get po -n gpu-operator-resources -l app=nvidia-dcgm-exporter
NAME                         READY   STATUS    RESTARTS   AGE
nvidia-dcgm-exporter-ff6zp   1/1     Running   0          3m31s
nvidia-dcgm-exporter-tk7xk   1/1     Running   0          3m31s
nvidia-dcgm-exporter-zdfg6   1/1     Running   0          3m31s

7.获取nvidia-dcgm-exporter服务监听的端口。

$ kubectl get svc -n gpu-operator-resources nvidia-dcgm-exporter -o yaml
apiVersion: v1
kind: Service
metadata:
  annotations:
    kubectl.kubernetes.io/last-applied-configuration: |
      {"apiVersion":"v1","kind":"Service","metadata":{"annotations":{"prometheus.io/scrape":"true"},"labels":{"app":"nvidia-dcgm-exporter"},"name":"nvidia-dcgm-exporter","namespace":"gpu-operator-resources"},"spec":{"ports":[{"name":"gpu-metrics","port":9400,"protocol":"TCP","targetPort":9400}],"selector":{"app":"nvidia-dcgm-exporter"}}}
    prometheus.io/scrape: "true"
  creationTimestamp: "2021-03-26T09:39:01Z"
  labels:
    app: nvidia-dcgm-exporter
  name: nvidia-dcgm-exporter
  namespace: gpu-operator-resources
  resourceVersion: "5634508"
  selfLink: /api/v1/namespaces/gpu-operator-resources/services/nvidia-dcgm-exporter
  uid: 55b81b2a-32a6-4a97-b75a-ad318a9443fd
spec:
  clusterIP: 10.51.129.82
  ports:
  - name: gpu-metrics
    port: 9400
    protocol: TCP
    targetPort: 9400
  selector:
    app: nvidia-dcgm-exporter
  sessionAffinity: None
  type: ClusterIP
status:
  loadBalancer: {}

可以看到,服务监听的端口为9400,端口名称为gpu-metrics。

配置ServiceMonitor

1.部署ServiceMonitor(需要创建一个文件servicemonitor.yaml),用于Prometheus找到节点上dcgm-exporter服务监听的端口,然后访问dcgm-exporter。

$ cat servicemonitor.yaml
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
  name: nvidia-dcgm-exporter
  labels:
    app: nvidia-dcgm-exporter
  namespace: gpu-operator-resources
spec:
  selector:
    matchLabels:
      app: nvidia-dcgm-exporter
  namespaceSelector:
    matchNames:
      - gpu-operator-resources
    # any: true
  endpoints:
  - port: gpu-metrics # 此处填写步骤7获得的端口名称,即gpu-metrics
    interval: "30s" # 表示prometheus多长时间访问一次dcgm-exporter获取gpu指标。
    path: /metrics

2.使用kubectl部署:

$ kubectl apply -f servicemonitor.yaml

在grafana中安装dashboard

1.从https://grafana.com/grafana/dashboards/12239下载dashboard,点击界面右面的“Download JSON”进行下载,文件名称为nvidia-dcgm-exporter-dashboard_rev1.json。

2.点击“+” -> Import导入nvidia-dcgm-exporter-dashboard_rev1.json。

导入时需要选择数据源(来自哪个集群)。

3.导入后效果如图。

验证

当监控大盘安装完成后,可以通过提交一个任务查看监控是否有效。

1.部署一个tensorflow任务。

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=10000
    - --data_dir=tensorflow-sample-code/data
    resources:
      limits:
        nvidia.com/gpu: 1
    workingDir: /root
  restartPolicy: Never

使用kubectl命令部署。

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

2.查看dashboard数据是否变化(注意需要开启自动刷新界面功能,点击右上角off,选择一个刷新频率,比如15s)。

可以看到有一个GPU的利用率发生了变化。

与Arena Exporter对比

目前,NVIDIA GPU Operator提供的监控仪表盘可参考的指标还是比较简单的,比如:节点GPU使用率、节点GPU温度、每张GPU卡已使用的显存等。仪表盘还存在着如下的一些缺点:

  • 无法从应用的角度观察GPU的使用情况,比如:某个Pod使用了多少GPU显存、GPU使用率是多少,或者更高级的功能是某个训练任务使用了多少GPU显存、GPU使用率是多少。
  • 无法查看集群的GPU的整体使用情况,比如:集群总的GPU数、已使用GPU数、集群已使用的GPU显存等。
  • 在当前的监控大盘中,GPU是用GPU Index表示的,所以你可以看到,示例集群中有三个节点,每个节点有一张GPU卡,但是在监控大盘中每块GPU的标识都是GPU0,无法区分哪张卡是属于哪个节点。

阿里云容器服务团队基于Arena实现的Arena Exporter结合Prometheus以及Grafana能够从更多的维度展示集群的GPU资源使用情况(详见:云原生AI监控):

  • 集群仪表盘概览

  • 节点仪表盘概览

  • 训练任务仪表盘概览

总结

本篇文章首先简单介绍了DCGM Exporter,然后演示了如何部署dcgm exporter以及结合prometheus和grafana将监控指标通过仪表盘展示出来,最后简单的对比了DCGM Exporter与Arena Exporter。

相关实践学习
部署Stable Diffusion玩转AI绘画(GPU云服务器)
本实验通过在ECS上从零开始部署Stable Diffusion来进行AI绘画创作,开启AIGC盲盒。
目录
相关文章
|
3月前
|
并行计算 TensorFlow 算法框架/工具
Windows11+CUDA12.0+RTX4090如何配置安装Tensorflow2-GPU环境?
本文介绍了如何在Windows 11操作系统上,配合CUDA 12.0和RTX4090显卡,通过创建conda环境、安装特定版本的CUDA、cuDNN和TensorFlow 2.10来配置TensorFlow GPU环境,并提供了解决可能遇到的cudnn库文件找不到错误的具体步骤。
368 3
|
3月前
|
并行计算 TensorFlow 算法框架/工具
Window安装TensorFlow-GPU版本
Window安装TensorFlow-GPU版本
59 0
|
4月前
|
Linux TensorFlow 算法框架/工具
安装GPU版本的TensorFlow
【7月更文挑战第3天】安装GPU版本的TensorFlow。
218 1
|
5月前
|
机器学习/深度学习 人工智能 弹性计算
阿里云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助力性能优化。购买方式灵活,客户案例包括深势科技、流利说、小牛翻译。
675 0
|
5月前
|
XML 机器学习/深度学习 监控
性能监控之Telegraf+InfluxDB+Grafana NVIDIA GPU实时监控
【6月更文挑战12天】性能监控之Telegraf+InfluxDB+Grafana NVIDIA GPU实时监控
140 0
|
6月前
|
Ubuntu Shell Docker
GPU_nvidia-container-toolkit安装和配置
GPU_nvidia-container-toolkit安装和配置
1755 0
|
6月前
|
TensorFlow 算法框架/工具 C++
在有GPU的windows上安装TensorFlow
在有GPU的windows上安装TensorFlow
101 0
|
6月前
|
人工智能 弹性计算 Ubuntu
【Hello AI】安装并使用Deepnccl-多GPU互联的AI通信加速库
Deepnccl是为阿里云神龙异构产品开发的用于多GPU互联的AI通信加速库,能够无感地加速基于NCCL通信算子调用的分布式训练或多卡推理等任务。本文主要介绍在Ubuntu或CentOS操作系统的GPU实例上安装和使用Deepnccl的操作方法。
|
14天前
|
弹性计算 人工智能 Serverless
阿里云ACK One:注册集群云上节点池(CPU/GPU)自动弹性伸缩,助力企业业务高效扩展
在当今数字化时代,企业业务的快速增长对IT基础设施提出了更高要求。然而,传统IDC数据中心却在业务存在扩容慢、缩容难等问题。为此,阿里云推出ACK One注册集群架构,通过云上节点池(CPU/GPU)自动弹性伸缩等特性,为企业带来全新突破。
|
3月前
|
机器学习/深度学习 编解码 人工智能
阿里云gpu云服务器租用价格:最新收费标准与活动价格及热门实例解析
随着人工智能、大数据和深度学习等领域的快速发展,GPU服务器的需求日益增长。阿里云的GPU服务器凭借强大的计算能力和灵活的资源配置,成为众多用户的首选。很多用户比较关心gpu云服务器的收费标准与活动价格情况,目前计算型gn6v实例云服务器一周价格为2138.27元/1周起,月付价格为3830.00元/1个月起;计算型gn7i实例云服务器一周价格为1793.30元/1周起,月付价格为3213.99元/1个月起;计算型 gn6i实例云服务器一周价格为942.11元/1周起,月付价格为1694.00元/1个月起。本文为大家整理汇总了gpu云服务器的最新收费标准与活动价格情况,以供参考。
阿里云gpu云服务器租用价格:最新收费标准与活动价格及热门实例解析