Diffusers documentation

Önbelleğe Alma

You are viewing main version, which requires installation from source. If you'd like regular pip install, checkout the latest stable version (v0.43.0).
Hugging Face's logo
Join the Hugging Face community

and get access to the augmented documentation experience

to get started

Ö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öntemKullanım zamanıNotlar
Metin KV ÖnbelleğiNucleusMoE görseli, adımlar arasında metin K/V projeksiyonlarını yeniden kullanmaŞu anda NucleusMoE görüntü bloklarına kancalar
SeaCacheCosmos 3 video üretimiAyarlar genellikle modeller arasında aktarılmaz
FirstBlockCacheKayıtlı bir dönüştürücüde tek bir ana hız/kalite ayarı istiyorsanızAdımların ne sıklıkla atlanacağını tek bir threshold kontrol eder
MagCacheKontrol noktanız ve zamanlayıcınız için büyüklük oranlarına sahip misiniz, yoksa önce kalibrasyon mu yapacaksınızOranlar, kontrol noktasına ve zamanlayıcıya özgüdür
TaylorSeerDaha sonraki aktivasyonları önceki adımlardan tahmin etmekDaha yüksek max_order daha fazla bellek kullanır
PABVideo, 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
FasterCachePAB 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ımlar
  • max_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 bunu 1 olarak 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_RATIOS FLUX.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:

  1. Kalibrasyon: calibrate=True ile bir kez çıkarım çalıştırın. Hook, kalan büyüklüklerini ölçer ve hesaplanan oranları yazdırır.
  2. Çıkarım: Kalibrasyon önbelleğini devre dışı bırakın, ardından bu oranları hızlandırma için MagCacheConfig parametresine 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.

  1. Dönüştürücü sınıfında CacheMixin'den devralın. Bu, enable_cache, disable_cache ve cache_context ekler.

  2. hooks/_helpers.py içindeki _register_transformer_blocks_metadata iç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,
        ),
    )
  3. Hattın gürültü azaltma döngüsündeki her transformer çağrısını cache_context ile 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.

Update on GitHub