Diffusers documentation

Backends d'attention

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

and get access to the augmented documentation experience

to get started

Backends d'attention

Le dispatcheur d'attention est une fonctionnalité expérimentale. Veuillez ouvrir un ticket si vous avez des retours ou si vous rencontrez des problèmes.

La plupart des modèles transformer de Diffusers acheminent l’attention via un dispatcheur d’attention afin de pouvoir basculer entre des backends optimisés derrière une seule API. Le dispatcheur gère les implémentations enregistrées et expose un chemin d’appel unifié pour celles-ci. Certains modèles, comme de nombreux autoencodeurs, n’utilisent pas le dispatcheur en raison de leur architecture interne, et le changement de backend n’a aucun effet sur leurs couches d’attention.

Reportez-vous au tableau ci-dessous pour un aperçu des familles d'attention disponibles et à la section Backends disponibles pour une liste plus complète. Le backend le plus rapide dépend du modèle, du GPU, du dtype et de la forme des entrées.

famille d'attentionfonctionnalité principale
FlashAttentionminimise les lectures/écritures mémoire grâce au tuilage et à la recomputation
Moteur de tenseurs IA pour ROCmImplémentation de FlashAttention optimisée pour les accélérateurs AMD ROCm
SageAttentionquantifie l'attention en int8
FlexAttentionPyTorch FlexAttention
PyTorch natifimplémentation intégrée de PyTorch utilisant scaled_dot_product_attention
xFormersattention efficace en mémoire avec prise en charge de divers noyaux d'attention

Les backends du Hub (les noms *_hub) nécessitent la bibliothèque Kernels et téléchargent le noyau lors de la première utilisation. Les backends du Hub SageAttention nécessitent également DIFFUSERS_TRUST_REMOTE_KERNELS=true (voir Faire confiance aux noyaux distants). Les autres backends nécessitent leur propre package, tel que flash-attn ou sageattention. Le tableau Backends disponibles répertorie les exigences que Diffusers vérifie lorsque vous activez un backend.

Définir un backend sur le modèle

La méthode set_attention_backend() parcourt les couches d’attention du modèle et applique le backend choisi à chacune d’entre elles. Elle définit également le backend actif du dispatcher pour l’ensemble du processus à la même valeur.

reset_attention_backend() efface le backend uniquement sur les couches d’attention. Il n’efface pas le backend actif à l’échelle du processus. Pour un changement temporaire qui restaure le backend actif précédent à la sortie, utilisez le gestionnaire de contexte attention_backend.

L'exemple ci-dessous active _flash_3_hub (FlashAttention-3 depuis le Hub) avec 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]

Les backends FlashAttention-3 non-Hub (_flash_3, _flash_varlen_3) nécessitent la compilation de FlashAttention-3 depuis le code source et seront bientôt dépréciés. Utilisez plutôt _flash_3_hub ou _flash_3_varlen_hub.

Essayer un backend temporairement

Le gestionnaire de contexte attention_backend() définit le backend actif pour l’ensemble du processus pendant la durée du bloc et restaure le backend précédent à la sortie du bloc. Utilisez-le pour tester un backend lors d’un seul appel sans laisser un backend permanent appliqué par 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]

La plupart des backends d'attention fonctionnent avec torch.compile. L'accélération de votre pipeline dépend du modèle et du backend. Consultez Précision et compilation.

Faire confiance aux noyaux distants

Les backends du Hub ont d'abord besoin de la bibliothèque Kernels, puis Diffusers récupère le noyau du Hub lors de la première utilisation.

Les backends d'attention du Hub téléchargent des noyaux de calcul via la bibliothèque Kernels et les exécutent localement. La plupart des noms d'attention du Hub (_flash_3_hub, flash_hub et les autres backends *_hub) résolvent vers l'organisation kernels-community. Cette organisation est un éditeur de confiance dans Kernels, Diffusers charge donc ces noyaux d'attention sans définir DIFFUSERS_TRUST_REMOTE_KERNELS.

Les backends du Hub SageAttention (sage_hub et sage_blackwell_hub) sont chargés depuis l’organisation SageAttention. Définissez DIFFUSERS_TRUST_REMOTE_KERNELS=true pour les utiliser.

D’autres fonctionnalités basées sur des noyaux, telles que GGUF et Nunchaku Lite, peuvent récupérer des noyaux auprès d’éditeurs extérieurs à kernels-community. Ces chemins restent bloqués à moins que vous n’optiez pour leur activation via DIFFUSERS_TRUST_REMOTE_KERNELS. Une fois défini, Diffusers transmet trust_remote_code=True à Kernels afin que les éditeurs non approuvés puissent également être chargés.

export DIFFUSERS_TRUST_REMOTE_KERNELS=true

