vLLM 端侧推理全面教程:常用 API 串联与实战指南
vLLM是伯克利开源的高效大模型推理框架,通过PagedAttention分页机制和连续批处理技术显著提升推理性能,支持主流大模型在端侧和云端部署。该框架安装简便,提供Python SDK和REST API,核心API包括LLM类(推理引擎)和SamplingParams(采样控制)。实战案例展示了如何构建求职咨询对话系统和批量岗位描述生成工具,适用于应届生导航网站等场景。vLLM通过优化显存管理
大家好,我是jobleap.cn的小九。
vLLM是加州大学伯克利分校于2023年开源的高效大模型推理框架,核心目标是解决大模型推理阶段的显存瓶颈与吞吐量问题,广泛适配端侧(本地GPU设备)、云端等多场景部署。其核心优势源于两项关键技术:
- PagedAttention(分页注意力机制):借鉴操作系统虚拟内存分页思想,将大模型的KV缓存(键值对缓存,推理时存储中间结果的核心组件)划分为固定大小的“页”,仅将当前推理所需的页加载到GPU显存,大幅降低显存占用,支持更长的上下文窗口。
- Continuous Batching(连续批处理):突破传统静态批处理限制,动态接收新请求并合并推理,避免空闲等待,显著提升推理吞吐量(官方数据显示,同等硬件下吞吐量较Hugging Face Transformers提升10-20倍)。
此外,vLLM支持主流大模型(如LLaMA系列、GPT - 2、Falcon等),兼容Hugging Face模型格式,同时提供Python SDK、REST API等多种调用方式,是端侧部署大模型的主流选择之一。
二、环境准备与框架安装
2.1 硬件与系统要求
| 类型 | 最低要求 | 推荐配置 |
|---|---|---|
| GPU | NVIDIA GPU(≥8GB显存) | RTX 3090/4090、A10(≥24GB显存) |
| CUDA版本 | CUDA 11.7+ | CUDA 12.1 |
| Python版本 | 3.8+ | 3.10 |
| 操作系统 | Linux/macOS | Ubuntu 22.04 LTS |
2.2 安装步骤
- 基础依赖安装
先安装CUDA对应的PyTorch版本,以CUDA 12.1为例:pip3 install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu121 - vLLM核心安装
支持通过pip快速安装或源码编译(源码编译适合自定义优化):- 快速安装(推荐端侧用户)
pip install vllm - 源码编译(适合需要修改框架代码的场景)
git clone https://github.com/vllm-project/vllm.git cd vllm pip install -e .
- 快速安装(推荐端侧用户)
- 验证安装
运行以下代码,无报错则安装成功:import vllm print(f"vLLM版本:{vllm.__version__}")
三、vLLM常用核心API解析
vLLM的Python SDK提供了LLM类(核心推理类)、SamplingParams类(采样参数配置)等核心组件,以下是高频API的详细说明与基础示例。
3.1 SamplingParams(采样参数配置)
用于控制生成文本的随机性、长度等,是推理的基础配置。
| 参数 | 类型 | 作用 | 默认值 |
|---|---|---|---|
| temperature | float | 控制随机性,0表示确定性输出,值越大越随机 | 1.0 |
| top_p | float | 核采样阈值,仅保留累计概率≥该值的token | 1.0 |
| max_tokens | int | 生成文本的最大长度 | 16 |
| stop | list | 停止符,遇到该字符停止生成 | [] |
| presence_penalty | float | 重复token惩罚,减少重复内容 | 0.0 |
示例代码
from vllm import SamplingParams
# 配置采样参数:适合文本生成场景
sampling_params = SamplingParams(
temperature=0.7,
top_p=0.9,
max_tokens=200,
stop=["\n\n", "用户:"],
presence_penalty=0.5
)
3.2 LLM类(核心推理引擎)
负责加载模型、执行推理,是vLLM的核心API,支持单条/批量请求。
关键方法
-
init(初始化模型)
参数 类型 作用 model str 模型路径(本地路径或Hugging Face仓库名) tensor_parallel_size int 张量并行数(适配多GPU) dtype str 数据类型(如"float16",减少显存占用) max_model_len int 模型最大上下文窗口 -
generate(执行推理)
接收文本列表与采样参数,返回生成结果,支持同步/异步调用。
基础示例(单条文本生成)
from vllm import LLM, SamplingParams
# 1. 配置采样参数
sampling_params = SamplingParams(max_tokens=100, temperature=0.8)
# 2. 加载模型(以LLaMA - 2 - 7B为例,本地路径或Hugging Face仓库)
llm = LLM(
model="meta - llama/Llama - 2 - 7b - chat - hf",
dtype="float16",
max_model_len=2048
)
# 3. 执行推理
prompts = ["请介绍大模型端侧推理的优势"]
outputs = llm.generate(prompts, sampling_params)
# 4. 解析结果
for output in outputs:
prompt = output.prompt
generated_text = output.outputs[0].text
print(f"输入:{prompt}\n输出:{generated_text}\n")
3.3 AsyncLLM类(异步推理引擎)
适合高并发场景,通过异步调用提升吞吐量,API与LLM类基本一致,核心区别是generate方法为异步。
示例代码
import asyncio
from vllm import AsyncLLM, SamplingParams
async def async_inference():
sampling_params = SamplingParams(max_tokens=100)
llm = AsyncLLM(model="meta - llama/Llama - 2 - 7b - chat - hf")
prompts = ["解释vLLM的PagedAttention原理", "vLLM如何提升推理速度"]
outputs = await llm.generate(prompts, sampling_params)
for output in outputs:
print(f"输入:{output.prompt}\n输出:{output.outputs[0].text}\n")
asyncio.run(async_inference())
四、实战:端侧多场景完整工作流
4.1 实战1:单轮对话系统(适配应届生导航网站咨询场景)
目标:构建一个为应届生解答求职问题的单轮对话工具,支持快速回复岗位推荐、简历优化等问题。
- 完整代码
from vllm import LLM, SamplingParams # 1. 定义对话模板(适配LLaMA - 2聊天模型) def build_prompt(user_question): system_prompt = "你是应届生求职助手,简洁解答求职相关问题,回答不超过200字。" return f"<s>[INST] <<SYS>>{system_prompt}<</SYS>>\n{user_question}[/INST]" # 2. 配置参数 sampling_params = SamplingParams( temperature=0.6, max_tokens=200, stop=["</s>"] ) # 3. 加载模型(端侧使用量化版模型减少显存占用) llm = LLM( model="TheBloke/Llama - 2 - 7B - Chat - GGUF", dtype="float16", max_model_len=1024 ) # 4. 交互逻辑 def get_answer(user_question): prompt = build_prompt(user_question) outputs = llm.generate([prompt], sampling_params) return outputs[0].outputs[0].text # 测试 if __name__ == "__main__": question = "应届生找互联网开发岗位,该优先准备哪些技术栈?" print(get_answer(question)) - 关键说明
- 对话模板:适配LLaMA - 2的指令格式,确保模型理解角色定位;
- 量化模型:使用GGUF量化版模型,RTX 4090可流畅运行7B参数模型;
- 应用适配:可集成到应届生导航网站的“求职咨询”模块,通过接口调用返回结果。
4.2 实战2:批量岗位描述生成(适配导航网站岗位维护场景)
目标:批量生成不同岗位的职责描述,提升网站岗位信息填充效率。
- 完整代码
from vllm import LLM, SamplingParams # 1. 定义岗位列表 job_titles = [ "前端开发工程师(应届生)", "Python后端开发实习生", "数据分析师(校招)" ] # 2. 构建批量提示词 def build_batch_prompts(titles): prompts = [] for title in titles: prompt = f"生成{title}的岗位职责,包含3-5条核心内容,语言简洁:" prompts.append(prompt) return prompts # 3. 配置参数(批量生成用低随机性,保证内容规范性) sampling_params = SamplingParams( temperature=0.3, max_tokens=150, presence_penalty=0.8 ) # 4. 加载模型并批量推理 llm = LLM( model="meta - llama/Llama - 2 - 7b - hf", tensor_parallel_size=1, # 单GPU dtype="float16" ) prompts = build_batch_prompts(job_titles) outputs = llm.generate(prompts, sampling_params) # 5. 输出结果 for i, output in enumerate(outputs): print(f"岗位:{job_titles[i]}\n职责:{output.outputs[0].text}\n") - 关键优化
- 低温度参数:保证批量生成内容风格统一、符合规范;
- 重复惩罚:避免不同岗位描述出现重复内容;
- 效率提升:vLLM连续批处理特性,生成100条岗位描述仅需数十秒(RTX 4090)。
4.3 实战3:vLLM + FastAPI 部署(供导航网站前端调用)
目标:将vLLM推理服务封装为API,支持Next.js等前端框架调用,适配导航网站的后端需求。
- 安装依赖
pip install fastapi uvicorn pydantic - 后端服务代码(main.py)
from fastapi import FastAPI from pydantic import BaseModel from vllm import LLM, SamplingParams app = FastAPI(title="应届生求职AI接口") # 初始化模型(服务启动时加载,避免重复加载) sampling_params = SamplingParams( temperature=0.7, max_tokens=200, stop=["\n\n"] ) llm = LLM( model="TheBloke/Llama - 2 - 7B - Chat - GGUF", dtype="float16" ) # 定义请求体格式 class JobRequest(BaseModel): question: str # 定义API接口 @app.post("/api/chat") def chat(request: JobRequest): prompt = f"应届生求职助手:{request.question}" outputs = llm.generate([prompt], sampling_params) return {"answer": outputs[0].outputs[0].text} if __name__ == "__main__": import uvicorn uvicorn.run(app, host="0.0.0.0", port=8000) - 前端调用示例(Next.js)
// 适配用户Next.js开发经验,提供前端调用代码 async function getJobAnswer(question) { const res = await fetch("http://localhost:8000/api/chat", { method: "POST", headers: { "Content - Type": "application/json" }, body: JSON.stringify({ question }) }); const data = await res.json(); return data.answer; } // 调用示例 getJobAnswer("应届生如何准备技术面试?").then(answer => console.log(answer)); - 服务部署说明
- 启动服务:
python main.py,通过http://localhost:8000/docs可测试API; - 端侧部署:可在本地服务器或边缘设备(如Jetson AGX Orin)部署,满足导航网站低延迟需求。
- 启动服务:
五、端侧推理优化技巧
- 模型量化:使用GGUF、GPTQ量化模型(如7B模型量化后显存占用从14GB降至4-6GB),推荐工具
llama.cpp、auto - gptq; - 显存管理:设置
dtype="float16"或"bfloat16",关闭不必要的KV缓存(短文本场景); - 参数调优:短文本生成时减小
max_model_len,批量任务时增大tensor_parallel_size(多GPU); - 模型选型:端侧优先选择7B/13B参数模型,如LLaMA - 2、Mistral - 7B,兼顾性能与效果。
六、常见问题排查
- 显存溢出
- 解决方案:使用量化模型、降低
max_model_len、切换dtype为float16;
- 解决方案:使用量化模型、降低
- 模型加载失败
- 原因:模型路径错误、Hugging Face权限不足;
- 解决方案:检查路径,登录Hugging Face(
huggingface - cli login);
- 推理速度慢
- 解决方案:启用连续批处理(默认开启)、减少
temperature、使用异步推理(AsyncLLM)。
- 解决方案:启用连续批处理(默认开启)、减少
更多推荐



所有评论(0)