从云原生走向 AI 原生:一套面向未来的架构方法论 → 阅读《AI 原生基础设施》

快速开始

已发行

本章将带你完成 HAMi 的完整部署流程,从安装到运行第一个 AI 应用,约需要 30 分钟。

安装 HAMi

1. 添加 Helm 仓库

# 添加 HAMi Helm 仓库
helm repo add hami-charts https://project-hami.github.io/hami-charts
helm repo update

# 查看可用的 Chart 版本
helm search repo hami-charts/hami

2. 创建命名空间

# 创建 HAMi 命名空间
kubectl create namespace hami-system

# 验证命名空间创建成功
kubectl get namespace hami-system

3. 安装 HAMi

# 使用默认配置安装
helm install hami hami-charts/hami -n hami-system

# 查看安装状态
kubectl get pods -n hami-system

预期输出:

NAME                                       READY   STATUS    RESTARTS   AGE
hami-device-plugin-nvidia-xxxxx            1/1     Running   0          2m
hami-scheduler-xxxxxxxxx-xxxxx             1/1     Running   0          2m
hami-vgpu-monitor-nvidia-xxxxx             1/1     Running   0          2m

4. 验证安装

# 检查所有组件是否正常运行
kubectl get pods -n hami-system

# 检查 HAMi Scheduler 服务
kubectl get svc -n hami-system

# 查看安装日志
kubectl logs -n hami-system -l app=hami-scheduler --tail=50

5. 检查 GPU 资源

安装成功后,GPU 节点应该注册了 HAMi 的资源:

# 查看节点上的 HAMi GPU 资源
kubectl describe node <gpu-node> | grep hami.io

预期输出:

Capacity:
  hami.io/gpu-memory: 16250
  nvidia.com/gpu: 100
Allocatable:
  hami.io/gpu-memory: 16250
  nvidia.com/gpu: 100

运行第一个 vGPU 应用

示例 1:简单的 CUDA 应用

创建一个使用 vGPU 的简单 CUDA 应用:

# cuda-vector-add.yaml
apiVersion: v1
kind: Pod
metadata:
  name: cuda-vector-add
spec:
  containers:
  - name: cuda-vector-add
    image: nvidia/cuda:12.2-base-ubuntu22.04
    command: ["sh", "-c"]
    args:
      - |
        apt-get update && \
        apt-get install -y cuda-samples-12-2 && \
        cuda-install-samples-12.2.sh --sbin=/usr/local/cuda/bin && \
        /usr/local/cuda/samples/1_Utilities/vectorAdd/vectorAdd
    resources:
      limits:
        # 使用 4 个 GPU 设备
        nvidia.com/gpu: 4
        # 4GB 显存
        nvidia.com/gpumem: 4000
    volumeMounts:
    - name: cuda-libs
      mountPath: /usr/local/cuda
  volumes:
  - name: cuda-libs
    emptyDir: {}
  restartPolicy: OnFailure

部署应用:

# 部署 Pod
kubectl apply -f cuda-vector-add.yaml

# 查看 Pod 状态
kubectl get pod cuda-vector-add

# 查看 Pod 日志
kubectl logs cuda-vector-add

预期输出:

[Vector addition of 50000 elements]
Copy input data from the host to the CUDA device
CUDA kernel launch with 196 blocks of 256 threads
Copy output data from the CUDA device to the host
Test PASSED

示例 2:TensorFlow 推理服务

创建一个 TensorFlow 推理服务:

# tf-inference.yaml
apiVersion: v1
kind: Pod
metadata:
  name: tf-inference
spec:
  containers:
  - name: tensorflow
    image: tensorflow/tensorflow:2.14.0-gpu
    command: ["python"]
    args:
      - |
        -c
        - |
          import tensorflow as tf
          print(f"TensorFlow Version: {tf.__version__}")
          print(f"GPUs Available: {len(tf.config.list_physical_devices('GPU'))}")
          # 创建简单的计算图
          a = tf.constant([[1.0, 2.0], [3.0, 4.0]])
          b = tf.constant([[5.0, 6.0], [7.0, 8.0]])
          c = tf.matmul(a, b)
          print(f"Result:\n{c.numpy()}")
    resources:
      limits:
        # 使用 3 个 GPU 设备
        nvidia.com/gpu: 3
        # 8GB 显存
        nvidia.com/gpumem: 8000
  restartPolicy: OnFailure

部署应用:

# 部署 Pod
kubectl apply -f tf-inference.yaml

# 查看 Pod 状态
kubectl get pod tf-inference

# 查看 Pod 日志
kubectl logs tf-inference

示例 3:多个 Pod 共享 GPU

创建三个共享同一 GPU 的 Pod:

# gpu-shared-apps.yaml
apiVersion: v1
kind: Pod
metadata:
  name: gpu-app-1
