Diffusers documentation

DDIMScheduler

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

and get access to the augmented documentation experience

to get started

DDIMScheduler

Jiaming Song、Chenlin Meng、Stefano Ermon による Denoising Diffusion Implicit Models (DDIM)。

論文の抄録は以下の通りです:

デノイジング拡散確率モデル(DDPM)は、敵対的学習なしで高品質な画像生成を実現していますが、サンプルを生成するには多くのステップでマルコフ連鎖をシミュレートする必要があります。 サンプリングを高速化するために、DDPMと同じ訓練手順を持つ、より効率的な反復的暗黙的確率モデルのクラスであるデノイジング拡散暗黙的モデル(DDIM)を提案します。DDPMでは、生成過程はマルコフ拡散過程の逆過程として定義されます。 我々は、同じ訓練目的関数に導く非マルコフ拡散過程のクラスを構築し、その逆過程からのサンプリングを大幅に高速化します。 実験により、DDIMはDDPMと比較して実時間(wall-clock time)で10倍から50倍高速に高品質なサンプルを生成でき、計算量とサンプル品質のトレードオフが可能であり、潜在空間内で意味のある画像補間を直接実行できることを実証しました。

この論文の元のコードベースはermongroup/ddimで確認でき、著者への連絡先はtsong.meです。

ヒント

The paper Common Diffusion Noise Schedules and Sample Steps are Flawed claims that a mismatch between the training and inference settings leads to suboptimal inference generation results for Stable Diffusion. To fix this, the authors propose:

🧪 これは実験的な機能です!

  1. ノイズスケジュールを再スケーリングして、終端の信号対雑音比 (SNR) がゼロであることを強制します
pipe.scheduler = DDIMScheduler.from_config(pipe.scheduler.config, rescale_betas_zero_snr=True)
  1. train a model with v_prediction (add the following argument to the train_text_to_image.py or train_text_to_image_lora.py scripts)
--prediction_type="v_prediction"
  1. サンプラーを、常に最後のタイムステップから開始するように変更します
pipe.scheduler = DDIMScheduler.from_config(pipe.scheduler.config, timestep_spacing="trailing")
  1. オーバーエクスポージャーを防ぐために、classifier-free guidance をリスケールします
image = pipe(prompt, guidance_rescale=0.7).images[0]

例えば:

from diffusers import DiffusionPipeline, DDIMScheduler
import torch

pipe = DiffusionPipeline.from_pretrained("ptx0/pseudo-journey-v2", dtype=torch.float16)
pipe.scheduler = DDIMScheduler.from_config(
    pipe.scheduler.config, rescale_betas_zero_snr=True, timestep_spacing="trailing"
)
pipe.to("cuda")  # or "mps", "xpu", "cpu"

prompt = "A lion in galaxies, spirals, nebulae, stars, smoke, iridescent, intricate detail, octane render, 8k"
image = pipe(prompt, guidance_rescale=0.7).images[0]
image

DDIMScheduler

クラス diffusers.DDIMScheduler

< >

( num_train_timesteps: int = 1000beta_start: float = 0.0001beta_end: float = 0.02beta_schedule: str = 'linear'trained_betas: numpy.ndarray | list[float] | None = Noneclip_sample: bool = Trueset_alpha_to_one: bool = Truesteps_offset: int = 0prediction_type: typing.Literal['epsilon', 'sample', 'v_prediction'] = 'epsilon'thresholding: bool = Falsedynamic_thresholding_ratio: float = 0.995clip_sample_range: float = 1.0sample_max_value: float = 1.0timestep_spacing: typing.Literal['leading', 'trailing', 'linspace'] = 'leading'rescale_betas_zero_snr: bool = False )

