docker及k8s使用nvidia显卡
前置条件
https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/latest/install-guide.html
需要安装 cuda toolkit,具体可以参考官网
1 | apt-get install -y nvidia-container-toolkit |
配置 runtime
使用 nvidia-ctk 配置, 官方推荐命令配置:
1 | # docker |
修改的 是 /etc/docker/daemon.json 和 /etc/containerd/config.toml 文件
1 | "default-runtime": "nvidia", |
以及
1 |
|
测试 containerd 的默认 runtime_name 还是 runc, 修改为 nvidia;
1 | [plugins."io.containerd.grpc.v1.cri".containerd] |
docker
未安装 nvidia-container-toolkit 时
1 | root@debian:~# docker run --rm --gpus all nvidia/cuda:12.4.0-base-ubuntu22.04 nvidia-smi |
安装后
1 |
|
k8s
需要先安装 nvidia 插件
或者使用 https://github.com/NVIDIA/gpu-operator (可以自动安装驱动)
1 | apiVersion: apps/v1 |
部署完,看日志有报错
1 | # kubectl logs -f -n kube-system nvidia-device-plugin-daemonset-fb7lc |
我的原因是 containerd 的默认 runtime 是 runc 改成 nvidia 后重启 containerd 及插件容器
1 | kubectl logs -f -n kube-system nvidia-device-plugin-daemonset-j4jdg |
describe node 节选
1 | Allocatable: |
我这个机器上只有一块显卡, k8s 的 GPU 调度申请的显卡只能为整数。 可以使用 vGPU 或者 MIG 虚拟化,但需要显卡支持
测试
1 | apiVersion: v1 |
Running 期间,其他的 GPU 容器 Pending , 日志
1 |
|
直接使用 gpu-operator
k8s 上可以直接使用 gpu-operator,自动安装 驱动,cuda 以及 plugin
驱动支持的操作系统有限,可以先去查看 https://catalog.ngc.nvidia.com/orgs/nvidia/containers/driver/tags
当前使用的 gpu-operator-v24.3.0, 最新安装的 ubuntu-server 22.04 版本
使用到的镜像,内网环境可能需要提前准备好镜像包,仅容器内有效, nvidia-driver-daemonset 容器删除重建后会重新编译 驱动。所以最好提前在服务器上安装好驱动及插件。
1 | nvcr.io/nvidia/cloud-native/gpu-operator-validator v24.3.0 |
使用 helm 安装
1 | helm repo add nvidia https://nvidia.github.io/gpu-operator |
执行完成后生成如下 pod
1 | gpu-operator gpu-feature-discovery-zd5qc 1/1 Running 0 69s |
这些 Pod 是 gpu-operator 组件的一部分,每个 Pod 执行特定的任务以确保 Kubernetes 集群能够正确地检测和使用 GPU。以下是每个 Pod 的作用:
gpu-feature-discovery:
- Pod 名称:
gpu-feature-discovery-zd5qc - 作用:检测节点上的 GPU 相关特性,并将这些特性报告给 Kubernetes,以便调度器能够根据这些特性做出更智能的调度决策。
- Pod 名称:
node-feature-discovery:
- Pod 名称:
gpu-operator-1719300178-node-feature-discovery-gc-c4b5bb74pcs28gpu-operator-1719300178-node-feature-discovery-master-664c5pbsjgpu-operator-1719300178-node-feature-discovery-worker-q544b
- 作用:检测节点的硬件和软件特性,并将这些特性标签添加到节点上,以帮助 Kubernetes 调度器做出更好的调度决策。
- Pod 名称:
gpu-operator:
- Pod 名称:
gpu-operator-ff9fb8679-w5xqk - 作用:管理和部署 GPU 相关的组件和资源,包括驱动程序、工具和插件。
- Pod 名称:
nvidia-container-toolkit-daemonset:
- Pod 名称:
nvidia-container-toolkit-daemonset-vn9dv - 作用:提供在容器中使用 NVIDIA GPU 的支持,包含 NVIDIA Container Runtime。
- Pod 名称:
nvidia-cuda-validator:
- Pod 名称:
nvidia-cuda-validator-fv8vc - 作用:验证 CUDA 的安装和功能,确保 GPU 资源可以正确使用。
- Pod 名称:
nvidia-dcgm-exporter:
- Pod 名称:
nvidia-dcgm-exporter-kfth8 - 作用:从 NVIDIA Data Center GPU Manager (DCGM) 收集 GPU 相关的监控数据,并将其导出到 Prometheus 格式。
- Pod 名称:
nvidia-device-plugin-daemonset:
- Pod 名称:
nvidia-device-plugin-daemonset-bc9q9 - 作用:为 Kubernetes 提供 NVIDIA GPU 的插件,使得 GPU 资源可以在 Kubernetes 中使用和管理。
- Pod 名称:
nvidia-operator-validator:
- Pod 名称:
nvidia-operator-validator-lfkl2 - 作用:验证 GPU Operator 组件的安装和功能,确保所有组件正确运行。
- Pod 名称:
nvidia-driver-daemonset:
- Pod 名称:
nvidia-driver-daemonset-ts2bf - 作用:在每个节点上安装和管理 NVIDIA GPU 驱动程序。
- Pod 名称:
这些 Pod 协同工作,确保 GPU 资源在 Kubernetes 集群中能够被正确检测、使用和管理。
编辑 kubectl edit clusterpolicies.nvidia.com, 可以看到默认的组件
1 | ccManager: |
查看 node 信息
1 | kubectl describe node |
验证
1 | root@test-ThinkPad-L14-Gen-2:~# kubectl logs -f -n gpu-operator nvidia-operator-validator-lh5n2 -c toolkit-validation |
同样执行上面的两个 pod
1 | kubectl logs gpu-pod |
遇到的问题
gcc 版本不对应,安装失败
1 | warning: the compiler differs from the one used to build the kernel |
解决方法
1 | FROM nvcr.io/nvidia/driver:550.54.15-ubuntu22.04 |
重新构建镜像
1 | docker build -t mydriver . |
修改 daemonset 使用 mydriver 镜像
prometheus 监控数据
可使用的面板之一 https://grafana.com/grafana/dashboards/21362-nvidia-dcgm-exporter-dashboard/
id: 21362
https://github.com/NVIDIA/dcgm-exporter
nvidia-dcgm-exporter 数据展示
curl nvidia-dcgm-exporter:port/metrics 当前版本的所有指标
1 | # HELP DCGM_FI_DEV_SM_CLOCK SM clock frequency (in MHz). |
指标解释
nvidia-dcgm-exporter 提供了许多关于 GPU 的关键性能指标,这些指标可以帮助监控和诊断 GPU 的健康和性能。以下是你提到的每个指标的详细解释:
DCGM_FI_DEV_SM_CLOCK
- 描述: SM(Streaming Multiprocessor)时钟频率,单位为 MHz。
- 类型:
gauge(测量一个特定时间点的值) - 示例:
300表示 SM 时钟频率为 300 MHz。
DCGM_FI_DEV_MEM_CLOCK
- 描述: 内存时钟频率,单位为 MHz。
- 类型:
gauge - 示例:
405表示内存时钟频率为 405 MHz。
DCGM_FI_DEV_MEMORY_TEMP
- 描述: 显卡内存温度,单位为摄氏度。
- 类型:
gauge - 示例:
0表示当前内存温度为 0°C。
DCGM_FI_DEV_GPU_TEMP
- 描述: GPU 温度,单位为摄氏度。
- 类型:
gauge - 示例:
43表示当前 GPU 温度为 43°C。
DCGM_FI_DEV_PCIE_REPLAY_COUNTER
- 描述: PCIe 重试次数总计。
- 类型:
counter(累积值,随着时间增加) - 示例:
0表示没有发生 PCIe 重试。
DCGM_FI_DEV_GPU_UTIL
- 描述: GPU 利用率,单位为百分比。
- 类型:
gauge - 示例:
0表示当前 GPU 利用率为 0%。
DCGM_FI_DEV_MEM_COPY_UTIL
- 描述: 内存复制利用率,单位为百分比。
- 类型:
gauge - 示例:
0表示当前内存复制利用率为 0%。
DCGM_FI_DEV_ENC_UTIL
- 描述: 编码器利用率,单位为百分比。
- 类型:
gauge - 示例:
0表示当前编码器利用率为 0%。
DCGM_FI_DEV_DEC_UTIL
- 描述: 解码器利用率,单位为百分比。
- 类型:
gauge - 示例:
0表示当前解码器利用率为 0%。
DCGM_FI_DEV_XID_ERRORS
- 描述: 最近一次 XID 错误的值。
- 类型:
gauge - 示例:
0表示没有 XID 错误。
DCGM_FI_DEV_FB_FREE
- 描述: 剩余显存,单位为 MiB。
- 类型:
gauge - 示例:
1863表示当前剩余显存为 1863 MiB。
DCGM_FI_DEV_FB_USED
- 描述: 已使用显存,单位为 MiB。
- 类型:
gauge - 示例:
0表示当前已使用显存为 0 MiB。
DCGM_FI_DEV_NVLINK_BANDWIDTH_TOTAL
- 描述: NVLink 总带宽计数,所有通道的总和。
- 类型:
counter - 示例:
0表示 NVLink 带宽总计为 0。
DCGM_FI_DEV_VGPU_LICENSE_STATUS
- 描述: vGPU 许可证状态。
- 类型:
gauge - 示例:
0表示 vGPU 许可证状态为 0(无许可证)。
这些指标提供了关于 GPU 性能和健康的详细信息,帮助你实时监控和分析 GPU 的状态。在 Prometheus 中抓取这些指标后,可以在 Grafana 等可视化工具中创建仪表板,监控这些关键指标.
测试搭建
prometheus.yml
1 | global: |
docker
1 | docker run -p 3000:3000 --name grafana \ |
使用上面的模版

更换面板
项目 https://github.com/utkuozdemir/nvidia_gpu_exporter
面板: https://grafana.com/grafana/dashboards/14574-nvidia-gpu-metrics/
面板id: 14574 中文 20622
1 | $ docker run -d \ |
效果查看
