Diffusers documentation
UniPCMultistepScheduler
UniPCMultistepScheduler
UniPCMultistepScheduler は、拡散モデルの高速サンプリングのために設計された、学習不要のフレームワークです。Wenliang Zhao、Lujia Bai、Yongming Rao、Jie Zhou、Jiwen Lu による UniPC: A Unified Predictor-Corrector Framework for Fast Sampling of Diffusion Models で提案されました。
正則化項(UniC)と予測項(UniP)で構成されており、統一された解析的な形式を共有し、任意の次数をサポートします。 UniPCは設計上、モデルに依存せず、ピクセル空間/潜在空間のDPMおよび無条件/条件付きサンプリングをサポートします。また、ノイズ予測モデルとデータ予測モデルの両方に適用できます。正則化項UniCは、市販のソルバーの後に適用して精度の次数を高めることも可能です。
論文の抄録は以下の通りです:
拡散確率モデル(DPM)は、高解像度画像合成において非常に有望な能力を示しています。しかし、DPMからのサンプリングは、ノイズ除去ネットワークの複数回の評価が必要であるため時間がかかり、DPMのサンプリングを高速化することがますます重要になっています。高速サンプラーの設計における最近の進歩にもかかわらず、既存の方法では、より少ないステップ(例:<10)が好まれる多くのアプリケーションにおいて、満足できる画像を生成することが依然としてできません。本論文では、既存のDPMサンプラーの後に適用でき、追加のモデル評価なしで精度の次数を高めることができる統一コーレクター(UniC)を開発し、その副産物として、任意の次数をサポートする統一プレディクター(UniP)を導出します。UniPとUniCを組み合わせることで、DPMの高速サンプリングのための統一プレディクター-コーレクターフレームワークUniPCを提案します。UniPCは任意の次数に対して統一された解析的な形式を持ち、特に極めて少ないステップ数において、従来の手法よりもサンプリング品質を大幅に向上させることができます。ピクセル空間と潜在空間のDPMを用いた、無条件サンプリングと条件付きサンプリングの両方を含む広範な実験を通じて、我々の手法を評価しました。UniPCは、わずか10回の関数評価で、CIFAR10(無条件)でFID 3.87、ImageNet 256×256(条件付き)でFID 7.51を達成します。コードはこの https URLで入手できます。
ヒント
ガイドサンプリングではsolver_orderを2に設定すること、無条件サンプリングではsolver_order=3に設定することが推奨されます。
Imagenの動的閾値化はサポートされており、ピクセル空間の拡散モデルでは、predict_x0=Trueとthresholding=Trueの両方を設定することで動的閾値化を使用できます。この閾値化手法は、Stable Diffusionなどの潜在空間拡散モデルには適していません。
UniPCMultistepScheduler
class diffusers.UniPCMultistepScheduler
< source >( num_train_timesteps: int = 1000beta_start: float = 0.0001beta_end: float = 0.02beta_schedule: str = '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.0predict_x0: bool = Truesolver_type: typing.Literal['bh1', 'bh2'] = 'bh2'lower_order_final: bool = Truedisable_corrector: list[int] = []solver_p: SchedulerMixin = Noneuse_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 = 0final_sigmas_type: typing.Literal['zero', 'sigma_min'] = 'zero'rescale_betas_zero_snr: bool = Falseuse_dynamic_shifting: bool = Falsetime_shift_type: typing.Literal['exponential'] = 'exponential'sigma_min: float | None = Nonesigma_max: bool | None = Noneshift_terminal: bool | None = None )
パラメータ
- num_train_timesteps (
int、デフォルト値は 1000) — モデルを学習するための拡散ステップ数。 - beta_start (
float、デフォルト値は 0.0001) — 推論の開始時のbeta値。 - beta_end (
float、デフォルト値は 0.02) — 最終的なbeta値。 - beta_schedule(
"linear"、"scaled_linear"、または"squaredcos_cap_v2"。デフォルトは"linear")— ベータスケジュールです。モデルのステップ処理において、ベータの範囲からベータのシーケンスへの変換を定義します。linear、scaled_linear、またはsquaredcos_cap_v2から選択してください。 - trained_betas (
np.ndarray, 省略可) —beta_startとbeta_endをバイパスして、ベータの配列を直接コンストラクタに渡す場合に使用します。 - solver_order (
int、デフォルトは2) — UniPC のオーダーで、任意の正の整数を指定できます。UniC により、実際の精度のオーダーはsolver_order + 1になります。ガイド付きサンプリングにはsolver_order=2、無条件サンプリングにはsolver_order=3の使用を推奨します。 - prediction_type (
"epsilon","sample","v_prediction", or"flow_prediction", defaults to"epsilon", optional) — 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、デフォルトはFalse) — 「動的閾値処理」メソッドを使用するかどうか。Stable Diffusion などの潜在空間拡散モデルには不向きです。 - dynamic_thresholding_ratio (
float、デフォルト値は 0.995) — 動的閾値化手法の比率。thresholding=Trueの場合のみ有効です。 - sample_max_value (
float、デフォルト値は 1.0) — 動的閾値処理の閾値です。thresholding=Trueかつpredict_x0=Trueの場合にのみ有効です。 - predict_x0 (
bool、デフォルトはTrue) — 予測されたx0に対して更新アルゴリズムを使用するかどうか。 - solver_type (
"bh1"または"bh2"、デフォルトは"bh2") — UniPC のソルバータイプです。ステップ数が 10 未満の無条件サンプリングにはbh1を、それ以外にはbh2を使用することをお勧めします。 - lower_order_final (
bool、デフォルトTrue) — 最終ステップで低次数のソルバーを使用するかどうか。推論ステップ数が 15 未満の場合のみ有効です。ステップ数が 15 未満、特に 10 以下の場合は、DPMSolver のサンプリングを安定させることができます。 - disable_corrector (
list、デフォルト[]) —epsilon_theta(x_t, c)とepsilon_theta(x_t^c, c)の間の不一致を緩和するために、どのステップで corrector を無効にするかを決定します。この不一致は、guidance scale が大きい場合に収束に影響を与える可能性があります。通常、corrector は最初の数ステップで無効にされます。 - solver_p (
SchedulerMixin、デフォルトはNone) — 指定された場合、アルゴリズムはsolver_p + UniCになります。 - use_karras_sigmas (
bool、任意、デフォルトはFalse) — サンプリング処理中のノイズスケジュールにおけるステップサイズに Karras sigmas を使用するかどうか。Trueの場合、sigmas はノイズレベルの列 {σi} に基づいて決定されます。 - use_exponential_sigmas (
bool、任意、デフォルトはFalse) — サンプリング処理中のノイズスケジュールにおけるステップサイズに、指数関数的なシグマを使用するかどうかを指定します。 - use_beta_sigmas (
bool, optional, defaults toFalse) — Whether to use beta sigmas for step sizes in the noise schedule during the sampling process. Refer to Beta Sampling is All You Need for more information. - use_flow_sigmas (
bool、任意、デフォルトはFalse) — サンプリング処理中のノイズスケジュールにおいて、ステップサイズにフローシグマを使用するかどうかを指定します。 - timestep_spacing (
"linspace","leading", or"trailing", defaults to"linspace") — The way the timesteps should be scaled. Refer to Table 2 of the Common Diffusion Noise Schedules and Sample Steps are Flawed for more information. - steps_offset (
int、デフォルト値は 0)— 一部のモデルファミリーで必要とされる、推論ステップに追加されるオフセットです。 - final_sigmas_type(
"zero"または"sigma_min"、デフォルトは"zero")— サンプリングプロセス中のノイズスケジュールにおける最終的なsigma値です。"sigma_min"の場合、最終的なsigmaは学習スケジュールの最後のsigmaと同じになります。zeroの場合、最終的なsigmaは0に設定されます。 - rescale_betas_zero_snr (
bool、デフォルトはFalse) — betas を再スケーリングして、終端 SNR をゼロにするかどうかを指定します。これにより、モデルは中間の明るさに限定されず、非常に明るく暗いサンプルを生成できるようになります。--offset_noiseとゆるく関連しています。
UniPCMultistepScheduler は、拡散モデルの高速サンプリングのために設計された、学習不要のフレームワークです。
このモデルは SchedulerMixin および ConfigMixin を継承しています。読み込みや保存など、ライブラリがすべてのスケジューラに対して実装している汎用的なメソッドについては、スーパークラスのドキュメントを参照してください。
add_noise
< source >( original_samples: Tensornoise: Tensortimesteps: IntTensor ) → torch.Tensor
指定されたタイムステップにおけるノイズスケジュールに従って、元のサンプルにノイズを追加します。
convert_model_output
< source >( model_output: Tensor*argssample: Tensor = None**kwargs ) → torch.Tensor
モデルの出力を、UniPCアルゴリズムが要求する対応する型に変換します。
index_for_timestep
< source >( timestep: typing.Union[int, torch.Tensor]schedule_timesteps: typing.Optional[torch.Tensor] = None ) → int
スケジュール内の指定されたタイムステップのインデックスを取得します。
multistep_uni_c_bh_update
< source >( this_model_output: Tensor*argslast_sample: Tensor = Nonethis_sample: Tensor = Noneorder: int = None**kwargs ) → torch.Tensor
パラメータ
- this_model_output (
torch.Tensor) —x_tにおけるモデルの出力です。 - this_timestep (
int) — 現在のタイムステップt。 - last_sample (
torch.Tensor) — 最後の予測器x_{t-1}による生成サンプル。 - this_sample (
torch.Tensor) — 最後の予測器x_{t}以降に生成されたサンプルです。 - order (
int) — このステップにおける UniC-p のpです。有効な精度の次数はorder + 1になるはずです。
戻り値
torch.Tensor
現在のタイムステップにおける修正済みサンプルテンソル。
UniC(B(h)版)の1ステップ。
multistep_uni_p_bh_update
< source >( model_output: Tensor*argssample: Tensor = Noneorder: int = None**kwargs ) → torch.Tensor
UniP(B(h)版)の1ステップ。または、指定されている場合はself.solver_pが使用されます。
scale_model_input
< source >( sample: Tensor*args**kwargs ) → torch.Tensor
現在のタイムステップに応じて、デノイジングモデルの入力をスケーリングする必要があるスケジューラーとの相互運用性を保証します。
set_begin_index
< source >( begin_index: int = 0 )
スケジューラの開始インデックスを設定します。この関数は、推論の前にパイプラインから実行する必要があります。
set_timesteps
< source >( num_inference_steps: int | None = Nonedevice: typing.Union[str, torch.device] = Nonesigmas: list[float] | None = Nonemu: bool | None = None )
パラメータ
- num_inference_steps (
int) — 事前学習済みモデルでサンプルを生成する際に使用する拡散ステップの数。 - device (
strまたはtorch.device、省略可) — timesteps を移動先とするデバイスです。Noneの場合、timesteps は移動されません。 - sigmas (
List[float], 任意) — 各拡散ステップで使用するシグマの自定义値。Noneの場合、シグマは自動的に計算されます。 - mu (
float, 任意) — exponential time shift type を使用する場合の動的シフトに用いる任意の mu パラメータ。
拡散チェーンで使用される離散タイムステップを設定します(推論の実行前に実行する必要があります)。
ステップ
< source >( model_output: Tensortimestep: typing.Union[int, torch.Tensor]sample: Tensorreturn_dict: bool = True ) → SchedulerOutput or tuple
パラメータ
- model_output (
torch.Tensor) — 学習済み拡散モデルからの直接の出力です。 - timestep (
intまたはtorch.Tensor) — 拡散チェーンにおける現在の離散タイムステップです。 - sample (
torch.Tensor) — 拡散プロセスによって生成されたサンプルの現在のインスタンス。 - return_dict (
bool、デフォルトはTrue) —tupleを返すか、SchedulerOutput を返すかを指定します。
戻り値
SchedulerOutput または tuple
True の場合、SchedulerOutput が返され、それ以外の場合は、最初の要素がサンプルテンソルであるタプルが返されます。
前のタイムステップのサンプルをSDEを逆方向に適用することで予測します。この関数は、マルチステップUniPCを用いてサンプルを伝播します。
stretch_shift_to_terminal
< source >( t: Tensor ) → torch.Tensor
shift_terminal 設定値で終了するように、タイムステップスケジュールを伸縮およびシフトします。
time_shift
< source >( mu: floatsigma: floatt: Tensor ) → torch.Tensor
シグマに時間シフトを適用します。
SchedulerOutput
class diffusers.schedulers.scheduling_utils.SchedulerOutput
< source >( prev_sample: Tensor )
スケジューラーのstep関数の出力の基底クラス。