GPU Compute Plans
04 场景演算S0 production plan

03 · M2 机器 · 中型主力

03 · M2 机器 · 中型主力

定位

跑高性价比中型模型,做主流客户请求承接

  • 单机 8×5090
  • 目标:4 副本 × Qwen2.5-14B AWQ TP=2,主流对话最赚钱
  • 定价:¥0.8/M in / ¥3/M out(对齐 DeepSeek 官方价 -20%)

部署方案:4 副本 × Qwen2.5-14B AWQ TP=2

为什么这个组合

  • 14B 是主流 API 最活跃档位(客服/助手/RAG 都在用)
  • AWQ INT4 精度损失小,稳定成熟
  • TP=2 平衡显存和通信开销
  • 4 副本 = 客户端看到 4 倍并发能力

启动 4 副本

副本 A(GPU 0-1,端口 8001):

CUDA_VISIBLE_DEVICES=0,1 python -m vllm.entrypoints.openai.api_server \
  --model /models/Qwen2.5-14B-Instruct-AWQ \
  --served-model-name qwen2.5-14b-a \
  --tensor-parallel-size 2 \
  --quantization awq \
  --max-model-len 16384 \
  --gpu-memory-utilization 0.88 \
  --enable-prefix-caching \
  --max-num-seqs 128 \
  --port 8001

副本 B(GPU 2-3,端口 8002):同上,GPU 换成 2,3

副本 C(GPU 4-5,端口 8003):同上,GPU 换成 4,5

副本 D(GPU 6-7,端口 8004):同上,GPU 换成 6,7

网关路由

Nginx / Envoy 层做 round-robin:

  • 客户请求 qwen2.5-14b → 网关随机路由到 8001-8004
  • 使用 sticky session(同 client_id 尽量走同副本)→ prefix cache 命中率高

性能预估

单副本(TP=2 AWQ)

  • TTFT p99:< 400ms(4K prompt)
  • 单卡 TPS:~200 tok/s(AWQ INT4)
  • 副本 TPS:~400 tok/s
  • 并发:稳定 60-100

M2 整机

  • 4 副本合计 TPS:~1600 tok/s
  • 月理论满载:42 亿 output tokens
  • 按 ¥3/M output → 1.26 万/月
  • 加 input:总营收约 2.2-2.9 万/月

备选:8 副本 × Qwen2.5-7B AWQ 单卡

如果客户特别多但需求都是小请求(客服机器人、意图分类),可以拆成 8 个独立单卡副本:

# 副本 1(GPU 0,端口 8001)
CUDA_VISIBLE_DEVICES=0 python -m vllm.entrypoints.openai.api_server \
  --model /models/Qwen2.5-7B-Instruct-AWQ \
  --served-model-name qwen2.5-7b \
  --tensor-parallel-size 1 \
  --quantization awq \
  --max-model-len 8192 \
  --gpu-memory-utilization 0.85 \
  --enable-prefix-caching \
  --max-num-seqs 256 \
  --port 8001

# 副本 2 GPU 1 端口 8002,以此类推 8 副本

性能

  • 每卡 ~300 tok/s,8 卡合计 ~2400 tok/s
  • 月理论:62 亿 tokens,¥2/M 均价 → 1.24 万/月

建议:M2 主推 4 × 14B AWQ,客户增长后再决定拆成 8 × 7B。

GLM-4-9B 补位(可选)

如果客户里有对 GLM 生态有偏好的(学术/研究团队),M2 可以留 2 卡跑 GLM-4-9B:

CUDA_VISIBLE_DEVICES=6,7 python -m vllm.entrypoints.openai.api_server \
  --model /models/glm-4-9b-chat \
  --served-model-name glm-4-9b \
  --tensor-parallel-size 2 \
  --dtype float16 \
  --max-model-len 32768 \
  --gpu-memory-utilization 0.88 \
  --enable-prefix-caching \
  --trust-remote-code \
  --port 8005

组合:3 副本 14B AWQ + 1 副本 GLM-4-9B。

systemd 编排

因为 M2 有 4 个 vLLM 副本,写一个统一的 vllm-m2@.service template:

/etc/systemd/system/vllm-m2@.service

[Unit]
Description=vLLM M2 Replica %i
After=network.target

[Service]
Type=simple
User=ubuntu
Environment="CUDA_VISIBLE_DEVICES=%i_GPU"  # 用启动脚本替换
Environment="PORT=%i_PORT"
ExecStart=/opt/vllm-m2-launch.sh %i
Restart=on-failure
RestartSec=30

[Install]
WantedBy=multi-user.target

/opt/vllm-m2-launch.sh

#!/bin/bash
REPLICA=$1
declare -A GPU_MAP=([1]="0,1" [2]="2,3" [3]="4,5" [4]="6,7")
declare -A PORT_MAP=([1]="8001" [2]="8002" [3]="8003" [4]="8004")

CUDA_VISIBLE_DEVICES=${GPU_MAP[$REPLICA]} \
  /home/ubuntu/miniconda3/envs/vllm/bin/python -m vllm.entrypoints.openai.api_server \
  --model /models/Qwen2.5-14B-Instruct-AWQ \
  --served-model-name qwen2.5-14b \
  --tensor-parallel-size 2 \
  --quantization awq \
  --max-model-len 16384 \
  --enable-prefix-caching \
  --port ${PORT_MAP[$REPLICA]}

启动全部:

  • systemctl enable vllm-m2@1 vllm-m2@2 vllm-m2@3 vllm-m2@4
  • systemctl start vllm-m2@1 vllm-m2@2 vllm-m2@3 vllm-m2@4

Nginx 负载均衡

/etc/nginx/conf.d/qwen14b.conf

upstream qwen14b_backend {
    least_conn;  # 或 hash $remote_addr consistent
    server M2-IP:8001;
    server M2-IP:8002;
    server M2-IP:8003;
    server M2-IP:8004;
}

server {
    listen 8010;
    location /v1/chat/completions {
        proxy_pass http://qwen14b_backend;
        proxy_read_timeout 300s;
        proxy_buffering off;   # SSE streaming 关键
    }
}

监控 & 告警

  • 4 副本各自 /metrics
  • Prometheus scrape 全部端口
  • 告警:任一副本 down 立刻通知
  • 若任一副本 down,网关自动摘除(Nginx health check)

推荐

8 周 MVP:4 副本 × Qwen2.5-14B AWQ + 网关负载均衡 → 稳定压舱石

验证客户后

  • 客户主要用 short prompt → 拆成 8 × 7B
  • 客户主要用 long prompt → 保持 14B,加 KV cache prefetch
  • 出现代码需求高 → 挪 1 副本给 Qwen2.5-Coder-14B

On this page