Diffusers documentation

Penyimpanan sementara

Hugging Face's logo
Join the Hugging Face community

and get access to the augmented documentation experience

to get started

Penyimpanan sementara

Caching mempercepat inferensi dengan menyimpan dan menggunakan kembali output antara dari berbagai lapisan, seperti lapisan perhatian dan lapisan feedforward, alih-alih melakukan seluruh komputasi pada setiap langkah inferensi. Hal ini secara signifikan meningkatkan kecepatan generasi dengan mengorbankan lebih banyak memori dan tidak memerlukan pelatihan tambahan.

Panduan ini menunjukkan cara menggunakan metode caching yang didukung di Diffusers.

Pyramid Attention Broadcast

Pyramid Attention Broadcast (PAB) didasarkan pada pengamatan bahwa output attention tidak terlalu berbeda antar timestep yang berurutan dalam proses generasi. Perbedaan attention paling kecil terjadi pada lapisan cross attention dan umumnya di-cache pada rentang timestep yang lebih panjang. Hal ini diikuti oleh lapisan temporal attention dan spatial attention.

Tidak semua model video memiliki tiga jenis perhatian (cross, temporal, dan spatial)!

PAB dapat dikombinasikan dengan teknik lain seperti sequence parallelism dan classifier-free guidance parallelism (data parallelism) untuk menghasilkan video secara hampir real-time.

Setel dan teruskan PyramidAttentionBroadcastConfig ke transformer pipeline untuk mengaktifkannya. spatial_attention_block_skip_range mengontrol seberapa sering perhitungan attention dilewati di blok spatial attention, dan spatial_attention_timestep_skip_range adalah rentang timestep yang akan dilewati. Perhatikan untuk memilih rentang yang tepat karena interval yang lebih kecil dapat menyebabkan kecepatan inferensi yang lebih lambat, sedangkan interval yang lebih besar dapat menghasilkan kualitas generasi yang lebih rendah.

import torch
from diffusers import CogVideoXPipeline, PyramidAttentionBroadcastConfig

pipeline = CogVideoXPipeline.from_pretrained("THUDM/CogVideoX-5b", dtype=torch.bfloat16)
pipeline.to("cuda")  # or "mps", "xpu", "cpu"

config = PyramidAttentionBroadcastConfig(
    spatial_attention_block_skip_range=2,
    spatial_attention_timestep_skip_range=(100, 800),
    current_timestep_callback=lambda: pipe.current_timestep,
)
pipeline.transformer.enable_cache(config)

FasterCache

FasterCache meng-cache dan menggunakan ulang fitur perhatian serupa dengan PAB karena perbedaan output kecil untuk setiap langkah waktu berikutnya.

Metode ini juga dapat memilih untuk melewati prediksi cabang tanpa syarat, ketika menggunakan panduan bebas klasifikator untuk pengambilan sampel (umum pada sebagian besar model dasar), dan memperkirakan dari prediksi cabang bersyarat jika terdapat redundansi yang signifikan pada output laten yang diprediksi antara langkah waktu yang berurutan.

Setel dan teruskan FasterCacheConfig ke transformer pipeline untuk mengaktifkannya.

import torch
from diffusers import CogVideoXPipeline, FasterCacheConfig

pipe line= CogVideoXPipeline.from_pretrained("THUDM/CogVideoX-5b", dtype=torch.bfloat16)
pipeline.to("cuda")  # or "mps", "xpu", "cpu"

config = FasterCacheConfig(
    spatial_attention_block_skip_range=2,
    spatial_attention_timestep_skip_range=(-1, 681),
    current_timestep_callback=lambda: pipe.current_timestep,
    attention_weight_callback=lambda _: 0.3,
    unconditional_batch_skip_range=5,
    unconditional_batch_timestep_skip_range=(-1, 781),
    tensor_format="BFCHW",
)
pipeline.transformer.enable_cache(config)

SeaCache

SeaCache membandingkan indikator Spectral-Evolution-Aware (SEA) antara langkah denoising yang berurutan. Ketika perubahan indikator yang terakumulasi tetap di bawah ambang batas, ia melewati tumpukan blok transformer yang mahal dan memprediksi keluarannya dari residual yang di-cache. Bangun indikator dari visual latents yang membentuk output yang dihasilkan. Sertakan frame conditioning yang bersih ketika mereka merupakan bagian dari trajektori output tersebut, seperti dalam generasi image-to-video dan video-to-video. Kecualikan visual hints terpisah yang mengondisikan generasi tetapi bukan bagian dari output. Text conditioning dikecualikan karena bukan merupakan visual latent.

