注意力后端#
SGLang 支持多种多样的注意力后端。每种后端都有不同的优缺点。 您可以根据自己的需求进行测试。
重要
选择最优的注意力后端对于最大化性能至关重要。不同的后端在各种场景下表现出色,因此请根据您的模型、硬件和用例进行选择。并非所有后端在所有平台和模型架构上都得到支持。
支持矩阵#
支持矩阵分为两部分:MHA(标准注意力)和 MLA(多头潜在注意力)。关于 MHA 和 MLA 之间关键差异的解释,请参阅 SGLang 关于 DeepSeek MLA 的文档和原始的DeepSeek MLA 论文。
MHA 后端#
后端 |
页面大小 > 1(原生) |
FP8 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 |
✅ |
❌ |
❌ |
❌ |
✅ |
❌ |
MLA 后端#
后端 |
原生页面大小 |
FP8 KV 缓存 |
分块前缀缓存 |
推测 topk=1 |
推测 topk>1 |
|---|---|---|---|---|---|
FlashInfer MLA |
1 |
❌ |
✅ |
✅ |
❌ |
FlashMLA |
64 |
❌ |
✅ |
✅ |
❌ |
Cutlass MLA |
128 |
✅ |
✅ |
✅ |
❌ |
TRTLLM MLA (Blackwell) |
32 或 64 |
✅ |
✅ |
✅ |
❌ |
FA3 (FlashAttention 3) |
n/a |
❌ |
✅ |
✅ |
⚠️ (仅 page_size=1) |
Triton |
n/a |
❌ |
❌ |
✅ |
⚠️ (仅 page_size=1) |
FA4 |
128 |
❌ |
❌ |
❌ |
❌ |
Ascend MLA (NPU) |
128 |
❌ |
❌ |
❌ |
❌ |
备注
多模态注意力通过 --mm-attention-backend 参数选择。"多模态"列指示该后端系列是否存在相应的多模态实现。
警告
FlashMLA FP8 KV 缓存目前无法正常工作。请参阅上游问题 #8856。当需要 FP8 KV 缓存时,请使用非 FP8 KV 或其他后端。
备注
FlashAttention 4 目前仅支持预填充阶段。
NSA 是专门为 DeepSeek V3.2 DSA 设计的。
小技巧
推测解码 topk:topk 是每个步骤从草稿模型中采样的草稿令牌数量。topk = 1 遵循经典 EAGLE;topk > 1 探索多个分支,需要在草稿和验证路径中都获得后端支持。
注意:许多不原生在页面上操作的后端可以通过将页表扩展到每个令牌索引来在包装层模拟 page_size > 1。"页面大小 > 1(原生)"列表示真正的内核内分页。某些后端需要固定的原生页面大小,不能以其他方式减少/模拟:TRTLLM MHA (16/32/64)、TRTLLM MLA (32/64)、FlashMLA (64)、Cutlass MLA (128)、FA4 (128)、Ascend (128)。
MLA 页面大小约束:
FlashInfer MLA:page_size = 1。
FlashMLA:page_size = 64。
Cutlass MLA:page_size = 128。
TRTLLM MLA:page_size ∈ {32, 64}。
FA4:page_size = 128。
混合注意力(预填充与解码使用不同后端)(实验性功能)#
警告
混合注意力是一个实验性功能。
您可以为预填充和解码阶段混合匹配注意力后端。当一个后端在预填充阶段表现出色,而另一个在解码阶段表现出色时,这非常有用。有关实现细节,请参阅 python/sglang/srt/layers/attention/hybrid_attn_backend.py。
# 示例:预填充使用 FA4,解码使用 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
混合注意力下的推测解码#
混合注意力也适用于推测解码。草稿解码和目标验证使用的后端取决于 --speculative-attention-mode:
--speculative-attention-mode decode(推荐):草稿/验证使用解码后端。--speculative-attention-mode prefill(默认):草稿/验证使用预填充后端。
将混合注意力与推测解码结合时的约束:
如果任何注意力后端是
trtllm_mha,推测解码仅支持--speculative-eagle-topk 1。对于具有
--page-size > 1和--speculative-eagle-topk > 1的分页 MHA 后端,仅支持flashinfer。flex_attention不支持推测解码。对于 MLA 后端,
trtllm_mla支持topk > 1;flashmla和flashinfer_mla仅支持topk = 1。CUDA 图:解码后端始终被捕获;预填充后端仅在
--speculative-attention-mode prefill时被捕获。
小技巧
如果您只设置了 --prefill-attention-backend 或 --decode-attention-backend 中的一个,未指定的阶段将继承 --attention-backend。
如果两者都被指定且不同,SGLang 会自动启用混合包装器以根据阶段分派到所选后端。
用户指南#
不同注意力后端的启动命令#
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
Torch Native
python3 -m sglang.launch_server \
--model meta-llama/Meta-Llama-3.1-8B-Instruct \
--attention-backend torch_native
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
TRTLLM MLA with FP8 KV Cache(更高的并发性,更小的内存占用)
python3 -m sglang.launch_server \
--tp 8 \
--model deepseek-ai/DeepSeek-R1 \
--attention-backend trtllm_mla \
--kv-cache-dtype fp8_e4m3 \
--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
Cutlass MLA
python3 -m sglang.launch_server \
--tp 8 \
--model deepseek-ai/DeepSeek-R1 \
--attention-backend cutlass_mla \
--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
添加新注意力后端的步骤#
要添加新的注意力后端,您可以参考现有的后端
(python/sglang/srt/layers/attention/triton_backend.py, python/sglang/srt/layers/attention/flashattention_backend.py)
并按照以下步骤操作。
在不使用 CUDA 图的情况下运行。支持两个前向函数
forward_extend
将用于预填充、带 KV 缓存的预填充和目标验证
每层调用一次
forward_decode
将用于普通解码和草稿解码
每层调用一次
init_forward_metadata
初始化类和所有层共享的通用元数据
调用 plan 函数进行优化,如 split_kv
每次前向传播调用一次
使用 CUDA 图运行。它有两个阶段(捕获和重放),您需要实现三个函数
init_cuda_graph_state
在生命周期内调用一次
创建所有通用共享缓冲区
init_forward_metadata_capture_cuda_graph
在捕获 CUDA 图之前调用
类似于 init_forward_metadata,但将元数据写入某些预定义的缓冲区
init_forward_metadata_replay_cuda_graph
在重放 CUDA 图之前调用
此函数在关键路径上,需要快速执行