Skip to content

大模型推理加速工具 —— vLLM

来自:AiGC面试宝典

作者:宁静致远

日期:2023年09月29日

官网: https://vllm.ai/官方文档: https://vllm.readthedocs.io/en/latest/getting_started/installation.html源码: https://github.com/vllm-project/vllm


一、引言

1.1 前言

随着大语言模型(LLM)的不断发展,这些模型在很大程度上改变了人类使用 AI 的方式。然而,实际上为这些模型提供服务仍然存在挑战,即使在昂贵的硬件上也可能慢得惊人。

📝通俗解释:大语言模型就像一个超级大脑,能够回答问题、写文章、编程等。但是让这个"大脑"工作很困难——它需要强大的计算能力,即使有最好的显卡,响应速度也可能很慢。这就是vLLM要解决的问题。

现在这种限制正在被打破。最近,来自加州大学伯克利分校的研究者开源了一个项目 vLLM,该项目主要用于快速 LLM 推理和服务。vLLM 的核心是 PagedAttention,这是一种新颖的注意力算法,它将在操作系统虚拟内存中分页的经典思想引入到 LLM 服务中。

配备了 PagedAttention 的 vLLM 将 LLM 服务的性能提升到了新高度:它比 HuggingFace Transformers 提供高达 24 倍的吞吐量,而无需任何模型架构更改。

📝通俗解释:PagedAttention的灵感来源于操作系统的内存管理方式。就像操作系统会把内存分成页面来管理一样,vLLM把注意力机制中的"键"和"值"也分成小页面来管理,这样就能更高效地利用GPU内存,处理更多的请求。

1.2 为什么需要 vLLM?

简言之,vLLM 是一个开源的 LLM 推理和服务引擎。它利用了全新的注意力算法「PagedAttention」,有效地管理注意力键和值。

配备全新算法的 vLLM,重新定义了 LLM 服务的最新技术水平:

与 HuggingFace Transformers 相比,它提供高达 24 倍的吞吐量,而无需进行任何模型架构更改。

📝通俗解释:想象一下,HuggingFace 是用一个勺子舀水,而 vLLM 用了消防水管——它们都能完成任务,但速度相差24倍!而且你不需要改变模型本身,直接就能用。

值得一提的是,「小羊驼」Vicuna 在 demo 中用到的就是 FastChat 和 vLLM 的集成。

正如研究者所称,vLLM 最大的优势在于——提供易用、快速、便宜的 LLM 服务。

这意味着,未来,即使对于像 LMSYS 这样计算资源有限的小型研究团队也能轻松部署自己的 LLM 服务。

1.3 vLLM 具有哪些特点?

  • 最先进的服务吞吐量:比现有方案快很多倍
  • PagedAttention:可以有效地管理注意力的键和值
  • 动态批处理请求:自动优化多个请求的处理顺序
  • 优化好的 CUDA 内核:充分发挥 GPU 性能
  • 与流行的 HuggingFace 模型无缝集成:直接支持大多数主流模型
  • 高吞吐量服务与各种解码算法:支持并行采样、beam search 等
  • 张量并行:支持分布式推理
  • 流输出:支持流式响应
  • 兼容 OpenAI 的 API 服务:可以直接替换 OpenAI API 使用

📝通俗解释:vLLM就像一个全能的服务员,它知道如何最有效地利用GPU资源,同时支持多种模型和高级功能,而且用起来和OpenAI的API一样简单。

1.4 vLLM 支持哪些 HuggingFace 模型?

常见模型系列

  • GPT-2 (gpt2、gpt2-xl 等)
  • GPTNeoX (EleutherAI/gpt-neox-20b、databricks/dolly-v2-12b、stabilityai/stablelm-tuned-alpha-7b 等)
  • LLaMA (lmsys/vicuna-13b-v1.3、young-geng/koala、openlm-research/open_llama_13b 等)
  • OPT (facebook/opt-66b、facebook/opt-iml-max-30b 等)

完整支持列表

