实验 6: 在 HAMi GPU 分片上运行 vLLM 推理
本实验演示如何在一个已经具备 NVIDIA GPU 的 Kubernetes 集群中安装 HAMi,并用 HAMi 调度 vLLM 推理服务。完成后,你将得到一个 OpenAI-compatible 的模型服务,可以通过 /v1/models 和 /v1/chat/completions 验证。
本文使用一个阿里云 ACK GPU 集群作为参考环境,但步骤并不绑定 ACK。只要你的 Kubernetes 集群已经有可用 NVIDIA GPU、NVIDIA 驱动和容器运行时支持,就可以按同样方式复现;云厂商相关的 LoadBalancer 和 ALB Ingress 配置可以替换为你自己的暴露方式。
学习目标
- 检查已有 GPU Kubernetes 集群是否满足 HAMi 和 vLLM 的前提条件
- 安装 HAMi scheduler 和 device plugin
- 给 GPU 节点补充 HAMi DaemonSet 所需标签
- 用 HAMi 的
nvidia.com/gpu、nvidia.com/gpumem、nvidia.com/gpucores资源运行 vLLM - 通过公网 LoadBalancer 或端口转发测试 vLLM 的 OpenAI-compatible API
实验概览
部署架构
前提条件
你需要提前准备:
- 一个已经可用的 Kubernetes 集群
- 至少 1 个 NVIDIA GPU 节点;本文示例使用 3 个 NVIDIA A10 节点
kubectl已经连接到该集群helm3.x- GPU 节点已经安装 NVIDIA 驱动和容器运行时支持
- 集群可以拉取 vLLM 镜像和模型文件
本文的配置文件如下:
| 文件 | 用途 |
|---|---|
hami-values-ack.yaml | ACK 示例 HAMi values,使用 DaoCloud 镜像代理并匹配 ACK GPU 节点标签。 |
vllm-qwen25-7b.yaml | vLLM Deployment 和 vllm-qwen25-7b-engine-service ClusterIP Service。 |
vllm-public-service-aliyun.yaml | 阿里云公网 LoadBalancer Service 示例。 |
vllm-ingress-aliyun.yaml | 阿里云 ALB Ingress 示例。 |
如果你不是在 ACK 上运行,仍然可以使用
vllm-qwen25-7b.yaml。只需要把镜像、节点标签和服务暴露方式改成你的环境可用的配置。
示例集群状态
下面是本文验证时使用的 ACK 集群状态。这个集群位于 cn-hangzhou,有 3 个 GPU 节点,每个节点是 ecs.gn7i-c8g1.2xlarge,带 1 张 NVIDIA A10。
kubectl get nodes -o wide
NAME STATUS ROLES AGE VERSION INTERNAL-IP OS-IMAGE CONTAINER-RUNTIME
cn-hangzhou.10.10.1.73 Ready <none> 17h v1.36.1-aliyun.1 10.10.1.73 Alibaba Cloud Linux 3.2104 U13.1 (OpenAnolis Edition) containerd://1.6.28
cn-hangzhou.10.10.1.74 Ready <none> 17h v1.36.1-aliyun.1 10.10.1.74 Alibaba Cloud Linux 3.2104 U13.1 (OpenAnolis Edition) containerd://1.6.28
cn-hangzhou.10.10.1.75 Ready <none> 17h v1.36.1-aliyun.1 10.10.1.75 Alibaba Cloud Linux 3.2104 U13.1 (OpenAnolis Edition) containerd://1.6.28
检查 GPU 节点标签和 HAMi 暴露的 GPU 资源:
kubectl get nodes -L gpu,aliyun.accelerator/xpu_type \
-o 'custom-columns=NAME:.metadata.name,GPU_LABEL:.metadata.labels.gpu,XPU:.metadata.labels.aliyun\.accelerator/xpu_type,ALLOC_GPU:.status.allocatable.nvidia\.com/gpu'
NAME GPU_LABEL XPU ALLOC_GPU
cn-hangzhou.10.10.1.73 on nvidia 10
cn-hangzhou.10.10.1.74 on nvidia 10
cn-hangzhou.10.10.1.75 on nvidia 10
每个物理 A10 被 HAMi 注册为 10 个可调度 GPU 份额。这里的 nvidia.com/gpu: 10 表示这个节点最多可以分配 10 个 HAMi GPU 设备份额;每个工作负载真正能使用多少显存和算力,还要看它同时请求的 nvidia.com/gpumem 和 nvidia.com/gpucores。节点上还能看到云厂商提供的 GPU 标签:
aliyun.accelerator/nvidia_count=1
aliyun.accelerator/nvidia_mem=23028MiB
aliyun.accelerator/nvidia_name=NVIDIA-A10
aliyun.accelerator/xpu_type=nvidia
node.kubernetes.io/instance-type=ecs.gn7i-c8g1.2xlarge
NVIDIA A10 是 24 GB 级别的 GPU;在这个 ACK 集群里,节点标签上报的可用显存是 23028MiB 或 24564MiB,具体以节点标签和容器内 nvidia-smi 为准。
当前集群的关键 Helm release:
helm list -A
NAME NAMESPACE STATUS CHART
ack-nvidia-device-plugin kube-system deployed ack-nvidia-device-plugin-0.7.0
hami kube-system deployed hami-2.9.0
vllm vllm deployed vllm-stack-0.1.11
HAMi 组件状态:
kubectl get pods -n kube-system -l app.kubernetes.io/instance=hami -o wide
kubectl get ds hami-device-plugin -n kube-system -o wide
NAME READY STATUS NODE
hami-device-plugin-8jz8x 2/2 Running cn-hangzhou.10.10.1.73
hami-device-plugin-whtkm 2/2 Running cn-hangzhou.10.10.1.74
hami-device-plugin-9db54 2/2 Running cn-hangzhou.10.10.1.75
hami-scheduler-... 2/2 Running cn-hangzhou.10.10.1.75
NAME DESIRED CURRENT READY NODE SELECTOR
hami-device-plugin 3 3 3 aliyun.accelerator/xpu_type=nvidia,gpu=on
vLLM 运行状态:
kubectl get pods,svc,ingress -n vllm -o wide
NAME READY STATUS NODE
pod/vllm-qwen25-7b-deployment-...-g8gct 1/1 Running cn-hangzhou.10.10.1.73
pod/vllm-qwen25-7b-deployment-...-znpb5 1/1 Running cn-hangzhou.10.10.1.74
NAME TYPE EXTERNAL-IP PORT(S)
service/vllm-qwen25-7b-public LoadBalancer 120.27.251.192 80:30835/TCP
service/vllm-qwen25-7b-engine-service ClusterIP <none> 80/TCP
NAME CLASS HOSTS ADDRESS
ingress.networking.k8s.io/vllm-qwen25-7b alb llm.kubecon.ai alb-aqaj06ms8ogcxwg16o.cn-hangzhou.alb.aliyuncsslb.com
这套参考集群里已经运行的 vLLM 服务通过 vLLM Production Stack Helm chart 部署,并已显式使用 hami-scheduler、nvidia.com/gpumem: "22000" 和 nvidia.com/gpucores: "100"。下面 Lab 使用独立 manifest 部署同类服务,保留这些关键配置,方便你直接观察 HAMi 资源约束是否生效。
步骤 1: 检查 GPU 集群
先确认 Kubernetes 能看到 GPU 节点:
kubectl get nodes -o wide
kubectl describe node | grep -A8 -E "Capacity:|Allocatable:" | grep -E "nvidia.com/gpu|cpu:|memory:"
如果集群已经安装了云厂商的 NVIDIA device plugin,你可能已经能看到 nvidia.com/gpu。安装 HAMi 后,nvidia.com/gpu 会变成 HAMi 暴露的 vGPU 数量。
在 ACK 上,GPU 节点通常带有下面的 标签:
kubectl get nodes -L aliyun.accelerator/xpu_type,aliyun.accelerator/nvidia_name
NAME XPU NVIDIA_NAME
cn-hangzhou.10.10.1.73 nvidia NVIDIA-A10
HAMi 的 device plugin 默认还会匹配 gpu=on,所以先给 GPU 节点补标签:
kubectl label nodes \
-l aliyun.accelerator/xpu_type=nvidia \
gpu=on \
--overwrite
非 ACK 环境请把 label selector 换成你的 GPU 节点标签,例如:
kubectl label node <gpu-node-name> gpu=on --overwrite
步骤 2: 安装 HAMi
添加 HAMi Helm repo:
helm repo add hami https://Project-HAMi.github.io/HAMi
helm repo update hami
ACK 示例使用 hami-values-ack.yaml:
device:
nvidia:
driver:
enabled: false
global:
managedNodeSelectorEnable: true
managedNodeSelector:
gpu: "on"
devicePlugin:
deviceSplitCount: 10
image:
registry: docker.m.daocloud.io
repository: projecthami/hami
关键配置说明:
| 配置 | 说明 |
|---|---|
device.nvidia.driver.enabled: false | ACK GPU 节点已经有 NVIDIA 驱动,不需要 HAMi 再安装驱动。 |
global.managedNodeSelectorEnable: true | 给 HAMi device plugin DaemonSet 加节点选择器。 |
global.managedNodeSelector.gpu: "on" | 只把 HAMi device plugin 调度到打了 gpu=on 的 GPU 节点。 |
devicePlugin.deviceSplitCount: 10 | 每张物理 GPU 注册为 10 个 vGPU。 |
scheduler.leaderElect: false |