パラメータ

  • num_train_timesteps (int、デフォルト値は 1000) — モデルを学習するための拡散ステップ数。
  • beta_start (float、デフォルト値は 0.0001) — 推論の開始時の beta 値。
  • beta_end (float、デフォルト値は 0.02) — 最終的な beta 値。
  • beta_schedule (Literal["linear", "scaled_linear", "squaredcos_cap_v2"]、デフォルトは "linear") — ベータスケジュールです。モデルのステップ処理において、ベータの範囲からベータのシーケンスへの変換を定義します。"linear"、"scaled_linear"、または "squaredcos_cap_v2" のいずれかである必要があります。
  • trained_betas (np.ndarray, 省略可) — beta_start と beta_end をバイパスして、ベータの配列を直接コンストラクタに渡す場合に使用します。
  • clip_sample (bool、デフォルトは True) — 数値の安定性を確保するために、予測されたサンプルをクリップします。
  • clip_sample_range (float、デフォルト値は 1.0) — サンプルクリッピングの最大振幅です。clip_sample=True の場合のみ有効です。
  • set_alpha_to_one (bool、デフォルトはTrue) — 各拡散ステップでは、そのステップと直前のステップのアルファの積の値が使用されます。最終ステップでは直前のアルファが存在しません。このオプションがTrueの場合、直前のアルファの積は1に固定され、それ以外の場合はステップ0のアルファの値が使用されます。
  • steps_offset (int、デフォルト値は 0)— 一部のモデルファミリーで必要とされる、推論ステップに追加されるオフセットです。
  • prediction_type (Literal["epsilon", "sample", "v_prediction"]、デフォルトは "epsilon") — スケジューラ関数の予測タイプです。"epsilon"(拡散プロセスのノイズを予測)、"sample"(ノイズ付きサンプルを直接予測)、または "v_prediction"(Imagen Video 論文のセクション 2.4 を参照)のいずれかである必要があります。
  • thresholding (bool、デフォルトは False) — 「動的閾値処理」メソッドを使用するかどうか。Stable Diffusion などの潜在空間拡散モデルには不向きです。
  • dynamic_thresholding_ratio (float、デフォルト値は 0.995) — 動的閾値化手法の比率。thresholding=True の場合のみ有効です。
  • sample_max_value (float、デフォルト値は 1.0) — 動的閾値処理の閾値です。thresholding=True の場合のみ有効です。
  • timestep_spacing (Literal["leading", "trailing", "linspace"], defaults to "leading") — The way the timesteps should be scaled. Must be one of "leading", "trailing", or "linspace". Refer to Table 2 of the Common Diffusion Noise Schedules and Sample Steps are Flawed for more information.
  • rescale_betas_zero_snr (bool、デフォルトは False) — betas を再スケーリングして、終端 SNR をゼロにするかどうかを指定します。これにより、モデルは中間の明るさに限定されず、非常に明るく暗いサンプルを生成できるようになります。--offset_noise とゆるく関連しています。

DDIMScheduler は、denoising diffusion probabilistic models (DDPM) で導入されたデノイジング手順を、非マルコフ的ガイダンスによって拡張します。

このモデルは SchedulerMixin および ConfigMixin を継承しています。読み込みや保存など、ライブラリがすべてのスケジューラに対して実装している汎用的なメソッドについては、スーパークラスのドキュメントを参照してください。

add_noise

< >

( original_samples: Tensornoise: Tensortimesteps: IntTensor ) → torch.Tensor

パラメータ

  • original_samples (torch.Tensor) — ノイズが加えられる元のサンプルです。
  • noise (torch.Tensor) — サンプルに追加するノイズ。
  • timesteps (torch.IntTensor) — 各サンプルのノイズレベルを示すタイムステップです。

戻り値

torch.Tensor

ノイズ付きサンプル。

各タイムステップにおけるノイズの大きさに従って、元のサンプルにノイズを追加します(これはフォワード拡散プロセスです)。

get_velocity

< >

( sample: Tensornoise: Tensortimesteps: IntTensor ) → torch.Tensor

パラメータ

  • sample (torch.Tensor) — 入力サンプルです。
  • noise (torch.Tensor) — ノイズテンソルです。
  • timesteps (torch.IntTensor) — 速度計算に使用するタイムステップです。

戻り値

torch.Tensor

計算された速度。

