From 83267a30ca41dcec9d74878faaa06993b3f1fed9 Mon Sep 17 00:00:00 2001 From: Wagner Bruna Date: Thu, 20 Nov 2025 19:00:01 -0300 Subject: [PATCH] fix: always initialize the default scheduler If the context was reused for new generationa, choosing the default scheduler wouldn't change it back from a previously chosen one. --- denoiser.hpp | 47 ++++++++++++++++++++++++++++++++++++++++++++ stable-diffusion.cpp | 45 +----------------------------------------- 2 files changed, 48 insertions(+), 44 deletions(-) diff --git a/denoiser.hpp b/denoiser.hpp index 5ff45bb2c..8d634e7cb 100644 --- a/denoiser.hpp +++ b/denoiser.hpp @@ -342,6 +342,49 @@ struct Denoiser { auto bound_t_to_sigma = std::bind(&Denoiser::t_to_sigma, this, std::placeholders::_1); return scheduler->get_sigmas(n, sigma_min(), sigma_max(), bound_t_to_sigma); } + + virtual void init_scheduler(scheduler_t sched, SDVersion version) { + switch (sched) { + case DEFAULT: + case DISCRETE: + LOG_INFO("running with discrete scheduler"); + scheduler = std::make_shared(); + break; + case KARRAS: + LOG_INFO("running with Karras scheduler"); + scheduler = std::make_shared(); + break; + case EXPONENTIAL: + LOG_INFO("running with exponential scheduler"); + scheduler = std::make_shared(); + break; + case AYS: + LOG_INFO("Running with Align-Your-Steps scheduler"); + scheduler = std::make_shared(); + break; + case GITS: + LOG_INFO("Running with GITS scheduler"); + scheduler = std::make_shared(); + break; + case SGM_UNIFORM: + LOG_INFO("Running with SGM Uniform scheduler"); + scheduler = std::make_shared(); + break; + case SIMPLE: + LOG_INFO("Running with Simple scheduler"); + scheduler = std::make_shared(); + break; + case SMOOTHSTEP: + LOG_INFO("Running with SmoothStep scheduler"); + scheduler = std::make_shared(); + break; + default: + LOG_ERROR("Unknown scheduler %i", (int)sched); + abort(); + } + scheduler->version = version; + } + }; struct CompVisDenoiser : public Denoiser { @@ -429,6 +472,10 @@ struct EDMVDenoiser : public CompVisVDenoiser { scheduler = std::make_shared(); } + void init_scheduler(scheduler_t sched, SDVersion version) override { + CompVisVDenoiser::init_scheduler(sched == DEFAULT ? EXPONENTIAL : sched, version); + } + float t_to_sigma(float t) override { return std::exp(t * 4 / (float)TIMESTEPS); } diff --git a/stable-diffusion.cpp b/stable-diffusion.cpp index c98d6d523..8798a3903 100644 --- a/stable-diffusion.cpp +++ b/stable-diffusion.cpp @@ -871,50 +871,7 @@ class StableDiffusionGGML { } void init_scheduler(scheduler_t scheduler) { - switch (scheduler) { - case DISCRETE: - LOG_INFO("running with discrete scheduler"); - denoiser->scheduler = std::make_shared(); - break; - case KARRAS: - LOG_INFO("running with Karras scheduler"); - denoiser->scheduler = std::make_shared(); - break; - case EXPONENTIAL: - LOG_INFO("running exponential scheduler"); - denoiser->scheduler = std::make_shared(); - break; - case AYS: - LOG_INFO("Running with Align-Your-Steps scheduler"); - denoiser->scheduler = std::make_shared(); - denoiser->scheduler->version = version; - break; - case GITS: - LOG_INFO("Running with GITS scheduler"); - denoiser->scheduler = std::make_shared(); - denoiser->scheduler->version = version; - break; - case SGM_UNIFORM: - LOG_INFO("Running with SGM Uniform schedule"); - denoiser->scheduler = std::make_shared(); - denoiser->scheduler->version = version; - break; - case SIMPLE: - LOG_INFO("Running with Simple schedule"); - denoiser->scheduler = std::make_shared(); - denoiser->scheduler->version = version; - break; - case SMOOTHSTEP: - LOG_INFO("Running with SmoothStep scheduler"); - denoiser->scheduler = std::make_shared(); - break; - case DEFAULT: - // Don't touch anything. - break; - default: - LOG_ERROR("Unknown scheduler %i", scheduler); - abort(); - } + denoiser->init_scheduler(scheduler, version); } bool is_using_v_parameterization_for_sd2(ggml_context* work_ctx, bool is_inpaint = false) {