vLLM使用教程:优化大型语言模型推理
大型语言模型(LLM)在人工智能领域取得了显著进展,但其推理过程面临着内存消耗大、推理速度慢以及GPU资源利用率低等挑战。为了解决这些问题,加州大学伯克利分校Sky Computing Lab开发了vLLM(Virtual Large Language Model),一个专为LLM推理和部署设计的高吞吐量、内存高效的开源库。vLLM通过引入创新技术,能够显著提升LLM的推理效率和吞吐量,最高可达传统方法的24倍,同时减少GPU内存使用和响应时间,从而降低运营成本。
vLLM的核心优势与特性
vLLM之所以能实现卓越的性能,主要归功于其两大核心技术和一系列优化功能:
-
PagedAttention(分页注意力机制)
- 原理: PagedAttention是vLLM的核心创新,灵感来源于操作系统中的虚拟内存和分页机制。它将LLM推理过程中存储注意力键值(KV)缓存的内存划分为固定大小的“块”或“页”,允许KV缓存以非连续的方式存储。
- 优势: 这种机制极大地减少了内存浪费(最高可达96%),解决了传统方法中KV缓存连续分配导致的内存碎片化问题。通过高效的内存管理,PagedAttention能够支持更大的批处理大小和更长的序列长度,从而提高GPU利用率和吞吐量。
-
Continuous Batching(连续批处理)
- 原理: 传统的LLM推理通常采用静态批处理,即服务器等待收集到固定数量的请求后才开始处理,这会导致延迟。vLLM的连续批处理机制则不同,它能够动态地将新到达的请求添加到正在进行的批处理中,并在序列生成完成后立即用新请求替换已完成的序列。
- 优势: 这种动态调度方式最大限度地提高了GPU的利用率,减少了GPU空闲时间,并显著降低了请求的延迟,尤其是在处理突发性流量时表现出色。
其他重要特性:
- 快速模型执行: 利用CUDA/HIP图进行快速模型执行。
- 量化支持: 支持多种量化技术,如GPTQ、AWQ、INT4、INT8和FP8,进一步优化模型性能并减少内存占用。
- 优化CUDA内核: 集成了FlashAttention和FlashInfer等优化过的CUDA内核。
- 推测解码 (Speculative Decoding): 通过使用小型草稿模型预测,大型模型验证的方式,满足低延迟需求。
- 分布式推理: 支持张量并行 (Tensor Parallelism)、流水线并行 (Pipeline Parallelism)、数据并行 (Data Parallelism) 和专家并行 (Expert Parallelism),适用于多GPU和多节点部署。
- Hugging Face模型集成: 与Hugging Face上的流行模型无缝集成。
- OpenAI兼容API服务器: 提供一个与OpenAI API兼容的服务器接口,方便现有应用快速迁移和集成。
- 流式输出: 支持流式生成输出,实现实时处理和交付模型输出。
vLLM 安装教程
在安装vLLM之前,请确保您的系统满足以下先决条件:
- 操作系统: Linux (推荐Ubuntu 20.04/22.04)。
- Python版本: 3.8至3.12 (推荐3.10+,最新版本推荐3.12+)。
- GPU: 兼容的NVIDIA GPU,计算能力 (compute capability) 7.0或更高 (例如V100, T4, RTX20xx, A100, L4, H100)。
- NVIDIA驱动: 已安装NVIDIA驱动 (推荐535+版本)。
- CUDA: CUDA 11.8+ 支持。
推荐安装步骤 (使用pip):
-
创建并激活Python虚拟环境 (推荐使用Conda):
bash
conda create -n vllm_env python=3.10 -y
conda activate vllm_env -
安装vLLM:
虽然Conda可以管理Python环境,但强烈建议使用pip来安装vLLM,以避免PyTorch和NCCL之间的潜在兼容性问题。
bash
pip install --upgrade pip # 确保pip是最新版本
pip install vllm
如果您需要特定CUDA版本的PyTorch,可以先手动安装PyTorch,然后安装vLLM。例如,对于CUDA 11.8:
bash
conda install pytorch torchvision torchaudio pytorch-cuda=11.8 -c pytorch -c nvidia
pip install vllm -
验证安装:
运行以下命令检查vLLM是否成功安装:
bash
python -c "import vllm; print(vllm.__version__)"
如果安装成功,将打印vLLM的版本号。
其他安装方式:
- Docker: vLLM提供官方Docker镜像,可以简化部署过程,避免本地环境配置问题。
- 从源代码安装: 如果您需要修改C++或CUDA代码,或者需要针对特定CUDA版本进行编译,可以从源代码安装。
vLLM 基本使用 (Python API)
通过Python API使用vLLM进行离线推理非常简单。以下是一个基本示例:
“`python
from vllm import LLM, SamplingParams
1. 定义采样参数
temperature: 控制生成文本的随机性,值越高越随机。
top_p: 核采样参数,只考虑累积概率达到top_p的最高概率词元。
max_tokens: 生成的最大词元数量。
sampling_params = SamplingParams(temperature=0.8, top_p=0.95, max_tokens=100)
2. 加载LLM模型
指定要加载的模型名称。vLLM支持Hugging Face上的大多数模型。
示例中使用的是一个较小的模型,您可以替换为其他模型,如 “deepseek-ai/DeepSeek-R1-Distill-Qwen-7B”。
vLLM会自动下载并加载模型到GPU内存。
llm = LLM(model=”facebook/opt-125m”)
3. 准备输入提示
prompts = [
“Explain quantum computing in simple terms.”,
“The largest country in the world is “,
“What is the capital of France?”,
]
4. 执行推理
outputs = llm.generate(prompts, sampling_params)
5. 打印生成结果
for output in outputs:
prompt = output.prompt
generated_text = output.outputs[0].text
print(f”Prompt: {prompt!r}, Generated text: {generated_text!r}”)
``LLM
在上述代码中,类是vLLM引擎运行离线推理的主要接口,而SamplingParams`则用于指定采样过程的参数。
vLLM 高级用法与优化
vLLM提供了多种高级功能和优化策略,以进一步提升LLM的推理性能和部署灵活性。
-
启动OpenAI兼容API服务器
vLLM可以部署为一个实现OpenAI API协议的服务器,这使得它能够作为OpenAI API的替代品,方便现有应用集成。“`bash
启动vLLM服务器,指定模型
默认在 http://localhost:8000 监听
python -m vllm.entrypoints.openai.api_server –model facebook/opt-125m
``curl`或OpenAI Python客户端进行交互:
启动服务器后,您可以使用使用
curl查询:
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
from openai import OpenAI修改OpenAI的API密钥和API基础URL以使用vLLM的API服务器
openai_api_key = “EMPTY” # vLLM服务器默认不需要API Key,但客户端可能需要
openai_api_base = “http://localhost:8000/v1”client = OpenAI(
api_key=openai_api_key,
base_url=openai_api_base,
)response = client.completions.create(
model=”facebook/opt-125m”,
prompt=”Hello, my name is”,
max_tokens=50,
temperature=0.7
)
print(response.choices[0].text)
``–host
您还可以通过和–port`参数指定服务器地址。 -
多GPU推理优化
在多GPU环境中部署LLM时,正确配置vLLM至关重要。- 张量并行 (Tensor Parallelism): 始终使用
--tensor-parallel-size=N参数来充分利用多GPU设置,其中N是您希望使用的GPU数量。 - 避免
TP=1的陷阱: 在多GPU机器上设置--tensor-parallel-size 1会导致严重的性能下降,因为vLLM的分布式推理设计即使在单GPU模式下也会与多个GPU交互。
“`bash
在4个GPU上运行模型,启用张量并行
python -m vllm.entrypoints.openai.api_server –model your_model_name –tensor-parallel-size 4
“` - 张量并行 (Tensor Parallelism): 始终使用
-
量化 (Quantization)
量化是一种通过降低模型权重和激活值的精度来减少模型大小和内存占用的技术,同时可以加速推理。vLLM支持多种量化方法,如GPTQ、AWQ、INT4、INT8和FP8。在加载模型时,可以通过dtype参数指定数据类型,例如dtype="half"(FP16) 或dtype="bfloat16"。对于量化模型,vLLM会自动处理。 -
KV缓存优化
PagedAttention是KV缓存优化的核心。此外,您还可以通过调整--max-num-seqs参数来控制最大批处理大小,以适应不同的吞吐量和延迟需求。“`bash
调整最大批处理序列数量
python -m vllm.entrypoints.openai.api_server –model your_model_name –max-num-seqs 512 # 适用于高吞吐量场景
“` -
推测解码 (Speculative Decoding)
对于对延迟要求较高的应用,vLLM支持推测解码。它使用一个较小的草稿模型快速生成候选词元,然后由大型模型进行验证,从而加速生成过程。“`bash
启用推测解码
python -m vllm.entrypoints.openai.api_server –model large_model –speculative-model small_draft_model –num-speculative-tokens 5
“` -
监控与指标
为了更好地理解和优化vLLM的性能,您可以利用工具进行监控:- GPU性能: 使用
nvidia-smi dmon监控GPU利用率、内存带宽等。 - vLLM内置指标: vLLM提供内置指标,可以通过访问
http://localhost:8000/metrics(如果API服务器正在运行) 来获取。
- GPU性能: 使用
通过以上教程,您可以开始使用vLLM来优化您的大型语言模型推理任务,实现更高的吞吐量和更低的延迟。