Diffusers documentation
Önbelleğe Alma
Önbelleğe Alma
Önbellekleme, gürültü azaltma adımları arasında ara katman çıktıları yeniden kullanarak çıkarımı hızlandırır. Daha fazla bellek kullanır ve eğitim gerektirmez. Önbellekleme destekleyen bir dönüştürücüde, yapılandırma ile bir yöntemi etkinleştirin.
Bir önbellekleme yöntemi seçin
Ne kadar yapılandırma ayarlayacağınız ve ihtiyacınız olan uyuma göre bir yöntem seçin. Her yöntem, hız, bellek ve çıktıların önbelleksiz çalıştırma ile ne kadar yakından eşleştiği arasında farklı bir denge kurar. Bir yönteme güvenmeden önce, önbellekli ve önbelleksiz çıktıları kendi isteklerinizle karşılaştırın.
| Yöntem | Kullanım zamanı | Notlar |
|---|---|---|
| Metin KV Önbelleği | NucleusMoE görseli, adımlar arasında metin K/V projeksiyonlarını yeniden kullanma | Şu anda NucleusMoE görüntü bloklarına kancalar |
| SeaCache | Cosmos 3 video üretimi | Ayarlar genellikle modeller arasında aktarılmaz |
| FirstBlockCache | Kayıtlı bir dönüştürücüde tek bir ana hız/kalite ayarı istiyorsanız | Adımların ne sıklıkla atlanacağını tek bir threshold kontrol eder |
| MagCache | Kontrol noktanız ve zamanlayıcınız için büyüklük oranlarına sahip misiniz, yoksa önce kalibrasyon mu yapacaksınız | Oranlar, kontrol noktasına ve zamanlayıcıya özgüdür |
| TaylorSeer | Daha sonraki aktivasyonları önceki adımlardan tahmin etmek | Daha yüksek max_order daha fazla bellek kullanır |
| PAB | Video, dikkat yeniden kullanımını ayarlamaya istekli (dikkat türü başına blok ve zaman adımı atlama aralıkları) | Skip aralıkları model bazında ayarlanmalıdır |
| FasterCache | PAB gibi, ayrıca isteğe bağlı CFG-dal atlaması | Deneysel |
Piramit Dikkat Yayınlama
Pyramid Attention Broadcast (PAB), gürültü azaltma adımları boyunca dikkati, bazı bloklar ve zaman adımları için dikkat çıktıları yeniden kullanılarak (her adımda yeniden hesaplamak yerine) yaklaşık olarak hesaplar. Modelde bu türler varsa Config, dikkat türlerini (uzamsal, zamansal, çapraz) ayırır. Her video modeli üç türün tamamını da sunmayabilir; yalnızca sahip olduğunuz bloklarla eşleşen aralıkları ayarlayın.
Her tür, pencere içinde yeniden hesaplama ile yeniden kullanım sıklığını belirleyen *_attention_block_skip_range ve hangi gürültü azaltma zaman adımlarının atlanabileceğini belirleyen *_attention_timestep_skip_range kullanır. Hook’un pipeline’ın mevcut zaman adımını okuyabilmesi için current_timestep_callback parametresini iletmeniz gerekir. Daha geniş veya daha agresif atlamalar genellikle daha fazla hız ve daha fazla kalite riski anlamına gelir.
Etkinleştirmek için bir PyramidAttentionBroadcastConfig geçirin.
import torch
from diffusers import CogVideoXPipeline, PyramidAttentionBroadcastConfig
pipe = CogVideoXPipeline.from_pretrained("THUDM/CogVideoX-5b", dtype=torch.bfloat16)
pipe.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,
)
pipe.transformer.enable_cache(config)FasterCache
FasterCache, PAB'ye benzer şekilde dikkat özelliklerini önbelleğe alır ve yeniden kullanır. Ayrıca, ardışık latentler yeterince yineleniyorsa, sınıflandırıcı-ücretsiz yönlendirme altındaki koşulsuz dalı atlayıp onu koşullu daldan tahmin edebilir.
Etkinleştirmek için bir FasterCacheConfig geçin. PAB'de olduğu gibi, sahip olduğunuz dikkat türleri için *_attention_block_skip_range ve *_attention_timestep_skip_range değerlerini, istediğinizde CFG dalı atlama seçeneklerini de ayarlayın.
import torch
from diffusers import CogVideoXPipeline, FasterCacheConfig
pipe = CogVideoXPipeline.from_pretrained("THUDM/CogVideoX-5b", dtype=torch.bfloat16)
pipe.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",
)
pipe.transformer.enable_cache(config)SeaCache
SeaCache, ardışık gürültü azaltma adımları arasında Spektral Evrim Farkındalıklı (SEA) göstergelerini karşılaştırır. Biriken değişiklik bir eşiğin altında kaldığında, transformer blok yığını atlanır ve çıktı önbelleğe alınmış artıklardan tahmin edilir. Yöntem yaklaşık olup video üretimi için tasarlanmıştır.
SeaCache için yerleşik adaptörler şunları içerir:
- Cosmos 3, birincil optimize edilmiş ve test edilmiş entegrasyondur.
- Wan T2V, ham görme latentlerini SeaCache'e nasıl sağlanacağını göstermek için genel tekrarlı blok yolunu bir demo olarak kullanır. Aynı önbellek parametreleri Wan veya diğer Wan varyantlarına aktarılamayabilir.
Dönüştürücüde SeaCache'i etkinleştirin. Cosmos 3 gürültü azaltma döngüsü, zamanlayıcı adımını, sigmayı ve adım sayısını her bir cache_context öğesine ekler, bu nedenle ek parametrelere gerek yoktur.
from diffusers import Cosmos3OmniPipeline, SeaCacheConfig
pipe = Cosmos3OmniPipeline.from_pretrained("nvidia/Cosmos3-Nano")
pipe.transformer.enable_cache(SeaCacheConfig(threshold=0.2, max_consecutive_cached=2))SeaCache çıktıları değiştirebilir. Her adımın tam dönüştürücüyü çalıştırması gerektiğinde pipe.transformer.disable_cache() çağrısını yapın. Aynı etkinleştirme çağrısı Cosmos3OmniPipeline, Cosmos3OmniModularPipeline ve Cosmos3DistilledModularPipeline ile de çalışır.
SeaCache'i başka bir video transformer ile kullanmak için Yeni bir modele önbellekleme ekleme bölümünü izleyin. SeaCache, her cache_context içinde step_index, sigma ve num_inference_steps değerlerine, ayrıca yerleşik bir adaptör bulunmadığında raw_vision_callback parametresine ihtiyaç duyar. Parametreleri modele ve zamanlayıcıya göre ayarlayın.
FirstBlockCache
FirstBlockCacheConfig, gürültü azaltıcının erken katmanlarının bir zaman adımından diğerine ne kadar değiştiğini kontrol eder. Değişim küçükse, model pahalı olan sonraki katmanları atlar ve önceki çıktıyı yeniden kullanır.
enable_cache ile etkinleştirin, böylece disable_cache ve is_cache_enabled senkron kalır. Varsayılan threshold değeri 0.05'tir. 0.2 gibi daha yüksek bir değer, ek hız için daha sık atlanır, ancak üretim kalitesi düşebilir.
import torch
from diffusers import DiffusionPipeline, FirstBlockCacheConfig
pipe = DiffusionPipeline.from_pretrained(
"Qwen/Qwen-Image", dtype=torch.bfloat16
)
pipe.transformer.enable_cache(FirstBlockCacheConfig(threshold=0.2))TaylorSeer Önbellek
TaylorSeer Cache, difüzyon çıkarımını, gürültü giderme adımları boyunca Taylor serisi açılımları kullanarak hızlandırır. Daha sonraki adımlardaki aktivasyonları önceki adımlardan tahmin eder ve bu tahminleri birkaç adım boyunca yeniden kullanır; böylece transformer daha az tam işlem yapar.
cache_interval: Tam bir ileri geçiş (forward pass) yapılmadan önce önbelleğe alınmış çıktıların yeniden kullanılacağı adım sayısıdisable_cache_before_step: Yaklaşımlar için veri toplamak amacıyla tam hesaplamalar kullanan ilk adımlarmax_order: Daha yüksek Taylor dereceleri daha doğru olabilir ancak daha fazla bellek kullanır. Değiştirmek için bir nedeniniz olmadıkça bunu1olarak bırakın.
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, kalıntı güncelleme büyüklüklerine göre dönüştürücü bloklarını atlar. Güncelleme büyüklükleri, gürültü azaltma süreci boyunca öngörülebilir bir şekilde azalır ve MagCache, yeniden kullanımın ne zaman güvenli olduğunu belirlemek için önceden hesaplanmış büyüklük oranlarından (mag_ratios) bir hata bütçesi izler. Bu oranlar, kontrol noktasına ve zamanlayıcıya özgüdür. Yüksek adım sayılarından elde edilen oranlar, daha az adıma doğru içsel olarak (interpolasyonla) indirgenebilir.
FLUX_MAG_RATIOSFLUX.1 üzerinde ölçülmüştür. Flux2 ve Flux2 Klein dahil olmak üzere diğer modellerin kendi kalibrasyon çalıştırmasını yapması gerekir.
MagCache iki adımdan oluşur:
- Kalibrasyon:
calibrate=Trueile bir kez çıkarım çalıştırın. Hook, kalan büyüklüklerini ölçer ve hesaplanan oranları yazdırır. - Çıkarım: Kalibrasyon önbelleğini devre dışı bırakın, ardından bu oranları hızlandırma için
MagCacheConfigparametresine iletin.
Classifier-free guidance, kalibrasyonu etkileyebilir. true_cfg_scale > 1 durumunda Flux gibi ardışık bağlamlarla gerçek CFG kullanan pipeline'lar, cache_context("cond") ve cache_context("uncond") bağlamlarını ayrı ayrı girer. Kalibrasyon, bağlam başına bir dizi yazdırabilir, ancak çoğu durumda koşullu diziyi kullanmanız gerekir. Koşullu ve koşulsuz girdileri birleştirerek CFG'yi toplu işleyen pipeline'lar (örneğin CogVideoX), doğrudan kullanabileceğiniz tek bir ortak dizi üretir.
import torch
from diffusers import FluxPipeline, MagCacheConfig
from diffusers.hooks.mag_cache import FLUX_MAG_RATIOS
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)
# Prints: [MagCache] Calibration Complete. Copy these values to MagCacheConfig(mag_ratios=...):
# 2. Inference Step
# Disable calibration hooks before enabling MagCache for inference.
pipe.transformer.disable_cache()
# Apply ratios from calibration, or use the Flux defaults:
# mag_ratios=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]Metin KV Önbelleği
TextKVCacheConfig, metin anahtar ve değer projeksiyonlarını bir kez hesaplar ve yeniden hesaplamak yerine her gürültü azaltma adımında bunları yeniden kullanır. apply_text_kv_cache() şu anda yalnızca NucleusMoEImageTransformerBlock sınıfına bağlanır. enable_cache parametresiyle etkinleştirilir.
import torch
from diffusers import NucleusMoEImagePipeline, TextKVCacheConfig
pipe = NucleusMoEImagePipeline.from_pretrained(
"NucleusAI/NucleusMoE-Image", dtype=torch.bfloat16
)
pipe.to("cuda") # or "mps", "xpu", "cpu"
pipe.transformer.enable_cache(TextKVCacheConfig())
image = pipe("A cat holding a sign that says hello world", num_inference_steps=50).images[0]Yeni bir modele önbellekleme ekleme
Cache yöntemleri, model class'ına, transformer bloklarına ve pipeline'ın denoising döngüsüne bağlı olan hook'lar aracılığıyla modele bağlanır. Yeni bir modelde enable_cache çağrısından önce bu üç bileşenin de yapılandırılmış olduğundan emin olun.
Dönüştürücü sınıfında CacheMixin'den devralın. Bu,
enable_cache,disable_cachevecache_contextekler.hooks/_helpers.pyiçindeki_register_transformer_blocks_metadataiçinde transformer bloğunun çıktı yerleşimini kaydedin. FirstBlockCache, MagCache ve SeaCache gibi tüm blokları atlayan veya yeniden kullanan yöntemler, bloğun çıktılarında gizli durumları bulmak için bunu kullanır.TransformerBlockRegistry.register( model_class=MyTransformerBlock, metadata=TransformerBlockMetadata( return_hidden_states_index=0, return_encoder_hidden_states_index=None, ), )Hattın gürültü azaltma döngüsündeki her transformer çağrısını
cache_contextile sarın. Sınıflandırıcı-ücretsiz yönlendirme, koşullu ve koşulsuz dalları ayrı çağrılar olarak çalıştırdığında, her dalın kendi önbellek durumunu koruması için"cond"ve"uncond"gibi ayrı adlar kullanın.with self.transformer.cache_context("cond"): noise_pred = self.transformer(hidden_states=latents, timestep=timestep, ...)[0]
PAB ve FasterCache, hook'ların mevcut timestep'i okuyabilmesi için current_timestep_callback değerine de ihtiyaç duyar. Yeni modelde çıktı kalitesini kontrol edin, çünkü bir model için ayarlanan cache ayarları genellikle başka bir modele aktarılamaz.