Buckets:
Backends de atenção
O despachante de atenção é um recurso experimental. Abra uma issue se tiver algum feedback ou encontrar algum problema.
A maioria dos modelos transformer do Diffusers roteia a atenção por meio de um dispatcher de atenção, permitindo alternar entre backends otimizados por trás de uma única API. O dispatcher gerencia as implementações registradas e expõe um caminho de chamada unificado para elas. Alguns modelos, como muitos autoencoders, não utilizam o dispatcher devido à sua estrutura interna, e a troca do backend não afeta suas camadas de atenção.
Consulte a tabela abaixo para uma visão geral das famílias de atenção disponíveis e a seção Backends disponíveis para uma lista mais completa. O backend mais rápido depende do modelo, da GPU, do dtype e da forma da entrada.
| família de atenção | principal recurso |
|---|---|
| FlashAttention | minimiza leituras/escritas de memória por meio de tiling e recomputação |
| AI Tensor Engine para ROCm | Implementação do FlashAttention otimizada para aceleradores AMD ROCm |
| SageAttention | quantiza a atenção para int8 |
| FlexAttention | PyTorch FlexAttention |
| PyTorch nativo | implementação embutida do PyTorch usando scaled_dot_product_attention |
| xFormers | atenção eficiente em memória com suporte para vários kernels de atenção |
Os backends do Hub (os nomes *_hub) precisam da biblioteca Kernels e baixam o kernel no primeiro uso. Os backends do Hub do SageAttention também precisam de DIFFUSERS_TRUST_REMOTE_KERNELS=true (veja Confiança em kernels remotos). Os outros backends precisam do próprio pacote, como flash-attn ou sageattention. A tabela Backends disponíveis lista os requisitos que o Diffusers verifica ao você habilitar um backend.
Defina um backend no modelo
O método set_attention_backend() percorre as camadas de atenção do modelo e aplica o backend escolhido em cada uma delas. Ele também define o backend ativo do dispatcher em todo o processo para o mesmo valor.
reset_attention_backend() limpa o backend apenas nas camadas de atenção. Ele não limpa o backend ativo em todo o processo. Para uma troca temporária que restaura o backend ativo anterior ao sair, use o gerenciador de contexto attention_backend.
O exemplo abaixo habilita _flash_3_hub (FlashAttention-3 do Hub) com device_map="cuda".
import torch
from diffusers import QwenImagePipeline
pipeline = QwenImagePipeline.from_pretrained(
"Qwen/Qwen-Image", dtype=torch.bfloat16, device_map="cuda"
)
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]
Os backends de FlashAttention-3 não-Hub (
_flash_3,_flash_varlen_3) exigem a compilação do FlashAttention-3 a partir do código-fonte e serão descontinuados em breve. Use_flash_3_hubou_flash_3_varlen_hubno lugar deles.
Tente um backend temporariamente
O gerenciador de contexto attention_backend() define o backend ativo em todo o processo durante a duração do bloco e restaura o backend anterior quando o bloco é encerrado. Use-o para testar um backend em uma única chamada sem deixar um backend permanente aplicado a partir de set_attention_backend().
import torch
from diffusers import QwenImagePipeline, attention_backend
pipeline = QwenImagePipeline.from_pretrained(
"Qwen/Qwen-Image", dtype=torch.bfloat16, device_map="cuda"
)
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]
A maioria dos backends de atenção funciona com
torch.compile. Se isso acelera seu pipeline depende do modelo e do backend. Consulte Precisão e compilação.
Confiança em kernels remotos
Os backends do Hub precisam primeiro da biblioteca Kernels, e em seguida o Diffusers busca o kernel do Hub no primeiro uso.
Os backends de atenção do Hub baixam kernels de computação com a biblioteca Kernels e os executam localmente. A maioria dos nomes de atenção do Hub (_flash_3_hub, flash_hub e os outros backends *_hub) resolve para a organização kernels-community. Essa organização é um publicador confiável no Kernels, portanto o Diffusers carrega esses kernels de atenção sem definir DIFFUSERS_TRUST_REMOTE_KERNELS.
Os backends do SageAttention Hub (
sage_hubesage_blackwell_hub) são carregados a partir da organização SageAttention. DefinaDIFFUSERS_TRUST_REMOTE_KERNELS=truepara usá-los.
Outros recursos baseados em kernels, como GGUF e Nunchaku Lite, podem obter kernels de publicadores fora do kernels-community. Esses caminhos permanecem bloqueados, a menos que você opte por habilitá-los com DIFFUSERS_TRUST_REMOTE_KERNELS. Quando definido, o Diffusers encaminha trust_remote_code=True para o Kernels, permitindo que publicadores não confiáveis também sejam carregados.
export DIFFUSERS_TRUST_REMOTE_KERNELS=true
Ative isso apenas após inspecionar o repositório do kernel. Sem ele, carregar um kernel de um editor não confiável gera um erro. O Diffusers executa essa verificação por conta própria, portanto ela também se aplica a kernels<0.14.0, que antecede o argumento trust_remote_code. Definir DIFFUSERS_DISABLE_REMOTE_CODE=true desativa o código remoto globalmente e tem precedência sobre DIFFUSERS_TRUST_REMOTE_KERNELS.
Verificações
O despachador de atenção pode executar verificações de depuração antes de cada chamada de atenção despachada. Quais verificações são executadas depende das restrições registradas para o backend ativo.
- As verificações de dispositivo confirmam que os tensores de consulta, chave e valor estão no mesmo dispositivo.
- As verificações de tipo de dados, quando registradas, confirmam a correspondência dos dtypes e frequentemente exigem
bfloat16oufloat16. - As verificações de forma validam as dimensões dos tensores e impedem a mistura de máscaras de atenção com bandeiras causais.
Ative as verificações com a variável de ambiente DIFFUSERS_ATTN_CHECKS. As verificações adicionam sobrecarga, portanto, estão desativadas por padrão.
export DIFFUSERS_ATTN_CHECKS=yes
Com as verificações ativadas, o Diffusers executa essas restrições antes de cada chamada de atenção despachada. O exemplo de baixo nível abaixo chama dispatch_attention_fn diretamente. A inferência de pipeline não precisa dessa importação. Ela só precisa do backend definido via set_attention_backend() ou attention_backend().
import torch
from diffusers.models.attention_dispatch import attention_backend, dispatch_attention_fn
query = torch.randn(1, 10, 8, 64, dtype=torch.bfloat16, device="cuda")
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}")
Backends disponíveis
Consulte a tabela abaixo para obter a lista completa dos backends de atenção disponíveis e suas variantes. O Diffusers verifica a disponibilidade do pacote e as versões fixadas quando você habilita um backend.
| Nome do Backend | Família | Descrição | Pré-requisito |
|---|---|---|---|
native |
PyTorch nativo | Backend padrão usando scaled_dot_product_attention do PyTorch | None |
flex |
FlexAttention | PyTorch FlexAttention | torch>=2.5.0 |
_native_cudnn |
PyTorch nativo | Atenção otimizada pelo CuDNN | CUDA + CuDNN |
_native_efficient |
PyTorch nativo | Atenção eficiente em memória | Nenhuma além do PyTorch |
_native_flash |
PyTorch nativo | FlashAttention do PyTorch | CUDA |
_native_math |
PyTorch nativo | Atenção baseada em matemática (fallback) | None |
_native_npu |
PyTorch nativo | Atenção otimizada para NPU | torch_npu |
_native_xla |
PyTorch nativo | Atenção otimizada com XLA | torch_xla>=2.2 |
flash |
FlashAttention | FlashAttention-2 | flash-attn>=2.6.3 |
flash_hub |
FlashAttention | FlashAttention-2 dos kernels do Hub | kernels>=0.12 |
flash_varlen |
FlashAttention | FlashAttention de comprimento variável | flash-attn>=2.6.3 |
flash_varlen_hub |
FlashAttention | FlashAttention de comprimento variável dos kernels do Hub | kernels>=0.12 |
aiter_fa2_hub |
Motor de Tensor de IA para ROCm | FlashAttention-2 para AMD ROCm a partir dos kernels do Hub (bfloat16) |
kernels>=0.12, ROCm |
flash_4_hub |
FlashAttention | FlashAttention-4 dos kernels do Hub | kernels>=0.12.3 |
_flash_3 |
FlashAttention | FlashAttention-3 (local; em breve será descontinuado) | Compilar o FA3 a partir do código-fonte |
_flash_varlen_3 |
FlashAttention | FlashAttention-3 de comprimento variável (local; será descontinuado em breve) | Compilar o FA3 a partir do código-fonte |
_flash_3_hub |
FlashAttention | FlashAttention-3 dos kernels do Hub | kernels>=0.12 |
_flash_3_varlen_hub |
FlashAttention | FlashAttention-3 de comprimento variável dos kernels do Hub | kernels>=0.12 |
sage |
SageAttention | Atenção quantizada (INT8 QK) | sageattention>=2.1.1 |
sage_hub |
SageAttention | Atenção quantizada (INT8 QK) dos kernels do Hub | kernels>=0.12, DIFFUSERS_TRUST_REMOTE_KERNELS=true |
sage_blackwell_hub |
SageAttention | Atenção SageAttention3 FP4 para GPUs Blackwell SM120 a partir de kernels do Hub | kernels>=0.12, DIFFUSERS_TRUST_REMOTE_KERNELS=true |
sage_varlen |
SageAttention | SageAttention de comprimento variável | sageattention>=2.1.1 |
_sage_qk_int8_pv_fp8_cuda |
SageAttention | INT8 QK + FP8 PV (CUDA) | sageattention>=2.1.1 |
_sage_qk_int8_pv_fp8_cuda_sm90 |
SageAttention | INT8 QK + FP8 PV (SM90) | sageattention>=2.1.1; SM90 |
_sage_qk_int8_pv_fp16_cuda |
SageAttention | INT8 QK + FP16 PV (CUDA) | sageattention>=2.1.1 |
_sage_qk_int8_pv_fp16_triton |
SageAttention | INT8 QK + FP16 PV (Triton) | sageattention>=2.1.1 |
xformers |
xFormers | Atenção eficiente em memória | xformers>=0.0.29 |
Xet Storage Details
- Size:
- 13.3 kB
- Xet hash:
- 0cb260cd4751ea6efb88f9ac4b61154e76de3d15e8ab5d0729fb05275502940f
Xet efficiently stores files, intelligently splitting them into unique chunks and accelerating uploads and downloads. More info.