Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit f382a48

Browse files
phil2satGreen-Sky
authored andcommitted
Beta Scheduler
1 parent abb115c commit f382a48

File tree

4 files changed

+51
-2
lines changed

4 files changed

+51
-2
lines changed

denoiser.hpp

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33

44
#include "ggml_extend.hpp"
55
#include "gits_noise.inl"
6+
#include <boost/math/distributions/beta.hpp>
67

78
/*================================================= CompVisDenoiser ==================================================*/
89

@@ -251,6 +252,48 @@ struct KarrasSchedule : SigmaSchedule {
251252
}
252253
};
253254

255+
struct BetaSchedule : SigmaSchedule {
256+
float alpha = 0.6f;
257+
float beta = 0.6f;
258+
259+
BetaSchedule(float a = 0.6f, float b = 0.6f) : alpha(a), beta(b) {}
260+
261+
std::vector<float> get_sigmas(uint32_t n, float sigma_min, float sigma_max, t_to_sigma_t t_to_sigma) override {
262+
std::vector<float> result;
263+
result.reserve(n + 1);
264+
265+
int t_max = TIMESTEPS - 1;
266+
if (n == 0) {
267+
return result;
268+
} else if (n == 1) {
269+
result.push_back(t_to_sigma((float)t_max));
270+
result.push_back(0);
271+
return result;
272+
}
273+
274+
// Beta-Verteilung (wie scipy.stats.beta.ppf)
275+
boost::math::beta_distribution<double> dist(alpha, beta);
276+
277+
int last_t = -1;
278+
for (uint32_t i = 0; i < n; i++) {
279+
// entspricht ts = 1 - linspace(0,1,n,endpoint=False)
280+
double u = 1.0 - static_cast<double>(i) / static_cast<double>(n);
281+
282+
// ppf(ts) * total_timesteps
283+
double t_cont = quantile(dist, u) * t_max;
284+
int t = (int)std::lround(t_cont);
285+
286+
if (t != last_t) {
287+
result.push_back(t_to_sigma((float)t));
288+
last_t = t;
289+
}
290+
}
291+
292+
result.push_back(0.0f);
293+
return result;
294+
}
295+
};
296+
254297
struct Denoiser {
255298
std::shared_ptr<SigmaSchedule> scheduler = std::make_shared<DiscreteSchedule>();
256299
virtual float sigma_min() = 0;

examples/cli/main.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -238,7 +238,7 @@ void print_usage(int argc, const char* argv[]) {
238238
printf(" --skip-layers LAYERS Layers to skip for SLG steps: (default: [7,8,9])\n");
239239
printf(" --skip-layer-start START SLG enabling point: (default: 0.01)\n");
240240
printf(" --skip-layer-end END SLG disabling point: (default: 0.2)\n");
241-
printf(" --scheduler {discrete, karras, exponential, ays, gits} Denoiser sigma scheduler (default: discrete)\n");
241+
printf(" --scheduler {discrete, karras, beta, exponential, ays, gits} Denoiser sigma scheduler (default: discrete)\n");
242242
printf(" --sampling-method {euler, euler_a, heun, dpm2, dpm++2s_a, dpm++2m, dpm++2mv2, ipndm, ipndm_v, lcm, ddim_trailing, tcd}\n");
243243
printf(" sampling method (default: \"euler_a\")\n");
244244
printf(" --steps STEPS number of sample steps (default: 20)\n");
@@ -251,7 +251,7 @@ void print_usage(int argc, const char* argv[]) {
251251
printf(" --high-noise-skip-layers LAYERS (high noise) Layers to skip for SLG steps: (default: [7,8,9])\n");
252252
printf(" --high-noise-skip-layer-start (high noise) SLG enabling point: (default: 0.01)\n");
253253
printf(" --high-noise-skip-layer-end END (high noise) SLG disabling point: (default: 0.2)\n");
254-
printf(" --high-noise-scheduler {discrete, karras, exponential, ays, gits} Denoiser sigma scheduler (default: discrete)\n");
254+
printf(" --high-noise-scheduler {discrete, karras, beta, exponential, ays, gits} Denoiser sigma scheduler (default: discrete)\n");
255255
printf(" --high-noise-sampling-method {euler, euler_a, heun, dpm2, dpm++2s_a, dpm++2m, dpm++2mv2, ipndm, ipndm_v, lcm, ddim_trailing, tcd}\n");
256256
printf(" (high noise) sampling method (default: \"euler_a\")\n");
257257
printf(" --high-noise-steps STEPS (high noise) number of sample steps (default: -1 = auto)\n");

stable-diffusion.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -730,6 +730,10 @@ class StableDiffusionGGML {
730730
LOG_INFO("running with Karras scheduler");
731731
denoiser->scheduler = std::make_shared<KarrasSchedule>();
732732
break;
733+
case BETA:
734+
LOG_INFO("running with Beta scheduler");
735+
denoiser->scheduler = std::make_shared<BetaSchedule>();
736+
break;
733737
case EXPONENTIAL:
734738
LOG_INFO("running exponential scheduler");
735739
denoiser->scheduler = std::make_shared<ExponentialSchedule>();
@@ -1524,6 +1528,7 @@ const char* schedule_to_str[] = {
15241528
"default",
15251529
"discrete",
15261530
"karras",
1531+
"beta",
15271532
"exponential",
15281533
"ays",
15291534
"gits",

stable-diffusion.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@ enum scheduler_t {
5454
DEFAULT,
5555
DISCRETE,
5656
KARRAS,
57+
BETA,
5758
EXPONENTIAL,
5859
AYS,
5960
GITS,

0 commit comments

Comments
 (0)