Paket Transfer Cosmos 3 mengontrol petunjuk sebagai urutan visual terpisah, sehingga adapter-nya mengecualikannya dari indikator. Cabang Control-CFG membandingkan lintasan output yang sama sambil mempertahankan residu cache mereka sendiri. Petunjuk kontrol tetap mengondisikan transformer.

Implementasi menyediakan adapter bawaan untuk model-model berikut:

  • Cosmos 3 adalah integrasi utama yang dioptimalkan dan diuji. Ia meng-cache seluruh tumpukan decoder melalui batas normalisasi pasca.
  • Wan T2V menggunakan jalur blok berulang generik dalam mode eager. Integrasi ini menunjukkan bagaimana transformer video single-stream lainnya dapat menyediakan latens visual mentah ke SeaCache; ini bukan klaim bahwa parameter cache yang sama optimal untuk Wan atau bahwa varian Wan lainnya didukung.

Video transformer lain dapat terintegrasi dengan jalur generik ketika mereka menggunakan CacheMixin, mengekspos daftar blok berulang yang dikenali, dan mendaftarkan tata letak input/output blok di TransformerBlockRegistry. Pipeline harus memasuki cache_context untuk setiap panggilan transformer, melampirkan step_index, sigma, dan num_inference_steps, serta menggunakan nama konteks yang terpisah untuk lintasan independen seperti panduan kondisional dan non-kondisional. Sampaikan raw_vision_callback yang mengembalikan latens visual yang membentuk output yang dihasilkan ketika tidak ada adapter bawaan yang tersedia. Validasi kualitas output dan sesuaikan parameter cache untuk setiap model dan scheduler; dukungan dan hasil benchmark tidak dipindahkan secara otomatis dari Cosmos 3.

Cosmos 3

SeaCache dinonaktifkan secara default. Aktifkan pada transformer; loop denoising Cosmos 3 menempelkan langkah scheduler aktif, sigma, dan jumlah langkah ke setiap panggilan cache_context, sehingga tidak diperlukan pengkabelan tambahan:

from diffusers import Cosmos3OmniPipeline, SeaCacheConfig

pipe = Cosmos3OmniPipeline.from_pretrained("nvidia/Cosmos3-Nano")
pipe.transformer.enable_cache(SeaCacheConfig(threshold=0.2, max_consecutive_cached=2))

API tingkat model ini bekerja dengan Cosmos3OmniPipeline, Cosmos3OmniModularPipeline, dan Cosmos3DistilledModularPipeline. SeaCache adalah optimasi aproksimasi dan dapat mengubah output yang dihasilkan. Panggil pipe.transformer.disable_cache() ketika Anda membutuhkan setiap langkah denoising untuk menjalankan transformer secara penuh.

FirstBlockCache

FirstBlock Cache memeriksa seberapa besar perubahan pada lapisan awal denoiser dari satu timestep ke timestep berikutnya. Jika perubahannya kecil, model akan melewati lapisan-lapisan akhir yang mahal dan menggunakan kembali output sebelumnya.

import torch
from diffusers import DiffusionPipeline
from diffusers.hooks import apply_first_block_cache, FirstBlockCacheConfig

pipeline = DiffusionPipeline.from_pretrained(
    "Qwen/Qwen-Image", dtype=torch.bfloat16
)
apply_first_block_cache(pipeline.transformer, FirstBlockCacheConfig(threshold=0.2))

Cache TaylorSeer

TaylorSeer Cache mempercepat inferensi difusi dengan menggunakan ekspansi deret Taylor untuk memperkirakan dan meng-cache aktivasi antara di antara langkah-langkah denoising. Metode ini memprediksi output masa depan berdasarkan komputasi masa lalu, lalu memakainya kembali pada interval tertentu untuk mengurangi perhitungan yang redundan.

Mekanisme penyangga ini memberikan hasil yang kuat dengan overhead memori tambahan yang minimal. Untuk analisis kinerja yang lebih rinci, lihat temuan kami di sini.

