Diffusers documentation

注意力后端

You are viewing main version, which requires installation from source. If you'd like regular pip install, checkout the latest stable version (v0.42.1).
Hugging Face's logo
Join the Hugging Face community

and get access to the augmented documentation experience

to get started

注意力后端

注意力分发器(attention dispatcher)是一项实验性功能。如果您有任何反馈或遇到问题,请提交一个 issue。

Diffusers 通过其 attention dispatcher 提供了多种经过优化的注意力算法,这些算法在内存和计算效率方面表现更佳。该调度器充当路由器,用于管理和切换不同的注意力实现,并为与这些实现进行交互提供统一的接口。

请参阅下表,了解可用的注意力机制家族,并参阅 可用后端 部分以获取更完整的列表。

注意力机制主要功能
FlashAttention通过分块和重计算来最小化内存读写
ROCm 的 AI Tensor Engine针对 AMD ROCm 加速器优化的 FlashAttention 实现
SageAttention将注意力量化为 int8
PyTorch 原生使用 scaled_dot_product_attention 的内置 PyTorch 实现
xFormers支持多种注意力内核的内存高效注意力

本指南将向您展示如何设置和使用不同的注意力后端。

set_attention_backend

set_attention_backend() 方法会遍历模型中的所有模块,并设置要使用的相应注意力后端。注意力后端的设置会一直生效,直到调用 reset_attention_backend() 为止。

以下示例演示了如何启用来自 kernels 库的 FlashAttention-3 的 _flash_3_hub 实现,该实现允许您即时使用 Hub 上优化的计算内核,而无需任何配置。

FlashAttention-3 至少需要 Ampere 架构的 GPU。

import torch
from diffusers import QwenImagePipeline

pipeline = QwenImagePipeline.from_pretrained(
    "Qwen/Qwen-Image", dtype=torch.bfloat16, device_map="cuda"  # or "mps", "xpu", "cpu"
)
pipeline.transformer.set_attention_backend("_flash_3_hub")

prompt = """
cinematic film still of a cat sipping a margarita in a pool in Palm Springs, California
highly detailed, high budget hollywood movie, cinemascope, moody, epic, gorgeous, film grain
"""
pipeline(prompt).images[0]

要恢复默认的注意力后端,请调用 reset_attention_backend()。

pipeline.transformer.reset_attention_backend()

attention_backend 上下文管理器

attention_backend 上下文管理器会在上下文内为模型临时设置一个注意力后端。在上下文之外,将使用默认的注意力机制(即 PyTorch 原生的缩放点积注意力)。如果您希望为流水线中的不同部分使用不同的后端,或者想要测试不同的后端,这一功能会非常有用。

import torch
from diffusers import QwenImagePipeline

pipeline = QwenImagePipeline.from_pretrained(
    "Qwen/Qwen-Image", dtype=torch.bfloat16, device_map="cuda"  # or "mps", "xpu", "cpu"
)
prompt = """
cinematic film still of a cat sipping a margarita in a pool in Palm Springs, California
highly detailed, high budget hollywood movie, cinemascope, moody, epic, gorgeous, film grain
"""

with attention_backend("_flash_3_hub"):
    image = pipeline(prompt).images[0]

大多数注意力后端支持 torch.compile,且不会导致图中断,可用于进一步加速推理。

信任远程内核

Hub 后端以及其他基于内核的功能(例如 GGUF 和 Nunchaku Lite)会通过 kernels 从 Hub 下载计算内核,并在本地执行其代码。

默认情况下,kernels 仅在其发布者属于 Hub 上的受信任内核发布者时才会加载内核。在 kernels-community 组织下发布的所有内核均受信任,因此 Diffusers 无需任何额外配置即可加载它们。_flash_3_hub、flash_hub、sage_hub 以及其他 Hub 注意力后端均解析到 kernels-community 仓库。

来自其他发布者的内核未经审核。加载此类内核会下载并运行 Diffusers 无法保证其安全性的代码,因此 Diffusers 默认将其禁用,除非您通过 DIFFUSERS_TRUST_REMOTE_KERNELS 环境变量明确选择启用。设置该变量后,Diffusers 会将 trust_remote_code=True 传递给 kernels,使其也能加载来自不受信任发布者的内核。

export DIFFUSERS_TRUST_REMOTE_KERNELS=true

