vLLM 是一款高性能的大语言模型推理框架,以高吞吐量、低延迟和显存高效利用为核心优势。在生产环境部署 vLLM 需兼顾稳定性、可扩展性、监控运维和性能优化,以下是完整的部署方案。
一、部署前准备
1. 环境要求
| 组件 | 推荐版本 | 说明 |
|---|---|---|
| 操作系统 | Ubuntu 20.04+/CentOS 8+ | 推荐 Linux,需支持 CUDA(GPU 部署) |
| Python | 3.8~3.11 | 3.12 + 可能存在依赖兼容问题 |
| CUDA | 11.8+/12.1+ | GPU 部署核心依赖,需匹配显卡驱动(驱动版本≥CUDA 要求的最低版本) |
| 显卡 | NVIDIA A10/A100/V100/T4 | 显存≥16GB(7B 模型),≥32GB(13B),≥80GB(70B);支持多卡 / 多机扩展 |
| 内存 | ≥64GB | CPU 推理 / 数据预处理需更大内存 |
| 网络 | 千兆网卡(单机)/InfiniBand(多机) | 多机部署需高带宽低延迟网络 |
2. 依赖安装
(1)基础依赖
bash
# 更新系统依赖
sudo apt update && sudo apt install -y build-essential git libaio-dev
# 安装Python依赖
pip install --upgrade pip
pip install vllm # 核心包(自动适配CUDA,也可指定版本:vllm==0.4.0)
# 可选:如需量化/自定义算子
pip install vllm[quantization] # 支持AWQ/GPTQ量化
(2)CUDA 环境验证
bash
# 验证CUDA是否可用
python -c "import torch; print(torch.cuda.is_available())" # 输出True则正常
# 验证vLLM CUDA编译
python -c "from vllm import LLM; print('vLLM installed successfully')"
3. 模型准备
- 模型来源:Hugging Face Hub(如 Llama 2、Qwen、Baichuan)、本地模型文件;
- 量化优化:生产环境优先使用量化模型(如 AWQ/GPTQ 4bit/8bit),降低显存占用;
- 模型转换:若模型格式不兼容,需先转换为 HF 格式(vLLM 原生支持 HF 格式)。
示例:下载 Llama 2 7B AWQ 量化模型
bash
git lfs install
git clone https://huggingface.co/TheBloke/Llama-2-7B-Chat-AWQ
二、核心部署方式
vLLM 支持多种部署模式,生产环境推荐API 服务部署(最通用),可选多卡 / 多机扩展或K8s 容器化部署。
方式 1:单机 API 服务部署(基础版)
vLLM 内置 OpenAI 兼容的 API 服务器,可直接启动,适配多数生产场景。
(1)启动命令
bash
# 基础启动(7B模型,单卡)
python -m vllm.entrypoints.openai.api_server \
--model /path/to/your/model \ # 模型本地路径/HF Hub名称
--host 0.0.0.0 \ # 监听所有网卡
--port 8000 \ # API端口
--gpu-memory-utilization 0.9 \ # 显存利用率(0~1,建议0.8~0.9)
--max-num-batched-tokens 4096 \# 批处理最大token数(根据显存调整)
--quantization awq \ # 可选:awq/gptq/none(量化方式)
--enforce-eager \ # 可选:禁用torch.compile,提升稳定性
--served-model-name my-llm # 自定义模型名称(API调用时使用)
# 进阶:多卡部署(70B模型,4卡)
python -m vllm.entrypoints.openai.api_server \
--model /path/to/70B-model \
--tensor-parallel-size 4 \ # 张量并行数(等于显卡数)
--gpu-memory-utilization 0.85 \
--max-num-batched-tokens 8192 \
--host 0.0.0.0 \
--port 8000
(2)API 调用示例
兼容 OpenAI 接口,支持chat/completions和completions:
python
import openai
# 配置客户端
client = openai.OpenAI(
base_url="http://localhost:8000/v1",
api_key="dummy-key" # vLLM无需真实API Key,填任意值
)
# 调用聊天接口
response = client.chat.completions.create(
model="my-llm", # 对应启动时的--served-model-name
messages=[
{"role": "system", "content": "你是一个智能助手"},
{"role": "user", "content": "介绍一下vLLM的优势"}
],
max_tokens=512,
temperature=0.7
)
print(response.choices[0].message.content)
方式 2:多机分布式部署(大规模模型)
针对 70B + 模型,单节点显存不足时,可通过张量并行 + 多机通信部署:
(1)前提条件
- 多机之间配置 SSH 免密登录;
- 安装 NCCL(v2.18+),确保多机 GPU 通信正常;
- 所有节点的 vLLM、CUDA、模型文件版本一致(模型文件建议放在共享存储如 NFS)。
(2)启动命令(以 2 机 4 卡为例)
bash
# 在主节点执行(节点1:192.168.1.10,节点2:192.168.1.11)
python -m vllm.entrypoints.openai.api_server \
--model /nfs/shared-model/70B-model \
--tensor-parallel-size 4 \ # 总显卡数(2机×2卡)
--distributed-init-method tcp://192.168.1.10:29500 \ # 主节点通信地址
--distributed-world-size 2 \ # 节点数
--distributed-rank 0 \ # 主节点rank(从0开始)
--host 0.0.0.0 \
--port 8000 \
--gpu-memory-utilization 0.8
bash
# 在从节点执行(节点2)
python -m vllm.entrypoints.openai.api_server \
--model /nfs/shared-model/70B-model \
--tensor-parallel-size 4 \
--distributed-init-method tcp://192.168.1.10:29500 \
--distributed-world-size 2 \
--distributed-rank 1 \ # 从节点rank
--host 0.0.0.0
方式 3:K8s 容器化部署(生产级)
生产环境推荐使用 K8s 部署,便于扩缩容、故障恢复和资源管理。
(1)制作 vLLM 镜像
dockerfile
# Dockerfile
FROM nvidia/cuda:11.8.0-devel-ubuntu20.04
# 配置基础环境
RUN apt update && apt install -y python3 python3-pip git && \
ln -s /usr/bin/python3 /usr/bin/python
# 安装vLLM
RUN pip install --no-cache-dir vllm==0.4.0 torch==2.1.2
# 暴露端口
EXPOSE 8000
# 启动命令
CMD ["python", "-m", "vllm.entrypoints.openai.api_server", \
"--model", "/model", \
"--host", "0.0.0.0", \
"--port", "8000", \
"--tensor-parallel-size", "${TP_SIZE}"]
(2)构建镜像
bash
docker build -t vllm-server:v0.4.0 .
(3)K8s 部署清单(示例)
yaml
# vllm-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: vllm-server
namespace: llm
spec:
replicas: 1
selector:
matchLabels:
app: vllm-server
template:
metadata:
labels:
app: vllm-server
spec:
containers:
- name: vllm-server
image: vllm-server:v0.4.0
env:
- name: TP_SIZE
value: "2" # 张量并行数
ports:
- containerPort: 8000
resources:
limits:
nvidia.com/gpu: 2 # 申请2张GPU
memory: 64Gi
cpu: 16
requests:
nvidia.com/gpu: 2
memory: 32Gi
cpu: 8
volumeMounts:
- name: model-volume
mountPath: /model # 模型挂载路径
volumes:
- name: model-volume
persistentVolumeClaim:
claimName: llm-model-pvc # 模型存储PVC(NFS/CSI)
---
# 服务暴露
apiVersion: v1
kind: Service
metadata:
name: vllm-server-service
namespace: llm
spec:
type: ClusterIP # 生产环境建议用Ingress+HTTPS
selector:
app: vllm-server
ports:
- port: 8000
targetPort: 8000
三、生产环境优化
1. 性能调优
| 参数 | 调优建议 |
|---|---|
| --gpu-memory-utilization | 7B 模型设 0.9,70B 模型设 0.8~0.85,避免显存溢出 |
| --max-num-batched-tokens | 越大吞吐量越高,但需匹配显存(7B:4096,13B:8192,70B:16384) |
| --tensor-parallel-size | 等于显卡数(如 4 卡设 4),避免跨卡通信开销 |
| --pipeline-parallel-size | 多机部署时使用,与张量并行配合(如 8 卡:TP=4,PP=2) |
| --enable-cpu-offloading | 显存不足时启用,将部分权重卸载到 CPU(会增加延迟,仅应急使用) |
2. 稳定性优化
- 禁用 torch.compile:添加--enforce-eager,避免部分模型编译失败;
- 设置超时机制:API 服务添加--timeout 60(请求超时时间);
- 日志持久化:将 vLLM 日志输出到文件,便于故障排查:
bash
python -m vllm.entrypoints.openai.api_server ... > /var/log/vllm/server.log 2>&1
- 进程守护:使用systemd或supervisor管理 vLLM 进程,崩溃自动重启:
ini
# /etc/supervisor/conf.d/vllm.conf
[program:vllm-server]
command=python -m vllm.entrypoints.openai.api_server --model /model --host 0.0.0.0 --port 8000
directory=/opt/vllm
user=root
autostart=true
autorestart=true
stderr_logfile=/var/log/vllm/error.log
stdout_logfile=/var/log/vllm/out.log
3. 显存优化
- 使用量化模型(AWQ/GPTQ 4bit):显存占用降低 75%,性能损失 < 10%;
- 启用--swap-space:设置磁盘交换空间(如--swap-space 16),应对突发显存需求;
- 清理无用缓存:启动前执行nvidia-smi --gpu-reset,释放显卡缓存。
四、监控与运维
1. 基础监控
- GPU 监控:使用nvidia-dcgm-exporter采集 GPU 使用率、显存、温度等指标;
- vLLM 指标:vLLM 内置 Prometheus 指标(默认端口 8080),可采集吞吐量、延迟、队列长度等:
bash
# 暴露监控端口
python -m vllm.entrypoints.openai.api_server ... --metrics-port 8080
- API 监控:通过 Grafana+Prometheus 可视化指标(如vllm_requests_total、vllm_request_latency_seconds)。
2. 故障排查
| 问题现象 | 排查方向 |
|---|---|
| 显存溢出(OOM) | 降低gpu-memory-utilization、启用量化、减少批处理 token 数 |
| API 请求超时 | 检查 GPU 利用率是否 100%、增大max-num-batched-tokens、优化模型并行方式 |
| 多机通信失败 | 检查 NCCL 版本、防火墙端口(29500+)、SSH 免密登录 |
| 模型加载失败 | 验证模型格式(HF 格式)、CUDA 版本兼容性、权限问题 |
3. 版本更新
- 先在测试环境验证新版本 vLLM 兼容性;
- 滚动更新 K8s 部署(避免服务中断);
- 备份模型文件和配置,更新后验证 API 功能。
五、安全最佳实践
- 网络隔离:API 服务仅暴露给内网,通过 Ingress / 反向代理(Nginx/Envoy)对外提供服务;
- 鉴权:vLLM 默认无鉴权,需在反向代理层添加 API Key/Token 验证;
- HTTPS 加密:通过 Nginx/Traefik 配置 HTTPS,避免明文传输;
- 资源限制:K8s 中严格限制 GPU/CPU/ 内存资源,防止单个请求耗尽资源;
- 日志审计:记录所有 API 调用日志(用户、请求内容、响应状态),满足合规要求。
六、总结
vLLM 生产部署的核心是:选对部署模式(单机 / 多机 / K8s)+ 调优显存 / 并行参数 + 完善监控运维 + 强化安全。优先使用量化模型和 K8s 容器化部署,兼顾性能和可维护性;大规模模型建议采用多机张量并行,并配置共享存储和高带宽网络。
根据业务量可进一步扩展:如添加负载均衡(如 NGINX)、缓存层(如 Redis)、请求队列(如 Celery),提升服务的高可用和并发能力。