Attention 后端#
SGLang 支持多种 Attention 后端。每种后端都有不同的优缺点。您可以根据需求进行测试。
重要提示
选择最优的 Attention 后端对于最大化性能至关重要。不同的后端在各种场景下表现各异,请根据您的模型、硬件和使用场景进行选择。并非所有后端都支持所有平台和模型架构。
如果您没有指定 --attention-backend,SGLang 将尽力根据您的硬件和模型架构自动选择性能最强的后端。
支持矩阵#
支持矩阵分为两部分:MHA(标准 Attention)和 MLA(多头潜变量 Attention)。有关 MHA 和 MLA 之间关键区别的解释,请参阅 关于 DeepSeek MLA 的 SGLang 文档 以及原始的 DeepSeek MLA 论文。
MHA 后端#
后端 |
Page Size > 1 (原生支持) |
FP8 KV 缓存 |
FP4 KV 缓存 |
投机采样 topk=1 |
投机采样 topk>1 |
滑动窗口 |
多模态 |
|---|---|---|---|---|---|---|---|
FlashInfer |
✅ |
✅ |
❌ |
✅ |
✅ |
✅ |
❌ |
FA3 (FlashAttention 3) |
✅ |
✅ |
❌ |
✅ |
✅ |
✅ |
✅ |
FA4 (FlashAttention 4) |
128 |
❌ |
✅ |
❌ |
❌ |
❌ |
❌ |
Triton |
❌ |
❌ |
✅ |
✅ |
✅ |
✅ |
✅ |
Torch Native (SDPA) |
❌ |
✅ |
✅ |
❌ |
❌ |
❌ |
✅ |
FlexAttention (PyTorch) |
❌ |
❌ |
✅ |
❌ |
❌ |
❌ |
❌ |
TRTLLM MHA |
16, 32 或 64 |
✅ |
✅ |
✅ |
❌ |
✅ |
❌ |
Dual Chunk FlashAttention |
✅ |
❌ |
❌ |
❌ |
❌ |
❌ |
❌ |
AITER (ROCm) |
✅ |
❌ |
❌ |
✅ |
✅ |
❌ |
✅ |
Wave (ROCm) |
✅ |
❌ |
❌ |
❌ |
❌ |
❌ |
❌ |
Ascend (NPU) |
✅ |
❌ |
❌ |
❌ |
❌ |
❌ |
✅ |
Intel XPU |
✅ |
❌ |
❌ |
❌ |
❌ |
✅ |
❌ |
Intel AMX (CPU) |
❌ |
❌ |
❌ |
❌ |
❌ |
❌ |
❌ |
MLA 后端#
后端 |
原生 Page Size |
FP8 KV 缓存 |
FP4 KV 缓存 |
分块前缀缓存 (Chunked Prefix Cache) |
投机采样 topk=1 |
投机采样 topk>1 |
|---|---|---|---|---|---|---|
FlashInfer MLA |
1 |
❌ |
✅ |
✅ |
✅ |
❌ |
FlashMLA |
64 |
✅ |
✅ |
✅ |
✅ |
❌ |
Cutlass MLA |
128 |
✅ |
✅ |
✅ |
✅ |
❌ |
TRTLLM MLA (Blackwell) |
32 或 64 |
✅ |
✅ |
✅ |
✅ |
❌ |
FA3 (FlashAttention 3) |
不适用 |
❌ |
❌ |
✅ |
✅ |
⚠️ (仅限 page_size=1) |
Triton |
不适用 |
❌ |
❌ |
❌ |
✅ |
⚠️ (仅限 page_size=1) |
FA4 |
1 |
❌ |
✅ |
❌ |
❌ |
❌ |
Ascend MLA (NPU) |
128 |
❌ |
❌ |
❌ |
❌ |
❌ |
注意
多模态 Attention 通过 --mm-attention-backend 选择。“多模态”列指示该后端系列是否存在相应的多模态实现。
注意
FlashAttention 4 目前仅支持 Prefill。
NSA 是专门为 DeepSeek V3.2 DSA 设计的。
注意
对于 KV4 FA4 场景,FA4 需要配合不同的 –decode-attention-backend 才能运行。除了 trtllm_mha 与 FA4 不兼容外,其他所有 decode 后端的表现如表中所示。
提示
投机采样 topk:topk 是每步从草稿模型采样的草稿 Token 数量。topk = 1 遵循经典的 EAGLE;topk > 1 会探索多个分支,需要草稿和验证路径中的后端同时支持。
提示
Page size 控制有多少个 Token 被分组到一个 KV 缓存块中。为了使前缀缓存生效,Token 数量必须至少填满一个完整的 page。例如,如果您的 Prompt 只有 32 个 Token,而 page_size = 64,它将无法填满一个完整的 page,从而无法在前缀缓存中匹配(page 无法填充/padding)。如果有 65 个 Token 且 page_size = 64,则只有前 64 个 Token 的第一页会被缓存和匹配;剩余的 1 个 Token 会被丢弃。使用 page_size = 1 可实现最大的前缀复用(Token 级匹配)。
许多本身不支持 page 操作的后端可以在封装层通过将 page 表扩展为逐 Token 索引来模拟 page_size > 1。“Page Size > 1 (原生支持)”列表示真正的内核内分页。某些后端需要固定的原生 page size,且无法减少或以其他方式模拟:TRTLLM MHA (16/32/64), TRTLLM MLA (32/64), FlashMLA (64), Cutlass MLA (128), Ascend (128)。
MLA page-size 约束
FlashInfer MLA: page_size = 1。
FlashMLA: page_size = 64。
Cutlass MLA: page_size = 128。
TRTLLM MLA: page_size ∈ {32, 64}。
混合 Attention(Prefill 与 Decode 使用不同后端)(实验性)#
警告
混合 Attention 是一项实验性功能。
您可以为 Prefill 和 Decode 混合搭配不同的 Attention 后端。当一个后端擅长 Prefill 而另一个后端擅长 Decode 时,这非常有用。有关实现细节,请参阅 python/sglang/srt/layers/attention/hybrid_attn_backend.py。
# Example: Prefill with FA4, Decode with TRTLLM MLA (Blackwell)
python3 -m sglang.launch_server \
--model-path nvidia/DeepSeek-R1-FP4 \
--tp 8 \
--attention-backend trtllm_mla \
--moe-runner-backend flashinfer_trtllm \
--quantization modelopt_fp4 \
--prefill-attention-backend fa4
带混合 Attention 的投机采样#
混合 Attention 同样适用于投机采样。草稿解码和目标验证所使用的后端取决于 --speculative-attention-mode
--speculative-attention-mode decode(推荐):草稿/验证均使用 decode 后端。--speculative-attention-mode prefill(默认):草稿/验证均使用 prefill 后端。
混合 Attention 与投机采样结合时的约束
如果任一 Attention 后端为
trtllm_mha,投机采样仅支持--speculative-eagle-topk 1。对于使用
--page-size > 1且--speculative-eagle-topk > 1的分页 MHA 后端,仅支持flashinfer。CUDA Graph:decode 后端始终会被 capture;prefill 后端仅在
--speculative-attention-mode prefill时才会被 capture。
提示
如果您仅设置了 --prefill-attention-backend 或 --decode-attention-backend 其中之一,未指定的阶段将继承 --attention-backend。如果两者都指定且不同,SGLang 会自动启用一个混合封装器,按阶段调度到所选后端。
用户指南#
不同 Attention 后端的启动命令#
FlashInfer(非 Hopper 架构机器的默认选择,例如 A100, A40)
python3 -m sglang.launch_server \
--model meta-llama/Meta-Llama-3.1-8B-Instruct \
--attention-backend flashinfer
python3 -m sglang.launch_server \
--tp 8 \
--model deepseek-ai/DeepSeek-V3 \
--attention-backend flashinfer \
--trust-remote-code
FlashAttention 3(Hopper 架构机器的默认选择,例如 H100, H200, H20)
python3 -m sglang.launch_server \
--model meta-llama/Meta-Llama-3.1-8B-Instruct \
--attention-backend fa3
python3 -m sglang.launch_server \
--tp 8 \
--model deepseek-ai/DeepSeek-V3 \
--trust-remote-code \
--attention-backend fa3
Triton
python3 -m sglang.launch_server \
--model meta-llama/Meta-Llama-3.1-8B-Instruct \
--attention-backend triton
python3 -m sglang.launch_server \
--tp 8 \
--model deepseek-ai/DeepSeek-V3 \
--attention-backend triton \
--trust-remote-code
FlashMLA
python3 -m sglang.launch_server \
--tp 8 \
--model deepseek-ai/DeepSeek-R1 \
--attention-backend flashmla \
--trust-remote-code
python3 -m sglang.launch_server \
--tp 8 \
--model deepseek-ai/DeepSeek-R1 \
--attention-backend flashmla \
--kv-cache-dtype fp8_e4m3 \
--trust-remote-code
TRTLLM MLA(针对 Blackwell 架构优化,例如 B200)
python3 -m sglang.launch_server \
--tp 8 \
--model deepseek-ai/DeepSeek-R1 \
--attention-backend trtllm_mla \
--trust-remote-code
带 FP8 KV 缓存的 TRTLLM MLA(更高并发,更低内存占用)
python3 -m sglang.launch_server \
--tp 8 \
--model deepseek-ai/DeepSeek-R1 \
--attention-backend trtllm_mla \
--kv-cache-dtype fp8_e4m3 \
--trust-remote-code
FlashAttention 4 (MHA & MLA)
python3 -m sglang.launch_server \
--tp 8 \
--model deepseek-ai/DeepSeek-R1 \
--prefill-attention-backend fa4 \
--trust-remote-code
Cutlass MLA
python3 -m sglang.launch_server \
--tp 8 \
--model deepseek-ai/DeepSeek-R1 \
--attention-backend cutlass_mla \
--trust-remote-code
Ascend
python3 -m sglang.launch_server \
--model meta-llama/Meta-Llama-3.1-8B-Instruct \
--attention-backend ascend
Intel XPU
python3 -m sglang.launch_server \
--model meta-llama/Meta-Llama-3.1-8B-Instruct \
--attention-backend intel_xpu
Wave
python3 -m sglang.launch_server \
--model meta-llama/Meta-Llama-3.1-8B-Instruct \
--attention-backend wave
FlexAttention
python3 -m sglang.launch_server \
--model meta-llama/Meta-Llama-3.1-8B-Instruct \
--attention-backend flex_attention
Dual Chunk FlashAttention
python3 -m sglang.launch_server \
--model Qwen/Qwen2.5-14B-Instruct-1M \
--attention-backend dual_chunk_flash_attn
Torch Native
python3 -m sglang.launch_server \
--model meta-llama/Meta-Llama-3.1-8B-Instruct \
--attention-backend torch_native
添加新 Attention 后端的步骤#
要添加新的 Attention 后端,您可以参考现有后端(python/sglang/srt/layers/attention/triton_backend.py,python/sglang/srt/layers/attention/flashattention_backend.py)并遵循以下步骤。
在不使用 CUDA Graph 的情况下运行。支持两个 Forward 函数
forward_extend
将用于 Prefill、带 KV 缓存的 Prefill 以及目标验证
每一层调用一次
forward_decode
将用于普通 Decode 和草稿 Decode
每一层调用一次
init_forward_metadata
初始化类和所有层共享的公共元数据
为 split_kv 等优化调用 plan 函数
每次 Forward 调用一次
使用 CUDA Graph 运行。它有两个阶段(Capture 和 Replay),您需要实现三个函数
init_cuda_graph_state
在生命周期内调用一次
创建所有公共共享缓冲区
init_forward_metadata_capture_cuda_graph
在捕获 CUDA Graph 之前调用
类似于 init_forward_metadata,但将元数据写入预定义的缓冲区
init_forward_metadata_replay_cuda_graph
在重放 CUDA Graph 之前调用
该函数位于关键路径上,需要运行迅速