本文最后更新于36 天前,其中的信息可能已经过时,如有错误请发送邮件到big_fw@foxmail.com
一、vLLM 企业级推理框架
1. 框架定位
vLLM(virtual Large Language Model)是面向大模型推理优化的高性能服务框架,核心解决传统 Transformers 部署的高延迟、低吞吐、显存浪费问题,是生产级推理服务的主流方案。
- 核心能力:模型加载、GPU 资源调度、KV Cache 管理、API 服务
- 核心技术:PagedAttention + Continuous Batching
- 兼容性:HuggingFace 模型无缝接入、OpenAI API 标准接口、多品牌 GPU/TPU
2. 两大核心技术
2.1 PagedAttention(分页注意力)
- 设计思想:借鉴操作系统虚拟内存分页机制,将 KV Cache 切分为固定大小的 Block(页),通过页表映射管理,物理上无需连续,按需分配、用完即回收。
- 解决痛点:传统 KV Cache 按最大上下文预留整块连续显存,实际使用率低,显存碎片化严重,导致并发数上不去。
- 核心优势:显存利用率提升至 96% 以上,支持更多并发请求,吞吐量最高达传统框架的 24 倍。
2.2 Continuous Batching(连续批处理)
- 设计思想:新请求动态插入正在执行的批次,无需等待整批处理完成;谁先生成结束,立刻释放位置补入新请求。
- 解决痛点:传统静态批处理必须等最长请求完成才能处理下一批,GPU 空闲时间多,短请求被长请求阻塞。
- 核心优势:GPU 始终高负载运行,请求等待时间短,吞吐量大幅提升,高并发场景优势显著。
3. vLLM 解决的核心问题
表格
| 传统部署痛点 | vLLM 解决方案 |
|---|---|
| 显存碎片严重、浪费大 | PagedAttention 分块管理 KV 缓存,显存利用率接近最优 |
| 推理吞吐量低、GPU 空转 | 连续批处理 + 优化 CUDA 内核,大幅提升推理速度 |
| 多任务调度混乱 | 先进调度策略(先来先服务 + 抢占机制),资源合理分配 |
| 多 GPU 部署复杂 | 原生支持张量并行、流水线并行,简化多设备部署 |
| 业务集成难度高 | 兼容主流模型与 OpenAI API,降低接入门槛 |
4. 主要应用场景
- 实时推理服务:智能客服、聊天机器人等高并发低延迟场景
- 长文本生成:文章写作、摘要生成、创意内容创作
- 企业内部 AI 助手:稳定承接多用户并发请求
- RAG 与知识库系统:高并发下性能优势明显
- 业务集成:作为推理后端对接前端应用,支持分布式扩展
二、vLLM 部署实战
1. 环境准备
1.1 包管理器 uv 安装
uv 是 Python 高性能包与虚拟环境管理器,速度远快于 pip,用于隔离环境和快速安装依赖。
# 方式1:官方脚本安装
curl -LsSf https://astral.sh/uv/install.sh | sh
# 方式2:pip安装
pip install uv
- 验证命令:
uv --version
1.2 创建虚拟环境
要求 Python 版本≥3.10
mkdir /root/uv-vllm-qwen
cd /root/uv-vllm-qwen
uv venv --python 3.10
source .venv/bin/activate # 激活后终端前缀显示 (.venv)
2. 安装 vLLM
# 基础安装
uv pip install "vllm==0.7.2" --torch-backend=auto
# 国内加速:使用清华源
UV_INDEX_URL=https://pypi.tuna.tsinghua.edu.cn/simple uv pip install "vllm==0.7.2" --torch-backend=auto
- 安装验证:
python -c "import vllm; print(vllm.__version__)"
3. 国内模型下载优化
vLLM 默认从 HuggingFace 下载,国内网络受限,切换为 ModelScope(魔搭)加速:
# 1. 安装modelscope工具
uv pip install modelscope==1.25.0
# 2. 开启环境变量,优先从ModelScope拉取模型
export VLLM_USE_MODELSCOPE=True
# 3. 升级配套依赖库
uv pip install "transformers==4.45.2" "tokenizers==0.20.1"
4. 启动模型服务
基础启动命令示例(Qwen2-1.5B-Instruct):
vllm serve Qwen/Qwen2-1.5B-Instruct \
--max-model-len 4096 \
--gpu-memory-utilization 0.9 \
--tensor-parallel-size 1 \
--max-num-seqs 16 \
--dtype half
- 默认监听地址:
http://localhost:8000 - 首次运行自动下载模型,下载完成后启动推理服务
5. 核心参数详解
5.1 基础服务参数
表格
| 参数 | 说明 | 默认值 |
|---|---|---|
--host | 服务绑定的 IP 地址 | 0.0.0.0 |
--port | 服务监听端口 | 8000 |
--served-model-name | API 对外暴露的模型名称 | 与原模型名一致 |
--api-key | API 访问鉴权密钥 | 无 |
--trust-remote-code | 允许执行模型仓库自定义代码 | 关闭 |
5.2 性能与显存调优参数
表格
| 参数 | 说明 | 调优建议 |
|---|---|---|
--gpu-memory-utilization | GPU 显存最大使用比例 | 默认 0.9(使用 90% 显存,预留 10% 给系统进程) |
--max-model-len | 最大上下文长度(输入 + 输出 Token 总数) | 根据业务场景设置,不必盲目追大,节省显存提升并发 |
--max-num-seqs | 同时处理的最大请求数(并发序列数) | 直接决定并发能力,过大易显存溢出,过小浪费 GPU 资源 |
--dtype | 模型推理数据精度 | FP16 (half)/BF16/INT8/INT4;精度越低,显存越少、速度越快 |
显存估算参考(模型权重部分):
- FP32:参数量 × 4 字节
- FP16:参数量 × 2 字节
- INT8:参数量 × 1 字节
- INT4:参数量 × 0.5 字节 总显存占用 = 模型权重 + KV Cache + CUDA 运行时开销
6. 多 GPU 并行策略
6.1 张量并行(–tensor-parallel-size, -tp)
- 原理:将模型权重矩阵横向切分,分散到多张 GPU,每张卡计算一部分,最后拼接结果。
- 特点:降低单卡显存占用,适合单模型装不下单张卡的场景;对通信带宽要求高,仅适合单机内多卡(NVLink 最佳)。
- 示例:4 张 GPU 张量并行运行 70B 模型
vllm serve Llama-3-70B-Instruct --tensor-parallel-size 4
6.2 流水线并行(–pipeline-parallel-size, -pp)
- 原理:按模型层纵向切分,每组 GPU 负责一部分层,数据依次流过各段完成计算。
- 特点:适合跨节点多机部署;存在 “气泡”(前后级等待导致的算力浪费)。
6.3 数据并行(Data Parallelism, DP)
- 原理:每张 GPU 复制完整模型,数据切分后独立计算,最后汇总梯度更新模型。
- 特点:实现简单,通用性强;无法解决模型过大单卡装不下的问题,多用于训练场景。
一句话记忆:
- TP 横切权重,单机多卡降显存
- PP 竖切层级,多机部署跑大模型
- DP 复制模型,数据分片提吞吐
7. 高级优化参数
--enable-prefix-caching:开启前缀缓存,相同系统提示词复用 KV Cache,显著降低首 Token 延迟,对话系统推荐开启。--enable-chunked-prefill:分块预填充,长文本输入拆分成小块与生成交替执行,避免长请求独占 GPU。--speculative-model:投机解码,用小模型生成候选 Token,大模型验证,在不损失质量的前提下提升生成速度。--swap-space:KV Cache 换出到 CPU 内存的大小,显存不足时临时兜底,不宜设置过大。
三、Open WebUI 前端部署
1. 概述
Open WebUI 是功能丰富的自托管 AI 前端界面,完全离线运行,支持 Ollama、OpenAI 兼容协议,是本地大模型的可视化交互入口。
- 特点:协议优先、与后端解耦、支持模型管理、RAG 知识库、插件扩展
- 默认端口:8080
2. 部署步骤
2.1 环境准备
mkdir /root/open-webui
cd /root/open-webui
uv venv --python 3.11 # 要求Python≥3.11
source .venv/bin/activate
2.2 安装 Open WebUI
# 避免下载超时
export UV_HTTP_TIMEOUT=600
# 国内源安装
uv pip install open-webui -i https://pypi.tuna.tsinghua.edu.cn/simple
2.3 启动服务
export HF_ENDPOINT=https://hf-mirror.com # 模型下载镜像加速
export ENABLE_RAG_WEB_SEARCH=false # 关闭联网搜索功能
open-webui serve
- 访问地址:
http://服务器IP:8080 - 首次访问需注册管理员账号
3. 对接后端
3.1 对接 Ollama
- 进入设置 → 连接配置
- 添加 Ollama 接口地址:
http://localhost:11434 - 启用连接,在模型下拉框选择对应模型即可对话
3.2 对接 vLLM
- 进入设置 → 外部连接
- 添加 OpenAI 兼容接口:
http://vLLM服务IP:8000/v1 - 填写 API 密钥(如有),保存后即可选择 vLLM 加载的模型
四、API 调用方式(了解)
vLLM 原生兼容 OpenAI API 标准,支持 curl、Python 等多种方式调用。
1. curl 调用示例
curl http://localhost:8000/v1/chat/completions \
-H "Content-Type: application/json" \
-d '{
"model": "Qwen/Qwen2-1.5B-Instruct",
"messages": [{"role": "user", "content": "介绍一下Linux"}],
"stream": false
}'
2. Python SDK 调用
2.1 安装依赖
uv pip install openai
2.2 单轮调用脚本
from openai import OpenAI
client = OpenAI(
base_url="http://localhost:8000/v1",
api_key="token-abc123" # 与启动时--api-key参数一致
)
resp = client.chat.completions.create(
model="Qwen/Qwen2-1.5B-Instruct",
messages=[{"role": "user", "content": "介绍一下Linux"}]
)
print(resp.choices[0].message.content)
2.3 并发批量调用
使用线程池实现多请求并发,常用于压测场景:
from openai import OpenAI
from concurrent.futures import ThreadPoolExecutor
client = OpenAI(base_url="http://localhost:8000/v1", api_key="token-abc123")
questions = [
"介绍一下Linux",
"什么是Docker",
"什么是Kubernetes",
"解释一下TCP三次握手"
]
def ask(q):
resp = client.chat.completions.create(
model="Qwen/Qwen2-1.5B-Instruct",
messages=[{"role": "user", "content": q}]
)
return q, resp.choices[0].message.content
with ThreadPoolExecutor(max_workers=5) as executor:
results = executor.map(ask, questions)
for q, ans in results:
print(f"问题: {q}")
print(f"回答: {ans}")
print("-" * 50)
五、高频汇总
- PagedAttention 的原理和优势? 答:借鉴操作系统分页思想,将 KV Cache 切分为固定大小的 Block,通过页表映射管理,物理上无需连续,按需分配、用完回收。解决了传统 KV Cache 显存浪费、碎片化严重的问题,显存利用率提升至 96% 以上,可支持更多并发请求。
- 连续批处理相比传统静态批处理的优势? 答:传统静态批处理必须等整批请求全部完成才能处理下一批,GPU 空转时间多、整体延迟高。连续批处理动态将新请求插入运行中的批次,请求完成立即释放位置补入新请求,GPU 始终保持高负载,吞吐量更高、平均延迟更低。
- vLLM 的多 GPU 并行策略有哪些,区别是什么? 答:
- 张量并行(TP):横向切分权重矩阵,单机多卡部署,降低单卡显存压力,对通信带宽要求高
- 流水线并行(PP):纵向切分模型层级,适合跨多机部署,存在算力气泡浪费
- 数据并行(DP):每张卡复制完整模型,数据分片计算,多用于训练,不能解决单卡装不下模型的问题
- 影响大模型推理显存占用的因素有哪些? 答:模型参数量、推理数据精度(dtype)、上下文长度、并发请求数量、KV Cache 大小、CUDA 运行时固定开销。
- 如何提升推理服务的并发能力? 答:使用 PagedAttention 优化显存利用率;开启连续批处理提升 GPU 使用率;适当降低推理精度(如 INT4/INT8);合理设置 max-model-len,避免盲目开大上下文;使用张量并行扩展单卡显存容量。