diff --git a/invokeai/backend/stable_diffusion/schedulers/schedulers.py b/invokeai/backend/stable_diffusion/schedulers/schedulers.py index 7d6851e278..c8836b316a 100644 --- a/invokeai/backend/stable_diffusion/schedulers/schedulers.py +++ b/invokeai/backend/stable_diffusion/schedulers/schedulers.py @@ -20,10 +20,14 @@ from diffusers import ( ) from diffusers.schedulers.scheduling_utils import SchedulerMixin +# TODO: add dpmpp_3s/dpmpp_3s_k when fix released +# https://github.com/huggingface/diffusers/issues/9007 + SCHEDULER_NAME_VALUES = Literal[ "ddim", "ddpm", "deis", + "deis_k", "lms", "lms_k", "pndm", @@ -33,16 +37,21 @@ SCHEDULER_NAME_VALUES = Literal[ "euler_k", "euler_a", "kdpm_2", + "kdpm_2_k", "kdpm_2_a", + "kdpm_2_a_k", "dpmpp_2s", "dpmpp_2s_k", "dpmpp_2m", "dpmpp_2m_k", "dpmpp_2m_sde", "dpmpp_2m_sde_k", + "dpmpp_3m", + "dpmpp_3m_k", "dpmpp_sde", "dpmpp_sde_k", "unipc", + "unipc_k", "lcm", "tcd", ] @@ -50,7 +59,8 @@ SCHEDULER_NAME_VALUES = Literal[ SCHEDULER_MAP: dict[SCHEDULER_NAME_VALUES, tuple[Type[SchedulerMixin], dict[str, Any]]] = { "ddim": (DDIMScheduler, {}), "ddpm": (DDPMScheduler, {}), - "deis": (DEISMultistepScheduler, {}), + "deis": (DEISMultistepScheduler, {"use_karras_sigmas": False}), + "deis_k": (DEISMultistepScheduler, {"use_karras_sigmas": True}), "lms": (LMSDiscreteScheduler, {"use_karras_sigmas": False}), "lms_k": (LMSDiscreteScheduler, {"use_karras_sigmas": True}), "pndm": (PNDMScheduler, {}), @@ -59,17 +69,28 @@ SCHEDULER_MAP: dict[SCHEDULER_NAME_VALUES, tuple[Type[SchedulerMixin], dict[str, "euler": (EulerDiscreteScheduler, {"use_karras_sigmas": False}), "euler_k": (EulerDiscreteScheduler, {"use_karras_sigmas": True}), "euler_a": (EulerAncestralDiscreteScheduler, {}), - "kdpm_2": (KDPM2DiscreteScheduler, {}), - "kdpm_2_a": (KDPM2AncestralDiscreteScheduler, {}), - "dpmpp_2s": (DPMSolverSinglestepScheduler, {"use_karras_sigmas": False}), - "dpmpp_2s_k": (DPMSolverSinglestepScheduler, {"use_karras_sigmas": True}), - "dpmpp_2m": (DPMSolverMultistepScheduler, {"use_karras_sigmas": False}), - "dpmpp_2m_k": (DPMSolverMultistepScheduler, {"use_karras_sigmas": True}), - "dpmpp_2m_sde": (DPMSolverMultistepScheduler, {"use_karras_sigmas": False, "algorithm_type": "sde-dpmsolver++"}), - "dpmpp_2m_sde_k": (DPMSolverMultistepScheduler, {"use_karras_sigmas": True, "algorithm_type": "sde-dpmsolver++"}), + "kdpm_2": (KDPM2DiscreteScheduler, {"use_karras_sigmas": False}), + "kdpm_2_k": (KDPM2DiscreteScheduler, {"use_karras_sigmas": True}), + "kdpm_2_a": (KDPM2AncestralDiscreteScheduler, {"use_karras_sigmas": False}), + "kdpm_2_a_k": (KDPM2AncestralDiscreteScheduler, {"use_karras_sigmas": True}), + "dpmpp_2s": (DPMSolverSinglestepScheduler, {"use_karras_sigmas": False, "solver_order": 2}), + "dpmpp_2s_k": (DPMSolverSinglestepScheduler, {"use_karras_sigmas": True, "solver_order": 2}), + "dpmpp_2m": (DPMSolverMultistepScheduler, {"use_karras_sigmas": False, "solver_order": 2}), + "dpmpp_2m_k": (DPMSolverMultistepScheduler, {"use_karras_sigmas": True, "solver_order": 2}), + "dpmpp_2m_sde": ( + DPMSolverMultistepScheduler, + {"use_karras_sigmas": False, "solver_order": 2, "algorithm_type": "sde-dpmsolver++"}, + ), + "dpmpp_2m_sde_k": ( + DPMSolverMultistepScheduler, + {"use_karras_sigmas": True, "solver_order": 2, "algorithm_type": "sde-dpmsolver++"}, + ), + "dpmpp_3m": (DPMSolverMultistepScheduler, {"use_karras_sigmas": False, "solver_order": 3}), + "dpmpp_3m_k": (DPMSolverMultistepScheduler, {"use_karras_sigmas": True, "solver_order": 3}), "dpmpp_sde": (DPMSolverSDEScheduler, {"use_karras_sigmas": False, "noise_sampler_seed": 0}), "dpmpp_sde_k": (DPMSolverSDEScheduler, {"use_karras_sigmas": True, "noise_sampler_seed": 0}), - "unipc": (UniPCMultistepScheduler, {"cpu_only": True}), + "unipc": (UniPCMultistepScheduler, {"use_karras_sigmas": False, "cpu_only": True}), + "unipc_k": (UniPCMultistepScheduler, {"use_karras_sigmas": True, "cpu_only": True}), "lcm": (LCMScheduler, {}), "tcd": (TCDScheduler, {}), } diff --git a/invokeai/frontend/web/src/features/nodes/types/common.ts b/invokeai/frontend/web/src/features/nodes/types/common.ts index 2ea8900281..c84b2dae62 100644 --- a/invokeai/frontend/web/src/features/nodes/types/common.ts +++ b/invokeai/frontend/web/src/features/nodes/types/common.ts @@ -32,6 +32,7 @@ export const zSchedulerField = z.enum([ 'ddpm', 'dpmpp_2s', 'dpmpp_2m', + 'dpmpp_3m', 'dpmpp_2m_sde', 'dpmpp_sde', 'heun', @@ -40,12 +41,17 @@ export const zSchedulerField = z.enum([ 'pndm', 'unipc', 'euler_k', + 'deis_k', 'dpmpp_2s_k', 'dpmpp_2m_k', + 'dpmpp_3m_k', 'dpmpp_2m_sde_k', 'dpmpp_sde_k', 'heun_k', + 'kdpm_2_k', + 'kdpm_2_a_k', 'lms_k', + 'unipc_k', 'euler_a', 'kdpm_2_a', 'lcm', diff --git a/invokeai/frontend/web/src/features/parameters/types/constants.ts b/invokeai/frontend/web/src/features/parameters/types/constants.ts index 6d7b4f9248..678b2b37f3 100644 --- a/invokeai/frontend/web/src/features/parameters/types/constants.ts +++ b/invokeai/frontend/web/src/features/parameters/types/constants.ts @@ -52,28 +52,34 @@ export const CLIP_SKIP_MAP = { * Mapping of schedulers to human readable name */ export const SCHEDULER_OPTIONS: ComboboxOption[] = [ - { value: 'euler', label: 'Euler' }, - { value: 'deis', label: 'DEIS' }, { value: 'ddim', label: 'DDIM' }, { value: 'ddpm', label: 'DDPM' }, - { value: 'dpmpp_sde', label: 'DPM++ SDE' }, + { value: 'deis', label: 'DEIS' }, + { value: 'deis_k', label: 'DEIS Karras' }, { value: 'dpmpp_2s', label: 'DPM++ 2S' }, - { value: 'dpmpp_2m', label: 'DPM++ 2M' }, - { value: 'dpmpp_2m_sde', label: 'DPM++ 2M SDE' }, - { value: 'heun', label: 'Heun' }, - { value: 'kdpm_2', label: 'KDPM 2' }, - { value: 'lms', label: 'LMS' }, - { value: 'pndm', label: 'PNDM' }, - { value: 'unipc', label: 'UniPC' }, - { value: 'euler_k', label: 'Euler Karras' }, - { value: 'dpmpp_sde_k', label: 'DPM++ SDE Karras' }, { value: 'dpmpp_2s_k', label: 'DPM++ 2S Karras' }, + { value: 'dpmpp_2m', label: 'DPM++ 2M' }, { value: 'dpmpp_2m_k', label: 'DPM++ 2M Karras' }, + { value: 'dpmpp_2m_sde', label: 'DPM++ 2M SDE' }, { value: 'dpmpp_2m_sde_k', label: 'DPM++ 2M SDE Karras' }, - { value: 'heun_k', label: 'Heun Karras' }, - { value: 'lms_k', label: 'LMS Karras' }, + { value: 'dpmpp_3m', label: 'DPM++ 3M' }, + { value: 'dpmpp_3m_k', label: 'DPM++ 3M Karras' }, + { value: 'dpmpp_sde', label: 'DPM++ SDE' }, + { value: 'dpmpp_sde_k', label: 'DPM++ SDE Karras' }, + { value: 'euler', label: 'Euler' }, + { value: 'euler_k', label: 'Euler Karras' }, { value: 'euler_a', label: 'Euler Ancestral' }, + { value: 'heun', label: 'Heun' }, + { value: 'heun_k', label: 'Heun Karras' }, + { value: 'kdpm_2', label: 'KDPM 2' }, + { value: 'kdpm_2_k', label: 'KDPM 2 Karras' }, { value: 'kdpm_2_a', label: 'KDPM 2 Ancestral' }, + { value: 'kdpm_2_a_k', label: 'KDPM 2 Ancestral Karras' }, { value: 'lcm', label: 'LCM' }, + { value: 'lms', label: 'LMS' }, + { value: 'lms_k', label: 'LMS Karras' }, + { value: 'pndm', label: 'PNDM' }, { value: 'tcd', label: 'TCD' }, -].sort((a, b) => a.label.localeCompare(b.label)); + { value: 'unipc', label: 'UniPC' }, + { value: 'unipc_k', label: 'UniPC Karras' }, +]; diff --git a/invokeai/frontend/web/src/services/api/schema.ts b/invokeai/frontend/web/src/services/api/schema.ts index 59f9897f74..79b82a23fa 100644 --- a/invokeai/frontend/web/src/services/api/schema.ts +++ b/invokeai/frontend/web/src/services/api/schema.ts @@ -3553,7 +3553,7 @@ export type components = { * @default euler * @enum {string} */ - scheduler?: "ddim" | "ddpm" | "deis" | "lms" | "lms_k" | "pndm" | "heun" | "heun_k" | "euler" | "euler_k" | "euler_a" | "kdpm_2" | "kdpm_2_a" | "dpmpp_2s" | "dpmpp_2s_k" | "dpmpp_2m" | "dpmpp_2m_k" | "dpmpp_2m_sde" | "dpmpp_2m_sde_k" | "dpmpp_sde" | "dpmpp_sde_k" | "unipc" | "lcm" | "tcd"; + scheduler?: "ddim" | "ddpm" | "deis" | "deis_k" | "lms" | "lms_k" | "pndm" | "heun" | "heun_k" | "euler" | "euler_k" | "euler_a" | "kdpm_2" | "kdpm_2_k" | "kdpm_2_a" | "kdpm_2_a_k" | "dpmpp_2s" | "dpmpp_2s_k" | "dpmpp_2m" | "dpmpp_2m_k" | "dpmpp_2m_sde" | "dpmpp_2m_sde_k" | "dpmpp_3m" | "dpmpp_3m_k" | "dpmpp_sde" | "dpmpp_sde_k" | "unipc" | "unipc_k" | "lcm" | "tcd"; /** * UNet * @description UNet (scheduler, LoRAs) @@ -8553,7 +8553,7 @@ export type components = { * Scheduler * @description Default scheduler for this model */ - scheduler?: ("ddim" | "ddpm" | "deis" | "lms" | "lms_k" | "pndm" | "heun" | "heun_k" | "euler" | "euler_k" | "euler_a" | "kdpm_2" | "kdpm_2_a" | "dpmpp_2s" | "dpmpp_2s_k" | "dpmpp_2m" | "dpmpp_2m_k" | "dpmpp_2m_sde" | "dpmpp_2m_sde_k" | "dpmpp_sde" | "dpmpp_sde_k" | "unipc" | "lcm" | "tcd") | null; + scheduler?: ("ddim" | "ddpm" | "deis" | "deis_k" | "lms" | "lms_k" | "pndm" | "heun" | "heun_k" | "euler" | "euler_k" | "euler_a" | "kdpm_2" | "kdpm_2_k" | "kdpm_2_a" | "kdpm_2_a_k" | "dpmpp_2s" | "dpmpp_2s_k" | "dpmpp_2m" | "dpmpp_2m_k" | "dpmpp_2m_sde" | "dpmpp_2m_sde_k" | "dpmpp_3m" | "dpmpp_3m_k" | "dpmpp_sde" | "dpmpp_sde_k" | "unipc" | "unipc_k" | "lcm" | "tcd") | null; /** * Steps * @description Default number of steps for this model @@ -11467,7 +11467,7 @@ export type components = { * @default euler * @enum {string} */ - scheduler?: "ddim" | "ddpm" | "deis" | "lms" | "lms_k" | "pndm" | "heun" | "heun_k" | "euler" | "euler_k" | "euler_a" | "kdpm_2" | "kdpm_2_a" | "dpmpp_2s" | "dpmpp_2s_k" | "dpmpp_2m" | "dpmpp_2m_k" | "dpmpp_2m_sde" | "dpmpp_2m_sde_k" | "dpmpp_sde" | "dpmpp_sde_k" | "unipc" | "lcm" | "tcd"; + scheduler?: "ddim" | "ddpm" | "deis" | "deis_k" | "lms" | "lms_k" | "pndm" | "heun" | "heun_k" | "euler" | "euler_k" | "euler_a" | "kdpm_2" | "kdpm_2_k" | "kdpm_2_a" | "kdpm_2_a_k" | "dpmpp_2s" | "dpmpp_2s_k" | "dpmpp_2m" | "dpmpp_2m_k" | "dpmpp_2m_sde" | "dpmpp_2m_sde_k" | "dpmpp_3m" | "dpmpp_3m_k" | "dpmpp_sde" | "dpmpp_sde_k" | "unipc" | "unipc_k" | "lcm" | "tcd"; /** * type * @default scheduler @@ -11483,7 +11483,7 @@ export type components = { * @description Scheduler to use during inference * @enum {string} */ - scheduler: "ddim" | "ddpm" | "deis" | "lms" | "lms_k" | "pndm" | "heun" | "heun_k" | "euler" | "euler_k" | "euler_a" | "kdpm_2" | "kdpm_2_a" | "dpmpp_2s" | "dpmpp_2s_k" | "dpmpp_2m" | "dpmpp_2m_k" | "dpmpp_2m_sde" | "dpmpp_2m_sde_k" | "dpmpp_sde" | "dpmpp_sde_k" | "unipc" | "lcm" | "tcd"; + scheduler: "ddim" | "ddpm" | "deis" | "deis_k" | "lms" | "lms_k" | "pndm" | "heun" | "heun_k" | "euler" | "euler_k" | "euler_a" | "kdpm_2" | "kdpm_2_k" | "kdpm_2_a" | "kdpm_2_a_k" | "dpmpp_2s" | "dpmpp_2s_k" | "dpmpp_2m" | "dpmpp_2m_k" | "dpmpp_2m_sde" | "dpmpp_2m_sde_k" | "dpmpp_3m" | "dpmpp_3m_k" | "dpmpp_sde" | "dpmpp_sde_k" | "unipc" | "unipc_k" | "lcm" | "tcd"; /** * type * @default scheduler_output @@ -13261,7 +13261,7 @@ export type components = { * @default euler * @enum {string} */ - scheduler?: "ddim" | "ddpm" | "deis" | "lms" | "lms_k" | "pndm" | "heun" | "heun_k" | "euler" | "euler_k" | "euler_a" | "kdpm_2" | "kdpm_2_a" | "dpmpp_2s" | "dpmpp_2s_k" | "dpmpp_2m" | "dpmpp_2m_k" | "dpmpp_2m_sde" | "dpmpp_2m_sde_k" | "dpmpp_sde" | "dpmpp_sde_k" | "unipc" | "lcm" | "tcd"; + scheduler?: "ddim" | "ddpm" | "deis" | "deis_k" | "lms" | "lms_k" | "pndm" | "heun" | "heun_k" | "euler" | "euler_k" | "euler_a" | "kdpm_2" | "kdpm_2_k" | "kdpm_2_a" | "kdpm_2_a_k" | "dpmpp_2s" | "dpmpp_2s_k" | "dpmpp_2m" | "dpmpp_2m_k" | "dpmpp_2m_sde" | "dpmpp_2m_sde_k" | "dpmpp_3m" | "dpmpp_3m_k" | "dpmpp_sde" | "dpmpp_sde_k" | "unipc" | "unipc_k" | "lcm" | "tcd"; /** * UNet * @description UNet (scheduler, LoRAs)