- PagedAttention 与 KV Cache 优化
- 分页内存管理:借鉴操作系统虚拟内存的分页机制,将每个序列的键值缓存(KV Cache)划分为固定大小的块(Block),支持非连续存储,减少内存碎片。
- 共享内存块:对于同一提示(prompt)生成的多个序列(如 Beam Search),共享基础块的 KV Cache,避免重复存储。
- 高效内存分配:通过 Block 池动态管理内存,显著降低长序列场景下的显存占用,提升吞吐量。
- 连续批处理(Continuous Batching)
- 动态请求调度:将不同长度的请求动态合并为批次,自动处理新请求的插入和完成请求的释放,最大化 GPU 利用率。
- 异步处理:允许批次中的部分请求完成后立即释放资源,无需等待整个批次结束。
- 优化的注意力计算
- 分块计算:将长序列的注意力计算分解为小块,减少中间显存占用。
- 自定义 CUDA 核:针对可变序列长度和分页结构优化注意力计算,提升计算效率。
- 模型并行与量化支持
- 张量并行:支持多 GPU 分布式推理,扩展模型规模。
- 量化兼容:集成 AWQ、GPTQ 等量化方案,降低显存需求。
- 零冗余的预填充与解码
- 分离预填充与解码阶段:对输入提示(Prefill)和生成(Decode)阶段分别优化,减少计算冗余。
二、vLLM 源码阅读指南
1. 源码结构概览
- 核心目录:
vllm/core:调度器、块管理、内存分配逻辑。
vllm/model_executor:模型实现(如 LLAMA、GPT-2 的适配层)。
vllm/worker:分布式推理的工作节点逻辑。
vllm/engine:推理引擎入口(异步处理、请求调度)。
vllm/attention:注意力机制实现(含自定义 CUDA 核)。
2. 关键代码入口
- 推理流程:从
AsyncLLMEngine.generate()(vllm/engine/async_llm_engine.py)开始,跟踪请求处理流程。
- 模型加载:查看
model_executor 下的模型加载代码(如 llama.py),了解如何适配不同架构。
- 注意力机制:重点阅读
vllm/attention 下的代码,尤其是 ops 目录中的 CUDA 核实现。
3. 核心模块解析
- Block 管理(
vllm/core/block_manager.py):
BlockAllocator 负责分配和回收内存块。
BlockSpaceManager 跟踪每个序列的块使用情况。
- 调度器(
vllm/core/scheduler.py):
- 注意力计算(
vllm/attention/layer_attention.py):
- 集成 PagedAttention 的分块计算逻辑,调用
vllm/attention/ops/paged_attention.py 中的 CUDA 核。
4. 调试与实验
- 日志输出:启用 DEBUG 日志(设置
VLLM_DEBUG=1)观察请求调度和内存分配。
- 性能分析:使用
nsight-systems 或 PyTorch Profiler 分析 CUDA 核的执行效率。
- 定制测试:修改测试用例(
tests/ 目录),验证特定优化效果。