Untuk mengaktifkan TaylorSeer Cache, buat TaylorSeerCacheConfig dan teruskan ke transformer pipeline Anda:

  • cache_interval: Jumlah langkah untuk menggunakan kembali output yang di-cache sebelum melakukan forward pass penuh
  • disable_cache_before_step: Langkah-langkah awal yang menggunakan komputasi penuh untuk mengumpulkan data untuk aproksimasi
  • max_order: Akurasi aproksimasi (secara teori, nilai yang lebih tinggi meningkatkan kualitas tetapi juga meningkatkan penggunaan memori, namun kami merekomendasikan untuk disetel ke 1)
import torch
from diffusers import FluxPipeline, TaylorSeerCacheConfig

pipe = FluxPipeline.from_pretrained(
    "black-forest-labs/FLUX.1-dev",
    dtype=torch.bfloat16,
).to("cuda")  # or "mps", "xpu", "cpu"

config = TaylorSeerCacheConfig(
    cache_interval=5,
    max_order=1,
    disable_cache_before_step=10,
    taylor_factors_dtype=torch.bfloat16,
)
pipe.transformer.enable_cache(config)

MagCache

MagCache mempercepat inferensi dengan melewati blok transformer berdasarkan magnitudo pembaruan residual. Metode ini mengamati bahwa magnitudo pembaruan (Output - Input) meluruh secara prediktif selama proses difusi. Dengan mengakumulasi “anggaran error” berdasarkan rasio magnitudo yang dihitung sebelumnya, metode ini secara dinamis memutuskan kapan harus melewati komputasi dan menggunakan kembali residual sebelumnya.

MagCache bergantung pada Magnitude Ratios (mag_ratios) yang menggambarkan kurva peluruhan ini. Rasio-rasio ini spesifik untuk checkpoint model dan scheduler. FLUX_MAG_RATIOS yang disertakan diukur pada FLUX.1; model lain, termasuk Flux2 dan Flux2 Klein, memerlukan kalibrasi tersendiri.

Untuk menggunakan MagCache, Anda biasanya mengikuti proses dua langkah: Kalibrasi dan Inferensi.

  1. Kalibrasi: Jalankan inferensi sekali dengan calibrate=True. Hook akan mengukur magnitudo residual dan mencetak rasio yang dihitung ke konsol.
  2. Inferensi: Teruskan rasio-rasio ini ke MagCacheConfig untuk mengaktifkan akselerasi.
import torch
from diffusers import FluxPipeline, MagCacheConfig

pipe = FluxPipeline.from_pretrained(
    "black-forest-labs/FLUX.1-schnell",
    dtype=torch.bfloat16
).to("cuda")  # or "mps", "xpu", "cpu"

# 1. Calibration Step
# Run full inference to measure model behavior.
calib_config = MagCacheConfig(calibrate=True, num_inference_steps=4)
pipe.transformer.enable_cache(calib_config)

# Run a prompt to trigger calibration
pipe("A cat playing chess", num_inference_steps=4)
# Logs will print something like: "MagCache Calibration Results: [1.0, 1.37, 0.97, 0.87]"

# 2. Inference Step
# Apply the specific ratios obtained from calibration for optimized speed.
# Note: For Flux models, you can also import defaults: 
# from diffusers.hooks.mag_cache import FLUX_MAG_RATIOS
mag_config = MagCacheConfig(
    mag_ratios=[1.0, 1.37, 0.97, 0.87],
    num_inference_steps=4
)

pipe.transformer.enable_cache(mag_config) 

image = pipe("A cat playing chess", num_inference_steps=4).images[0]

mag_ratios mewakili kurva peluruhan magnitudo intrinsik model. Rasio yang dikalibrasi untuk jumlah langkah yang tinggi (misalnya, 50) dapat digunakan kembali untuk jumlah langkah yang lebih rendah (misalnya, 20). Implementasi menggunakan interpolasi untuk memetakan kurva ke jumlah langkah inferensi saat ini.

Untuk pipeline yang menjalankan Classifier-Free Guidance secara berurutan (seperti Kandinsky 5.0), log kalibrasi mungkin mencetak dua array: satu untuk jalur Conditional dan satu untuk jalur Unconditional. Dalam kebanyakan kasus, Anda harus menggunakan array pertama (Conditional).

Untuk pipeline yang menjalankan Classifier-Free Guidance secara batched (seperti SDXL atau Flux), hidden_states yang diproses oleh model mengandung cabang kondisional dan non-kondisional yang digabungkan. Proses kalibrasi secara otomatis memperhitungkan hal ini, menghasilkan satu array rasio yang merepresentasikan perilaku gabungan. Anda dapat menggunakan array hasil ini secara langsung tanpa modifikasi.

Update on GitHub