Diffusers documentation
DEISMultistepScheduler
DEISMultistepScheduler
Diffusion Exponential Integrator Sampler (DEIS), Qinsheng Zhang ve Yongxin Chen tarafından Fast Sampling of Diffusion Models with Exponential Integrator makalesinde önerilmiştir. DEISMultistepScheduler, difüzyon sıradan diferansiyel denklemleri (ODE) için hızlı, yüksek mertebeden bir çözücüdür.
Bu uygulama, DEIS makalesindeki orijinal doğrusal t uzayı yerine log-rho uzayındaki polinom sığdırma formülünü değiştirir. Bu değişiklik, sayısal çözücüye başvurmak yerine üstel çok adımlı güncelleme için kapalı form katsayıları sağlar.
Makalenin özeti şudur:
Son birkaç yıl, üretken modelleme görevlerinde yüksek sadakatli örnekler üretmede Difüzyon modellerinin~(DM) büyük başarısına tanık oldu. DM'nin önemli bir kısıtlaması, istenen doğruluğa ulaşmak için öğrenilen difüzyon sürecinin genellikle yüzlerce ile binlerce zaman ayrıklaştırma adımını gerektiren, meşhur yavaş örnek alma prosedürüdür. Amacımız, yüksek örnek kalitesini korurken çok daha az adımla DM'ler için hızlı bir örnek alma yöntemi geliştirmektir. Bu amaçla, DM'lerdeki örnek alma prosedürünü sistematik olarak analiz ediyoruz ve örnek kalitesini etkileyen ana faktörleri belirliyoruz; bunlar arasında ayrıklaştırma yöntemi en kritik olanıdır. Öğrenilen difüzyon sürecini dikkatlice inceleyerek Diffusion Exponential Integrator Sampler~(DEIS) öneriyoruz. Bu yöntem, sıradan diferansiyel denklemleri (ODE) ayrıklaştırmak için tasarlanan Exponential Integrator'a dayanır ve öğrenilen difüzyon sürecinin yarı doğrusal yapısından yararlanarak ayrıklaştırma hatasını azaltır. Önerilen yöntem herhangi bir DM'ye uygulanabilir ve en fazla 10 adımda yüksek sadakatli örnekler üretebilir. Deneylerimizde, tek bir A6000 GPU üzerinde CIFAR10'dan 50k görsel üretmek yaklaşık 3 dakika sürmektedir. Ayrıca, önceden eğitilmiş DM'leri doğrudan kullanarak, skor fonksiyonu değerlendirmesi~(NFE) sayısı kısıtlı olduğunda, örneğin CIFAR10'da 10 NFE ile 4.17 FID, 3.37 FID ve yalnızca 15 NFE ile 9.74 IS, en iyi örnek alma performansını elde ediyoruz. Kod bu https URL adresinde mevcuttur.
İpuçları
solver_order'un 2 veya 3 olarak ayarlanması önerilir; solver_order=1 ise DDIMScheduler'a eşdeğerdir.
Imagen'den dinik eşikleme desteklenmektedir ve piksel uzayında difüzyon modelleri için dinamik eşikleme kullanmak üzere thresholding=True ayarlayabilirsiniz.
DEISMultistepScheduler
sınıf diffusers.DEISMultistepScheduler
< source >( num_train_timesteps: int = 1000beta_start: float = 0.0001beta_end: float = 0.02beta_schedule: typing.Literal['linear', 'scaled_linear', 'squaredcos_cap_v2'] = 'linear'trained_betas: numpy.ndarray | list[float] | None = Nonesolver_order: int = 2prediction_type: typing.Literal['epsilon', 'sample', 'v_prediction', 'flow_prediction'] = 'epsilon'thresholding: bool = Falsedynamic_thresholding_ratio: float = 0.995sample_max_value: float = 1.0algorithm_type: typing.Literal['deis'] = 'deis'solver_type: typing.Literal['logrho'] = 'logrho'lower_order_final: bool = Trueuse_karras_sigmas: bool = Falseuse_exponential_sigmas: bool = Falseuse_beta_sigmas: bool = Falseuse_flow_sigmas: bool = Falseflow_shift: float = 1.0timestep_spacing: typing.Literal['linspace', 'leading', 'trailing'] = 'linspace'steps_offset: int = 0use_dynamic_shifting: bool = Falsetime_shift_type: typing.Literal['exponential'] = 'exponential' )
Parametreler
- num_train_timesteps (
int, varsayılan1000) — Modelin eğitileceği difüzyon adım sayısı. - beta_start (
float, varsayılan0.0001) — Çıkarımın başlangıçbetadeğeri. - beta_end (
float, varsayılan0.02) — Sonbetadeğeri. - beta_schedule (
"linear","scaled_linear"veya"squaredcos_cap_v2", varsayılan"linear") — Beta zamanlaması, modelin adım atması için beta aralığını beta dizisine eşleyen bir haritadır.linear,scaled_linearveyasquaredcos_cap_v2seçeneklerinden birini seçin. - trained_betas (
np.ndarrayveyalist[float], isteğe bağlı) —beta_startvebeta_endparametrelerini atlamak için beta dizisini doğrudan yapılandırıcıya iletin. - solver_order (
int, varsayılan2) —1veya2veya3olabilecek DEIS derecesi. Rehberli örneklemeler içinsolver_order=2, koşulsuz örneklemeler içinsolver_order=3kullanılması önerilir. - prediction_type (
"epsilon","sample","v_prediction", or"flow_prediction", defaults to"epsilon") — Prediction type of the scheduler function; can beepsilon(predicts the noise of the diffusion process),sample(directly predicts the noisy sample),v_prediction(see section 2.4 of [Imagen Video](https://huggingface.co/papers/2210.02303) paper), orflow_prediction`. - thresholding (
bool, varsayılanFalse) — “Dinamik eşikleme” yönteminin kullanılıp kullanılmayacağı. Bu, Stable Diffusion gibi gizli uzay difüzyon modelleri için uygun değildir. - dynamic_thresholding_ratio (
float, varsayılan0.995) — Dinik eşikleme yöntemi için oran. Yalnızcathresholding=Trueolduğunda geçerlidir. - sample_max_value (
float, varsayılan1.0) — Dinik eşikleme için eşik değeri. Yalnızcathresholding=Trueolduğunda geçerlidir. - algorithm_type (
"deis", varsayılan"deis") — Çözücü için algoritma türü. - solver_type (
"logrho", varsayılan"logrho") — DEIS için çözümleyici türü. - lower_order_final (
bool, varsayılanTrue) — Son adımlarda düşük dereceli çözücülerin kullanılıp kullanılmayacağı. Yalnızca 15'ten az çıkarım adımı için geçerlidir. - use_karras_sigmas (
bool, isteğe bağlı, varsayılanFalse) — Örnekleme sürecinde gürültü zamanlamasındaki adım boyutları için Karras sigmalarının kullanılıp kullanılmayacağını belirtir.Trueise, sigmalar {σi} gürültü seviyeleri dizisine göre belirlenir. - use_exponential_sigmas (
bool, isteğe bağlı, varsayılanFalse) — Örnekleme sürecindeki gürültü zamanlamasında adım boyutları için üstel sigmaların kullanılıp kullanılmayacağı. - use_beta_sigmas (
bool, isteğe bağlı, varsayılanFalse) — Örnekleme sürecindeki gürültü zamanlamasında adım boyutları için beta sigmaların kullanılıp kullanılmayacağı. Daha fazla bilgi için Beta Sampling is All You Need makalesine bakın. - use_flow_sigmas (
bool, isteğe bağlı, varsayılanFalse) — Örnekleme sürecinde gürültü zamanlamasında adım boyutları için akış sigmalarının kullanılıp kullanılmayacağı. - flow_shift (
float, isteğe bağlı, varsayılan1.0) — Akış tabanlı modeller için akış kaydırma parametresi. - timestep_spacing (
"linspace","leading"veya"trailing", varsayılan"linspace") — Zaman adımlarının ölçeklendirilme biçimi. Daha fazla bilgi için Common Diffusion Noise Schedules and Sample Steps are Flawed makalesindeki Tablo 2'ye bakın. - steps_offset (
int, varsayılan0) — Bazı model ailelerinin gerektirdiği gibi, çıkarım adımlarına eklenen bir ofset. - use_dynamic_shifting (
bool, varsayılanFalse) — Gürültü zamanlaması için dinamik kaydırma kullanılıp kullanılmayacağı. - time_shift_type (
"exponential", varsayılan"exponential") — Uygulanacak zaman kaydırma türü.
DEISMultistepScheduler, difüzyon sıradan diferansiyel denklemleri (ODE) için hızlı yüksek mertebeden bir çözücüdür.
Bu model SchedulerMixin ve ConfigMixin sınıflarından devralır. Kütüphanenin tüm zamanlayıcılar için yükleme ve kaydetme gibi genel yöntemleri uyguladığı üst sınıf belgelendirmesini kontrol edin.
add_noise
< source >( original_samples: Tensornoise: Tensortimesteps: IntTensor ) → torch.Tensor
Belirtilen zaman adımlarındaki gürültü planına göre orijinal örneklerin gürültü ekleyin.
convert_model_output
< source >( model_output: Tensor*argssample: Tensor = None**kwargs ) → torch.Tensor
Parametreler
- model_output (
torch.Tensor) — Öğrenen difüzyon modelinden gelen doğrudan çıktı. - timestep (
int) — Difüzyon zincirindeki mevcut ayrık zaman adımı. - sample (
torch.Tensor) — Difüzyon süreci tarafından oluşturulan bir örneğin mevcut bir örneği.
Dönüş değeri
torch.Tensor
Dönüştürülen model çıktısı.
Model çıktısını DEIS algoritmasının ihtiyaç duyduğu ilgili tipe dönüştürün.
deis_first_order_update
< source >( model_output: Tensor*argssample: Tensor = None**kwargs ) → torch.Tensor
Parametreler
- model_output (
torch.Tensor) — Öğrenen difüzyon modelinden gelen doğrudan çıktı. - timestep (
int) — Difüzyon zincirindeki mevcut ayrık zaman adımı. - prev_timestep (
int) — Difüzyon zincirindeki önceki ayrık zaman adımı. - sample (
torch.Tensor) — Difüzyon süreci tarafından oluşturulan bir örneğin mevcut bir örneği.
Dönüş değeri
torch.Tensor
Önceki zaman adımındaki örnek tensör.
Birinci dereceden DEIS için bir adım (DDIM ile eşdeğer).
index_for_timestep
< source >( timestep: typing.Union[int, torch.Tensor]schedule_timesteps: typing.Optional[torch.Tensor] = None ) → int
Zamanlamadaki (schedule) belirli bir zaman adımının (timestep) indeksini bulun.
multistep_deis_second_order_update
< source >( model_output_list: list*argssample: Tensor = None**kwargs ) → torch.Tensor
İkinci mertebeden çok adımlı DEIS için bir adım.
multistep_deis_third_order_update
< source >( model_output_list: list*argssample: Tensor = None**kwargs ) → torch.Tensor
Üçüncü dereceden çok adımlı DEIS için bir adım.
scale_model_input
< source >( sample: Tensor*args**kwargs ) → torch.Tensor
Gürültüden arındırma modelinin girdisinin mevcut zaman adımına bağlı olarak ölçeklenmesi gereken zamanlayıcılarla değiştirilebilirliği sağlar.
set_begin_index
< source >( begin_index: int = 0 )
Zamanlayıcının başlangıç indeksini ayarlar. Bu işlev, çıkarım (inference) öncesinde pipeline'dan çalıştırılmalıdır.
set_timesteps
< source >( num_inference_steps: intdevice: typing.Union[str, torch.device] = Nonemu: float | None = None )
Parametreler
- num_inference_steps (
int) — Önceden eğitilmiş bir modelle örnekler oluşturulurken kullanılan difüzyon adım sayısı. - device (
strveyatorch.device, isteğe bağlı) — Adımların (timesteps) taşınacağı cihaz.Noneise adımlar taşınmaz. - mu (
float, isteğe bağlı) — Dinamik kaydırma için mu parametresi. Yalnızcause_dynamic_shifting=Truevetime_shift_type="exponential"olduğunda kullanılır.
Difüzyon zinciri için kullanılan ayrık zaman adımlarını ayarlar (çalıştırılmadan önce çıkarım yapılmalıdır).
adım
< source >( model_output: Tensortimestep: typing.Union[int, torch.Tensor]sample: Tensorreturn_dict: bool = True ) → SchedulerOutput or tuple
Parametreler
- model_output (
torch.Tensor) — Öğrenen difüzyon modelinden gelen doğrudan çıktı. - timestep (
intveyatorch.Tensor) — Difüzyon zincirindeki mevcut ayrık zaman adımı. - sample (
torch.Tensor) — Difüzyon süreci tarafından oluşturulan bir örneğin mevcut bir örneği. - return_dict (
bool, varsayılanTrue) — SchedulerOutput mu yoksatuplemu döndürüleceğini belirtir.
Dönüş değeri
SchedulerOutput veya tuple
return_dict True ise SchedulerOutput döndürülür, aksi halde ilk öğesi örnek tensörü olan bir tuple döndürülür.
Önceki zaman adımından örneklemeyi SDE'yi tersine çevirerek tahmin edin. Bu fonksiyon, örneklemeyi çok adımlı DEIS ile ilerletir.
SchedulerOutput
sınıf diffusers.schedulers.scheduling_utils.SchedulerOutput
< source >( prev_sample: Tensor )
Bir zamanlayıcının step işlevinin çıktısı için temel sınıf.