Activez cette option uniquement après avoir inspecté le dépôt du noyau. Sans elle, le chargement d’un noyau provenant d’un éditeur non fiable provoque une erreur. Diffusers effectue lui-même ce contrôle, ce qui s’applique donc également à kernels<0.14.0, qui précède l’argument trust_remote_code. La définition de DIFFUSERS_DISABLE_REMOTE_CODE=true désactive le code distant de manière globale et prend le pas sur DIFFUSERS_TRUST_REMOTE_KERNELS.

Vérifications

Le dispatcheur d'attention peut exécuter des vérifications de débogage avant chaque appel d'attention dispatché. Les vérifications exécutées dépendent des contraintes enregistrées pour le backend actif.

  1. Les vérifications de périphérique confirment que les tenseurs de requête, de clé et de valeur sont sur le même périphérique.
  2. Les vérifications de type de données, lorsqu’elles sont enregistrées, confirment la correspondance des dtypes et exigent souvent bfloat16 ou float16.
  3. Les vérifications de forme valident les dimensions des tenseurs et empêchent le mélange des masques d'attention avec les drapeaux causaux.

Activez les vérifications avec la variable d’environnement DIFFUSERS_ATTN_CHECKS. Les vérifications ajoutent une surcharge, elles sont donc désactivées par défaut.

export DIFFUSERS_ATTN_CHECKS=yes

Avec les vérifications activées, Diffusers exécute ces contraintes avant chaque appel d’attention dispatché. L’exemple de bas niveau ci-dessous appelle directement dispatch_attention_fn. L’inférence de pipeline n’a pas besoin de cet import. Il suffit de définir le backend 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 disponibles

Reportez-vous au tableau ci-dessous pour la liste complète des backends d'attention disponibles et de leurs variantes. Diffusers vérifie la disponibilité des packages et les versions épinglées lorsque vous activez un backend.

Nom du backendFamilleDescriptionPrérequis
nativePyTorch natifBackend par défaut utilisant scaled_dot_product_attention de PyTorchAucun
flexFlexAttentionPyTorch FlexAttentiontorch>=2.5.0
_native_cudnnPyTorch natifAttention optimisée par CuDNNCUDA + CuDNN
_native_efficientPyTorch natifAttention efficace en mémoireAucun au-delà de PyTorch
_native_flashPyTorch natifFlashAttention de PyTorchCUDA
_native_mathPyTorch natifAttention basée sur les mathématiques (repli)Aucun
_native_npuPyTorch natifAttention optimisée pour NPUtorch_npu
_native_xlaPyTorch natifAttention optimisée par XLAtorch_xla>=2.2
flashFlashAttentionFlashAttention-2flash-attn>=2.6.3
flash_hubFlashAttentionFlashAttention-2 des noyaux du Hubkernels>=0.12
flash_varlenFlashAttentionFlashAttention de longueur variableflash-attn>=2.6.3
flash_varlen_hubFlashAttentionFlashAttention de longueur variable à partir des noyaux du Hubkernels>=0.12
aiter_fa2_hubMoteur de tenseurs IA pour ROCmFlashAttention-2 pour AMD ROCm à partir des noyaux du Hub (bfloat16)kernels>=0.12, ROCm
flash_4_hubFlashAttentionFlashAttention-4 des noyaux du Hubkernels>=0.12.3
_flash_3FlashAttentionFlashAttention-3 (local ; bientôt obsolète)Compiler FA3 à partir du code source
_flash_varlen_3FlashAttentionFlashAttention-3 de longueur variable (local ; bientôt obsolète)Compiler FA3 à partir du code source
_flash_3_hubFlashAttentionFlashAttention-3 des noyaux du Hubkernels>=0.12
_flash_3_varlen_hubFlashAttentionFlashAttention-3 de longueur variable à partir des noyaux du Hubkernels>=0.12
sageSageAttentionAttention quantifiée (INT8 QK)sageattention>=2.1.1
sage_hubSageAttentionAttention quantifiée (INT8 QK) à partir des noyaux du Hubkernels>=0.12, DIFFUSERS_TRUST_REMOTE_KERNELS=true
sage_blackwell_hubSageAttentionSageAttention3 attention FP4 pour les GPU Blackwell SM120 à partir des noyaux du Hubkernels>=0.12, DIFFUSERS_TRUST_REMOTE_KERNELS=true
sage_varlenSageAttentionSageAttention de longueur variablesageattention>=2.1.1
_sage_qk_int8_pv_fp8_cudaSageAttentionINT8 QK + FP8 PV (CUDA)sageattention>=2.1.1
_sage_qk_int8_pv_fp8_cuda_sm90SageAttentionINT8 QK + FP8 PV (SM90)sageattention>=2.1.1 ; SM90
_sage_qk_int8_pv_fp16_cudaSageAttentionINT8 QK + FP16 PV (CUDA)sageattention>=2.1.1
_sage_qk_int8_pv_fp16_tritonSageAttentionINT8 QK + FP16 PV (Triton)sageattention>=2.1.1
xformersxFormersAttention efficace en mémoirexformers>=0.0.29
Update on GitHub