系列导航
本系列介绍 K8s 中 Device Plugin 机制及其在 GPU 管理等 AI 场景中的应用。
① GPU基础 → ② Device Plugin → ③ 开发Plugin → ④ 多设备/AI场景 → ⑤ DRA
重要
K8s 的 Device Plugin 机制是 GPU 管理的基础。NVIDIA GPU Operator 负责驱动安装、Device Plugin 部署、MIG 配置。理解 GPU 的物理拓扑(PCIe、NVLink、NVSwitch)和逻辑切分(MIG、vGPU、Time-Slicing)是 AI 集群调度的前提。
1. GPU 设备要求
要使容器能使用 GPU,容器内需要出现两部分内容:
| 要求 | 说明 | 路径 |
|---|
| GPU 设备文件 | 容器能访问 GPU 设备 | /dev/nvidia0, /dev/nvidiactl, /dev/nvidia-uvm |
| GPU 驱动库 | CUDA 驱动、NVML 库等 | /usr/local/nvidia/lib64/ |
kubelet 通过 CRI 接口将这些设备和目录注入容器。
2. GPU 资源声明
K8s 通过 Extended Resource 声明 GPU:
1
2
3
4
5
6
7
8
9
10
11
| apiVersion: v1
kind: Pod
metadata:
name: cuda-vector-add
spec:
containers:
- name: main
image: nvidia/cuda:11.0
resources:
limits:
nvidia.com/gpu: 1
|
| 字段 | 说明 |
|---|
nvidia.com/gpu | NVIDIA GPU 的 Extended Resource 名 |
limits: 1 | 申请 1 块 GPU(requests 可以省略,会自动等于 limits) |
3. 物理拓扑
3.1 单机 GPU 互联
1
2
3
4
5
6
7
8
| 节点内 GPU 拓扑:
CPU Socket 0 ──── PCIe ──── PCIe Switch ──── GPU0
├─── NVLink ──── GPU1
├─── NVLink ──── GPU2
└─── NVLink ──── GPU3
CPU Socket 1 ──── PCIe ──── PCIe Switch ──── GPU4
├─── NVLink ──── GPU5
...
|
| 互联方式 | 带宽 | 说明 |
|---|
| NVLink | 900 GB/s(H100) | GPU-GPU 直连,不经过 PCIe |
| NVSwitch | 3.2 TB/s(H100 全互联) | 无阻塞交换芯片,连接节点内所有 GPU |
| PCIe 5.0 | 128 GB/s(双向) | GPU-CPU 通信 |
3.2 查看拓扑
1
2
3
4
5
6
7
8
9
10
11
12
| nvidia-smi topo -m
# GPU0 GPU1 GPU2 GPU3 GPU4 GPU5 GPU6 GPU7
# GPU0 X NV18 NV18 NV18 SYS SYS SYS SYS
# GPU1 NV18 X NV18 NV18 SYS SYS SYS SYS
# GPU2 NV18 NV18 X NV18 SYS SYS SYS SYS
# GPU3 NV18 NV18 NV18 X SYS SYS SYS SYS
# GPU4 SYS SYS SYS SYS X NV18 NV18 NV18
# GPU5 SYS SYS SYS SYS NV18 X NV18 NV18
# GPU6 SYS SYS SYS SYS NV18 NV18 X NV18
# GPU7 SYS SYS SYS SYS NV18 NV18 NV18 X
# NV18 = NVLink 18 路(最高带宽)
# SYS = 通过 PCIe + CPU 互联(需要通过系统总线)
|
4. GPU 切分方式
4.1 MIG(Multi-Instance GPU)
A100/H100 支持将一块物理 GPU 切分为最多 7 个独立实例:
1
2
3
4
5
6
7
8
| # 列出 MIG 配置
nvidia-smi --query-gpu=mig.mode.current --format=csv
# 启用电实例 A100 MIG
nvidia-smi mig -cgi 9,9,9,9,9,9,9 # 7 个 1g.5gb 实例
# MIG 实例的资源声明方式
nvidia-smi mig -i 0 -cgi 9 -C
|
| MIG 配置 | 实例数 | 每实例显存 | 适用场景 |
|---|
| 1g.5gb | 7 | 5 GB | 小模型推理 |
| 2g.10gb | 3 | 10 GB | 中等推理/小训练 |
| 3g.20gb | 2 | 20 GB | 中等训练 |
| 7g.40gb | 1 | 40 GB(全 GPU) | 大模型训练 |
4.2 Time-Slicing(时间切片)
NVIDIA GPU Operator 1.12+ 支持 GPU 时间切片,允许多个 Pod 共享同一 GPU:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
| apiVersion: v1
kind: ConfigMap
metadata:
name: time-slicing-config
data:
any: |-
version: v1
flags:
migStrategy: none
sharing:
timeSlicing:
resources:
- name: nvidia.com/gpu
replicas: 4 # 1 张物理 GPU 暴露为 4 个虚拟 GPU
|
4.3 vGPU(Virtual GPU)
NVIDIA vGPU 通过 GRID 驱动实现显存隔离和 QoS(需要 vGPU License):
| 方式 | 隔离级别 | License | 适用场景 |
|---|
| MIG | 硬件隔离(独立显存+SM) | 免费 | 推理+训练 |
| Time-Slicing | 软件时间片,无显存隔离 | 免费 | 轻量推理 |
| vGPU | 显存隔离 + 帧缓冲隔离 | 收费 | VDI、专业可视化 |
5. NVIDIA GPU Operator
NVIDIA 提供的统一部署方案,一键安装所有 GPU 组件:
1
2
3
4
5
6
7
8
| NVIDIA GPU Operator 包含:
├── NVIDIA Driver(节点驱动)
├── NVIDIA Container Toolkit(nvidia-container-runtime)
├── NVIDIA Device Plugin(上报 GPU 资源给 K8s)
├── NVIDIA DCGM(GPU 监控)
├── GPU Feature Discovery(节点标签)
├── MIG Manager(MIG 管理)
└── Sandbox Device Plugin(共享 GPU)
|
1
2
3
4
5
| # 安装 NVIDIA GPU Operator
helm repo add nvidia https://helm.ngc.nvidia.com/nvidia
helm install gpu-operator nvidia/gpu-operator \
--set operator.defaultRuntime=containerd \
--set driver.enabled=true
|
6. 节点标签
安装 GPU Operator 后,节点自动打上标签:
1
2
3
4
5
6
7
8
| kubectl get node gpu-node-1 --show-labels
# nvidia.com/gpu.present=true
# nvidia.com/gpu.product=NVIDIA-A100-SXM4-40GB
# nvidia.com/gpu.count=8
# nvidia.com/gpu.memory=40960
# nvidia.com/gpu.family=ampere
# nvidia.com/mig.capable=true
# nvidia.com/mig.strategy=mixed
|
参考链接