GPUStack 异构 GPU 集群管理实战:统一调度 NVIDIA/AMD/昇腾
介绍开源 GPU 集群管理器 GPUStack 的架构与核心功能,详解在混合 NVIDIA、AMD ROCm、华为昇腾 GPU 环境下统一部署 LLM 推理服务,以及显存感知调度、多节点推理与 OpenAI 兼容 API 实践。
AI 基础设施的现实场景远比理想复杂:一批 NVIDIA H100 节点、几台 AMD MI300X 开发机、若干华为昇腾 910B 服务器,甚至还有 Apple Silicon MacBook——这些异构设备如何统一纳管,统一跑 LLM 推理?
GPUStack 是一个专为大语言模型设计的开源 GPU 集群管理器,支持 NVIDIA、AMD、Intel 以及 Apple Silicon 等异构 GPU,兼容 macOS、Windows 和 Linux,提供 OpenAI 兼容 API、显存感知调度和多节点推理能力。
GPUStack 核心能力
| 能力 | 描述 |
|---|---|
| 异构 GPU 支持 | NVIDIA CUDA、AMD ROCm、Intel OneAPI、Apple Metal、CPU 推理 |
| 显存感知调度 | 根据模型大小自动选择有足够显存的 GPU 节点 |
| 跨节点推理 | 单模型跨多台机器分布式推理(类似 Tensor Parallel) |
| OpenAI 兼容 API | 直接替换 OpenAI SDK 的 base_url |
| 多模型并发 | 同一集群同时运行多个不同模型 |
| 推理引擎灵活 | 内置 llama.cpp、vLLM、MindIE 等多引擎支持 |
| Web UI | 内置管理界面,查看节点/GPU/模型/请求状态 |
安装 GPUStack
单节点快速安装(Linux/macOS)
# Linux(NVIDIA GPU)
curl -sfL https://get.gpustack.ai | sh -s -
# macOS(Apple Silicon)
curl -sfL https://get.gpustack.ai | sh -s -
# 检查服务状态
gpustack status
# 访问 Web UI:http://localhost:80
多节点集群部署
Server 节点(管理节点):
# 安装 Server 并开启集群模式
curl -sfL https://get.gpustack.ai | sh -s - --server-port 8080
# 获取 Worker 加入令牌
gpustack token
Worker 节点(GPU 工作节点):
# NVIDIA GPU Worker
curl -sfL https://get.gpustack.ai | sh -s - \
--server-url http://<server-ip>:8080 \
--token <token-from-server>
# AMD ROCm Worker(安装了 ROCm 7 的节点)
curl -sfL https://get.gpustack.ai | sh -s - \
--server-url http://<server-ip>:8080 \
--token <token-from-server>
# 昇腾 NPU Worker(需先安装 CANN)
curl -sfL https://get.gpustack.ai | sh -s - \
--server-url http://<server-ip>:8080 \
--token <token-from-server> \
--worker-npu-type=ascend
Docker Compose 部署(开发/测试环境)
# docker-compose.yml
version: "3.8"
services:
gpustack:
image: gpustack/gpustack:latest
ports:
- "80:80"
- "10150:10150" # Worker 注册端口
volumes:
- gpustack_data:/var/lib/gpustack
- /tmp/cache:/root/.cache
environment:
- GPUSTACK_DATA_DIR=/var/lib/gpustack
deploy:
resources:
reservations:
devices:
- driver: nvidia
count: all
capabilities: [gpu]
restart: unless-stopped
volumes:
gpustack_data:
集群初始化与节点管理
安装完成后通过 Web UI(默认 http://<server-ip>:80)或 CLI 进行管理:
# 查看集群节点列表
gpustack get nodes
# 输出示例:
# NAME STATUS GPU VRAM ALLOCATED
# h100-node-01 Ready NVIDIA H100 80GB (x4) 320GB 128GB
# mi300x-01 Ready AMD Instinct MI300X (x2) 384GB 0GB
# 910b-node-01 Ready Ascend 910B (x8) 512GB 256GB
# macbook-01 Ready Apple M3 Max (shared) 48GB 12GB
# 查看 GPU 详情
gpustack get nodes h100-node-01 -o yaml
部署 LLM 模型
通过 Web UI 部署
在 Web UI 中选择「Models」→「Add Model」,支持从 HuggingFace、ModelScope 或本地路径加载模型。
通过 CLI 部署
# 部署 Qwen3-7B(自动选择有足够显存的节点)
gpustack apply -f - << 'EOF'
apiVersion: model.gpustack.ai/v1
kind: Model
metadata:
name: qwen3-7b
spec:
source: modelscope
modelID: qwen/Qwen3-7B-Instruct
backendType: vllm
# 显存感知调度:自动找有 ≥20GB 显存的 GPU
resourceClaim:
vram: 20Gi
backendParameters:
- --dtype=fp16
- --max-model-len=8192
- --enable-prefix-caching
EOF
# 部署大模型(跨节点多 GPU)
gpustack apply -f - << 'EOF'
apiVersion: model.gpustack.ai/v1
kind: Model
metadata:
name: llama4-maverick-400b
spec:
source: huggingface
modelID: meta-llama/Llama-4-Maverick-400B-Instruct
backendType: vllm
# 跨 2 台 H100 节点,每节点 4 卡,共 8 卡
resourceClaim:
vram: 640Gi
tensorParallel: 8
pipelineParallel: 2
backendParameters:
- --dtype=fp8
- --max-model-len=65536
EOF
查看模型状态
gpustack get models
# NAME STATUS BACKEND NODE VRAM
# qwen3-7b Running vllm h100-node-01 18GB
# llama4-maverick Running vllm h100-node-01,02 620GB
# qwen3-32b-gguf Running llama.cpp macbook-01 24GB(苹果统一内存)
异构调度策略
GPUStack 的显存感知调度器会根据以下维度选择节点:
- 显存需求:模型大小决定最低显存要求
- GPU 类型优先级:可配置 NVIDIA > AMD > 昇腾 > CPU
- 节点负载:优先调度到空闲 GPU 资源多的节点
- 引擎兼容性:vLLM 不支持 GGUF,llama.cpp 不需要 CUDA
# 指定 GPU 类型(在需要特定硬件时使用)
spec:
resourceClaim:
gpuType: nvidia # nvidia | amd | ascend | apple | cpu
vram: 40Gi
昇腾 NPU 专用配置
spec:
backendType: mindie # 昇腾推荐使用 MindIE 后端
resourceClaim:
gpuType: ascend
vram: 64Gi
backendParameters:
- --npu-count=4
- --model-format=mindir # 昇腾优化格式
OpenAI 兼容 API 使用
GPUStack 暴露与 OpenAI API 完全兼容的接口:
from openai import OpenAI
# 只需修改 base_url,其他代码不变
client = OpenAI(
api_key="your-gpustack-api-key",
base_url="http://<gpustack-server>:80/v1"
)
# 聊天补全
response = client.chat.completions.create(
model="qwen3-7b", # 使用 GPUStack 中的模型名称
messages=[
{"role": "user", "content": "解释 GPU 显存分层架构"}
],
temperature=0.7,
max_tokens=1024
)
print(response.choices[0].message.content)
# 流式输出
stream = client.chat.completions.create(
model="qwen3-7b",
messages=[{"role": "user", "content": "写一个 Python 快速排序"}],
stream=True
)
for chunk in stream:
if chunk.choices[0].delta.content:
print(chunk.choices[0].delta.content, end="", flush=True)
监控与运维
内置监控
GPUStack Web UI 提供实时监控:
- 各节点 GPU 利用率、显存使用、温度
- 各模型的 QPS、延迟、并发请求数
- 请求日志与错误统计
Prometheus 集成
# GPUStack 暴露 /metrics 端点
curl http://<gpustack-server>:80/metrics | grep gpustack
# 关键指标
# gpustack_model_request_total{model="qwen3-7b", status="success"}
# gpustack_model_request_duration_seconds{model="qwen3-7b", quantile="0.99"}
# gpustack_gpu_memory_used_bytes{node="h100-node-01", gpu="0"}
# gpustack_gpu_utilization_percent{node="h100-node-01", gpu="0"}
典型场景:模型灰度切换
利用 GPUStack 的多版本模型支持做模型灰度升级:
# 部署新版本模型
gpustack apply -f qwen3-32b-v2.yaml
# 等待新版本 Running
gpustack get models
# 切换流量(修改路由权重)
gpustack patch model qwen3-32b-prod \
--set spec.trafficWeight.v1=20 \
--set spec.trafficWeight.v2=80
# 确认稳定后全量切换
gpustack patch model qwen3-32b-prod \
--set spec.trafficWeight.v1=0 \
--set spec.trafficWeight.v2=100
# 删除旧版本
gpustack delete model qwen3-32b-v1
与 Kubernetes 集成
GPUStack 可以作为 Kubernetes 中的 GPU 调度层,通过 Helm 部署到 K8s 集群:
helm repo add gpustack https://gpustack.github.io/helm-charts
helm upgrade --install gpustack gpustack/gpustack \
--namespace gpustack \
--create-namespace \
--set server.ingress.enabled=true \
--set server.ingress.host=gpustack.company.internal
小结
GPUStack 解决了异构 GPU 集群的核心痛点:统一 API 层屏蔽硬件差异、显存感知调度避免 OOM、跨节点推理支持大模型。对于同时持有 NVIDIA、AMD 和国产 GPU 的团队,GPUStack 是比分别维护多套推理服务更高效的方案。其 OpenAI 兼容 API 使得业务代码几乎零改造即可切换底层硬件。
