Buckets:

hf-doc-build/doc / diffusers /main /vi /optimization /attention_backends.md
mishig's picture
|
download
raw
14.2 kB
# Các backend chú ý
> [!NOTE]
> Bộ điều phối chú ý (attention dispatcher) là một tính năng thử nghiệm. Vui lòng mở một issue nếu bạn có bất kỳ phản hồi nào hoặc gặp phải vấn đề gì.
Hầu hết các mô hình transformer của Diffusers định tuyến chú ý (attention) thông qua một *attention dispatcher* để bạn có thể chuyển đổi các backend tối ưu hóa phía sau một API duy nhất. Dispatcher quản lý các cài đặt đã đăng ký và cung cấp một đường gọi thống nhất cho chúng. Một số mô hình, chẳng hạn như nhiều autoencoder, không sử dụng dispatcher do cấu trúc bên trong của chúng, và việc chuyển đổi backend không có tác dụng đến các lớp chú ý của chúng.
Tham khảo bảng bên dưới để có cái nhìn tổng quan về các họ attention khả dụng và phần [Các backend khả dụng](#available-backends) để có danh sách đầy đủ hơn. Backend nhanh nhất phụ thuộc vào model, GPU, dtype và hình dạng đầu vào.
| gia đình attention | tính năng chính |
|---|---|
| FlashAttention | giảm thiểu đọc/ghi bộ nhớ thông qua việc chia khối (tiling) và tính toán lại |
| AI Tensor Engine cho ROCm | Cài đặt FlashAttention được tối ưu hóa cho bộ tăng tốc AMD ROCm |
| SageAttention | lượng tử hóa attention thành int8 |
| FlexAttention | PyTorch FlexAttention |
| PyTorch native | thực hiện tích hợp sẵn của PyTorch sử dụng [scaled_dot_product_attention](./fp16#scaled-dot-product-attention) |
| xFormers | chú ý tiết kiệm bộ nhớ với hỗ trợ cho các kernel chú ý khác nhau |
Các backend Hub (các tên `*_hub`) cần thư viện [Kernels](https://github.com/huggingface/kernels) và sẽ tải kernel về khi sử dụng lần đầu. Các backend Hub của SageAttention cũng cần `DIFFUSERS_TRUST_REMOTE_KERNELS=true` (xem [Trusting remote kernels](#trusting-remote-kernels)). Các backend khác cần gói riêng của chúng, chẳng hạn như `flash-attn` hoặc `sageattention`. Bảng [Available backends](#available-backends) liệt kê các yêu cầu mà Diffusers kiểm tra khi bạn bật một backend.
## Đặt backend trên mô hình
Phương thức [set_attention_backend()](/docs/diffusers/main/vi/api/models/overview#diffusers.ModelMixin.set_attention_backend) sẽ duyệt qua các lớp attention của mô hình và áp dụng backend đã chọn cho từng lớp. Nó cũng đặt backend hoạt động trên toàn bộ tiến trình của dispatcher thành cùng một giá trị đó.
[reset_attention_backend()](/docs/diffusers/main/vi/api/models/overview#diffusers.ModelMixin.reset_attention_backend) chỉ xóa backend trên các lớp attention. Nó không xóa backend đang hoạt động trên toàn bộ quy trình. Để chuyển đổi tạm thời và khôi phục lại backend đang hoạt động trước đó khi thoát, hãy sử dụng context manager [attention_backend](#try-a-backend-temporarily).
Ví dụ bên dưới bật `_flash_3_hub` (FlashAttention-3 từ Hub) với `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]
> Các backend FlashAttention-3 không thuộc Hub (`_flash_3`, `_flash_varlen_3`) yêu cầu phải build FlashAttention-3 từ mã nguồn và sẽ sớm bị ngừng hỗ trợ. Hãy dùng `_flash_3_hub` hoặc `_flash_3_varlen_hub` thay thế.
## Thử một backend tạm thời
Trình quản lý ngữ cảnh `attention_backend()` đặt backend hoạt động cho toàn bộ tiến trình trong suốt thời gian khối thực thi và khôi phục backend trước đó khi khối kết thúc. Hãy sử dụng nó để thử một backend cho một lần gọi mà không để lại backend được áp dụng vĩnh viễn từ [set_attention_backend()](/docs/diffusers/main/vi/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]
> Hầu hết các backend attention đều hoạt động với `torch.compile`. Việc điều này có làm tăng tốc pipeline của bạn hay không phụ thuộc vào model và backend. Xem [Precision and compilation](./fp16#torchcompile).
## Tin tưởng các kernel từ xa
Các backend Hub cần thư viện [Kernels](https://github.com/huggingface/kernels) trước, sau đó Diffusers sẽ tải kernel Hub từ Hub khi lần đầu sử dụng.
Các backend attention trên Hub tải các kernel tính toán bằng thư viện [Kernels](https://github.com/huggingface/kernels) và chạy chúng cục bộ. Hầu hết các tên attention trên Hub (`_flash_3_hub`, `flash_hub` và các backend `*_hub` khác) được ánh xạ đến tổ chức [kernels-community](https://huggingface.co/kernels-community). Tổ chức này là một nhà xuất bản đáng tin cậy trong Kernels, do đó Diffusers tải các kernel attention đó mà không cần đặt `DIFFUSERS_TRUST_REMOTE_KERNELS`.
> [!NOTE]
> Các backend của SageAttention Hub (`sage_hub` và `sage_blackwell_hub`) được tải từ tổ chức [SageAttention](https://huggingface.co/SageAttention). Đặt `DIFFUSERS_TRUST_REMOTE_KERNELS=true` để sử dụng chúng.
Các tính năng khác dựa trên kernel như [GGUF](../quantization/gguf) và [Nunchaku Lite](../quantization/nunchaku) có thể lấy kernel từ các nhà phát hành bên ngoài kernels-community. Các đường dẫn này vẫn bị chặn trừ khi bạn chọn tham gia bằng `DIFFUSERS_TRUST_REMOTE_KERNELS`. Khi được đặt, Diffusers sẽ chuyển `trust_remote_code=True` sang Kernels để các nhà phát hành không đáng tin cậy cũng có thể tải lên.
```bash
export DIFFUSERS_TRUST_REMOTE_KERNELS=true
```
Chỉ bật tính năng này sau khi đã kiểm tra kho kernel. Nếu không bật, việc tải kernel từ nhà phát hành không đáng tin cậy sẽ gây ra lỗi. Diffusers tự thực hiện kiểm tra này, do đó nó cũng áp dụng cho `kernels<0.14.0`, phiên bản ra đời trước đối số `trust_remote_code`. Đặt `DIFFUSERS_DISABLE_REMOTE_CODE=true` sẽ vô hiệu hóa mã từ xa trên toàn cục và có ưu tiên cao hơn `DIFFUSERS_TRUST_REMOTE_KERNELS`.
## Kiểm tra
Bộ điều phối attention có thể chạy các kiểm tra gỡ lỗi trước mỗi lần gọi attention được điều phối. Các kiểm tra được thực thi phụ thuộc vào các ràng buộc đã đăng ký cho backend đang hoạt động.
1. Kiểm tra thiết bị xác minh rằng các tensor truy vấn, khóa và giá trị nằm trên cùng một thiết bị.
2. Các kiểm tra kiểu dữ liệu, khi được đăng ký, xác nhận sự khớp nhau của các dtype và thường yêu cầu `bfloat16` hoặc `float16`.
3. Kiểm tra hình dạng xác thực các chiều của tensor và ngăn chặn việc trộn lẫn các mặt nạ chú ý với các cờ nhân quả.
Bật các kiểm tra bằng biến môi trường `DIFFUSERS_ATTN_CHECKS`. Các kiểm tra làm tăng chi phí xử lý, do đó chúng bị tắt theo mặc định.
```bash
export DIFFUSERS_ATTN_CHECKS=yes
```
Khi bật các kiểm tra, Diffusers sẽ chạy các ràng buộc đó trước mỗi lần gọi attention được dispatch. Ví dụ cấp thấp bên dưới gọi trực tiếp `dispatch_attention_fn`. Suy luận pipeline không cần import đó. Nó chỉ cần đặt backend thông qua [set_attention_backend()](/docs/diffusers/main/vi/api/models/overview#diffusers.ModelMixin.set_attention_backend) hoặc `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}")
```
## Các backend khả dụng
Xem bảng bên dưới để có danh sách đầy đủ các backend attention khả dụng và các biến thể của chúng. Diffusers sẽ kiểm tra tính khả dụng của gói và các phiên bản được cố định khi bạn bật một backend.
| Tên Backend | Họ | Mô tả | Điều kiện tiên quyết |
|--------------|--------|-------------|--------------|
| `native` | [PyTorch native](https://docs.pytorch.org/docs/stable/generated/torch.nn.attention.SDPBackend.html#torch.nn.attention.SDPBackend) | Backend mặc định sử dụng scaled_dot_product_attention của PyTorch | Không |
| `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 native](https://docs.pytorch.org/docs/stable/generated/torch.nn.attention.SDPBackend.html#torch.nn.attention.SDPBackend) | Chú ý được tối ưu bằng CuDNN | CUDA + CuDNN |
| `_native_efficient` | [PyTorch native](https://docs.pytorch.org/docs/stable/generated/torch.nn.attention.SDPBackend.html#torch.nn.attention.SDPBackend) | Chú ý tiết kiệm bộ nhớ | Không có gì ngoài PyTorch |
| `_native_flash` | [PyTorch native](https://docs.pytorch.org/docs/stable/generated/torch.nn.attention.SDPBackend.html#torch.nn.attention.SDPBackend) | FlashAttention của PyTorch | CUDA |
| `_native_math` | [PyTorch native](https://docs.pytorch.org/docs/stable/generated/torch.nn.attention.SDPBackend.html#torch.nn.attention.SDPBackend) | Chú ý dựa trên toán học (phương án dự phòng) | Không |
| `_native_npu` | [PyTorch native](https://docs.pytorch.org/docs/stable/generated/torch.nn.attention.SDPBackend.html#torch.nn.attention.SDPBackend) | Chú ý được tối ưu hóa cho NPU | `torch_npu` |
| `_native_xla` | [PyTorch native](https://docs.pytorch.org/docs/stable/generated/torch.nn.attention.SDPBackend.html#torch.nn.attention.SDPBackend) | Chú ý được tối ưu bằng 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 từ Hub kernels | `kernels>=0.12` |
| `flash_varlen` | [FlashAttention](https://github.com/Dao-AILab/flash-attention) | FlashAttention có độ dài biến đổi | `flash-attn>=2.6.3` |
| `flash_varlen_hub` | [FlashAttention](https://github.com/Dao-AILab/flash-attention) | FlashAttention có độ dài biến đổi từ các kernel của Hub | `kernels>=0.12` |
| `aiter_fa2_hub` | [AI Tensor Engine cho ROCm](https://github.com/ROCm/aiter) | FlashAttention-2 cho AMD ROCm từ Hub kernels (`bfloat16`) | `kernels>=0.12`, ROCm |
| `flash_4_hub` | [FlashAttention](https://github.com/Dao-AILab/flash-attention) | FlashAttention-4 từ Hub kernels | `kernels>=0.12.3` |
| `_flash_3` | [FlashAttention](https://github.com/Dao-AILab/flash-attention) | FlashAttention-3 (cục bộ; sắp bị ngừng hỗ trợ) | Build FA3 từ mã nguồn |
| `_flash_varlen_3` | [FlashAttention](https://github.com/Dao-AILab/flash-attention) | FlashAttention-3 có độ dài biến đổi (cục bộ; sắp bị ngừng hỗ trợ) | Build FA3 từ mã nguồn |
| `_flash_3_hub` | [FlashAttention](https://github.com/Dao-AILab/flash-attention) | FlashAttention-3 từ Hub kernels | `kernels>=0.12` |
| `_flash_3_varlen_hub` | [FlashAttention](https://github.com/Dao-AILab/flash-attention) | FlashAttention-3 có độ dài biến đổi từ các kernel của Hub | `kernels>=0.12` |
| `sage` | [SageAttention](https://github.com/thu-ml/SageAttention) | Chú ý lượng tử hóa (INT8 QK) | `sageattention>=2.1.1` |
| `sage_hub` | [SageAttention](https://github.com/thu-ml/SageAttention) | Chú ý lượng tử hóa (INT8 QK) từ các kernel của Hub | `kernels>=0.12`, `DIFFUSERS_TRUST_REMOTE_KERNELS=true` |
| `sage_blackwell_hub` | [SageAttention](https://github.com/thu-ml/SageAttention) | Chú ý SageAttention3 FP4 cho GPU SM120 Blackwell từ Hub kernels | `kernels>=0.12`, `DIFFUSERS_TRUST_REMOTE_KERNELS=true` |
| `sage_varlen` | [SageAttention](https://github.com/thu-ml/SageAttention) | SageAttention có độ dài biến đổi | `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) | Chú ý tiết kiệm bộ nhớ | `xformers>=0.0.29` |

Xet Storage Details

Size:
14.2 kB
·
Xet hash:
508933ec84544d097200c0169b2761c1d6404693c800a4efa116e563f164d469

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