大模型推理加速工具 —— 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 等)
完整支持列表
| Architecture | Models | Example HuggingFace Models |
|---|---|---|
BaiChuanForCausalLM | Baichuan | baichuan-inc/Baichuan-7B, baichuan-inc/Baichuan-13B-Chat, etc. |
BloomForCausalLM | BLOOM, BLOOMZ, BLOOMChat | bigscience/bloom, bigscience/bloomz, etc. |
FalconForCausalLM | Falcon | tiiuae/falcon-7b, tiiuae/falcon-40b, tiiuae/falcon-rw-7b, etc. |
GPT2LMHeadModel | GPT-2 | gpt2, gpt2-xl, etc. |
GPTBigCodeForCausalLM | StarCoder, SantaCoder, WizardCoder | bigcode/starcoder, bigcode/gpt_bigcode-santacoder, WizardLM/WizardCoder-15B-V1.0, etc. |
GPTJForCausalLM | GPT-J | EleutherAI/gpt-j-6b, nomic-ai/gpt4all-j, etc. |
GPTNeoXForCausalLM | GPT-NeoX, Pythia, OpenAssistant, Dolly V2, StableLM | EleutherAI/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. |
LlamaForCausalLM | LLaMA, LLaMA-2, Vicuna, Alpaca, Koala, Guanaco | meta-llama/Llama-2-13b-hf, openlm-research/open_llama_13b, lmsys/vicuna-13b-v1.3, young-geng/koala, JosephusCheung/Guanaco, etc. |
MPTForCausalLM | MPT, MPT-Instruct, MPT-Chat, MPT-StoryWriter | mosaicml/mpt-7b, mosaicml/mpt-7b-storywriter, mosaicml/mpt-30b, etc. |
OPTForCausalLM | OPT, OPT-IML | facebook/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 缓存存储在连续的内存空间中,这导致:
- 内存碎片化:生成新 token 时需要动态扩展,但连续内存空间有限
- 内存浪费:预留的内存空间往往大于实际需求
- 显存瓶颈:单个 GPU 无法处理大量并发请求
📝通俗解释:就像你在餐厅排队,传统方法要求每个人必须紧挨着站在一起,这样既浪费空间,又不方便有人加入或离开。
2.2 PagedAttention 的创新
PagedAttention 借鉴了操作系统中的虚拟内存分页机制,将 KV 缓存分成固定大小的"页面"进行管理:
- 非连续存储:无需预先分配连续内存空间
- 按需分配:只分配实际需要的页面
- 共享内存:不同请求可以共享相同的页面
📝通俗解释:就像图书馆的座位管理系统——不需要所有人坐在一起,可以分散坐,而且有人离开后空出的座位马上可以被其他人使用。
三、vLLM 依赖包
| 依赖项 | 要求 |
|---|---|
| 操作系统 | Linux |
| Python | 3.8 或更高版本 |
| CUDA | 11.0 – 11.8 |
| GPU | 计算能力 7.0 或更高(如 V100、T4、RTX 20xx、A100、L4 等) |
📝通俗解释:vLLM需要Linux系统、Python编程环境、NVIDIA显卡和CUDA驱动——就像你需要合适的场地、设备和工具才能开始工作。
四、vLLM 安装
4.1 构建环境
# 创建新环境
$ conda create -n py310_chat python=3.10
# 激活环境
$ conda activate py310_chat
# 或者 source activate py310_chat(取决于conda版本)4.2 vLLM 安装
4.2.1 使用 pip 安装(推荐)
$ pip install vllm📝通俗解释:pip安装就像用应用商店下载APP,简单快捷,适合大多数用户。
4.2.2 使用源码安装
# 克隆源码仓库
$ git clone https://github.com/vllm-project/vllm.git
$ cd vllm
# 安装(可能需要5-10分钟)
$ pip install -e .📝通俗解释:源码安装就像自己组装家具——需要更多时间,但可以自定义配置,适合高级用户和开发者。
五、vLLM 使用
5.1 vLLM 离线推理
在使用 vLLM 进行离线推理任务时,需要导入 vLLM 并在 Python 脚本中使用 LLM 类。
# 导包
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 类来支持异步处理传入请求。
启动服务
$ python -m vllm.entrypoints.openai.api_server --model lmsys/vicuna-7b-v1.3默认情况下,服务启动在 http://localhost:8000
📝通俗解释:在线推理就像餐厅的服务员——你随时可以点餐,服务员会立即响应,适合实时应用。
调用服务
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,不需要改代码。
启动服务
python -m vllm.entrypoints.openai.api_server \
--model facebook/opt-125m默认情况下,服务启动在 http://localhost:8000,可使用 --host 和 --port 参数指定地址。
查询可用模型
$ curl http://localhost:8000/v1/models使用模型生成文本
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 包调用
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
$ pip install ray6.2 多 GPU 推理
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 服务
python -m vllm.entrypoints.openai.api_server \
--model facebook/opt-13b \
--tensor-parallel-size 46.4 多机分布式
# 在主节点启动
ray start --head
# 在工作节点启动
ray start --address=<ray-head-address>之后,可以在多台机器上运行推理和服务,方法是在 head 节点上启动 vLLM 进程,将 tensor_parallel_size 设置为所有机器上的 GPU 总数。
📝通俗解释:多机分布式就像连锁餐厅——不仅厨房里有多个厨师,不同城市的餐厅也能一起协作,同时为更多顾客服务。
七、常见问题与最佳实践
7.1 常见问题
- 显存不足:减小
max_num_seqs参数或使用更小的模型 - 安装失败:确保 CUDA 版本兼容,检查 PyTorch 版本
- 模型加载慢:首次加载需要下载模型权重耐心等待
7.2 性能优化建议
- 使用量化模型(如 AWQ、GPTQ)减少显存占用
- 合理设置
max_num_seqs控制并发数 - 使用流式输出提升用户体验
参考资料
- vLLM 官网:https://vllm.ai/
- vLLM 文档:https://vllm.readthedocs.io/
- GitHub:https://github.com/vllm-project/vllm