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@4systemctl 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