Diffusers documentation

Бэкенды внимания

Hugging Face's logo
Join the Hugging Face community

and get access to the augmented documentation experience

to get started

Бэкенды внимания

Диспетчер внимания — это экспериментальная функция. Пожалуйста, создайте issue, если у вас есть отзывы или вы столкнулись с какими-либо проблемами.

Diffusers предоставляет несколько оптимизированных алгоритмов внимания, которые более эффективны по памяти и вычислениям, через свой диспетчер внимания. Диспетчер выступает в роли маршрутизатора для управления и переключения между различными реализациями внимания и предоставляет единый интерфейс для взаимодействия с ними.

См. таблицу ниже для обзора доступных семейств внимания и раздел Доступные бэкенды для более полного списка.

семейство attentionосновная функция
FlashAttentionминимизирует чтение/запись памяти с помощью тайлинга и пересчета
AI Tensor Engine для ROCmРеализация FlashAttention, оптимизированная для ускорителей AMD ROCm
SageAttentionквантует внимание до int8
Нативный PyTorchвстроенная реализация PyTorch с использованием scaled_dot_product_attention
xFormersmemory-efficient attention с поддержкой различных attention-ядер

В этом руководстве показано, как настраивать и использовать различные бэкенды внимания.

set_attention_backend

Метод set_attention_backend() перебирает все модули в модели и устанавливает соответствующий бэкенд внимания для использования. Настройка бэкенда внимания сохраняется до вызова reset_attention_backend().

Пример ниже демонстрирует, как включить реализацию _flash_3_hub для FlashAttention-3 из библиотеки kernels, что позволяет мгновенно использовать оптимизированные вычислительные ядра из Hub без какой-либо настройки.

FlashAttention-3 требует как минимум GPU архитектуры Ampere.

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), загружают вычислительные ядра с Hub с помощью kernels и выполняют их код локально.

По умолчанию kernels загружает ядро только в том случае, если его издатель является доверенным издателем ядер на Hub. Ядра, опубликованные в организации kernels-community, считаются доверенными, поэтому Diffusers загружает их без дополнительной настройки. Бэкенды внимания Hub _flash_3_hub, flash_hub, sage_hub и другие все разрешаются в репозитории kernels-community.

Ядра от любых других издателей не проходят проверку. Загрузка такого ядра приводит к скачиванию и запуску кода, за который Diffusers не может поручиться, поэтому Diffusers держит эту функцию отключённой, пока вы явно не включите её с помощью переменной окружения DIFFUSERS_TRUST_REMOTE_KERNELS. Если переменная задана, Diffusers передаёт trust_remote_code=True в kernels, чтобы те загружали ядра и от непроверенных издателей.

export DIFFUSERS_TRUST_REMOTE_KERNELS=true

Включайте этот параметр только после проверки репозитория ядра, поскольку он предоставляет загруженному коду возможность выполняться на вашем компьютере. Без него загрузка ядра от ненадёжного издателя приводит к ошибке. Diffusers выполняет эту проверку самостоятельно, поэтому она также распространяется на kernels<0.14.0, которые предшествуют аргументу trust_remote_code. Установка DIFFUSERS_DISABLE_REMOTE_CODE=true глобально отключает удалённый код и имеет приоритет над DIFFUSERS_TRUST_REMOTE_KERNELS.

Проверки

Диспетчер внимания включает проверки отладки, которые выявляют типичные ошибки до того, как они вызовут проблемы.

  1. Проверки устройства подтверждают, что тензоры запроса, ключа и значения находятся на одном и том же устройстве.
  2. Проверки типа данных подтверждают, что тензоры имеют совпадающие dtypes и используют либо 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
Имя бэкендаСемействоОписание
nativeнативный PyTorchБэкенд по умолчанию, использующий scaled_dot_product_attention из PyTorch
flexFlexAttentionРеализация PyTorch FlexAttention
_native_cudnnнативный PyTorchВнимание с оптимизацией CuDNN
_native_efficientнативный PyTorchВнимание с эффективной работой с памятью
_native_flashнативный PyTorchFlashAttention в PyTorch
_native_mathнативный PyTorchВнимание на основе математики (резервный вариант)
_native_npuнативный PyTorchВнимание, оптимизированное для NPU
_native_xlaнативный PyTorchВнимание, оптимизированное XLA
flashFlashAttentionFlashAttention-2
flash_hubFlashAttentionFlashAttention-2 из ядер
flash_varlenFlashAttentionFlashAttention с переменной длиной
flash_varlen_hubFlashAttentionFlashAttention переменной длины из ядер
aiter_fa2_hubAI Tensor Engine для ROCmFlashAttention-2 для AMD ROCm из kernels
aiter_sage_hubAI Tensor Engine для ROCmКвантованное внимание (INT8 QK, FP8 PV) для AMD RDNA4 (gfx1201) из kernels
flash_4_hubFlashAttentionFlashAttention-4
_flash_3FlashAttentionFlashAttention-3
_flash_varlen_3FlashAttentionFlashAttention-3 с переменной длиной
_flash_3_hubFlashAttentionFlashAttention-3 из kernels
_flash_3_varlen_hubFlashAttentionFlashAttention-3 переменной длины из kernels
sageSageAttentionКвантованное внимание (INT8 QK)
sage_hubSageAttentionКвантованное внимание (INT8 QK) из ядер
sage_blackwell_hubSageAttentionSageAttention3 FP4-внимание для SM120 Blackwell GPU из kernels
sage_varlenSageAttentionSageAttention переменной длины
_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