HAMi - Kubernetes GPU 共享部署与使用手册

在线体验各类最新模型,更有模型 免费Token 额度领取!
立即体验
简介: HAMI

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. 性能调优建议

  1. 显存分配策略

    • 开发环境: 4-8GB/用户
    • 推理服务: 2-4GB/实例
    • 训练任务: 8-16GB/任务
  2. 算力分配策略

    • 交互式任务 (Jupyter): 30-50%
    • 批处理训练: 50-100%
    • 推理服务: 20-40%
  3. 监控建议

    • 启用 HAMi metrics
    • 部署 DCGM Exporter
    • 配置告警阈值(显存使用 > 90%)
  4. 最佳实践

    • 为不同业务创建独立命名空间
    • 使用 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 命令,建议先在测试环境验证。


技术支持:

相关文章
|
5天前
|
缓存 人工智能 安全
GPT-5.6 Terra与GPT-5.5性能实测:成本减半后的跑分对比与快速迁移指南
GPT-5.6 Terra 的定价为每百万 token 输入 2.50/输出 15。GPT-5.5 则是 5/ 30。Terra 的每一项费率,包括 $0.25/M 的缓存读取,都恰好是 GPT-5.5 的一半,因此在任何工作负载组合下,Terra 都固定 便宜 2.0x。以每天 10 万次请求、3K token 提示词计算,大约是 Terra 每天 2,000,GPT−5.5每天 4,000,即每月约 60,000对 120,000。问题在于:OpenAI 没有发布任何针对 Terra 的编码基准。那个著名的 91.9% Terminal-Bench 数字是 Sol 在 Ul
|
5天前
|
人工智能 缓存 JSON
刚刚 GPT-5.6 发布,吊打 Claude 5 和 Grok 4.5?一手实测来啦!
GPT-5.6 刚发布,跑分号称超越 Fable 5,真的假的?附一手实测,让 3 个最强 AI 编程模型 GPT-5.6 Sol、Claude Fable 5、Grok 4.5 在 Cursor 里同时一把梭开发网页游戏,看看最新模型到底谁更能打。
313 0
|
5天前
|
存储 人工智能 JSON
Qwen 本地部署搭配 ComfyUI 生成 AI 漫剧完整实操指南(小白零基础可落地,零成本无限生成+角色一致性天花板)
2026全网最优本地漫剧流水线:零成本、离线运行、角色统一、低配(8G显卡)可跑。融合Qwen本地大模型+ComfyUI双引擎,实现剧本生成→分镜绘图→动态成片全自动,隐私安全、无审核限流,新手30分钟上手,日更无忧。(239字)
|
28天前
|
Linux 程序员 数据格式
【2026最新】Notepad++下载、安装和使用一篇搞定(附中文版安装包)
Notepad++ 是一款免费开源、轻量高效的 Windows 文本编辑器,支持 C/Python/HTML 等 80+ 语言语法高亮、代码折叠、正则替换、编码转换及插件扩展,专为程序员与文本处理用户打造,完美替代系统记事本。(239字)
|
2天前
|
缓存 UED 开发者
Codex109天重置23次,明天还要再送一次
Codex近109天完成23次额度重置,7月14日将迎来第24次。Tibo高频响应用户反馈:优化GPT-5.6高消耗问题、补发失效福利、调整重置时间——形成“反馈→回应→修复→补偿”正向闭环,彰显以用户为中心的产品哲学。(239字)
423 11