Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

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)

AltStyle によって変換されたページ (->オリジナル) /