ArchitectureModelsExample HuggingFace Models
BaiChuanForCausalLMBaichuanbaichuan-inc/Baichuan-7B, baichuan-inc/Baichuan-13B-Chat, etc.
BloomForCausalLMBLOOM, BLOOMZ, BLOOMChatbigscience/bloom, bigscience/bloomz, etc.
FalconForCausalLMFalcontiiuae/falcon-7b, tiiuae/falcon-40b, tiiuae/falcon-rw-7b, etc.
GPT2LMHeadModelGPT-2gpt2, gpt2-xl, etc.
GPTBigCodeForCausalLMStarCoder, SantaCoder, WizardCoderbigcode/starcoder, bigcode/gpt_bigcode-santacoder, WizardLM/WizardCoder-15B-V1.0, etc.
GPTJForCausalLMGPT-JEleutherAI/gpt-j-6b, nomic-ai/gpt4all-j, etc.
GPTNeoXForCausalLMGPT-NeoX, Pythia, OpenAssistant, Dolly V2, StableLMEleutherAI/gpt-neox-20b, EleutherAI/pythia-12b, OpenAssistant/oasst-sft-4-pythia-12b-epoch-3.5, databricks/dolly-v2-12b, stabilityai/stablelm-tuned-alpha-7b, etc.
LlamaForCausalLMLLaMA, LLaMA-2, Vicuna, Alpaca, Koala, Guanacometa-llama/Llama-2-13b-hf, openlm-research/open_llama_13b, lmsys/vicuna-13b-v1.3, young-geng/koala, JosephusCheung/Guanaco, etc.
MPTForCausalLMMPT, MPT-Instruct, MPT-Chat, MPT-StoryWritermosaicml/mpt-7b, mosaicml/mpt-7b-storywriter, mosaicml/mpt-30b, etc.
OPTForCausalLMOPT, OPT-IMLfacebook/opt-66b, facebook/opt-iml-max-30b, etc.

📝通俗解释:vLLM支持很多主流的开源大模型,就像一个多语言的翻译器,能听懂并处理很多种"语言"(模型架构)。

1.5 性能对比

LLaMA-13B, A100-40GB

  • vLLM 吞吐量比 HF 高 14 倍 - 24 倍
  • vLLM 吞吐量比 TGI 高 2.2 倍 - 2.5 倍

LLaMA-7B, A10G

  • vLLM 吞吐量比 HF 高 8.5 - 15 倍
  • vLLM 吞吐量比 TGI 高 3.3 - 3.5 倍

📝通俗解释:性能对比就像赛车比赛。HF( HuggingFace)相当于普通赛车,TGI(Text Generation Inference)相当于改装车,而vLLM就是F1赛车——速度完全不在一个级别。


二、PagedAttention 核心原理

2.1 传统注意力机制的内存问题

在大语言模型推理过程中,注意力机制需要存储所有的键(Key)和值(Value)向量。传统方法将所有 KV 缓存存储在连续的内存空间中,这导致:

  1. 内存碎片化:生成新 token 时需要动态扩展,但连续内存空间有限
  2. 内存浪费:预留的内存空间往往大于实际需求
  3. 显存瓶颈:单个 GPU 无法处理大量并发请求

📝通俗解释:就像你在餐厅排队,传统方法要求每个人必须紧挨着站在一起,这样既浪费空间,又不方便有人加入或离开。

2.2 PagedAttention 的创新

PagedAttention 借鉴了操作系统中的虚拟内存分页机制,将 KV 缓存分成固定大小的"页面"进行管理:

  • 非连续存储:无需预先分配连续内存空间
  • 按需分配:只分配实际需要的页面
  • 共享内存:不同请求可以共享相同的页面

📝通俗解释:就像图书馆的座位管理系统——不需要所有人坐在一起,可以分散坐,而且有人离开后空出的座位马上可以被其他人使用。


三、vLLM 依赖包

依赖项要求
操作系统Linux
Python3.8 或更高版本
CUDA11.0 – 11.8
GPU计算能力 7.0 或更高(如 V100、T4、RTX 20xx、A100、L4 等)

📝通俗解释:vLLM需要Linux系统、Python编程环境、NVIDIA显卡和CUDA驱动——就像你需要合适的场地、设备和工具才能开始工作。


四、vLLM 安装

4.1 构建环境

bash
# 创建新环境
$ conda create -n py310_chat python=3.10

# 激活环境
$ conda activate py310_chat
# 或者 source activate py310_chat(取决于conda版本)

4.2 vLLM 安装

4.2.1 使用 pip 安装(推荐)

bash
$ pip install vllm

📝通俗解释:pip安装就像用应用商店下载APP,简单快捷,适合大多数用户。

4.2.2 使用源码安装

bash
# 克隆源码仓库
$ git clone https://github.com/vllm-project/vllm.git
$ cd vllm

# 安装(可能需要5-10分钟)
$ pip install -e .

📝通俗解释:源码安装就像自己组装家具——需要更多时间,但可以自定义配置,适合高级用户和开发者。


五、vLLM 使用

5.1 vLLM 离线推理

在使用 vLLM 进行离线推理任务时,需要导入 vLLM 并在 Python 脚本中使用 LLM 类。

python
# 导包
from vllm import LLM, SamplingParams

# 定义输入 prompt
prompts = [
    "Hello, my name is",
    "The president of the United States is",
    "The capital of France is",
    "The future of AI is",
]

