Skip to content

Commit c607fc3

Browse files
authored
feat: use Euler sampling by default for SD3 and Flux (#753)
Thank you for your contribution.
1 parent b54bec3 commit c607fc3

File tree

4 files changed

+33
-9
lines changed

4 files changed

+33
-9
lines changed

README.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -334,9 +334,9 @@ arguments:
334334
--skip-layers LAYERS Layers to skip for SLG steps: (default: [7,8,9])
335335
--skip-layer-start START SLG enabling point: (default: 0.01)
336336
--skip-layer-end END SLG disabling point: (default: 0.2)
337-
--scheduler {discrete, karras, exponential, ays, gits} Denoiser sigma scheduler (default: discrete)
337+
--scheduler {discrete, karras, exponential, ays, gits, smoothstep} Denoiser sigma scheduler (default: discrete)
338338
--sampling-method {euler, euler_a, heun, dpm2, dpm++2s_a, dpm++2m, dpm++2mv2, ipndm, ipndm_v, lcm, ddim_trailing, tcd}
339-
sampling method (default: "euler_a")
339+
sampling method (default: "euler" for Flux/SD3/Wan, "euler_a" otherwise)
340340
--steps STEPS number of sample steps (default: 20)
341341
--high-noise-cfg-scale SCALE (high noise) unconditional guidance scale: (default: 7.0)
342342
--high-noise-img-cfg-scale SCALE (high noise) image guidance scale for inpaint or instruct-pix2pix models: (default: same as --cfg-scale)
@@ -347,7 +347,7 @@ arguments:
347347
--high-noise-skip-layers LAYERS (high noise) Layers to skip for SLG steps: (default: [7,8,9])
348348
--high-noise-skip-layer-start (high noise) SLG enabling point: (default: 0.01)
349349
--high-noise-skip-layer-end END (high noise) SLG disabling point: (default: 0.2)
350-
--high-noise-scheduler {discrete, karras, exponential, ays, gits} Denoiser sigma scheduler (default: discrete)
350+
--high-noise-scheduler {discrete, karras, exponential, ays, gits, smoothstep} Denoiser sigma scheduler (default: discrete)
351351
--high-noise-sampling-method {euler, euler_a, heun, dpm2, dpm++2s_a, dpm++2m, dpm++2mv2, ipndm, ipndm_v, lcm, ddim_trailing, tcd}
352352
(high noise) sampling method (default: "euler_a")
353353
--high-noise-steps STEPS (high noise) number of sample steps (default: -1 = auto)

examples/cli/main.cpp

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -240,7 +240,7 @@ void print_usage(int argc, const char* argv[]) {
240240
printf(" --skip-layer-end END SLG disabling point: (default: 0.2)\n");
241241
printf(" --scheduler {discrete, karras, exponential, ays, gits, smoothstep} 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");
243-
printf(" sampling method (default: \"euler_a\")\n");
243+
printf(" sampling method (default: \"euler\" for Flux/SD3/Wan, \"euler_a\" otherwise)\n");
244244
printf(" --steps STEPS number of sample steps (default: 20)\n");
245245
printf(" --high-noise-cfg-scale SCALE (high noise) unconditional guidance scale: (default: 7.0)\n");
246246
printf(" --high-noise-img-cfg-scale SCALE (high noise) image guidance scale for inpaint or instruct-pix2pix models: (default: same as --cfg-scale)\n");
@@ -1202,6 +1202,10 @@ int main(int argc, const char* argv[]) {
12021202
return 1;
12031203
}
12041204

1205+
if (params.sample_params.sample_method == SAMPLE_METHOD_DEFAULT) {
1206+
params.sample_params.sample_method = sd_get_default_sample_method(sd_ctx);
1207+
}
1208+
12051209
sd_image_t* results;
12061210
int num_results = 1;
12071211
if (params.mode == IMG_GEN) {

stable-diffusion.cpp

Lines changed: 22 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ const char* model_version_to_str[] = {
4343
};
4444

4545
const char* sampling_methods_str[] = {
46-
"Euler A",
46+
"default",
4747
"Euler",
4848
"Heun",
4949
"DPM2",
@@ -55,6 +55,7 @@ const char* sampling_methods_str[] = {
5555
"LCM",
5656
"DDIM \"trailing\"",
5757
"TCD",
58+
"Euler A",
5859
};
5960

6061
/*================================================== Helper Functions ================================================*/
@@ -1500,7 +1501,7 @@ enum rng_type_t str_to_rng_type(const char* str) {
15001501
}
15011502

15021503
const char* sample_method_to_str[] = {
1503-
"euler_a",
1504+
"default",
15041505
"euler",
15051506
"heun",
15061507
"dpm2",
@@ -1512,6 +1513,7 @@ const char* sample_method_to_str[] = {
15121513
"lcm",
15131514
"ddim_trailing",
15141515
"tcd",
1516+
"euler_a",
15151517
};
15161518

15171519
const char* sd_sample_method_name(enum sample_method_t sample_method) {
@@ -1650,7 +1652,7 @@ void sd_sample_params_init(sd_sample_params_t* sample_params) {
16501652
sample_params->guidance.slg.layer_end = 0.2f;
16511653
sample_params->guidance.slg.scale = 0.f;
16521654
sample_params->scheduler = DEFAULT;
1653-
sample_params->sample_method = EULER_A;
1655+
sample_params->sample_method = SAMPLE_METHOD_DEFAULT;
16541656
sample_params->sample_steps = 20;
16551657
}
16561658

@@ -1792,6 +1794,17 @@ void free_sd_ctx(sd_ctx_t* sd_ctx) {
17921794
free(sd_ctx);
17931795
}
17941796

1797+
enum sample_method_t sd_get_default_sample_method(const sd_ctx_t* sd_ctx) {
1798+
if (sd_ctx != NULL && sd_ctx->sd != NULL) {
1799+
SDVersion version = sd_ctx->sd->version;
1800+
if (sd_version_is_dit(version))
1801+
return EULER;
1802+
else
1803+
return EULER_A;
1804+
}
1805+
return SAMPLE_METHOD_COUNT;
1806+
}
1807+
17951808
sd_image_t* generate_image_internal(sd_ctx_t* sd_ctx,
17961809
struct ggml_context* work_ctx,
17971810
ggml_tensor* init_latent,
@@ -2356,6 +2369,11 @@ sd_image_t* generate_image(sd_ctx_t* sd_ctx, const sd_img_gen_params_t* sd_img_g
23562369
LOG_INFO("encode_first_stage completed, taking %.2fs", (t1 - t0) * 1.0f / 1000);
23572370
}
23582371

2372+
enum sample_method_t sample_method = sd_img_gen_params->sample_params.sample_method;
2373+
if (sample_method == SAMPLE_METHOD_DEFAULT) {
2374+
sample_method = sd_get_default_sample_method(sd_ctx);
2375+
}
2376+
23592377
sd_image_t* result_images = generate_image_internal(sd_ctx,
23602378
work_ctx,
23612379
init_latent,
@@ -2366,7 +2384,7 @@ sd_image_t* generate_image(sd_ctx_t* sd_ctx, const sd_img_gen_params_t* sd_img_g
23662384
sd_img_gen_params->sample_params.eta,
23672385
width,
23682386
height,
2369-
sd_img_gen_params->sample_params.sample_method,
2387+
sample_method,
23702388
sigmas,
23712389
seed,
23722390
sd_img_gen_params->batch_count,

stable-diffusion.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ enum rng_type_t {
3535
};
3636

3737
enum sample_method_t {
38-
EULER_A,
38+
SAMPLE_METHOD_DEFAULT,
3939
EULER,
4040
HEUN,
4141
DPM2,
@@ -47,6 +47,7 @@ enum sample_method_t {
4747
LCM,
4848
DDIM_TRAILING,
4949
TCD,
50+
EULER_A,
5051
SAMPLE_METHOD_COUNT
5152
};
5253

@@ -238,6 +239,7 @@ SD_API char* sd_ctx_params_to_str(const sd_ctx_params_t* sd_ctx_params);
238239

239240
SD_API sd_ctx_t* new_sd_ctx(const sd_ctx_params_t* sd_ctx_params);
240241
SD_API void free_sd_ctx(sd_ctx_t* sd_ctx);
242+
SD_API enum sample_method_t sd_get_default_sample_method(const sd_ctx_t* sd_ctx);
241243

242244
SD_API void sd_sample_params_init(sd_sample_params_t* sample_params);
243245
SD_API char* sd_sample_params_to_str(const sd_sample_params_t* sample_params);

0 commit comments

Comments
 (0)