Buckets:

hf-doc-build/doc / diffusers /main /fr /optimization /attention_backends.md
mishig's picture
|
download
raw
13.7 kB
# Backends d'attention
> [!NOTE]
> 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](#available-backends) 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'attention | fonctionnalité principale |
|---|---|
| FlashAttention | minimise les lectures/écritures mémoire grâce au tuilage et à la recomputation |
| Moteur de tenseurs IA pour ROCm | Implémentation de FlashAttention optimisée pour les accélérateurs AMD ROCm |
| SageAttention | quantifie l'attention en int8 |
| FlexAttention | PyTorch FlexAttention |
| PyTorch natif | implémentation intégrée de PyTorch utilisant [scaled_dot_product_attention](./fp16#scaled-dot-product-attention) |
| xFormers | attention 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](https://github.com/huggingface/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](#trusting-remote-kernels)). Les autres backends nécessitent leur propre package, tel que `flash-attn` ou `sageattention`. Le tableau [Backends disponibles](#available-backends) 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()](/docs/diffusers/main/fr/api/models/overview#diffusers.ModelMixin.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()](/docs/diffusers/main/fr/api/models/overview#diffusers.ModelMixin.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](#try-a-backend-temporarily).
L'exemple ci-dessous active `_flash_3_hub` (FlashAttention-3 depuis le Hub) avec `device_map="cuda"`.
```py
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]
```
> [!NOTE]
> 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()](/docs/diffusers/main/fr/api/models/overview#diffusers.ModelMixin.set_attention_backend).
```py
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]
```
> [!TIP]
> 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](./fp16#torchcompile).
## Faire confiance aux noyaux distants
Les backends du Hub ont d'abord besoin de la bibliothèque [Kernels](https://github.com/huggingface/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](https://github.com/huggingface/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](https://huggingface.co/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`.
> [!NOTE]
> Les backends du Hub SageAttention (`sage_hub` et `sage_blackwell_hub`) sont chargés depuis l’organisation [SageAttention](https://huggingface.co/SageAttention). Définissez `DIFFUSERS_TRUST_REMOTE_KERNELS=true` pour les utiliser.
D’autres fonctionnalités basées sur des noyaux, telles que [GGUF](../quantization/gguf) et [Nunchaku Lite](../quantization/nunchaku), 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.
```bash
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.
```bash
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()](/docs/diffusers/main/fr/api/models/overview#diffusers.ModelMixin.set_attention_backend) ou `attention_backend()`.
```py
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 backend | Famille | Description | Prérequis |
|--------------|--------|-------------|--------------|
| `native` | [PyTorch natif](https://docs.pytorch.org/docs/stable/generated/torch.nn.attention.SDPBackend.html#torch.nn.attention.SDPBackend) | Backend par défaut utilisant scaled_dot_product_attention de PyTorch | Aucun |
| `flex` | [FlexAttention](https://docs.pytorch.org/docs/stable/nn.attention.flex_attention.html#module-torch.nn.attention.flex_attention) | PyTorch FlexAttention | `torch>=2.5.0` |
| `_native_cudnn` | [PyTorch natif](https://docs.pytorch.org/docs/stable/generated/torch.nn.attention.SDPBackend.html#torch.nn.attention.SDPBackend) | Attention optimisée par CuDNN | CUDA + CuDNN |
| `_native_efficient` | [PyTorch natif](https://docs.pytorch.org/docs/stable/generated/torch.nn.attention.SDPBackend.html#torch.nn.attention.SDPBackend) | Attention efficace en mémoire | Aucun au-delà de PyTorch |
| `_native_flash` | [PyTorch natif](https://docs.pytorch.org/docs/stable/generated/torch.nn.attention.SDPBackend.html#torch.nn.attention.SDPBackend) | FlashAttention de PyTorch | CUDA |
| `_native_math` | [PyTorch natif](https://docs.pytorch.org/docs/stable/generated/torch.nn.attention.SDPBackend.html#torch.nn.attention.SDPBackend) | Attention basée sur les mathématiques (repli) | Aucun |
| `_native_npu` | [PyTorch natif](https://docs.pytorch.org/docs/stable/generated/torch.nn.attention.SDPBackend.html#torch.nn.attention.SDPBackend) | Attention optimisée pour NPU | `torch_npu` |
| `_native_xla` | [PyTorch natif](https://docs.pytorch.org/docs/stable/generated/torch.nn.attention.SDPBackend.html#torch.nn.attention.SDPBackend) | Attention optimisée par XLA | `torch_xla>=2.2` |
| `flash` | [FlashAttention](https://github.com/Dao-AILab/flash-attention) | FlashAttention-2 | `flash-attn>=2.6.3` |
| `flash_hub` | [FlashAttention](https://github.com/Dao-AILab/flash-attention) | FlashAttention-2 des noyaux du Hub | `kernels>=0.12` |
| `flash_varlen` | [FlashAttention](https://github.com/Dao-AILab/flash-attention) | FlashAttention de longueur variable | `flash-attn>=2.6.3` |
| `flash_varlen_hub` | [FlashAttention](https://github.com/Dao-AILab/flash-attention) | FlashAttention de longueur variable à partir des noyaux du Hub | `kernels>=0.12` |
| `aiter_fa2_hub` | [Moteur de tenseurs IA pour ROCm](https://github.com/ROCm/aiter) | FlashAttention-2 pour AMD ROCm à partir des noyaux du Hub (`bfloat16`) | `kernels>=0.12`, ROCm |
| `flash_4_hub` | [FlashAttention](https://github.com/Dao-AILab/flash-attention) | FlashAttention-4 des noyaux du Hub | `kernels>=0.12.3` |
| `_flash_3` | [FlashAttention](https://github.com/Dao-AILab/flash-attention) | FlashAttention-3 (local ; bientôt obsolète) | Compiler FA3 à partir du code source |
| `_flash_varlen_3` | [FlashAttention](https://github.com/Dao-AILab/flash-attention) | FlashAttention-3 de longueur variable (local ; bientôt obsolète) | Compiler FA3 à partir du code source |
| `_flash_3_hub` | [FlashAttention](https://github.com/Dao-AILab/flash-attention) | FlashAttention-3 des noyaux du Hub | `kernels>=0.12` |
| `_flash_3_varlen_hub` | [FlashAttention](https://github.com/Dao-AILab/flash-attention) | FlashAttention-3 de longueur variable à partir des noyaux du Hub | `kernels>=0.12` |
| `sage` | [SageAttention](https://github.com/thu-ml/SageAttention) | Attention quantifiée (INT8 QK) | `sageattention>=2.1.1` |
| `sage_hub` | [SageAttention](https://github.com/thu-ml/SageAttention) | Attention quantifiée (INT8 QK) à partir des noyaux du Hub | `kernels>=0.12`, `DIFFUSERS_TRUST_REMOTE_KERNELS=true` |
| `sage_blackwell_hub` | [SageAttention](https://github.com/thu-ml/SageAttention) | SageAttention3 attention FP4 pour les GPU Blackwell SM120 à partir des noyaux du Hub | `kernels>=0.12`, `DIFFUSERS_TRUST_REMOTE_KERNELS=true` |
| `sage_varlen` | [SageAttention](https://github.com/thu-ml/SageAttention) | SageAttention de longueur variable | `sageattention>=2.1.1` |
| `_sage_qk_int8_pv_fp8_cuda` | [SageAttention](https://github.com/thu-ml/SageAttention) | INT8 QK + FP8 PV (CUDA) | `sageattention>=2.1.1` |
| `_sage_qk_int8_pv_fp8_cuda_sm90` | [SageAttention](https://github.com/thu-ml/SageAttention) | INT8 QK + FP8 PV (SM90) | `sageattention>=2.1.1` ; SM90 |
| `_sage_qk_int8_pv_fp16_cuda` | [SageAttention](https://github.com/thu-ml/SageAttention) | INT8 QK + FP16 PV (CUDA) | `sageattention>=2.1.1` |
| `_sage_qk_int8_pv_fp16_triton` | [SageAttention](https://github.com/thu-ml/SageAttention) | INT8 QK + FP16 PV (Triton) | `sageattention>=2.1.1` |
| `xformers` | [xFormers](https://github.com/facebookresearch/xformers) | Attention efficace en mémoire | `xformers>=0.0.29` |

Xet Storage Details

Size:
13.7 kB
·
Xet hash:
d35a3eab7fab897aa270beb37b02b8eeb1a8364b275c2b7d60c4778e8d38c439

Xet efficiently stores files, intelligently splitting them into unique chunks and accelerating uploads and downloads. More info.