# 设置采样参数:温度0.8,核采样概率0.95
sampling_params = SamplingParams(temperature=0.8, top_p=0.95)

# 初始化 vLLM 引擎
llm = LLM(model="facebook/opt-125m")

# 生成结果
outputs = llm.generate(prompts, sampling_params)

# 打印输出结果
for output in outputs:
    prompt = output.prompt
    generated_text = output.outputs[0].text
    print(f"Prompt: {prompt!r}, Generated text: {generated_text!r}")

📝通俗解释:离线推理就像批量处理任务——你一次性给模型多个问题,它一次性给出所有答案,适合需要大量处理的任务。

参数说明

  • temperature:控制输出的随机性,值越大越随机,越小越确定性
  • top_p:核采样参数,控制候选词的多样性

⚠️ 注意:目前 vLLM 并不支持所有 LLM,具体可查看 supported-models

5.2 vLLM 在线推理(API 服务)

vLLM 可以作为 LLM 服务进行部署。服务器使用 AsyncLLMEngine 类来支持异步处理传入请求。

启动服务

bash
$ python -m vllm.entrypoints.openai.api_server --model lmsys/vicuna-7b-v1.3

默认情况下,服务启动在 http://localhost:8000

📝通俗解释:在线推理就像餐厅的服务员——你随时可以点餐,服务员会立即响应,适合实时应用。

调用服务

bash
curl http://localhost:8000/generate \
    -d '{
        "prompt": "San Francisco is a",
        "use_beam_search": true,
        "n": 4,
        "temperature": 0
    }'

5.3 OpenAI 兼容服务器

vLLM 可以部署为模仿 OpenAI API 协议的服务器。这允许 vLLM 被用作使用 OpenAI API 的应用程序的插入式替代

📝通俗解释:就像一个翻译器能把中文翻译成英文,vLLM的OpenAI兼容模式能让原本用OpenAI API的程序无缝切换到vLLM,不需要改代码。

启动服务

bash
python -m vllm.entrypoints.openai.api_server \
    --model facebook/opt-125m

默认情况下,服务启动在 http://localhost:8000,可使用 --host--port 参数指定地址。

查询可用模型

bash
$ curl http://localhost:8000/v1/models

使用模型生成文本

bash
curl http://localhost:8000/v1/completions \
    -H "Content-Type: application/json" \
    -d '{
        "model": "facebook/opt-125m",
        "prompt": "San Francisco is a",
        "max_tokens": 7,
        "temperature": 0
    }'

使用 OpenAI Python 包调用

python
import openai

# 配置 OpenAI 使用 vLLM 的 API 服务器
openai.api_key = "EMPTY"
openai.api_base = "http://localhost:8000/v1"

# 调用模型
completion = openai.Completion.create(
    model="facebook/opt-125m",
    prompt="San Francisco is a"
)

print("Completion result:", completion)

六、vLLM 分布式推理与服务

vLLM 支持分布式张量并行推理和服务。目前支持 Megatron-LM 的张量并行算法,使用 Ray 管理分布式运行时。

📝通俗解释:分布式推理就像让多个厨师同时做菜——一个人忙不过来,那就多叫几个人一起干,速度更快。

6.1 安装 Ray

bash
$ pip install ray

6.2 多 GPU 推理

python
from vllm import LLM

# 在 4 个 GPU 上运行推理
llm = LLM("facebook/opt-13b", tensor_parallel_size=4)
output = llm.generate("San Francisco is a")

6.3 多 GPU 服务

bash
python -m vllm.entrypoints.openai.api_server \
    --model facebook/opt-13b \
    --tensor-parallel-size 4

6.4 多机分布式

bash
# 在主节点启动
ray start --head

# 在工作节点启动
ray start --address=<ray-head-address>

之后,可以在多台机器上运行推理和服务,方法是在 head 节点上启动 vLLM 进程,将 tensor_parallel_size 设置为所有机器上的 GPU 总数。

📝通俗解释:多机分布式就像连锁餐厅——不仅厨房里有多个厨师,不同城市的餐厅也能一起协作,同时为更多顾客服务。


七、常见问题与最佳实践

7.1 常见问题

  1. 显存不足:减小 max_num_seqs 参数或使用更小的模型
  2. 安装失败:确保 CUDA 版本兼容,检查 PyTorch 版本
  3. 模型加载慢:首次加载需要下载模型权重耐心等待

7.2 性能优化建议

  • 使用量化模型(如 AWQ、GPTQ)减少显存占用
  • 合理设置 max_num_seqs 控制并发数
  • 使用流式输出提升用户体验

参考资料

基于 MIT 许可发布