生产服务

快速上手 的单进程演示收成可给多人用的服务:绑端口、切显存、多卡并行、认清鉴权边界。参数名以 vllm serve --help 为准。


推荐启动骨架

vllm serve Qwen/Qwen2.5-0.5B-Instruct \
  --host 0.0.0.0 \
  --port 8000 \
  --dtype auto \
  --gpu-memory-utilization 0.90 \
  --max-model-len 4096 \
  --max-num-seqs 64 \
  --api-key "$VLLM_API_KEY"
标志作用
--host / --port默认端口 8000;只本机调试用 127.0.0.1
--gpu-memory-utilization预留多少比例显存给引擎(含 KV 页)。过高易 OOM,过低吞吐差
--max-model-len上下文上限;越大 KV 越贵,并发越少
--max-num-seqs同时调度的序列数上限
--dtype auto按硬件与权重选 FP16/BF16 等
--download-dir自定义 Hub 缓存目录

生产环境用 systemd / k8s 管进程,不要依赖一个 SSH 终端。容器见 Docker


张量并行:--tensor-parallel-size

单卡放不下时,把一层里的矩阵切到多张 GPU(Megatron 风格张量并行)。常见写法:

vllm serve Qwen/Qwen2.5-0.5B-Instruct --tensor-parallel-size 2

-tp 是同一标志的短形式(若当前 CLI 仍提供)。约定:

  • 单机多卡: tp 常等于本机 GPU 数(或你愿意划给该副本的卡数)。
  • 卡必须同构、NVLink / PCIe 拓扑要能跑 NCCL。CUDA_VISIBLE_DEVICES=0,1 选出卡。
  • 还有 流水线并行 --pipeline-parallel-size、数据并行等。多机常用 Ray 或文档中的 --distributed-executor-backend。本课先掌握 tp

小模型(0.5B)不必 tp=2,那是为了演示语法。70B 满精度才需要按显存算卡数。


前缀缓存与吞吐旋钮

长系统提示重复出现时,可打开前缀缓存(标志多为 --enable-prefix-caching以当前文档为准),避免重复计算相同前缀的 KV。

观测:

  • 日志里的 KV 使用率、running / waiting 队列
  • nvidia-smi 的利用率与显存
  • 客户端 P50/P99 延迟与 tokens/s

连续批处理会让「单请求延迟」和「系统吞吐」不完全同向:队列越长,GPU 越满,队头等待也可能变长。用 --max-num-seqs 做限流。


鉴权:--api-key 不够当防火墙

--api-key / VLLM_API_KEY 只覆盖文档列出的路径前缀(通常包括 /v1)。同一 HTTP 服务器上可能仍有未鉴权或鉴权范围不同的端点。 官方明确警告:不要只靠这一项保护 vLLM。

建议:

  1. 默认绑内网或 localhost;公网前加 反向代理(TLS、IP 允许列表、独立鉴权)。
  2. 不要把 Hub Token、--api-key 写进镜像层或 Git。
  3. --host 0.0.0.0 只表示听所有网卡,不等于「已经安全」。

健康检查与客户端

负载均衡可打 GET /v1/models 或文档中的 health 路径(名称以当前版本为准)。应用侧用 OpenAI SDK,超时要覆盖 首 token 时间(排队 + 预填充),不要只按云厂商 30s 抄。

多副本时:每个进程一块(或一组 tp)GPU;前面用 nginx / 云 LB。不要多个无协调的进程抢同一张卡。


失败模式

现象处理方向
CUDA OOM--max-model-len--gpu-memory-utilization--max-num-seqs;或量化 / 加 tp
NCCL timeout查 GPU 直连、防火墙、是否混用 Docker 网络
首包极慢权重仍在载入或编译内核;预热发一条短请求
吞吐上不去并发不够、或 max-model-len 把 KV 占满只剩极少槽位

下一步

评论