技术博客

GPUStack 异构 GPU 集群管理实战:统一调度 NVIDIA/AMD/昇腾

介绍开源 GPU 集群管理器 GPUStack 的架构与核心功能,详解在混合 NVIDIA、AMD ROCm、华为昇腾 GPU 环境下统一部署 LLM 推理服务,以及显存感知调度、多节点推理与 OpenAI 兼容 API 实践。

GPUStack异构GPUNVIDIAAMD昇腾LLM调度

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 的显存感知调度器会根据以下维度选择节点:

  1. 显存需求:模型大小决定最低显存要求
  2. GPU 类型优先级:可配置 NVIDIA > AMD > 昇腾 > CPU
  3. 节点负载:优先调度到空闲 GPU 资源多的节点
  4. 引擎兼容性: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 提供实时监控:

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 使得业务代码几乎零改造即可切换底层硬件。