From 994a5646e0d04da4e942bee81de5171b6b917d24 Mon Sep 17 00:00:00 2001 From: vmobilis <75476228+vmobilis@users.noreply.github.com> Date: Wed, 30 Apr 2025 22:30:56 +0300 Subject: [PATCH 1/2] denoiser.hpp: simplify DPM++ (2S) Ancestral --- denoiser.hpp | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/denoiser.hpp b/denoiser.hpp index 66799109d..7dcda02b3 100644 --- a/denoiser.hpp +++ b/denoiser.hpp @@ -669,7 +669,7 @@ static void sample_k_diffusion(sample_method_t method, } break; case DPMPP2S_A: { struct ggml_tensor* noise = ggml_dup_tensor(work_ctx, x); - struct ggml_tensor* d = ggml_dup_tensor(work_ctx, x); +// struct ggml_tensor* d = ggml_dup_tensor(work_ctx, x); struct ggml_tensor* x2 = ggml_dup_tensor(work_ctx, x); for (int i = 0; i < steps; i++) { @@ -684,6 +684,8 @@ static void sample_k_diffusion(sample_method_t method, auto sigma_fn = [](float t) -> float { return exp(-t); }; if (sigma_down == 0) { + x = ggml_dup_tensor(work_ctx, denoised); +/* // Euler step float* vec_d = (float*)d->data; float* vec_x = (float*)x->data; @@ -701,6 +703,7 @@ static void sample_k_diffusion(sample_method_t method, for (int j = 0; j < ggml_nelements(d); j++) { vec_x[j] = vec_x[j] + vec_d[j] * dt; } +//*/ } else { // DPM-Solver++(2S) float t = t_fn(sigmas[i]); @@ -708,7 +711,7 @@ static void sample_k_diffusion(sample_method_t method, float h = t_next - t; float s = t + 0.5f * h; - float* vec_d = (float*)d->data; +// float* vec_d = (float*)d->data; float* vec_x = (float*)x->data; float* vec_x2 = (float*)x2->data; float* vec_denoised = (float*)denoised->data; From 859886373cd7cf7abdb988eac7b1b0b597b71806 Mon Sep 17 00:00:00 2001 From: leejet Date: Tue, 16 Sep 2025 23:04:15 +0800 Subject: [PATCH 2/2] adjust code --- denoiser.hpp | 24 ++++++------------------ 1 file changed, 6 insertions(+), 18 deletions(-) diff --git a/denoiser.hpp b/denoiser.hpp index afa939649..3c53301bc 100644 --- a/denoiser.hpp +++ b/denoiser.hpp @@ -770,7 +770,6 @@ static void sample_k_diffusion(sample_method_t method, } break; case DPMPP2S_A: { struct ggml_tensor* noise = ggml_dup_tensor(work_ctx, x); -// struct ggml_tensor* d = ggml_dup_tensor(work_ctx, x); struct ggml_tensor* x2 = ggml_dup_tensor(work_ctx, x); for (int i = 0; i < steps; i++) { @@ -785,26 +784,16 @@ static void sample_k_diffusion(sample_method_t method, auto sigma_fn = [](float t) -> float { return exp(-t); }; if (sigma_down == 0) { - x = ggml_dup_tensor(work_ctx, denoised); -/* - // Euler step - float* vec_d = (float*)d->data; + // d = (x - denoised) / sigmas[i]; + // dt = sigma_down - sigmas[i]; + // x += d * dt; + // => x = denoised float* vec_x = (float*)x->data; float* vec_denoised = (float*)denoised->data; - for (int j = 0; j < ggml_nelements(d); j++) { - vec_d[j] = (vec_x[j] - vec_denoised[j]) / sigmas[i]; - } - - // TODO: If sigma_down == 0, isn't this wrong? - // But - // https://github.com/crowsonkb/k-diffusion/blob/master/k_diffusion/sampling.py#L525 - // has this exactly the same way. - float dt = sigma_down - sigmas[i]; - for (int j = 0; j < ggml_nelements(d); j++) { - vec_x[j] = vec_x[j] + vec_d[j] * dt; + for (int j = 0; j < ggml_nelements(x); j++) { + vec_x[j] = vec_denoised[j]; } -//*/ } else { // DPM-Solver++(2S) float t = t_fn(sigmas[i]); @@ -812,7 +801,6 @@ static void sample_k_diffusion(sample_method_t method, float h = t_next - t; float s = t + 0.5f * h; -// float* vec_d = (float*)d->data; float* vec_x = (float*)x->data; float* vec_x2 = (float*)x2->data; float* vec_denoised = (float*)denoised->data;