LLM 推理引擎:vLLM 架构与实战
在 LLM 的生产落地中,推理系统面临着高吞吐(Throughput)与低延迟(Latency)的双重挑战。vLLM 凭借其革命性的内存管理技术,已成为当前开源界事实上的推理标准。
1. 核心技术解析
1.1 PagedAttention:解决显存碎片
传统的推理引擎(如 HuggingFace Transformers)通常需要预分配连续的显存空间,导致高达 60%-80% 的显存浪费(Fragmentation)。
vLLM 引入了操作系统中 虚拟内存 的概念:
- KV Cache 分页:将 KV Cache 切分为固定大小的块(Block),如每块存储 16 个 Token。
- 非连续存储:逻辑上连续的 Tensor,在物理显存中可以是不连续的。
- 动态映射:通过页表(Page Table)记录逻辑块与物理块的映射关系,实现按需分配。
1.2 Continuous Batching:极致调度
传统批处理(Static Batching)必须等待 Batch 中所有请求都完成后才能开始下一批,导致“短跑拼命等长跑”。
vLLM 实现了 Continuous Batching (Orca 机制):
- 迭代级调度:一旦某个请求生成结束([EOS]),立即将该槽位释放给等待队列中的新请求。
- 零气泡:GPU 计算单元始终处于忙碌状态,不再有空转等待。
2. 快速上手 (Quick Start)
2.1 环境准备
推荐使用 Docker 容器以避免 CUDA 版本冲突。
bash
# 基于官方镜像
docker run --gpus all -it --rm \
-v ~/.cache/huggingface:/root/.cache/huggingface \
vllm/vllm-openai:latest /bin/bash2.2 离线推理 (Python SDK)
适合离线批处理任务(如数据清洗、RAG 向量库构建)。
python
from vllm import LLM, SamplingParams
# 1. 加载模型 (自动处理 Tensor Parallelism)
llm = LLM(model="meta-llama/Meta-Llama-3-8B-Instruct", tensor_parallel_size=1)
# 2. 设置采样参数 (Temperature=0.8, Top-P=0.95, Max_Tokens=512)
sampling_params = SamplingParams(temperature=0.8, top_p=0.95, max_tokens=512)
# 3. 准备 Prompts
prompts = [
"Explain the PagedAttention algorithm in one sentence.",
"Write a Python function to calculate Fibonacci numbers.",
]
# 4. 执行推理
outputs = llm.generate(prompts, sampling_params)
for output in outputs:
print(f"Prompt: {output.prompt}")
print(f"Generated: {output.outputs[0].text}")
print("-" * 20)3. 生产级服务部署
vLLM 提供了一个兼容 OpenAI API 的高性能 HTTP 服务器。
3.1 启动 API Server
bash
python -m vllm.entrypoints.openai.api_server \
--model meta-llama/Meta-Llama-3-70B-Instruct \
--tensor-parallel-size 4 \
--host 0.0.0.0 \
--port 8000 \
--gpu-memory-utilization 0.9 \
--max-num-seqs 256--tensor-parallel-size 4: 使用 4 张卡进行张量并行。--max-num-seqs 256: 最大并发序列数(控制吞吐量上限)。
3.2 流式调用 (Streaming)
流式输出能显著降低用户的“首字延迟感”(TTFT)。
python
import openai
client = openai.OpenAI(
base_url="http://localhost:8000/v1",
api_key="EMPTY",
)
stream = client.chat.completions.create(
model="meta-llama/Meta-Llama-3-70B-Instruct",
messages=[{"role": "user", "content": "用 500 字介绍一下量子力学"}],
stream=True,
)
print("Response: ", end="", flush=True)
for chunk in stream:
if chunk.choices[0].delta.content:
print(chunk.choices[0].delta.content, end="", flush=True)4. 进阶优化:AWQ 量化
对于显存受限场景,量化(Quantization)是必选项。vLLM 对 AWQ (Activation-aware Weight Quantization) 支持最好。
4.1 优势
- 显存减半:4-bit 量化可将模型体积压缩至 FP16 的 1/4 左右(实际运行时约为 1/2 到 1/3,因为 KV Cache 不压缩)。
- 速度提升:显存带宽压力减小,推理速度通常提升 1.5x - 2x。
4.2 部署 AWQ 模型
直接加载 HuggingFace 上的 AWQ 版本模型:
bash
python -m vllm.entrypoints.openai.api_server \
--model TheBloke/Llama-2-70B-Chat-AWQ \
--quantization awq \
--dtype half \
--gpu-memory-utilization 0.955. 性能基准测试 (Benchmark)
在 NVIDIA A100 (80GB) 上的实测数据(Llama-2-7B, Output 128 tokens)。
| 引擎 | Batch Size | 吞吐量 (Tokens/s) | 显存占用 (GB) |
|---|---|---|---|
| HuggingFace | 16 | 480 | 24.5 |
| vLLM (FP16) | 16 | 2100 (4.3x) | 16.2 |
| vLLM (FP16) | 256 | 3850 | 72.0 |
总结:vLLM 通过压榨显存碎片,使得在相同硬件下能支撑的并发量(Batch Size)大幅提升,从而获得数倍的吞吐量增长。