速度の式に従って、サンプルとノイズから速度予測を計算します。

scale_model_input

< >

( sample: Tensortimestep: int = None ) → torch.Tensor

パラメータ

  • sample (torch.Tensor) — 入力サンプルです。
  • timestep (int, 任意) — 拡散チェーンにおける現在のタイムステップ。

戻り値

torch.Tensor

スケーリングされた入力サンプル。

現在のタイムステップに応じて、デノイジングモデルの入力をスケーリングする必要があるスケジューラーとの相互運用性を保証します。

set_timesteps

< >

( num_inference_steps: intdevice: typing.Union[str, torch.device] = None )

パラメータ

  • num_inference_steps (int) — 事前学習済みモデルでサンプルを生成する際に使用する拡散ステップの数。
  • device (str | torch.device, 省略可) — timesteps に使用するデバイス。

例外

ValueError

  • ValueError — num_inference_steps が self.config.num_train_timesteps より大きい場合。

拡散チェーンで使用される離散タイムステップを設定します(推論の実行前に実行する必要があります)。

ステップ

< >

( model_output: Tensortimestep: intsample: Tensoreta: float = 0.0use_clipped_model_output: bool = Falsegenerator: typing.Optional[torch.Generator] = Nonevariance_noise: typing.Optional[torch.Tensor] = Nonereturn_dict: bool = True ) → DDIMSchedulerOutput or tuple

パラメータ

  • model_output (torch.Tensor) — 学習済み拡散モデルからの直接の出力です。
  • timestep (int) — 拡散チェーンにおける現在の離散タイムステップ。
  • sample (torch.Tensor) — 拡散プロセスによって生成されたサンプルの現在のインスタンス。
  • eta (float、任意、デフォルト値は 0.0)— 拡散ステップで追加されるノイズの重みです。値が 0 の場合は DDIM(決定論的)、1 の場合は DDPM(完全に確率的)に対応します。
  • use_clipped_model_output (bool、任意、デフォルトはFalse) — Trueの場合、クリップされた予測元のサンプルから「補正済み」のmodel_outputを計算します。self.config.clip_sampleがTrueの場合、予測元のサンプルは[-1, 1]にクリップされるため、この処理が必要です。クリップが行われていない場合、「補正済み」のmodel_outputは入力として提供されたものと同じになり、use_clipped_model_outputは影響しません。
  • generator (torch.Generator、任意) — 再現可能なサンプリング用の乱数生成器。
  • variance_noise (torch.Tensor, 省略可) — generator を用いてノイズを生成する代わりに、分散そのもののノイズを直接指定するための代替手段です。CycleDiffusion のような手法に有用です。
  • return_dict (bool、省略可、デフォルトはTrue) — tupleではなくDDIMSchedulerOutputを返すかどうか。

戻り値

DDIMSchedulerOutput または tuple

True の場合、DDIMSchedulerOutput が返され、それ以外の場合は、最初の要素がサンプルテンソルであるタプルが返されます。

前のタイムステップのサンプルを、SDEを逆方向に適用することで予測します。この関数は、学習済みモデルの出力(多くの場合、予測されたノイズ)から拡散過程を伝播させます。

DDIMSchedulerOutput

class diffusers.schedulers.scheduling_ddim.DDIMSchedulerOutput

< >

( prev_sample: Tensorpred_original_sample: typing.Optional[torch.Tensor] = None )

パラメータ

  • prev_sample(画像の場合、torch.Tensor、形状 (batch_size, num_channels, height, width)) — 前のタイムステップの計算済みサンプル (x_{t-1})。prev_sample は、デノイジングループにおける次のモデル入力として使用します。
  • pred_original_sample(画像の場合、torch.Tensor、形状 (batch_size, num_channels, height, width)) — 現在のタイムステップにおけるモデルの出力に基づいて予測された、ノイズ除去済みのサンプル (x_{0}) です。 pred_original_sample は、進捗のプレビューやガイダンスに使用できます。

スケジューラーのstep関数の出力用のクラス。

Update on GitHub