From 10bf1084cc8f1a44f7f8cd9fbae94c23210c6536 Mon Sep 17 00:00:00 2001 From: Richard Palethorpe Date: Mon, 15 Sep 2025 20:42:46 +0100 Subject: [PATCH] =?UTF-8?q?chore:=20=E2=AC=86=EF=B8=8F=20Update=20leejet/s?= =?UTF-8?q?table-diffusion.cpp=20to=200ebe6fe118f125665939b27c89f34ed38716?= =?UTF-8?q?bff8=20(#6271)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * :arrow_up: Update leejet/stable-diffusion.cpp Signed-off-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> * fix(stablediffusion-ggml): Move parameters and start refactor of passing params Signed-off-by: Richard Palethorpe * fix(stablediffusion-ggml): Add default sampler option Signed-off-by: Richard Palethorpe --------- Signed-off-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Signed-off-by: Richard Palethorpe Co-authored-by: mudler <2420543+mudler@users.noreply.github.com> --- backend/go/stablediffusion-ggml/Makefile | 2 +- backend/go/stablediffusion-ggml/gosd.cpp | 99 ++++++++++++++++-------- backend/go/stablediffusion-ggml/gosd.go | 23 +++++- backend/go/stablediffusion-ggml/gosd.h | 17 +++- backend/go/stablediffusion-ggml/main.go | 25 +++++- 5 files changed, 126 insertions(+), 40 deletions(-) diff --git a/backend/go/stablediffusion-ggml/Makefile b/backend/go/stablediffusion-ggml/Makefile index 9aa74c27f..4cbf9dcf1 100644 --- a/backend/go/stablediffusion-ggml/Makefile +++ b/backend/go/stablediffusion-ggml/Makefile @@ -8,7 +8,7 @@ JOBS?=$(shell nproc --ignore=1) # stablediffusion.cpp (ggml) STABLEDIFFUSION_GGML_REPO?=https://github.com/leejet/stable-diffusion.cpp -STABLEDIFFUSION_GGML_VERSION?=fce6afcc6a3250a8e17923608922d2a99b339b47 +STABLEDIFFUSION_GGML_VERSION?=0ebe6fe118f125665939b27c89f34ed38716bff8 CMAKE_ARGS+=-DGGML_MAX_NAME=128 diff --git a/backend/go/stablediffusion-ggml/gosd.cpp b/backend/go/stablediffusion-ggml/gosd.cpp index 4a2e01da4..db51b0b09 100644 --- a/backend/go/stablediffusion-ggml/gosd.cpp +++ b/backend/go/stablediffusion-ggml/gosd.cpp @@ -4,17 +4,11 @@ #include #include #include -#include -#include #include #include #include #include "gosd.h" -// #include "preprocessing.hpp" -#include "flux.hpp" -#include "stable-diffusion.h" - #define STB_IMAGE_IMPLEMENTATION #define STB_IMAGE_STATIC #include "stb_image.h" @@ -29,7 +23,7 @@ // Names of the sampler method, same order as enum sample_method in stable-diffusion.h const char* sample_method_str[] = { - "euler_a", + "default", "euler", "heun", "dpm2", @@ -41,6 +35,7 @@ const char* sample_method_str[] = { "lcm", "ddim_trailing", "tcd", + "euler_a", }; static_assert(std::size(sample_method_str) == SAMPLE_METHOD_COUNT, "sample method mismatch"); @@ -173,7 +168,7 @@ int load_model(const char *model, char *model_path, char* options[], int threads } if (sample_method_found == -1) { fprintf(stderr, "Invalid sample method, default to EULER_A!\n"); - sample_method_found = EULER_A; + sample_method_found = sample_method_t::SAMPLE_METHOD_DEFAULT; } sample_method = (sample_method_t)sample_method_found; @@ -197,9 +192,7 @@ int load_model(const char *model, char *model_path, char* options[], int threads ctx_params.control_net_path = ""; ctx_params.lora_model_dir = lora_dir; ctx_params.embedding_dir = ""; - ctx_params.stacked_id_embed_dir = ""; ctx_params.vae_decode_only = false; - ctx_params.vae_tiling = false; ctx_params.free_params_immediately = false; ctx_params.n_threads = threads; ctx_params.rng_type = STD_DEFAULT_RNG; @@ -225,7 +218,49 @@ int load_model(const char *model, char *model_path, char* options[], int threads return 0; } -int gen_image(char *text, char *negativeText, int width, int height, int steps, int64_t seed, char *dst, float cfg_scale, char *src_image, float strength, char *mask_image, char **ref_images, int ref_images_count) { +void sd_tiling_params_set_enabled(sd_tiling_params_t *params, bool enabled) { + params->enabled = enabled; +} + +void sd_tiling_params_set_tile_sizes(sd_tiling_params_t *params, int tile_size_x, int tile_size_y) { + params->tile_size_x = tile_size_x; + params->tile_size_y = tile_size_y; +} + +void sd_tiling_params_set_rel_sizes(sd_tiling_params_t *params, float rel_size_x, float rel_size_y) { + params->rel_size_x = rel_size_x; + params->rel_size_y = rel_size_y; +} + +void sd_tiling_params_set_target_overlap(sd_tiling_params_t *params, float target_overlap) { + params->target_overlap = target_overlap; +} + +sd_tiling_params_t* sd_img_gen_params_get_vae_tiling_params(sd_img_gen_params_t *params) { + return ¶ms->vae_tiling_params; +} + +sd_img_gen_params_t* sd_img_gen_params_new(void) { + sd_img_gen_params_t *params = (sd_img_gen_params_t *)std::malloc(sizeof(sd_img_gen_params_t)); + sd_img_gen_params_init(params); + return params; +} + +void sd_img_gen_params_set_prompts(sd_img_gen_params_t *params, const char *prompt, const char *negative_prompt) { + params->prompt = prompt; + params->negative_prompt = negative_prompt; +} + +void sd_img_gen_params_set_dimensions(sd_img_gen_params_t *params, int width, int height) { + params->width = width; + params->height = height; +} + +void sd_img_gen_params_set_seed(sd_img_gen_params_t *params, int64_t seed) { + params->seed = seed; +} + +int gen_image(sd_img_gen_params_t *p, int steps, char *dst, float cfg_scale, char *src_image, float strength, char *mask_image, char **ref_images, int ref_images_count) { sd_image_t* results; @@ -233,21 +268,15 @@ int gen_image(char *text, char *negativeText, int width, int height, int steps, fprintf (stderr, "Generating image\n"); - sd_img_gen_params_t p; - sd_img_gen_params_init(&p); + p->sample_params.guidance.txt_cfg = cfg_scale; + p->sample_params.guidance.slg.layers = skip_layers.data(); + p->sample_params.guidance.slg.layer_count = skip_layers.size(); + p->sample_params.sample_method = sample_method; + p->sample_params.sample_steps = steps; + p->sample_params.scheduler = scheduler; - p.prompt = text; - p.negative_prompt = negativeText; - p.sample_params.guidance.txt_cfg = cfg_scale; - p.sample_params.guidance.slg.layers = skip_layers.data(); - p.sample_params.guidance.slg.layer_count = skip_layers.size(); - p.width = width; - p.height = height; - p.sample_params.sample_method = sample_method; - p.sample_params.sample_steps = steps; - p.seed = seed; - p.input_id_images_path = ""; - p.sample_params.scheduler = scheduler; + int width = p->width; + int height = p->height; // Handle input image for img2img bool has_input_image = (src_image != NULL && strlen(src_image) > 0); @@ -296,13 +325,13 @@ int gen_image(char *text, char *negativeText, int width, int height, int steps, input_image_buffer = resized_image_buffer; } - p.init_image = {(uint32_t)width, (uint32_t)height, 3, input_image_buffer}; - p.strength = strength; + p->init_image = {(uint32_t)width, (uint32_t)height, 3, input_image_buffer}; + p->strength = strength; fprintf(stderr, "Using img2img with strength: %.2f\n", strength); } else { // No input image, use empty image for text-to-image - p.init_image = {(uint32_t)width, (uint32_t)height, 3, NULL}; - p.strength = 0.0f; + p->init_image = {(uint32_t)width, (uint32_t)height, 3, NULL}; + p->strength = 0.0f; } // Handle mask image for inpainting @@ -342,12 +371,12 @@ int gen_image(char *text, char *negativeText, int width, int height, int steps, mask_image_buffer = resized_mask_buffer; } - p.mask_image = {(uint32_t)width, (uint32_t)height, 1, mask_image_buffer}; + p->mask_image = {(uint32_t)width, (uint32_t)height, 1, mask_image_buffer}; fprintf(stderr, "Using inpainting with mask\n"); } else { // No mask image, create default full mask default_mask_image_vec.resize(width * height, 255); - p.mask_image = {(uint32_t)width, (uint32_t)height, 1, default_mask_image_vec.data()}; + p->mask_image = {(uint32_t)width, (uint32_t)height, 1, default_mask_image_vec.data()}; } // Handle reference images @@ -405,13 +434,15 @@ int gen_image(char *text, char *negativeText, int width, int height, int steps, } if (!ref_images_vec.empty()) { - p.ref_images = ref_images_vec.data(); - p.ref_images_count = ref_images_vec.size(); + p->ref_images = ref_images_vec.data(); + p->ref_images_count = ref_images_vec.size(); fprintf(stderr, "Using %zu reference images\n", ref_images_vec.size()); } } - results = generate_image(sd_c, &p); + results = generate_image(sd_c, p); + + std::free(p); if (results == NULL) { fprintf (stderr, "NO results\n"); diff --git a/backend/go/stablediffusion-ggml/gosd.go b/backend/go/stablediffusion-ggml/gosd.go index 6a1d7535c..d2bec357a 100644 --- a/backend/go/stablediffusion-ggml/gosd.go +++ b/backend/go/stablediffusion-ggml/gosd.go @@ -22,7 +22,18 @@ type SDGGML struct { var ( LoadModel func(model, model_apth string, options []uintptr, threads int32, diff int) int - GenImage func(text, negativeText string, width, height, steps int, seed int64, dst string, cfgScale float32, srcImage string, strength float32, maskImage string, refImages []string, refImagesCount int) int + GenImage func(params uintptr, steps int, dst string, cfgScale float32, srcImage string, strength float32, maskImage string, refImages []string, refImagesCount int) int + + TilingParamsSetEnabled func(params uintptr, enabled bool) + TilingParamsSetTileSizes func(params uintptr, tileSizeX int, tileSizeY int) + TilingParamsSetRelSizes func(params uintptr, relSizeX float32, relSizeY float32) + TilingParamsSetTargetOverlap func(params uintptr, targetOverlap float32) + + ImgGenParamsNew func() uintptr + ImgGenParamsSetPrompts func(params uintptr, prompt string, negativePrompt string) + ImgGenParamsSetDimensions func(params uintptr, width int, height int) + ImgGenParamsSetSeed func(params uintptr, seed int64) + ImgGenParamsGetVaeTilingParams func(params uintptr) uintptr ) // Copied from Purego internal/strings @@ -120,7 +131,15 @@ func (sd *SDGGML) GenerateImage(opts *pb.GenerateImageRequest) error { // Default strength for img2img (0.75 is a good default) strength := float32(0.75) - ret := GenImage(t, negative, int(opts.Width), int(opts.Height), int(opts.Step), int64(opts.Seed), dst, sd.cfgScale, srcImage, strength, maskImage, refImages, refImagesCount) + // free'd by GenImage + p := ImgGenParamsNew() + ImgGenParamsSetPrompts(p, t, negative) + ImgGenParamsSetDimensions(p, int(opts.Width), int(opts.Height)) + ImgGenParamsSetSeed(p, int64(opts.Seed)) + vaep := ImgGenParamsGetVaeTilingParams(p) + TilingParamsSetEnabled(vaep, false) + + ret := GenImage(p, int(opts.Step), dst, sd.cfgScale, srcImage, strength, maskImage, refImages, refImagesCount) if ret != 0 { return fmt.Errorf("inference failed") } diff --git a/backend/go/stablediffusion-ggml/gosd.h b/backend/go/stablediffusion-ggml/gosd.h index 9ce94869b..823133c4f 100644 --- a/backend/go/stablediffusion-ggml/gosd.h +++ b/backend/go/stablediffusion-ggml/gosd.h @@ -1,8 +1,23 @@ +#include +#include "stable-diffusion.h" + #ifdef __cplusplus extern "C" { #endif + +void sd_tiling_params_set_enabled(sd_tiling_params_t *params, bool enabled); +void sd_tiling_params_set_tile_sizes(sd_tiling_params_t *params, int tile_size_x, int tile_size_y); +void sd_tiling_params_set_rel_sizes(sd_tiling_params_t *params, float rel_size_x, float rel_size_y); +void sd_tiling_params_set_target_overlap(sd_tiling_params_t *params, float target_overlap); +sd_tiling_params_t* sd_img_gen_params_get_vae_tiling_params(sd_img_gen_params_t *params); + +sd_img_gen_params_t* sd_img_gen_params_new(void); +void sd_img_gen_params_set_prompts(sd_img_gen_params_t *params, const char *prompt, const char *negative_prompt); +void sd_img_gen_params_set_dimensions(sd_img_gen_params_t *params, int width, int height); +void sd_img_gen_params_set_seed(sd_img_gen_params_t *params, int64_t seed); + int load_model(const char *model, char *model_path, char* options[], int threads, int diffusionModel); -int gen_image(char *text, char *negativeText, int width, int height, int steps, int64_t seed, char *dst, float cfg_scale, char *src_image, float strength, char *mask_image, char **ref_images, int ref_images_count); +int gen_image(sd_img_gen_params_t *p, int steps, char *dst, float cfg_scale, char *src_image, float strength, char *mask_image, char **ref_images, int ref_images_count); #ifdef __cplusplus } #endif diff --git a/backend/go/stablediffusion-ggml/main.go b/backend/go/stablediffusion-ggml/main.go index 85841db11..4f053fbbe 100644 --- a/backend/go/stablediffusion-ggml/main.go +++ b/backend/go/stablediffusion-ggml/main.go @@ -11,14 +11,35 @@ var ( addr = flag.String("addr", "localhost:50051", "the address to connect to") ) +type LibFuncs struct { + FuncPtr any + Name string +} + func main() { gosd, err := purego.Dlopen("./libgosd.so", purego.RTLD_NOW|purego.RTLD_GLOBAL) if err != nil { panic(err) } - purego.RegisterLibFunc(&LoadModel, gosd, "load_model") - purego.RegisterLibFunc(&GenImage, gosd, "gen_image") + libFuncs := []LibFuncs{ + {&LoadModel, "load_model"}, + {&GenImage, "gen_image"}, + {&TilingParamsSetEnabled, "sd_tiling_params_set_enabled"}, + {&TilingParamsSetTileSizes, "sd_tiling_params_set_tile_sizes"}, + {&TilingParamsSetRelSizes, "sd_tiling_params_set_rel_sizes"}, + {&TilingParamsSetTargetOverlap, "sd_tiling_params_set_target_overlap"}, + + {&ImgGenParamsNew, "sd_img_gen_params_new"}, + {&ImgGenParamsSetPrompts, "sd_img_gen_params_set_prompts"}, + {&ImgGenParamsSetDimensions, "sd_img_gen_params_set_dimensions"}, + {&ImgGenParamsSetSeed, "sd_img_gen_params_set_seed"}, + {&ImgGenParamsGetVaeTilingParams, "sd_img_gen_params_get_vae_tiling_params"}, + } + + for _, lf := range libFuncs { + purego.RegisterLibFunc(lf.FuncPtr, gosd, lf.Name) + } flag.Parse()