注意力后端#

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 > 1flashmlaflashinfer_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) 并按照以下步骤操作。

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

    • forward_extend

      • 将用于预填充、带 KV 缓存的预填充和目标验证

      • 每层调用一次

    • forward_decode

      • 将用于普通解码和草稿解码

      • 每层调用一次

    • init_forward_metadata

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

      • 调用 plan 函数进行优化,如 split_kv

      • 每次前向传播调用一次

  2. 使用 CUDA 图运行。它有两个阶段(捕获和重放),您需要实现三个函数

    • init_cuda_graph_state

      • 在生命周期内调用一次

      • 创建所有通用共享缓冲区

    • init_forward_metadata_capture_cuda_graph

      • 在捕获 CUDA 图之前调用

      • 类似于 init_forward_metadata,但将元数据写入某些预定义的缓冲区

    • init_forward_metadata_replay_cuda_graph

      • 在重放 CUDA 图之前调用

      • 此函数在关键路径上,需要快速执行