spec:
  containers:
  - name: app
    image: nvidia/cuda:12.2-base-ubuntu22.04
    command: ["nvidia-smi"]
    resources:
      limits:
        nvidia.com/gpu: 1        # 使用 1 个 GPU
        nvidia.com/gpumem: 4000  # 4GB 显存
  restartPolicy: Never

---
apiVersion: v1
kind: Pod
metadata:
  name: gpu-app-2
spec:
  containers:
  - name: app
    image: nvidia/cuda:12.2-base-ubuntu22.04
    command: ["nvidia-smi"]
    resources:
      limits:
        nvidia.com/gpu: 1        # 使用 1 个 GPU
        nvidia.com/gpumem: 4000  # 4GB 显存
  restartPolicy: Never

---
apiVersion: v1
kind: Pod
metadata:
  name: gpu-app-3
spec:
  containers:
  - name: app
    image: nvidia/cuda:12.2-base-ubuntu22.04
    command: ["nvidia-smi"]
    resources:
      limits:
        nvidia.com/gpu: 1        # 使用 1 个 GPU
        nvidia.com/gpumem: 4000  # 4GB 显存
  restartPolicy: Never

部署应用:

# 部署所有 Pod
kubectl apply -f gpu-shared-apps.yaml

# 查看所有 Pod 状态
kubectl get pods gpu-app-1 gpu-app-2 gpu-app-3

# 查看调度情况
kubectl describe pod gpu-app-1 | grep "Node:"

验证三个 Pod 都运行在同一个 GPU 节点上。3 个 Pod 各请求 1 个 GPU 和 4000MB 显存,只要节点有 1 张 12GB 以上的 GPU,就可以共享同一张物理 GPU。

监控 vGPU 使用情况

1. 查看 vGPU Monitor 指标

HAMi 提供了 Prometheus 指标:

# 端口转发到本地
kubectl port-forward -n hami-system svc/hami-vgpu-monitor-nvidia-service 41991:41991

# 访问指标
curl http://localhost:41991/metrics | grep vgpu

2. 使用 kubectl 插件查看资源使用

# 查看 Pod 的 GPU 使用情况
kubectl top pod gpu-app-1 --containers

# 查看节点的 GPU 使用情况
kubectl top node <gpu-node>

3. 查看 vGPU 分配情况

# 查看所有使用 GPU 的 Pod
kubectl get pods -A -o json | \
  jq '.items[] | select(.spec.containers[].resources.limits["nvidia.com/gpu"]) | \
  {name: .metadata.name, namespace: .metadata.namespace, gpu: .spec.containers[].resources.limits["nvidia.com/gpu"]}'

常见部署问题

问题 1:Pod 处于 Pending 状态

现象:

kubectl get pod cuda-vector-add
# NAME               READY   STATUS    RESTARTS   AGE
# cuda-vector-add    0/1     Pending   0          5m

排查:

# 查看 Pod 事件
kubectl describe pod cuda-vector-add

# 常见原因:
# 1. 资源不足
# 2. 调度器未就绪
# 3. 节点选择器不匹配

解决:

# 检查 HAMi Scheduler 是否运行
kubectl get pods -n hami-system | grep scheduler

# 检查节点资源
kubectl describe node <gpu-node> | grep hami.io

问题 2:Pod 启动失败

现象:

kubectl get pod cuda-vector-add
# NAME               READY   STATUS             RESTARTS   AGE
# cuda-vector-add    0/1     CrashLoopBackOff   5          10m

排查:

# 查看 Pod 日志
kubectl logs cuda-vector-add

# 查看 Device Plugin 日志
kubectl logs -n hami-system -l app=hami-device-plugin --tail=50

问题 3:GPU 资源未注册

现象:节点没有 hami.io 资源

排查:

# 检查 Device Plugin Pod
kubectl get pods -n hami-system | grep device-plugin

# 查看 Device Plugin 日志
kubectl logs -n hami-system -l app=hami-device-plugin

解决:

# 重启 Device Plugin
kubectl delete pod -n hami-system -l app=hami-device-plugin

卸载 HAMi

如果需要卸载 HAMi:

# 删除所有使用 HAMi 的 Pod
kubectl delete pods -A -l nvidia.com/gpu

# 卸载 Helm Chart
helm uninstall hami -n hami-system

# 删除命名空间
kubectl delete namespace hami-system

# 删除 Helm 仓库
helm repo remove hami-charts

小结

本章完成了 HAMi 的快速部署:

  1. 使用 Helm 安装 Hami
  2. 部署了三个示例应用
    • CUDA 向量加法
    • TensorFlow 推理
    • 多 Pod 共享 GPU
  3. 学习了监控和故障排查方法

现在你已经成功运行了第一个 vGPU 应用!在下一部分,我们将深入学习 HAMi 的核心概念和工作原理。

参考资料

创建于 2026/01/26 更新于 2026/01/26 1361 字 阅读约 3 分钟