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.pypython/sglang/srt/layers/attention/flashattention_backend.py)并遵循以下步骤。

  1. 在不使用 CUDA Graph 的情况下运行。支持两个 Forward 函数

    • forward_extend

      • 将用于 Prefill、带 KV 缓存的 Prefill 以及目标验证

      • 每一层调用一次

    • forward_decode

      • 将用于普通 Decode 和草稿 Decode

      • 每一层调用一次

    • init_forward_metadata

      • 初始化类和所有层共享的公共元数据

      • 为 split_kv 等优化调用 plan 函数

      • 每次 Forward 调用一次

  2. 使用 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 之前调用

      • 该函数位于关键路径上,需要运行迅速