大家好,我是jobleap.cn的小九。
vLLM是加州大学伯克利分校于2023年开源的高效大模型推理框架,核心目标是解决大模型推理阶段的显存瓶颈与吞吐量问题,广泛适配端侧(本地GPU设备)、云端等多场景部署。其核心优势源于两项关键技术:

  1. PagedAttention(分页注意力机制):借鉴操作系统虚拟内存分页思想,将大模型的KV缓存(键值对缓存,推理时存储中间结果的核心组件)划分为固定大小的“页”,仅将当前推理所需的页加载到GPU显存,大幅降低显存占用,支持更长的上下文窗口。
  2. 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 安装步骤

  1. 基础依赖安装
    先安装CUDA对应的PyTorch版本,以CUDA 12.1为例:
    pip3 install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu121
    
  2. vLLM核心安装
    支持通过pip快速安装或源码编译(源码编译适合自定义优化):
    • 快速安装(推荐端侧用户)
      pip install vllm
      
    • 源码编译(适合需要修改框架代码的场景)
      git clone https://github.com/vllm-project/vllm.git
      cd vllm
      pip install -e .
      
  3. 验证安装
    运行以下代码,无报错则安装成功:
    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,支持单条/批量请求。

关键方法
  1. init(初始化模型)

    参数 类型 作用
    model str 模型路径(本地路径或Hugging Face仓库名)
    tensor_parallel_size int 张量并行数(适配多GPU)
    dtype str 数据类型(如"float16",减少显存占用)
    max_model_len int 模型最大上下文窗口
  2. 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:单轮对话系统(适配应届生导航网站咨询场景)

目标:构建一个为应届生解答求职问题的单轮对话工具,支持快速回复岗位推荐、简历优化等问题。

  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))
    
  2. 关键说明
    • 对话模板:适配LLaMA - 2的指令格式,确保模型理解角色定位;
    • 量化模型:使用GGUF量化版模型,RTX 4090可流畅运行7B参数模型;
    • 应用适配:可集成到应届生导航网站的“求职咨询”模块,通过接口调用返回结果。

4.2 实战2:批量岗位描述生成(适配导航网站岗位维护场景)

目标:批量生成不同岗位的职责描述,提升网站岗位信息填充效率。

  1. 完整代码
    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")
    
  2. 关键优化
    • 低温度参数:保证批量生成内容风格统一、符合规范;
    • 重复惩罚:避免不同岗位描述出现重复内容;
    • 效率提升:vLLM连续批处理特性,生成100条岗位描述仅需数十秒(RTX 4090)。

4.3 实战3:vLLM + FastAPI 部署(供导航网站前端调用)

目标:将vLLM推理服务封装为API,支持Next.js等前端框架调用,适配导航网站的后端需求。

  1. 安装依赖
    pip install fastapi uvicorn pydantic
    
  2. 后端服务代码(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)
    
  3. 前端调用示例(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));
    
  4. 服务部署说明
    • 启动服务:python main.py,通过http://localhost:8000/docs可测试API;
    • 端侧部署:可在本地服务器或边缘设备(如Jetson AGX Orin)部署,满足导航网站低延迟需求。

五、端侧推理优化技巧

  1. 模型量化:使用GGUF、GPTQ量化模型(如7B模型量化后显存占用从14GB降至4-6GB),推荐工具llama.cppauto - gptq
  2. 显存管理:设置dtype="float16""bfloat16",关闭不必要的KV缓存(短文本场景);
  3. 参数调优:短文本生成时减小max_model_len,批量任务时增大tensor_parallel_size(多GPU);
  4. 模型选型:端侧优先选择7B/13B参数模型,如LLaMA - 2、Mistral - 7B,兼顾性能与效果。

六、常见问题排查

  1. 显存溢出
    • 解决方案:使用量化模型、降低max_model_len、切换dtypefloat16
  2. 模型加载失败
    • 原因:模型路径错误、Hugging Face权限不足;
    • 解决方案:检查路径,登录Hugging Face(huggingface - cli login);
  3. 推理速度慢
    • 解决方案:启用连续批处理(默认开启)、减少temperature、使用异步推理(AsyncLLM)。
Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