Skip to content

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/bash

2.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.95

5. 性能基准测试 (Benchmark)

在 NVIDIA A100 (80GB) 上的实测数据(Llama-2-7B, Output 128 tokens)。

引擎Batch Size吞吐量 (Tokens/s)显存占用 (GB)
HuggingFace1648024.5
vLLM (FP16)162100 (4.3x)16.2
vLLM (FP16)256385072.0

总结:vLLM 通过压榨显存碎片,使得在相同硬件下能支撑的并发量(Batch Size)大幅提升,从而获得数倍的吞吐量增长。

AI-HPC Organization