仅在检查内核仓库后再启用此选项,因为它会授予已下载代码在您的机器上运行的权限。若未启用,从不受信任的发布者加载内核将引发错误。Diffusers 会自行执行此检查,因此该检查同样适用于早于 trust_remote_code 参数引入的 kernels<0.14.0。设置 DIFFUSERS_DISABLE_REMOTE_CODE=true 可全局禁用远程代码,并且其优先级高于 DIFFUSERS_TRUST_REMOTE_KERNELS。

检查

注意力分发器包含调试检查,可在问题引发故障之前捕获常见错误。

  1. 设备检查会验证查询、键和值张量是否位于同一设备上。
  2. 数据类型检查会确认张量具有匹配的数据类型,并且使用 bfloat16 或 float16。
  3. 形状检查用于验证张量维度,并防止将注意力掩码与因果标志混用。

通过设置 DIFFUSERS_ATTN_CHECKS 环境变量来启用这些检查。由于检查会为每个注意力操作增加额外开销,因此默认情况下是禁用的。

export DIFFUSERS_ATTN_CHECKS=yes

这些检查现在会在每次注意力操作之前运行。

import torch

query = torch.randn(1, 10, 8, 64, dtype=torch.bfloat16, device="cuda")  # or "mps", "xpu", "cpu"
key = torch.randn(1, 10, 8, 64, dtype=torch.bfloat16, device="cuda")
value = torch.randn(1, 10, 8, 64, dtype=torch.bfloat16, device="cuda")

try:
    with attention_backend("flash"):
        output = dispatch_attention_fn(query, key, value)
        print("✓ Flash Attention works with checks enabled")
except Exception as e:
    print(f"✗ Flash Attention failed: {e}")

您也可以直接配置注册表。

from diffusers.models.attention_dispatch import _AttentionBackendRegistry

_AttentionBackendRegistry._checks_enabled = True

可用的后端

请参阅下表,了解可用的注意力后端及其变体的完整列表。

Expand
后端名称家族描述
nativePyTorch 原生使用 PyTorch 的 scaled_dot_product_attention 的默认后端
flexFlexAttentionPyTorch FlexAttention 实现
_native_cudnnPyTorch 原生CuDNN 优化的注意力
_native_efficientPyTorch 原生内存高效注意力
_native_flashPyTorch 原生PyTorch 的 FlashAttention
_native_mathPyTorch 原生基于数学的注意力(回退方案)
_native_npuPyTorch 原生NPU 优化的注意力
_native_xlaPyTorch 原生XLA 优化的注意力
flashFlashAttentionFlashAttention-2
flash_hubFlashAttention来自内核的 FlashAttention-2
flash_varlenFlashAttention可变长度 FlashAttention
flash_varlen_hubFlashAttention来自内核的变长 FlashAttention
aiter_fa2_hubROCm 的 AI Tensor Engine来自 kernels 的 AMD ROCm 版 FlashAttention-2
aiter_sage_hub面向 ROCm 的 AI Tensor Engine来自 kernels 的 AMD RDNA4 (gfx1201) 量化注意力 (INT8 QK, FP8 PV)
flash_4_hubFlashAttentionFlashAttention-4
_flash_3FlashAttentionFlashAttention-3
_flash_varlen_3FlashAttention可变长度 FlashAttention-3
_flash_3_hubFlashAttention来自 kernels 的 FlashAttention-3
_flash_3_varlen_hubFlashAttention来自内核的变长 FlashAttention-3
sageSageAttention量化注意力(INT8 QK)
sage_hubSageAttention来自内核的量化注意力(INT8 QK)
sage_blackwell_hubSageAttention来自 kernels 的 SageAttention3 FP4 注意力,适用于 SM120 Blackwell GPU
sage_varlenSageAttention可变长度 SageAttention
_sage_qk_int8_pv_fp8_cudaSageAttentionINT8 QK + FP8 PV (CUDA)
_sage_qk_int8_pv_fp8_cuda_sm90SageAttentionINT8 QK + FP8 PV (SM90)
_sage_qk_int8_pv_fp16_cudaSageAttentionINT8 QK + FP16 PV (CUDA)
_sage_qk_int8_pv_fp16_tritonSageAttentionINT8 QK + FP16 PV (Triton)
xformersxFormers内存高效注意力
Update on GitHub