HAMi - Kubernetes GPU 共享部署与使用手册
HAMi: Heterogeneous AI Memory Interface
版本: v2.x (latest)
功能: GPU 共享、显存隔离、算力切分
适用: Kubernetes 1.16+ / RKE2
目录
1. HAMi 简介
1.1 什么是 HAMi
HAMi(异构算力虚拟化中间件)是一个 Kubernetes 设备插件和调度器扩展,用于实现:
- GPU 共享: 多个 Pod 共享同一张物理 GPU
- 显存隔离: 精确控制每个 Pod 可使用的显存大小
- 算力切分: 限制 GPU 计算资源使用比例
- 多厂商支持: 支持 NVIDIA、AMD、Intel 等异构算力
1.2 核心组件
HAMi 架构:
┌─────────────────────────────────────────┐
│ Kubernetes Scheduler │
│ (调度器扩展) │
└──────────────┬──────────────────────────┘
│
┌──────────────▼──────────────────────────┐
│ Mutating Webhook │
│ (Pod 资源注入与修改) │
└──────────────┬──────────────────────────┘
│
┌──────────────▼──────────────────────────┐
│ Device Plugin │
│ (GPU 设备发现与上报) │
└──────────────┬──────────────────────────┘
│
┌──────────────▼──────────────────────────┐
│ In-Container Virtualization │
│ (容器内 GPU 虚拟化与隔离) │
└─────────────────────────────────────────┘
1.3 应用场景
| 场景 | 说明 | 示例 |
|---|---|---|
| 开发测试 | 多开发者共享 GPU 进行模型开发 | 1张GPU分给4个开发者 |
| 推理服务 | 低负载推理服务共享 GPU | 多个小模型部署在同一GPU |
| 教学环境 | 学生实验环境 GPU 共享 | 40个学生共享8张GPU |
| 成本控制 | 提高 GPU 利用率,降低云成本 | 利用率从 20% 提升到 70% |
2. 环境要求
2.1 硬件要求
| 组件 | 最低要求 | 推荐配置 |
|---|---|---|
| GPU | NVIDIA GPU (支持 CUDA) | Tesla V100/A100, RTX 3090/4090 |
| 驱动 | NVIDIA Driver >= 440 | NVIDIA Driver >= 535 |
| CUDA | CUDA >= 10.2 | CUDA >= 12.0 |
| 内存 | 8GB | 16GB+ |
2.2 软件要求
| 组件 | 版本要求 |
|---|---|
| Kubernetes | 1.16+ (推荐 1.24+) |
| Helm | 3.0+ |
| kubectl | 1.16+ |
| containerd | 1.4+ 或 Docker 19.03+ |
| OS | Ubuntu 20.04+/CentOS 8+ |
2.3 支持的 GPU 型号
✅ NVIDIA 系列(完整支持):
- Tesla: V100, A100, A10, T4, P100
- RTX: 2080Ti, 3090, 4090, 5090
- Quadro: RTX 4000/5000/6000
✅ 其他厂商(部分支持):
- AMD GPU (通过 ROCm)
- Intel GPU (通过 oneAPI)
- 海光 DCU
- 寒武纪 MLU
3. 部署前准备
3.1 安装 NVIDIA 驱动
# Ubuntu/Debian
# 1. 添加 NVIDIA 仓库
distribution=$(. /etc/os-release;echo $ID$VERSION_ID)
curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey | sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg
curl -s -L https://nvidia.github.io/libnvidia-container/stable/deb/nvidia-container-toolkit.list | \
sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g' | \
sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list
# 2. 安装驱动(如果未安装)
sudo apt-get update
sudo apt-get install -y nvidia-driver-535
# 3. 重启并验证
sudo reboot
nvidia-smi
3.2 安装 nvidia-container-toolkit
# 所有 GPU 节点执行
# 1. 安装工具包
sudo apt-get update
sudo apt-get install -y nvidia-container-toolkit
# 2. 验证安装
nvidia-container-cli info
3.3 配置容器运行时
3.3.1 配置 containerd(RKE2 环境)
# RKE2 使用 containerd,需要配置 nvidia 运行时
# 1. 编辑 containerd 配置
sudo vim /etc/containerd/config.toml
# 2. 添加或修改以下内容
version = 2
[plugins]
[plugins."io.containerd.grpc.v1.cri"]
[plugins."io.containerd.grpc.v1.cri".containerd]
default_runtime_name = "nvidia"
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes]
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.nvidia]
privileged_without_host_devices = false
runtime_engine = ""
runtime_root = ""
runtime_type = "io.containerd.runc.v2"
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.nvidia.options]
BinaryName = "/usr/bin/nvidia-container-runtime"
# 3. 重启 containerd
sudo systemctl restart containerd
# 4. 验证配置
sudo ctr run --runtime io.containerd.runc.v2 --rm -t \
docker.io/nvidia/cuda:12.0.0-base-ubuntu22.04 nvidia-test nvidia-smi
3.3.2 配置 Docker(可选)
# 如果使用 Docker 作为容器运行时
# 1. 编辑 Docker 配置
sudo vim /etc/docker/daemon.json
# 2. 添加以下内容
{
"default-runtime": "nvidia",
"runtimes": {
"nvidia": {
"path": "/usr/bin/nvidia-container-runtime",
"runtimeArgs": []
}
}
}
# 3. 重启 Docker
sudo systemctl daemon-reload
sudo systemctl restart docker
# 4. 验证
docker run --rm --gpus all nvidia/cuda:12.0.0-base-ubuntu22.04 nvidia-smi
3.4 验证 GPU 节点
# 1. 检查 GPU 是否被识别
lspci | grep -i nvidia
# 2. 查看 GPU 状态
nvidia-smi
# 3. 确认 CUDA 版本
nvcc --version
# 示例输出
# +-----------------------------------------------------------------------------+
# | NVIDIA-SMI 535.129.03 Driver Version: 535.129.03 CUDA Version: 12.2 |
# |-------------------------------+----------------------+----------------------+
# | GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC |
# | Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. |
# |===============================+======================+======================|
# | 0 Tesla V100-PCIE... On | 00000000:3E:00.0 Off | 0 |
# | N/A 32C P0 24W / 250W | 0MiB / 32768MiB | 0% Default |
# +-------------------------------+----------------------+----------------------+
4. HAMi 部署
4.1 节点标签配置
# 为所有 GPU 节点添加标签,HAMi 只管理带 gpu=on 标签的节点
# 查看节点
kubectl get nodes
# 添加标签(替换 <node-name> 为实际节点名)
kubectl label nodes <node-name> gpu=on
# 示例
kubectl label nodes worker-01 gpu=on
kubectl label nodes worker-02 gpu=on
# 验证标签
kubectl get nodes -l gpu=on
4.2 使用 Helm 部署 HAMi
# 1. 添加 HAMi Helm 仓库
helm repo add hami-charts https://project-hami.github.io/HAMi/
helm repo update
# 2. 查看可用版本
helm search repo hami-charts/hami --versions
# 3. 检查 Kubernetes 版本
kubectl version --short
# 4. 部署 HAMi(根据 K8s 版本调整 kubeScheduler.imageTag)
helm install hami hami-charts/hami \
--namespace kube-system \
--set scheduler.kubeScheduler.imageTag=v1.29.0 \
--set devicePlugin.devicePluginImage=projecthami/hami-device-plugin:v2.2.0 \
--set devicePlugin.vGPUImage=projecthami/hami-vgpu:cuda12.2
# 参数说明:
# scheduler.kubeScheduler.imageTag: 匹配您的 K8s 版本
# devicePlugin.devicePluginImage: 设备插件镜像
# devicePlugin.vGPUImage: 容器内虚拟化镜像(根据 CUDA 版本选择)
4.3 验证部署
# 1. 检查 Pod 状态
kubectl get pods -n kube-system | grep hami
# 应该看到以下 Pod 运行中:
# hami-device-plugin-daemonset-xxxxx 1/1 Running
# hami-scheduler-xxxxx 1/1 Running
# hami-webhook-xxxxx 1/1 Running
# 2. 检查节点 GPU 资源
kubectl describe node <node-name> | grep -A 5 "Allocatable:"
# 应该看到类似输出:
# Allocatable:
# cpu: 16
# memory: 65860480Ki
# nvidia.com/gpu: 2 # GPU 数量
# nvidia.com/gpumem: 65536 # 总显存(MiB)
# 3. 查看 HAMi 日志
kubectl logs -n kube-system -l app=hami-device-plugin --tail=50
kubectl logs -n kube-system -l app=hami-scheduler --tail=50
4.4 自定义配置(可选)
# hami-values.yaml
scheduler:
kubeScheduler:
imageTag: v1.29.0
extender:
image: projecthami/hami-scheduler:v2.2.0
metrics:
enabled: true
port: 9395
devicePlugin:
devicePluginImage: projecthami/hami-device-plugin:v2.2.0
vGPUImage: projecthami/hami-vgpu:cuda12.2
logLevel: 4 # 日志级别 0-4
timeSlice: 100 # 时间片大小(毫秒)
# 资源限制
resources:
limits:
cpu: 200m
memory: 256Mi
requests:
cpu: 100m
memory: 128Mi
webhook:
enabled: true
image: projecthami/hami-webhook:v2.2.0
nvidia:
enabled: true
migStrategy: none # MIG 策略: none/single/mixed
使用自定义配置部署:
helm install hami hami-charts/hami \
--namespace kube-system \
-f hami-values.yaml
5. 使用指南
5.1 基础使用:申请 vGPU
5.1.1 申请完整 GPU
# 示例1: 申请 1 张完整 GPU
apiVersion: v1
kind: Pod
metadata:
name: gpu-pod-full
spec:
containers:
- name: cuda-container
image: nvidia/cuda:12.0.0-base-ubuntu22.04
command: ["nvidia-smi", "&&", "sleep", "3600"]
resources:
limits:
nvidia.com/gpu: 1 # 申请 1 张 GPU
5.1.2 申请部分显存
# 示例2: 申请 1 张 GPU 的 8GB 显存
apiVersion: v1
kind: Pod
metadata:
name: gpu-pod-memory
spec:
containers:
- name: cuda-container
image: nvidia/cuda:12.0.0-base-ubuntu22.04
command: ["nvidia-smi", "&&", "sleep", "3600"]
resources:
limits:
nvidia.com/gpu: 1 # 申请 1 个 vGPU
nvidia.com/gpumem: 8192 # 限制显存为 8192 MiB (8GB)
5.1.3 申请算力比例
# 示例3: 申请 50% 的 GPU 算力
apiVersion: v1
kind: Pod
metadata:
name: gpu-pod-core
spec:
containers:
- name: cuda-container
image: nvidia/cuda:12.0.0-base-ubuntu22.04
command: ["nvidia-smi", "&&", "sleep", "3600"]
resources:
limits:
nvidia.com/gpu: 1 # 申请 1 个 vGPU
nvidia.com/gpucores: 50 # 限制算力为 50%
5.1.4 同时限制显存和算力
# 示例4: 申请 4GB 显存 + 30% 算力
apiVersion: v1
kind: Pod
metadata:
name: gpu-pod-both
spec:
containers:
- name: cuda-container
image: nvidia/cuda:12.0.0-base-ubuntu22.04
command: ["nvidia-smi", "&&", "sleep", "3600"]
resources:
limits:
nvidia.com/gpu: 1 # 申请 1 个 vGPU
nvidia.com/gpumem: 4096 # 显存限制 4GB
nvidia.com/gpucores: 30 # 算力限制 30%
5.2 验证 GPU 共享
# 1. 部署测试 Pod
kubectl apply -f gpu-pod-memory.yaml
# 2. 进入容器查看 GPU 信息
kubectl exec -it gpu-pod-memory -- bash
# 3. 运行 nvidia-smi
nvidia-smi
# 预期输出(显存被限制为 8192 MiB):
# +-----------------------------------------------------------------------------+
# | NVIDIA-SMI 535.129.03 Driver Version: 535.129.03 CUDA Version: 12.2 |
# |-------------------------------+----------------------+----------------------+
# | GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC |
# | Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. |
# |===============================+======================+======================|
# | 0 Tesla V100-PCIE... On | 00000000:3E:00.0 Off | 0 |
# | N/A 32C P0 24W / 250W | 0MiB / 8192MiB | 0% Default |
# +-------------------------------+----------------------+----------------------+
# 注意: 显示的最大显存为 8192MiB 而非完整的 32768MiB
# 4. 查看 GPU 利用率限制
nvidia-smi --query-gpu=utilization.gpu --format=csv
5.3 多 Pod 共享 GPU 示例
# 创建 4 个 Pod 共享同一张 GPU
---
apiVersion: v1
kind: Pod
metadata:
name: shared-gpu-pod-1
spec:
containers:
- name: cuda-container
image: nvidia/cuda:12.0.0-base-ubuntu22.04
command: ["python", "-c", "import time; time.sleep(3600)"]
resources:
limits:
nvidia.com/gpu: 1
nvidia.com/gpumem: 4096 # 每个 Pod 4GB
nvidia.com/gpucores: 25 # 每个 Pod 25% 算力
---
apiVersion: v1
kind: Pod
metadata:
name: shared-gpu-pod-2
spec:
containers:
- name: cuda-container
image: nvidia/cuda:12.0.0-base-ubuntu22.04
command: ["python", "-c", "import time; time.sleep(3600)"]
resources:
limits:
nvidia.com/gpu: 1
nvidia.com/gpumem: 4096
nvidia.com/gpucores: 25
---
apiVersion: v1
kind: Pod
metadata:
name: shared-gpu-pod-3
spec:
containers:
- name: cuda-container
image: nvidia/cuda:12.0.0-base-ubuntu22.04
command: ["python", "-c", "import time; time.sleep(3600)"]
resources:
limits:
nvidia.com/gpu: 1
nvidia.com/gpumem: 4096
nvidia.com/gpucores: 25
---
apiVersion: v1
kind: Pod
metadata:
name: shared-gpu-pod-4
spec:
containers:
- name: cuda-container
image: nvidia/cuda:12.0.0-base-ubuntu22.04
command: ["python", "-c", "import time; time.sleep(3600)"]
resources:
limits:
nvidia.com/gpu: 1
nvidia.com/gpumem: 4096
nvidia.com/gpucores: 25
# 部署所有 Pod
kubectl apply -f shared-gpu-pods.yaml
# 查看 Pod 状态
kubectl get pods | grep shared-gpu
# 验证 GPU 共享
kubectl exec -it shared-gpu-pod-1 -- nvidia-smi
kubectl exec -it shared-gpu-pod-2 -- nvidia-smi
5.4 实际工作负载示例
5.4.1 PyTorch 训练任务
apiVersion: v1
kind: Pod
metadata:
name: pytorch-training
spec:
containers:
- name: pytorch
image: pytorch/pytorch:2.1.0-cuda12.1-cudnn8-runtime
command: ["python", "-c"]
args:
- |
import torch
print(f"CUDA available: {torch.cuda.is_available()}")
print(f"GPU name: {torch.cuda.get_device_name(0)}")
print(f"GPU memory: {torch.cuda.get_device_properties(0).total_memory / 1024**3:.2f} GB")
# 简单测试
x = torch.randn(1000, 1000).cuda()
y = torch.randn(1000, 1000).cuda()
z = torch.matmul(x, y)
print(f"Matrix multiplication successful!")
import time
time.sleep(3600)
resources:
limits:
nvidia.com/gpu: 1
nvidia.com/gpumem: 8192
nvidia.com/gpucores: 50
env:
- name: NVIDIA_VISIBLE_DEVICES
value: all
- name: NVIDIA_DRIVER_CAPABILITIES
value: compute,utility
5.4.2 TensorFlow 推理服务
apiVersion: apps/v1
kind: Deployment
metadata:
name: tensorflow-serving
spec:
replicas: 2
selector:
matchLabels:
app: tf-serving
template:
metadata:
labels:
app: tf-serving
spec:
containers:
- name: tensorflow
image: tensorflow/serving:2.14.0-gpu
ports:
- containerPort: 8501
resources:
limits:
nvidia.com/gpu: 1
nvidia.com/gpumem: 4096
nvidia.com/gpucores: 30
env:
- name: MODEL_NAME
value: my_model
- name: NVIDIA_VISIBLE_DEVICES
value: all
5.4.3 Jupyter Notebook(教学环境)
apiVersion: v1
kind: Pod
metadata:
name: jupyter-gpu
spec:
containers:
- name: jupyter
image: jupyter/scipy-notebook:latest
ports:
- containerPort: 8888
command: ["start-notebook.sh"]
args: ["--NotebookApp.token=''", "--NotebookApp.password=''"]
resources:
limits:
nvidia.com/gpu: 1
nvidia.com/gpumem: 6144
nvidia.com/gpucores: 40
env:
- name: NVIDIA_VISIBLE_DEVICES
value: all
- name: NVIDIA_DRIVER_CAPABILITIES
value: compute,utility
---
apiVersion: v1
kind: Service
metadata:
name: jupyter-gpu
spec:
selector:
app: jupyter-gpu
ports:
- port: 8888
targetPort: 8888
nodePort: 30888
type: NodePort
6. 高级配置
6.1 GPU 类型选择
如果您的集群有多种 GPU 类型,可以通过节点标签选择:
# 为不同 GPU 类型打标签
kubectl label nodes <node-with-v100> gpu-type=v100
kubectl label nodes <node-with-a100> gpu-type=a100
# Pod 指定 GPU 类型
apiVersion: v1
kind: Pod
metadata:
name: gpu-pod-v100
spec:
containers:
- name: cuda-container
image: nvidia/cuda:12.0.0-base-ubuntu22.04
command: ["sleep", "3600"]
resources:
limits:
nvidia.com/gpu: 1
nvidia.com/gpumem: 8192
nodeSelector:
gpu-type: v100 # 指定使用 V100 GPU
6.2 MIG 模式支持
如果使用 NVIDIA A100/H100,可以启用 MIG(Multi-Instance GPU)模式:
# hami-values.yaml
nvidia:
migStrategy: single # 或 mixed
# 部署后,Pod 可以使用 MIG 设备
apiVersion: v1
kind: Pod
metadata:
name: mig-pod
spec:
containers:
- name: cuda-container
image: nvidia/cuda:12.0.0-base-ubuntu22.04
command: ["sleep", "3600"]
resources:
limits:
nvidia.com/mig-3g.20gb: 1 # 使用 3GB 显存的 MIG 设备
6.3 优先级和抢占
# 定义 PriorityClass
apiVersion: scheduling.k8s.io/v1
kind: PriorityClass
metadata:
name: high-priority-gpu
value: 1000
globalDefault: false
description: "高优先级 GPU 任务"
---
# 使用 PriorityClass 的 Pod
apiVersion: v1
kind: Pod
metadata:
name: high-priority-training
spec:
priorityClassName: high-priority-gpu
containers:
- name: cuda-container
image: nvidia/cuda:12.0.0-base-ubuntu22.04
command: ["sleep", "3600"]
resources:
limits:
nvidia.com/gpu: 1
nvidia.com/gpumem: 16384
6.4 资源配额限制
# 在命名空间级别限制 GPU 使用
apiVersion: v1
kind: ResourceQuota
metadata:
name: gpu-quota
namespace: edu-platform
spec:
hard:
limits.nvidia.com/gpu: 10 # 最多 10 个 vGPU
limits.nvidia.com/gpumem: 40960 # 最多 40GB 显存
6.5 容忍度和污点
# 为 GPU 节点设置污点
kubectl taint nodes <gpu-node> gpu=true:NoSchedule
# Pod 添加容忍度
apiVersion: v1
kind: Pod
metadata:
name: gpu-pod-with-toleration
spec:
containers:
- name: cuda-container
image: nvidia/cuda:12.0.0-base-ubuntu22.04
command: ["sleep", "3600"]
resources:
limits:
nvidia.com/gpu: 1
nvidia.com/gpumem: 8192
tolerations:
- key: "gpu"
operator: "Equal"
value: "true"
effect: "NoSchedule"
7. 运维与监控
7.1 查看 GPU 资源使用情况
# 1. 查看节点 GPU 资源
kubectl describe node <node-name> | grep -A 10 "Allocated resources"
# 2. 查看所有 Pod 的 GPU 使用
kubectl get pods --all-namespaces -o custom-columns=\
NAMESPACE:.metadata.namespace,\
NAME:.metadata.name,\
GPU:spec.containers[*].resources.limits.nvidia\.com/gpu,\
MEM:spec.containers[*].resources.limits.nvidia\.com/gpumem
# 3. 使用 kubectl top 查看实际使用(需要 metrics-server)
kubectl top pods -A | grep -E "NAMESPACE|gpu"
7.2 GPU 监控指标
# 1. 启用 HAMi metrics
helm upgrade hami hami-charts/hami \
--namespace kube-system \
--set scheduler.metrics.enabled=true \
--set scheduler.metrics.port=9395
# 2. 访问 metrics 端点
kubectl port-forward -n kube-system svc/hami-scheduler 9395:9395
curl http://localhost:9395/metrics
# 3. 集成 Prometheus
# prometheus-config.yaml
scrape_configs:
- job_name: 'hami'
static_configs:
- targets: ['hami-scheduler.kube-system:9395']
7.3 使用 DC-GM 监控(NVIDIA 官方工具)
# 部署 DCGM Exporter
helm repo add nvdp https://nvidia.github.io/k8s-device-plugin
helm install dcgm nvgp/dcgm-exporter \
--namespace kube-system
# 访问监控面板
kubectl port-forward -n kube-system svc/dcgm-exporter 9400:9400
curl http://localhost:9400/metrics
7.4 GPU 利用率报告
# 创建 GPU 使用情况报告脚本
cat > gpu-usage-report.sh << 'EOF'
#!/bin/bash
echo "===== GPU Resource Usage Report ====="
echo "Date: $(date)"
echo ""
echo "--- Node GPU Resources ---"
kubectl get nodes -l gpu=on -o custom-columns=\
NODE:.metadata.name,\
GPU_TOTAL:status.allocatable.nvidia\.com/gpu,\
GPU_USED:status.allocatable.nvidia\.com/gpu
echo ""
echo "--- Pod GPU Allocation ---"
kubectl get pods --all-namespaces -o custom-columns=\
NAMESPACE:.metadata.namespace,\
POD:.metadata.name,\
GPU:spec.containers[*].resources.limits.nvidia\.com/gpu,\
MEM_MB:spec.containers[*].resources.limits.nvidia\.com/gpumem \
--no-headers | grep -v "<none>"
echo ""
echo "--- GPU Node Details ---"
for node in $(kubectl get nodes -l gpu=on -o name); do
echo "Node: $node"
kubectl describe $node | grep -A 15 "Allocated resources"
echo ""
done
EOF
chmod +x gpu-usage-report.sh
./gpu-usage-report.sh
7.5 日志收集
# 1. 查看 HAMi 组件日志
kubectl logs -n kube-system -l app=hami-device-plugin --tail=100
kubectl logs -n kube-system -l app=hami-scheduler --tail=100
kubectl logs -n kube-system -l app=hami-webhook --tail=100
# 2. 查看 Pod GPU 初始化日志
kubectl logs <pod-name> | grep -i "hami\|vgpu\|gpu"
# 3. 收集故障诊断信息
kubectl describe pod <pod-name>
kubectl exec <pod-name> -- nvidia-smi
kubectl exec <pod-name> -- cat /var/lib/vgpu/log/libvgpu.log
8. 故障排查
8.1 常见问题
问题1:Pod 无法调度到 GPU 节点
# 症状
kubectl describe pod <pod-name>
# Events:
# Warning FailedScheduling pod has unbound immediate PersistentVolumeClaims
# 排查步骤
# 1. 检查节点标签
kubectl get nodes -l gpu=on
# 2. 检查 HAMi 组件状态
kubectl get pods -n kube-system | grep hami
# 3. 检查节点 GPU 资源
kubectl describe node <node-name> | grep nvidia
# 4. 查看调度器日志
kubectl logs -n kube-system -l app=hami-scheduler --tail=50
问题2:容器内看不到 GPU
# 症状
kubectl exec -it <pod-name> -- nvidia-smi
# NVIDIA-SMI has failed because it couldn't communicate with the NVIDIA driver
# 排查步骤
# 1. 确认 nvidia-container-toolkit 已安装
which nvidia-container-cli
# 2. 检查 containerd/Docker 配置
cat /etc/containerd/config.toml | grep nvidia
# 3. 重启 containerd
systemctl restart containerd
# 4. 测试容器 GPU 访问
ctr run --rm -t --gpus 0 docker.io/nvidia/cuda:12.0.0-base-ubuntu22.04 test nvidia-smi
问题3:显存限制不生效
# 症状
kubectl exec -it <pod-name> -- nvidia-smi
# 显示完整显存而非限制的显存
# 排查步骤
# 1. 确认 HAMi device plugin 正常运行
kubectl get pods -n kube-system | grep hami-device-plugin
# 2. 检查 Pod 资源配置
kubectl get pod <pod-name> -o yaml | grep -A 5 resources
# 3. 查看容器内 HAMi 日志
kubectl exec -it <pod-name> -- cat /var/lib/vgpu/log/libvgpu.log
# 4. 重新部署 Pod
kubectl delete pod <pod-name>
kubectl apply -f <pod-yaml>
问题4:GPU 算力限制不生效
# 症状
# Pod 可以使用 100% GPU 算力而非配置的限制
# 排查步骤
# 1. 确认使用了正确的资源名称
kubectl get pod <pod-name> -o yaml | grep gpucores
# 2. 检查 HAMi 版本(需要 v2.0+)
helm list -n kube-system | grep hami
# 3. 查看调度器日志
kubectl logs -n kube-system -l app=hami-scheduler | grep -i "core\|utilization"
8.2 调试命令速查
# 查看 GPU 设备插件发现的设备
kubectl exec -n kube-system <hami-device-plugin-pod> -- cat /var/lib/kubelet/device-plugins/hami.sock
# 手动触发设备插件重新发现
kubectl delete pod -n kube-system -l app=hami-device-plugin
# 查看调度器决策过程
kubectl logs -n kube-system -l app=hami-scheduler -f | grep -E "schedule|filter|prioritize"
# 检查 Webhook 是否注入
kubectl get pod <pod-name> -o yaml | grep -A 10 "annotations"
# 查看节点 GPU 拓扑
kubectl exec <pod-with-gpu> -- nvidia-smi topo -m
8.3 卸载 HAMi
# 1. 删除 Helm release
helm uninstall hami -n kube-system
# 2. 清理残留资源
kubectl delete mutatingwebhookconfiguration hami-webhook
kubectl delete clusterrolebinding hami-scheduler
kubectl delete serviceaccount hami-scheduler -n kube-system
# 3. 移除节点标签
kubectl label nodes <node-name> gpu-
# 4. 验证清理
kubectl get pods -n kube-system | grep hami # 应该为空
附录
A. 资源类型说明
| 资源名称 | 类型 | 说明 | 示例 |
|---|---|---|---|
nvidia.com/gpu |
int | vGPU 数量 | 1, 2, 3 |
nvidia.com/gpumem |
int (MiB) | 显存限制 | 4096 (4GB) |
nvidia.com/gpumem-percentage |
int (%) | 显存百分比 | 50 (50%) |
nvidia.com/gpucores |
int (%) | 算力限制 | 30 (30%) |
nvidia.com/gputype |
string | GPU 类型 | "V100", "A100" |
B. 镜像版本对照表
| CUDA 版本 | HAMi vGPU 镜像标签 | 适用场景 |
|---|---|---|
| CUDA 11.8 | cuda11.8 |
PyTorch 1.x, TensorFlow 2.10- |
| CUDA 12.0 | cuda12.0 |
PyTorch 2.0, TensorFlow 2.12+ |
| CUDA 12.1 | cuda12.1 |
PyTorch 2.1, 最新框架 |
| CUDA 12.2 | cuda12.2 |
推荐版本,最新稳定 |
C. 性能调优建议
显存分配策略
- 开发环境: 4-8GB/用户
- 推理服务: 2-4GB/实例
- 训练任务: 8-16GB/任务
算力分配策略
- 交互式任务 (Jupyter): 30-50%
- 批处理训练: 50-100%
- 推理服务: 20-40%
监控建议
- 启用 HAMi metrics
- 部署 DCGM Exporter
- 配置告警阈值(显存使用 > 90%)
最佳实践
- 为不同业务创建独立命名空间
- 使用 ResourceQuota 限制资源
- 定期清理未使用的 Pod
- 监控 GPU 温度和使用率
D. 常见问题 FAQ
Q: HAMi 与 NVIDIA Device Plugin 的区别?
A: NVIDIA Device Plugin 是一对一绑定(1 GPU = 1 Pod),HAMi 支持一对多共享(1 GPU = N Pods)。
Q: 是否支持 GPU 热迁移?
A: 目前不支持。GPU 设备与节点绑定,Pod 迁移需要重新调度。
Q: 性能损耗有多大?
A: 显存隔离几乎无损耗(< 2%),算力调度基于 Linux cgroups,损耗约 3-5%。
Q: 是否支持 MIG?
A: 支持。需要在配置中启用 migStrategy,且硬件支持(A100/H100)。
Q: 如何升级 HAMi?
A: 使用 helm upgrade 命令,建议先在测试环境验证。
技术支持: