【vllm】vLLM v1 Attention — 系统级架构深度分析(五)

vLLM v1 Attention --- 系统级架构深度分析

分析范围:vllm/v1/attention/ 目录,53个Python文件,~25.8K行代码。

Attention 是 v1 推理系统的"计算核心"------所有 GPU 上实际发生的 Attention 计算都由本模块驱动。

Dark Terminal 风格架构图 10 张,见 diagrams/ 子目录。


一、整体架构概览

1.1 设计思路

v1 Attention 采用 插件式架构 + 策略选择 设计:

  1. 抽象基类统一接口AttentionBackend(ABC) 定义所有 Attention 后端的契约
  2. 25+后端可插拔:FlashAttention / FlashInfer / Triton / MLA / ROCm / CPU / SSM 等
  3. 自动选择机制get_attn_backend() 根据硬件/模型/配置自动选择最优后端
  4. 三层分离:Backend(接口)→ MetadataBuilder(元数据构建)→ Impl(执行)→ Ops(Triton内核)
  5. 运行时可覆盖register_backend() 支持运行时替换任意后端实现

核心设计哲学:

  • 硬件适配:不同 GPU 平台(NVIDIA/AMD/Intel/CPU)有不同最优后端
  • 模型适配:MLA / Mamba / GDN / TurboQuant 等特殊注意力机制有专属后端
  • 性能优先:FlashInfer(1846行)和FlashAttn(1214行)是最优化的两个后端
  • 可扩展性AttentionBackendEnum.CUSTOM + register_backend() 支持第三方扩展

1.2 架构模式

模式 应用
策略模式 25+ AttentionBackend 实现,按场景选择
插件式架构 每个后端独立文件,可插拔注册
工厂方法 get_attn_backend() 自动选择最优后端
模板方法 AttentionMetadataBuilder.build() 统一流程
注册表模式 AttentionBackendEnum + register_backend() 运行时注册
三层分离 Backend → MetadataBuilder → Impl → Ops
适配器模式 RayWorkerWrapper 适配不同后端到统一接口

1.3 整体运行流程

复制代码
Model.__init__()
    ├── get_attn_backend(head_size, dtype, use_mla, ...)
    │   ├── Build AttentionSelectorConfig
    │   ├── current_platform.get_attn_backend_cls()
    │   └── resolve_obj_by_qualname() -> AttentionBackend subclass
    ├── backend.get_impl_cls() -> AttentionImpl
    └── backend.get_builder_cls() -> MetadataBuilder

Model.forward()
    ├── builder.build(common_attn_metadata) -> backend-specific metadata
    ├── impl.forward(query, key, value, kv_cache, attn_metadata)
    │   ├── Prefill: batch prefill kernel
    │   ├── Decode: batch decode kernel
    │   └── KV cache update: rope + cache store
    └── Return attention output

二、子模块划分

模块1:AttentionBackend ABC(backend.py,1004行)

核心作用:所有 Attention 后端的抽象基类------定义统一接口、元数据构建器、执行实现三层契约。

关键类/方法

类/方法 类型 说明
AttentionType(str, Enum) 枚举 DECODER / ENCODER / ENCODER_ONLY / ENCODER_DECODER
MultipleOf 工具类 Block size 约束(必须是某数的倍数)
AttentionBackend(ABC) 抽象类 所有后端的基类
AttentionMetadata 数据类 Attention 元数据基类
CommonAttentionMetadata 数据类 公共元数据(seq_lens, block_tables 等)
AttentionCGSupport(Enum) 枚举 CUDA Graph 支持级别
AttentionMetadataBuilder(ABC) 抽象类 元数据构建器基类
AttentionLayer(Protocol) 协议 Attention 层接口
AttentionImplBase(ABC) 抽象类 Attention 实现基类
AttentionImpl 标准 Attention 实现(支持 kv_quant)
MLAAttentionImpl MLA Attention 实现(forward_mha/forward_mqa)
SparseMLAAttentionImpl 稀疏 MLA 实现(top-k 路由)
subclass_attention_backend() 函数 动态创建后端子类
subclass_attention_backend_with_overrides() 函数 带覆盖的子类创建

AttentionBackend 抽象方法

方法 说明
get_name() 返回后端名称字符串
get_impl_cls() 返回 AttentionImpl 子类
get_builder_cls() 返回 MetadataBuilder 子类
get_kv_cache_shape() 返回 KV Cache 的 tensor 形状

AttentionMetadataBuilder 核心方法

方法 说明
build() 构建后端特定元数据(核心方法)
update_block_table() 更新 block table
build_for_cudagraph_capture() CUDA Graph 捕获用元数据
build_for_drafting() 投机解码用元数据
use_cascade_attention() 是否使用级联注意力
get_cudagraph_support() CUDA Graph 支持级别

架构图 :见 02-backend-abc.svg


模块2:Attention Selector(selector.py,165行)

核心作用:自动选择最优 Attention 后端------根据硬件能力、模型配置、运行时参数选择。

关键函数/类

函数/类 说明
AttentionSelectorConfig(NamedTuple) 选择器配置:11个字段的命名元组
get_attn_backend() 主选择函数:构建配置 → 平台选择 → 解析类
_cached_get_attn_backend() 缓存版本:@cache 避免重复选择
get_mamba_attn_backend() Mamba 后端选择:按 mamba_type 映射
_cached_get_mamba_attn_backend() 缓存版本

选择流程

  1. 构建 AttentionSelectorConfig(head_size, dtype, kv_cache_dtype, block_size, use_mla, has_sink, use_sparse, ...)
  2. 读取 vllm_config.attention_config.backend
  3. 调用 current_platform.get_attn_backend_cls()(平台特定选择逻辑)
  4. resolve_obj_by_qualname() → 实际后端类
  5. 检查 get_required_kv_cache_layout() → 设置 KV Cache 布局
  6. @cache 缓存结果,同配置不重复选择

架构图 :见 03-selector.svg


模块3:Backend Registry(registry.py,263行)

核心作用:Attention 后端注册表------枚举所有支持的后端 + 运行时覆盖机制。

关键类/函数

类/函数 说明
AttentionBackendEnum(Enum) 24个标准后端枚举(FLASH_ATTN, FLASHINFER, ...)
MambaAttentionBackendEnum(Enum) 6个 Mamba 后端枚举
MAMBA_TYPE_TO_BACKEND_MAP mamba_type → 枚举名映射
register_backend() 注册/覆盖后端(支持装饰器用法)
_ATTN_OVERRIDES 运行时覆盖字典
_MAMBA_ATTN_OVERRIDES Mamba 运行时覆盖字典

枚举成员

类别 后端
标准 FLASH_ATTN, FLASH_ATTN_DIFFKV, FLASHINFER, TRITON_ATTN, FLEX_ATTENTION, TREE_ATTN, CPU_ATTN, TORCH_SDPA
MLA FLASHMLA, FLASHMLA_SPARSE, FLASH_ATTN_MLA, FLASHINFER_MLA, FLASHINFER_MLA_SPARSE, TRITON_MLA, CUTLASS_MLA
ROCm ROCM_ATTN, ROCM_AITER_FA, ROCM_AITER_MLA, ROCM_AITER_MLA_SPARSE, ROCM_AITER_UNIFIED_ATTN, ROCM_AITER_TRITON_MLA
XPU XPU_MLA_SPARSE
量化 TURBOQUANT
SSM MAMBA1, MAMBA2, SHORT_CONV, LINEAR, GDN_ATTN
自定义 CUSTOM(需注册后使用)

架构图 :见 04-registry.svg


模块4:FlashInfer Backend(backends/flashinfer.py,1846行)

核心作用:最功能丰富的 Attention 后端------基于 FlashInfer 库,支持 prefill/decode/TRT-LLM/cascade/FP8。

关键类/方法

类/方法 说明
FlashInferBackend(AttentionBackend) 后端定义
FlashInferImpl(AttentionImpl) 实现类
FlashInferMetadata 后端特定元数据
FlashInferMetadataBuilder 元数据构建器(700+行,最复杂)
FIPrefill / FIDecode FlashInfer 预填充/解码包装器类型
TRTLLMPrefill / TRTLLMDecode TensorRT-LLM 内核包装器
BatchDCPPrefillWrapper DCP 预填充包装器

FlashInferMetadataBuilder 关键方法

方法 说明
build() 构建元数据(plan + 分配 workspace)
_get_prefill_wrapper() 获取/创建 FlashInfer prefill wrapper
_get_decode_wrapper() 获取/创建 FlashInfer decode wrapper
_get_cascade_wrapper() 获取 cascade attention wrapper
_compute_flashinfer_kv_metadata() 计算 KV 元数据
_make_buffer() 创建 workspace buffer
get_cudagraph_support() UNIFORM_BATCH

特色功能

  • FlashInfer BatchPrefillWithPagedKVCache / BatchDecodeWithPagedKVCache
  • TRT-LLM FP8 MLA decode 内核
  • Cascade attention(共享前缀优化)
  • DCP(Decode Context Parallel)支持
  • KV sharing fast prefill 优化
  • FP8 KV cache(e5m2/e4m3)

架构图 :见 05-flashinfer-backend.svg


模块5:FlashAttention Backend(backends/flash_attn.py,1214行 + fa_utils.py 236行)

核心作用:标准 CUDA Attention 后端------基于 flash_attn 库,最广泛使用的后端。

关键类/方法

类/方法 说明
FlashAttentionBackend(AttentionBackend) 后端定义
FlashAttentionImpl(AttentionImpl) 实现类
FlashAttentionMetadata 元数据(block_tables + seq_lens)
FlashAttentionMetadataBuilder 元数据构建器

FlashAttentionMetadataBuilder 特色

  • schedule():内部函数,将 decode/prefill 分块调度
  • 支持滑动窗口注意力配置
  • Block size = 16(preferred)
  • FP8 KV cache 支持
  • Alibi 位置编码支持
  • Sink attention(StreamingLLM)支持

关联文件

  • fa_utils.py(236行):FlashAttention 辅助函数
  • flash_attn_diffkv.py(284行):支持不同 KV head 数的变体

架构图 :见 06-flashattn-backend.svg


模块6:MLA Backends(backends/mla/,9文件,~3.7K行)

核心作用:Multi-Head Latent Attention 后端------Deepseek V3.2 风格的低秩注意力,支持 dense 和 sparse 两种模式。

公共基类(来自 model_executor):

基类 说明
MLACommonBackend MLA 公共后端基类(is_mla=True)
MLACommonMetadata MLA 公共元数据
MLACommonDecodeMetadata MLA 解码特定元数据
MLACommonMetadataBuilder MLA 公共构建器
MLACommonImpl MLA 公共实现(forward_mha/forward_mqa)
QueryLenSupport UNIFORM / VARIABLE 查询长度支持

Dense MLA 实现(7个):

后端 行数 内核 说明
FlashMLABackend 334 FlashMLA FlashMLA 内核(decode 最优)
FlashAttnMLABackend 360 FlashAttn prefill + MLA decode 混合内核
FlashInferMLABackend 209 FlashInfer MLA FlashInfer + TRT-LLM
CutlassMLABackend 285 CUTLASS SM100 NVIDIA SM100 专用
TritonMLABackend 213 纯 Triton 纯 Triton 实现
AiterMLABackend 452 AMD Aiter AMD ROCm 专用
AiterTritonMLABackend 66 Aiter+Triton AMD 混合实现

Sparse MLA 实现(4个):

后端 行数 说明
FlashMLASparseBackend 863 最完整的 sparse MLA(FP8 量化支持)
FlashInferMLASparseBackend 365 FlashInfer sparse MLA
ROCMAiterMLASparseBackend 381 AMD sparse MLA
XPUMLASparseBackend 258 Intel XPU sparse MLA

Indexer(645行):DeepseekV3.2 风格的 sparse expert index------top-k 路由选择相关 KV 块。

架构图 :见 07-mla-backends.svg


模块7:其他标准后端

TritonAttention(backends/triton_attn.py,768行):

  • 纯 Triton 内核实现,不依赖外部库
  • TritonAttentionImpl:使用 triton_unified_attentiontriton_decode_attention

FlexAttention(backends/flex_attention.py,1182行):

  • 基于 PyTorch torch.nn.attention.flex_attention
  • 支持 BlockSparsityHint
  • 最灵活但性能略低

TreeAttention(backends/tree_attn.py,442行):

  • 树状 Attention,用于投机解码验证

CPUAttention(backends/cpu_attn.py,498行):

  • CPU 后端,基于 torch.nn.functional.scaled_dot_product_attention

ROCm 后端(4个文件):

  • RocmAttentionBackend(533行):ROCm 基础后端
  • AiterFlashAttentionBackend(1460行):AMD Aiter FA
  • RocmAiterUnifiedAttention(318行):统一 ROCm 后端

TurboQuant(backends/turboquant_attn.py,800行):

  • FP8 量化 Attention,配合 Triton decode 内核

SSM 后端(5个文件,总计 ~326行):

  • Mamba1 / Mamba2 / ShortConv / LinearAttention / GDN

模块8:Triton Kernel Ops(ops/,12文件,~12.5K行)

核心作用:Triton GPU 内核------Attention 计算的实际执行者,纯 GPU 编程。

关键内核

文件 行数 内核函数 说明
triton_unified_attention.py 1268 kernel_unified_attention_2d/3d 统一 decode+prefill 内核
prefix_prefill.py 864 context_attention_fwd Prefix prefill + paged KV
triton_decode_attention.py 778 decode 内核 解码专用内核
triton_turboquant_decode.py 623 TurboQuant decode FP8 量化解码
triton_reshape_and_cache_flash.py 601 reshape+cache KV reshape + cache store
chunked_prefill_paged_decode.py 467 chunked prefill 分块 prefill + paged decode
common.py 465 correct_attn_out + pack_seq CP 修正 + 序列打包
triton_turboquant_store.py 447 TurboQuant store FP8 KV store
dcp_alltoall.py 363 DCP all-to-all Decode Context Parallel 通信
vit_attn_wrappers.py 361 ViT wrappers 视觉 Transformer 注意力
triton_prefill_attention.py 253 prefill 内核 纯 prefill 内核
merge_attn_states.py 175 merge states Attention 状态合并(spec decode)
flashmla.py 153 FlashMLA 内核 FlashMLA 调用
paged_attn.py 51 paged attention 分页注意力辅助

架构图 :见 08-triton-ops.svg


模块9:Utils & Helpers(backends/utils.py,892行)

核心作用:共享基础设施------batch 分割、KV 布局管理、参数推断、快速 prefill 优化。

关键函数

函数 说明
split_decodes_prefills_and_extends() 将 batch 分为 decode/prefill/extend 三组
split_decodes_and_prefills() 简化版:decode/prefill 两组
split_prefill_chunks() 将长 prefill 分块
reorder_batch_to_split_decodes_and_prefills() 重排 tensor 适配分割执行
make_local_attention_virtual_batches() 创建虚拟 batch 大小
make_kv_sharing_fast_prefill_common_attn_metadata() KV 共享快速 prefill 元数据
reshape_query_for_spec_decode() 投机解码 query 重塑
compute_causal_conv1d_metadata() Mamba causal conv1d 元数据
mamba_get_block_table_tensor() Mamba block table
get_kv_cache_layout() / set_kv_cache_layout() KV Cache 布局管理
PerLayerParameters 每层 Attention 参数
get_per_layer_parameters() 提取每层参数
infer_global_hyperparameters() 推断全局超参数
create_fast_prefill_custom_backend() 工厂:创建 KV 共享 prefill 后端
subclass_attention_metadata() 动态创建元数据子类
get_dcp_local_seq_lens() DCP 本地序列长度

架构图 :见 09-utils-helpers.svg


三、模块调用关系与数据流

3.1 主要调用链

复制代码
Model.__init__()
    ↓
get_attn_backend(head_size, dtype, use_mla, ...)
    ↓
AttentionSelectorConfig → current_platform.get_attn_backend_cls()
    ↓
resolve_obj_by_qualname() → AttentionBackend subclass
    ↓
backend.get_impl_cls() → AttentionImpl
backend.get_builder_cls() → MetadataBuilder

Model.forward()
    ↓
builder.build(common_prefix_len, common_attn_metadata)
    ↓ backend-specific metadata
impl.forward(query, key, value, kv_cache, attn_metadata)
    ├── Prefill: batch prefill kernel (FlashInfer/FlashAttn/Triton)
    ├── Decode: batch decode kernel
    ├── MLA: forward_mha() (prefill) / forward_mqa() (decode)
    ├── Sparse MLA: indexer → top-k routing → sparse decode
    └── KV cache update: do_rope_and_kv_cache_update()
    ↓
Attention output tensor

3.2 后端选择链

复制代码
Platform (CUDA/ROCm/XPU/CPU)
    ↓
get_attn_backend_cls(backend_name, config)
    ↓
AttentionBackendEnum[backend_name].get_class()
    ↓ (respects overrides)
resolve_obj_by_qualname(class_path)
    ↓
AttentionBackend subclass (e.g., FlashInferBackend)

3.3 关键交互

调用方 被调用方 数据 方式
Model Selector config参数 函数调用
Selector Platform backend_name + config 方法调用
Platform Registry enum → class_path qualname解析
Model Backend 接口查询 方法调用
Model MetadataBuilder common_attn_metadata build()
Model Impl query/key/value/kv_cache/metadata forward()
Impl Triton Ops tensor + metadata kernel launch
Impl flash_attn/flashinfer tensor + metadata library call
MetadataBuilder Utils batch分割/重排 函数调用

四、设计模式总结

模式 应用位置 说明
策略模式 25+ AttentionBackend 按硬件/模型选择最优实现
插件式架构 backends/ 目录 每个后端独立文件,可插拔
工厂方法 get_attn_backend() 自动选择后端
模板方法 MetadataBuilder.build() 统一构建流程
注册表模式 AttentionBackendEnum 运行时注册+覆盖
三层分离 Backend→Builder→Impl 接口/构建/执行解耦
装饰器注册 register_backend() 装饰器方式注册自定义后端
缓存策略 @cache 同配置不重复选择

五、关键指标

指标 数值
Attention 总代码量 ~25.8K 行(53 文件)
backend.py 1004 行(核心 ABC)
FlashInfer 后端 1846 行(最大单文件)
Triton Ops 总量 ~12.5K 行
Attention 后端数量 25+
MLA 后端数量 11(7 dense + 4 sparse)
ROCm 后端数量 5
SSM 后端数量 5
Triton 内核数量 14+
AttentionType 类型 4(DECODER/ENCODER/ENCODER_ONLY/ENCODER_DECODER)
CUDA Graph 支持级别 4(SUPPORTED/UNIFORM/SPLIT/NOT_SUPPORTED)

六、架构亮点与设计权衡

亮点

  1. 25+后端可插拔:覆盖 NVIDIA/AMD/Intel/CPU 全平台 + MLA/Mamba/GDN/TurboQuant 全模型
  2. 自动选择机制get_attn_backend() 根据硬件能力自动选择最优后端
  3. 运行时覆盖register_backend() 支持第三方后端无侵入式替换
  4. 三层分离:Backend(接口)→MetadataBuilder(构建)→Impl(执行),职责清晰
  5. MLA 系列完整:7个 dense + 4个 sparse + Indexer,覆盖所有 MLA 场景
  6. FlashInfer 功能最全:1846行,支持 cascade/DCP/TRT-LLM/FP8/spec-decode
  7. Triton 内核自研:12.5K行纯 Triton 内核,不依赖外部库时也能高效运行

权衡

  1. 后端数量爆炸:25+后端增加维护成本,MLA 单独就有11个
  2. MetadataBuilder 最复杂:FlashInferMetadataBuilder 700+行,承担过多职责
  3. 选择逻辑分散:Platform.get_attn_backend_cls() 在各平台独立实现,逻辑不统一
  4. MLA 公共基类在外部:MLACommonBackend 等定义在 model_executor 而非 attention 模块
  5. Sparse MLA 重复:4个 sparse 实现有大量重复逻辑
  6. Kernel 调度复杂:Triton unified attention 1268行,一个内核处理所有场景

报告生成时间:2026-04-19 | 代码版本:vllm main branch

相关推荐
roman_日积跬步-终至千里2 小时前
【案例题-知识点】分篇一:质量属性与架构评估:非功能需求的场景化表达与架构权衡、评估与度量
架构
薛定谔的猫3692 小时前
探索 MCP 协议:构建跨平台的 Agent 自动化生态
ai·自动化·agent·技术趋势·mcp
DavidSoCool2 小时前
win11系统使用DockerDesktop搭建Dify实现知识库问答
ai·大模型·知识库·dify
ZhengEnCi3 小时前
01a-编码器解码器架构详解
架构
刘大猫.4 小时前
华为昇腾芯片将为DeepSeek-V4推理,通往国产算力自由
华为·ai·大模型·算力·deepseek·deepseek-v4·昇腾芯片
零安道长4 小时前
Twitter 用户信息 API 集成指南
ai
heimeiyingwang4 小时前
【架构实战】Kubernetes日志收集:EFK/Loki架构
容器·架构·kubernetes
阿杰学AI5 小时前
AI核心知识129—大语言模型之 向量数据库(简洁且通俗易懂版)
数据库·人工智能·ai·语言模型·自然语言处理·向量数据库·vector database
高木木的博客6 小时前
数字架构智能化测试平台(1)--总纲
人工智能·python·nginx·架构