使用Prometheus监视Kubernetes的GPU节点
首先
在近年的深度学习热潮中,我们经常听到使用Kubernetes管理多个GPU节点并进行多人共享的操作方式。我们公司也在本地环境搭建了GPU集群,并利用开源软件KAMONOHASHI进行基于深度学习的人工智能开发。
在共享和使用GPU集群的过程中,有一个需求是要收集GPU节点的使用情况作为度量,并可视化过去的使用历程。因此我尝试使用NVIDIA DCGM exporter for Prometheus和Prometheus来收集GPU的度量。
另外,本文使用的文件已放置在GitHub上。
进球 qiú)
在包含GPU节点的Kubernetes集群中,引入Prometheus和DCGM exporter,以便通过Prometheus收集GPU的指标。
版本信息 xī)
每个组件所使用的版本如下:
使用的各组件版本如下所示。
-
- Kubernetes: v1.14.1
-
- helm: v2.13.0
NVIDIA DCGM exporter for Prometheus: d39e0cc8675c0b10aab14d4f66191eedf5029f66
Prometheus: 2.13.1(helm chartはprometheus-9.3.1を利用)
nginx-ingress: v0.26.1(helm chartはnginx-ingress-1.24.7を利用)
我使用Helm来安装了Prometheus和nginx-ingress。
集群的组成
假设集群中包含以下节点。
-
- master: Kubernetesのmasterノード
-
- gpu1: NVIDIA Tesla K80搭載のGPUノード
-
- gpu2: NVIDIA Tesla K80搭載のGPUノード
- kamonohashi: KAMONOHASHIで利用のノード。今回は関係なし
我们正在使用现有的KAMONOHASHI集群。在引入KAMONOHASHI时,我们使用kubespray进行了Kubernetes的构建。
这次我们将在主节点上部署Prometheus,并通过Ingress进行访问。我们将使用Nginx Ingress Controller作为Ingress控制器。
由于DCGM导出器的运行需求已经被提出,我们将确保每个GPU节点满足这些要求。
先决条件
NVIDIA Tesla 驱动程序 = R384+(从 NVIDIA 驱动程序下载页面下载)
nvidia-docker 版本 > 2.0(参见如何安装及其先决条件)
可选择配置 docker 将默认运行时设置为 nvidia
NVIDIA提供的GPU监测工具
NVIDIA提供的GPU监控工具可以从GitHub的NVIDIA/gpu-monitoring-tools获取。其中,NVIDIA DCGM exporter for Prometheus可作为在Prometheus中获取GPU指标的导出工具使用。DCGM是NVIDIA数据中心GPU管理器的缩写,用于获取GPU集群的指标的工具集合。
这个存储库有点难以理解,所以我在这里整理一下。
k8s/node-exporter在NVIDIA DCGM exporter for Prometheus中,是存储了exporter的DaemonSet清单的目录(k8s/pod-gpu-metrics-exporter存储了exporter本身的源代码)。
k8s/node-exporter 中包含以下三个清单文件。
gpu-node-exporter-daemonset.yaml
用于获取GPU节点指标以及包含CPU等信息的导出器的DaemonSet。
只需要一个选择,用中文改写以下内容:
gpu-only-node-exporter-daemonset.yaml
获取仅 GPU 信息的节点指标的 exporter 的 DaemonSet。
pod-gpu-node-exporter-daemonset.yaml是一个DaemonSet,用于获取每个Pod的GPU利用情况的指标。
这些DaemonSet由以下exporter的组合构成。
prometheus/node-exporter是Prometheus提供的一个常见的exporter。
nvidia/dcgm-exporter是NVIDIA提供的用于获取GPU节点指标的导出程序。使用此导出程序,可以获取每个GPU节点的GPU利用率和GPU内存使用量。gpu-node-exporter-daemonset和gpu-only-node-exporter-daemonset是将prometheus/node-exporter与此导出程序集成的解决方案。
nvidia/pod-gpu-metrics-exporter是一个用于获取每个Pod的GPU使用情况指标的导出器。使用此导出器可以获取每个GPU节点上运行的Pod的GPU利用率和GPU内存使用量。此导出器已与prometheus/node-exporter和nvidia/dcgm-exporter进行了整合,并在pod-gpu-node-exporter-daemonset中使用。
要使用kubelet获取Pod的信息,需要启用FeatureGates的KubeletPodResources功能(在Kubernetes v1.15之后默认启用)。
本文将使用pod-gpu-node-exporter-daemonset.yaml来获取每个Pod的GPU使用情况的指标。
步骤
1. kubelet的配置更改
由于本次使用的Kubernetes版本是v1.14.1,所以为了获取每个Pod的GPU使用情况指标,需要在每个GPU节点上启用kubelet的FeatureGates功能。
您需要编辑每个GPU节点上的/etc/systemd/system/kubelet.service文件,并修改ExecStart部分。
ExecStart=/usr/local/bin/kubelet \
+ --feature-gates KubeletPodResources=true \
然后使用以下命令重新启动kubelet。
systemctl daemon-reload
systemctl restart kubelet
通过这些操作,上述的 exporter 将能够获取到 Pod 的信息。
创建命名空间
我們將為這次部署的資源創建一個命名空間。名稱將為monitoring。
kubectl create namespace monitoring
3. 为GPU节点打标签
pod-gpu-node-exporter-daemonset设置了nodeSelector,将hardware-type:NVIDIAGPU设置为标签,并将exporter部署在具有此标签的节点上。
因此,可以对GPU节点进行以下标签(可以更改为gpu节点的主机名,如gpu1)。
kubectl label nodes <gpu-node-name> hardware-type=NVIDIAGPU
您可以使用以下命令检查标签的添加情况。
kubectl get nodes --show-labels
创建Prometheus的数据存储位置。
在部署 Prometheus 时,需要指定收集到的数据的存储位置。本次我们将数据保存在 master 节点的 /var/lib/prometheus 目录下。我们可以使用以下命令创建该目录,并将其所有者设置为 nobody。由于 Prometheus 服务器将以 nobody 用户身份运行,因此需要修改所有者。
mkdir /var/lib/prometheus
chown nobody /var/lib/prometheus
5. 部署各种资源
将以下资源部署到GitHub。使用的文件已经放在GitHub上了。
-
- GPUノード用のexporterを配置するためのDaemonSet(pod-gpu-node-exporter-daemonset.yaml)
-
- exporterのPodにアクセスするためのservice(exporter-service.yaml)
- Prometheusで利用するPersistent Volume, Persistent Volume Claim(prometheus-pv-pvc.yaml)
关于GPU节点的exporter,我们将使用修改了原始库中的pod-gpu-node-exporter-daemonset.yaml文件,将其namespace从kube-system更改为monitoring。此外,还会创建一个service,以使Prometheus可以从exporter的Pod中收集信息。另外,我们会以8GB的容量创建用于存储Prometheus数据的PV和PVC(根据Prometheus图表的默认值)。
请使用以下命令应用这三个清单文件。
kubectl apply -f pod-gpu-node-exporter-daemonset.yaml -f exporter-service.yaml -f prometheus-pv-pvc.yaml
您可以使用以下命令来确认导出器部署后,GPU节点的指标是否正常输出。
curl <gpu-node-name>:9100/metrics | grep dcgm
如果输出了 dcgm_gpu_utilization 等信息,则表示 exporter 正常启动。建议在此处进行确认一次。
6. Prometheus的安装
用Helm工具安装Prometheus。
通过以下命令下载并编辑Prometheus配置文件。
helm inspect values stable/prometheus > prometheus-values.yaml
由于本次的目的是先使其能正常运行,因此我们将以几乎所有功能被禁用的状态进行部署。
-
- Prometheus serverのみ有効化
http://master-hostname/prometheusのような形でアクセスするためにprefixURLとbaseURLを変更
prometheus serverのingressを有効化し、ingress.classとしてprometheus-nginxを指定
masterノードにデプロイするようnodeSelectorを設定
persistentVolumeとして上記で作成したものを指定
編輯完成後,使用以下命令進行Prometheus的安裝。
helm install --name prometheus --namespace monitoring --version 9.3.1 -f prometheus-values.yaml stable/prometheus
7. 安装 Ingress Controller
为了Prometheus Server的入口,安装Nginx Ingress Controller。
使用以下命令下载并编辑配置文件。
helm inspect values stable/nginx-ingress > nginx-ingress-values.yaml
以下是编辑内容的概述。
-
- ingressClassをprometheus-nginxに変更
-
- scopeを有効にし、namespaceとしてmonitoringを指定
-
- defaultBackendServiceとしてmonitoring/prometheus-serverを指定
-
- masterノードにデプロイするようnodeSelectorを設定
- externalIPsとしてmasterノードのIPを指定
编辑完成后,使用以下命令安装Ingress Controller。
helm install stable/nginx-ingress --name prometheus-nginx --namespace monitoring --version 1.24.7 -f nginx-ingress-values.yaml
8. 使用Prometheus
总结
通过将NVIDIA DCGM导出程序与Prometheus结合使用,可以监视GPU资源的利用情况。同时,结合Grafana,还可以将Prometheus收集到的结果进行美观的可视化。
希望这可以帮助到希望实现类似目标的人,但在实际运作中,需要详细考虑指标存储空间的大小等问题。