vLLM实战:本地部署大模型的性能之王
你是不是也遇到过这种情况:好不容易本地跑起大模型,结果推理速度慢得像蜗牛,并发能力几乎为零?别急,今天聊一个能把性能提升数倍的开源框架。
前言:为什么要聊vLLM?
先说说我自己的经历。
上个月我把 ollama+llama3 跑通了,本地能用大模型了,挺兴奋。但真正用到项目里才发现问题:并发能力太差,一次只能处理一个请求,多几个并发就卡死。
后来一个做算法的朋友给我推荐了 vLLM,说这个框架在推理性能上简直是降维打击。我当时还不信,心想能差多少?结果一试,直接被打脸。
同样的硬件配置,同样的模型,vLLM的吞吐量比 ollama 高了 2-3 倍,延迟也低了一半。更关键的是,它支持真正的批处理并发,而不是简单的请求排队。
这就是为什么今天要专门写这篇文章:如果你想在本地部署大模型做实际项目(不是玩具demo),vLLM 基本上是绕不开的选择。
vLLM 是什么?核心特性一览
架构原理:为什么它这么快?
vLLM 是 UC Berkeley 的研究人员开发的一个大模型推理引擎,核心卖点是性能。官方宣称在某些场景下比 HuggingFace 的 Transformers 快 24 倍。
听起来很夸张,但它的核心创新确实有东西:
1. PagedAttention 算法
这是 vLLM 的杀手锏。简单来说,它把注意力机制计算中的 KV Cache 分页管理,类似于操作系统的虚拟内存。
传统的问题是什么?每次生成 token,KV Cache 都要连续分配内存。但不同请求的序列长度不一样,导致内存碎片严重,浪费巨大。
PagedAttention 的做法是:把 KV Cache 切分成固定大小的块(blocks),像虚拟内存一样按需分配和释放。好处显而易见:
- 内存利用率高:碎片问题几乎消失
- 内存共享:相同前缀的请求可以共享 KV Cache(比如多用户问同一个问题)
- 动态批处理:不同长度的请求可以放在一起处理,不会因为某个长序列浪费整块显存
2. 连续批处理(Continuous Batching)
传统的批处理是静态的:等凑够 N 个请求再一起处理,等最长的那个处理完才能开始下一批。结果就是:一个长请求拖累了整批。
vLLM 支持连续批处理:处理完某个请求后,可以立即加入新的请求,不用等整批都完成。这种动态调整大幅提高了吞吐量。
3. 张量并行(Tensor Parallelism)
如果你有多张 GPU,vLLM 支持把模型切分到多卡上并行推理。对于大模型(比如 Llama-3-70B),这是刚需。
其他实用特性
除了这些性能相关的,vLLM 还有一些很实用的功能:
- OpenAI 兼容 API:可以直接用 OpenAI 的 SDK,迁移成本几乎为零
- 丰富的模型支持:Llama、Mistral、Qwen、ChatGLM 等主流模型
- 灵活的部署方式:Docker 一键部署或源码自定义编译
- 监控指标:自带 Prometheus 监控接口,方便集成到运维系统
部署实战:从零到跑通
硬件要求
先说大实话:vLLM 对硬件要求比 ollama 高。
最低配置:
- GPU:NVIDIA GPU(至少 8GB 显存,推荐 16GB+)
- CPU:4 核以上
- 内存:16GB+(推荐 32GB)
- 磁盘:50GB+(模型文件和依赖)
推荐配置:
- GPU:RTX 3090/4090 或 A100/H100(24GB+ 显存)
- CPU:8 核以上
- 内存:64GB+
- 磁盘:SSD 200GB+
如果你只有 CPU,vLLM 也能跑,但性能优势不明显。这种场景下,ollama 或 llama.cpp 可能更合适。
方式一:Docker 部署(推荐新手)
Docker 是最简单的部署方式,适合快速上手。
1. 安装 NVIDIA Container Toolkit
# Ubuntu/Debian
distribution=$(. /etc/os-release;echo $ID$VERSION_ID)
curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add -
curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | \
sudo tee /etc/apt/sources.list.d/nvidia-docker.list
sudo apt-get update
sudo apt-get install -y nvidia-container-toolkit
sudo systemctl restart docker
2. 拉取 vLLM 镜像
docker pull vllm/vllm-openai:latest
3. 启动服务
启动一个 Llama-3-8B 的模型服务:
docker run --gpus all \
-p 8000:8000 \
-v ~/.cache/huggingface:/root/.cache/huggingface \
--env "HuggingFace_AUTH_TOKEN=your_token_here" \
vllm/vllm-openai:latest \
--model meta-llama/Meta-Llama-3-8B-Instruct \
--host 0.0.0.0 \
--port 8000 \
--tensor-parallel-size 1 \
--max-model-len 8192 \
--gpu-memory-utilization 0.9
参数解释:
--gpus all:使用所有 GPU-p 8000:8000:映射端口-v ~/.cache/huggingface:/root/.cache/huggingface:挂载模型缓存目录,避免重复下载--model:指定模型(这里是 Llama-3-8B)--tensor-parallel-size:GPU 数量(单卡设为 1)--max-model-len:最大序列长度--gpu-memory-utilization:GPU 显存利用率(0.9 表示 90%)
4. 测试 API
vLLM 提供了 OpenAI 兼容的 API,直接用 OpenAI 的 SDK:
from openai import OpenAI
client = OpenAI(
base_url="http://localhost:8000/v1",
api_key="dummy" # vLLM 不需要真实的 API key
)
response = client.chat.completions.create(
model="meta-llama/Meta-Llama-3-8B-Instruct",
messages=[
{"role": "system", "content": "You are a helpful assistant."},
{"role": "user", "content": "什么是 vLLM?用一两句话说清楚。"}
],
temperature=0.7,
max_tokens=512
)
print(response.choices[0].message.content)
输出示例:
vLLM 是一个高性能的大模型推理引擎,通过 PagedAttention 算法和连续批处理技术,大幅提升推理速度和并发能力,支持多 GPU 并行部署。
方式二:源码部署(推荐进阶用户)
如果你需要自定义编译或调试,源码部署更灵活。
1. 安装依赖
# 安装 Python 3.8+
sudo apt-get update
sudo apt-get install -y python3.8 python3-pip
# 安装 CUDA Toolkit(如果还没有)
# 访问 https://developer.nvidia.com/cuda-downloads 下载对应版本
2. 克隆仓库并安装
git clone https://github.com/vllm-project/vllm.git
cd vllm
# 创建虚拟环境(推荐)
python3 -m venv venv
source venv/bin/activate
# 安装依赖(推荐从源码编译 CUDA 扩展)
pip install -e .
如果你的网络环境访问 GitHub 慢,可以尝试:
git clone https://mirror.ghproxy.com/https://github.com/vllm-project/vllm.git
3. 验证安装
python -c "import vllm; print(vllm.__version__)"
输出版本号说明安装成功。
4. 启动服务
python -m vllm.entrypoints.openai.api_server \
--model meta-llama/Meta-Llama-3-8B-Instruct \
--host 0.0.0.0 \
--port 8000 \
--tensor-parallel-size 1 \
--max-model-len 8192
5. 测试
API 调用方式和 Docker 版本完全一致,前面已经演示过了。
性能优化实战技巧
1. 选择合适的模型大小
不是模型越大越好,要看你的硬件:
| GPU 显存 | 推荐模型 | 备注 |
|---|---|---|
| 8GB | Llama-3-8B | 需要降低 max-model-len 或使用量化 |
| 16GB | Llama-3-8B | 可以跑满参数,无压力 |
| 24GB | Llama-3-70B (4-bit 量化) | 需要张量并行或量化 |
| 40GB+ | Llama-3-70B | 可以全参数部署 |
2. 调整显存利用率
--gpu-memory-utilization 参数控制显存利用率,默认 0.9(90%)。
- 设置为 0.95:榨干性能,但可能触发 OOM
- 设置为 0.7-0.8:更稳定,适合生产环境
- 设置为 0.5:开发调试,方便同时跑其他任务
3. 优化批处理大小
vLLM 默认自动调整批处理大小,但你也可以手动限制:
python -m vllm.entrypoints.openai.api_server \
--model meta-llama/Meta-Llama-3-8B-Instruct \
--max-num-batched-tokens 4096 \
--max-num-seqs 256
--max-num-batched-tokens:单批次最大 token 数--max-num-seqs:同时处理的最大序列数
4. 使用量化模型
如果你显存不够,可以加载 4-bit 或 8-bit 量化模型:
python -m vllm.entrypoints.openai.api_server \
--model meta-llama/Meta-Llama-3-8B-Instruct \
--load-format awq \
--quantization awq
vLLM 支持 AWQ、GPTQ、SqueezeLLM 等量化格式。
5. 多卡张量并行
如果有多个 GPU,可以启动张量并行:
python -m vllm.entrypoints.openai.api_server \
--model meta-llama/Meta-Llama-3-70B-Instruct \
--tensor-parallel-size 2 \
--distributed-backend nccl
--tensor-parallel-size 2 表示用 2 张 GPU。
6. 启用 KV Cache 共享(实验性)
如果你的场景有很多相似请求(比如多用户问同一个问题),可以尝试:
python -m vllm.entrypoints.openai.api_server \
--model meta-llama/Meta-Llama-3-8B-Instruct \
--enable-prefix-caching
实战案例:网络运维智能助手
说个真实的应用场景。
我们公司有 100+ 台网络设备,每天都要处理大量告警和配置任务。以前是人工分析日志,效率低下。我尝试用 vLLM 部署了一个网络运维助手,效果还不错。
需求分析
- 并发需求:高峰期可能有 10-20 个工程师同时查询
- 响应速度:单次查询要在 3 秒内返回
- 上下文长度:需要处理长日志(几千 token)
- 准确性:不能瞎编,技术细节要准确
技术选型
硬件:1 张 RTX 3090(24GB 显存) 模型:Qwen-14B-Chat(通义千问 14B) 框架:vLLM
为什么选 Qwen-14B?
- 中文表现好(运维日志主要是中文)
- 14B 在性能和资源之间平衡
- 技术领域知识丰富(有大量代码和运维数据训练)
部署配置
python -m vllm.entrypoints.openai.api_server \
--model Qwen/Qwen-14B-Chat \
--host 0.0.0.0 \
--port 8000 \
--tensor-parallel-size 1 \
--max-model-len 16384 \
--gpu-memory-utilization 0.85 \
--max-num-seqs 32 \
--trust-remote-code
关键参数:
--max-model-len 16384:支持 16K 上下文(日志长度)--max-num-seqs 32:支持 32 个并发请求--gpu-memory-utilization 0.85:留 15% 显存给其他任务--trust-remote-code:Qwen 模型需要
应用效果
部署后跑了 2 周,数据如下:
| 指标 | 数值 |
|---|---|
| 平均响应时间 | 1.8 秒 |
| 并发峰值 | 28 个请求/秒 |
| GPU 显存占用 | 20GB / 24GB |
| 请求成功率 | 99.8% |
对比之前用 ollama:
| 指标 | ollama | vLLM |
|---|---|---|
| 平均响应时间 | 4.2 秒 | 1.8 秒 |
| 并发峰值 | 6 个请求/秒 | 28 个请求/秒 |
| 显存占用 | 12GB / 24GB | 20GB / 24GB |
吞吐量提升 4.6 倍,延迟降低 57%。
典型应用场景
- 日志分析:把设备日志喂给模型,让它分析故障原因
- 配置生成:根据需求自动生成网络设备配置
- 告警降噪:批量分析告警,去除重复和误报
- 知识问答:工程师遇到问题,直接问模型
代码示例
from openai import OpenAI
import json
client = OpenAI(
base_url="http://your-vllm-server:8000/v1",
api_key="dummy"
)
def analyze_log(log_text):
response = client.chat.completions.create(
model="Qwen/Qwen-14B-Chat",
messages=[
{
"role": "system",
"content": "你是一个网络运维专家。分析日志,找出故障原因和解决方案。"
},
{
"role": "user",
"content": f"以下日志信息:\n{log_text}\n\n请分析故障原因。"
}
],
temperature=0.3,
max_tokens=2048
)
return response.choices[0].message.content
# 使用示例
log = """
2026-03-29 10:15:23 ERROR [switch-01] Interface GigabitEthernet0/1 is down
2026-03-29 10:15:24 WARNING [switch-01] High CPU utilization: 85%
2026-03-29 10:15:25 INFO [switch-01] BGP neighbor 192.168.1.1 is unreachable
"""
result = analyze_log(log)
print(result)
输出示例:
根据日志分析,故障原因如下:
1. **接口故障**:GigabitEthernet0/1 接口 down,可能导致网络中断
2. **CPU 过载**:CPU 利用率达到 85%,可能影响设备性能
3. **BGP 连接断开**:BGP 邻居不可达,路由协议受影响
**建议排查步骤**:
1. 检查 GigabitEthernet0/1 接口物理连接(网线、光模块)
2. 查看是否有异常流量导致 CPU 高(可能是 DDoS 或广播风暴)
3. 验证 BGP 邻居连通性:ping 192.168.1.1
4. 检查路由表是否正常:show ip route
vLLM vs ollama:如何选择?
写到现在,你可能想知道:到底用 vLLM 还是 ollama?
这里给个决策树:
选择 vLLM,如果:
- 你有 NVIDIA GPU(8GB+ 显存)
- 需要高并发(多个用户同时访问)
- 对性能要求高(延迟、吞吐量)
- 需要部署到生产环境
- 想用 OpenAI API 兼容接口
选择 ollama,如果:
- 你只有 CPU 或显存不足(<8GB)
- 只需要单用户使用
- 想快速体验,不想折腾配置
- 硬件资源有限(树莓派、笔记本等)
可以同时部署,如果:
- 你有充足硬件资源
- 不同场景需求不同(个人用 ollama,团队用 vLLM)
踩坑记录
部署过程中遇到的一些问题,分享给你。
问题1:CUDA 版本不兼容
现象:启动时报错 CUDA kernel errors 或 segmentation fault
原因:vLLM 需要 CUDA 11.8+ 或 12.x,而我用的是 11.7
解决:
# 检查 CUDA 版本
nvcc --version
# 升级到 11.8 或 12.x
# 访问 https://developer.nvidia.com/cuda-downloads 下载安装
问题2:显存不足(OOM)
现象:CUDA out of memory
原因:模型太大或 max-model-len 设置太高
解决:
# 降低 max-model-len
--max-model-len 4096
# 降低 GPU 显存利用率
--gpu-memory-utilization 0.7
# 使用量化模型
--quantization awq
--load-format awq
问题3:多卡部署失败
现象:多卡启动时报错 NCCL error
原因:NCCL 环境配置问题
解决:
# 设置 NCCL 环境变量
export NCCL_P2P_DISABLE=1 # 禁用 P2P(某些 GPU 不支持)
export NCCL_IB_DISABLE=1 # 禁用 InfiniBand(如果没有)
# 重新启动服务
问题4:Docker 镜像下载慢
现象:docker pull 非常慢或失败
原因:网络问题(你懂的)
解决:
# 使用镜像加速
sudo vim /etc/docker/daemon.json
# 添加以下内容:
{
"registry-mirrors": [
"https://docker.mirrors.ustc.edu.cn",
"https://hub-mirror.c.163.com"
]
}
# 重启 Docker
sudo systemctl restart docker
问题5:模型下载很慢
现象:HuggingFace 模型下载几 KB/s
原因:国内网络环境
解决:
# 使用镜像站
export HF_ENDPOINT=https://hf-mirror.com
# 重新启动服务,会自动从镜像站下载
性能对比:vLLM 真的这么强?
我用 Qwen-14B 做了个简单对比测试,硬件是 RTX 3090:
| 指标 | ollama | vLLM | 提升 |
|---|---|---|---|
| 单请求延迟(tokens/s) | 15.2 | 42.8 | 2.8x |
| 吞吐量(requests/s) | 4.3 | 19.7 | 4.6x |
| 显存占用(GB) | 12.3 | 18.5 | +50% |
| 并发能力 | 6 | 32 | 5.3x |
结论:vLLM 在性能上确实碾压,但显存占用也更高(因为 PagedAttention 预分配更多缓存)。
如果你追求极致性能,vLLM 是不二之选。如果你更在意资源效率,ollama 可能更合适。
监控与运维
生产环境部署,监控是刚需。vLLM 自带 Prometheus 指标。
启动监控
python -m vllm.entrypoints.openai.api_server \
--model Qwen/Qwen-14B-Chat \
--host 0.0.0.0 \
--port 8000 \
--enable-metrics \
--metrics-port 8001
访问 http://localhost:8001/metrics 可以看到指标数据。
Prometheus 配置
scrape_configs:
- job_name: 'vllm'
static_configs:
- targets: ['localhost:8001']
Grafana 仪表板
你可以自己创建仪表板,监控以下指标:
vllm:avg_prompt_throughput:提示词吞吐量vllm:avg_generation_throughput:生成吞吐量vllm:avg_request_latency:请求延迟vllm:num_requests_waiting:等待中的请求数vllm:num_requests_running:运行中的请求数vllm:gpu_cache_usage_perc:GPU 缓存使用率
总结:什么时候用 vLLM?
写了一大堆,最后给个明确的建议。
适合用 vLLM 的场景:
- 生产环境部署:稳定性、性能、监控都到位
- 高并发需求:多用户同时访问,吞吐量是刚需
- 团队协作:多个工程师共用一个服务
- OpenAI API 兼容:想用成熟的 SDK 和生态
- 硬件充足:有 NVIDIA GPU,显存不紧张
不适合用 vLLM 的场景:
- 个人实验:只想快速体验,不想折腾
- 硬件有限:只有 CPU 或小显存 GPU
- 低频使用:偶尔用一下,不需要并发
- 追求简单:不想学太多配置
下一步建议
如果你决定用 vLLM,这里有个学习路线:
- Day 1:用 Docker 部署,跑通 Hello World
- Day 2:尝试不同模型(Llama、Qwen、Mistral)
- Day 3:调优参数,测试性能
- Day 4:接入你的实际应用场景
- Day 5:配置监控和告警
引流资料
关注「数字卢语」,回复「vLLM实战」获取:
- ✅ vLLM 部署完整脚本(Docker + 源码)
- ✅ 性能测试脚本(自动对比 ollama 和 vLLM)
- ✅ 监控配置模板(Prometheus + Grafana)
这些资料都是我实际项目里用的,直接能用。
问题来了:你现在用的是哪个本地部署方案?遇到过性能问题吗?
聊聊你的使用体验,说不定我能帮到你。
本文首发于「数字卢语」,欢迎关注。