Skip to content

Commit 8fe9fa9

Browse files
authored
fix(stablediffusion-cpp): Switch back to upstream and update (#5880)
* sync(stablediffusion-cpp): Switch back to upstream and update Signed-off-by: Richard Palethorpe <[email protected]> * fix(stablediffusion-ggml): NULL terminate options array to prevent segfault Signed-off-by: Richard Palethorpe <[email protected]> * fix(build): Add BUILD_TYPE and BASE_IMAGE to all backends Signed-off-by: Richard Palethorpe <[email protected]> --------- Signed-off-by: Richard Palethorpe <[email protected]>
1 parent 4db1b80 commit 8fe9fa9

File tree

5 files changed

+106
-80
lines changed

5 files changed

+106
-80
lines changed

.github/workflows/bump_deps.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ jobs:
2121
variable: "BARKCPP_VERSION"
2222
branch: "main"
2323
file: "Makefile"
24-
- repository: "richiejp/stable-diffusion.cpp"
24+
- repository: "leejet/stable-diffusion.cpp"
2525
variable: "STABLEDIFFUSION_GGML_VERSION"
2626
branch: "master"
2727
file: "backend/go/stablediffusion-ggml/Makefile"

Makefile

Lines changed: 18 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -145,7 +145,7 @@ backends/stablediffusion-ggml: docker-build-stablediffusion-ggml docker-save-sta
145145

146146
backends/whisper: docker-build-whisper docker-save-whisper build
147147
./local-ai backends install "ocifile://$(abspath ./backend-images/whisper.tar)"
148-
148+
149149
backends/silero-vad: docker-build-silero-vad docker-save-silero-vad build
150150
./local-ai backends install "ocifile://$(abspath ./backend-images/silero-vad.tar)"
151151

@@ -359,19 +359,19 @@ backend-images:
359359
mkdir -p backend-images
360360

361361
docker-build-llama-cpp:
362-
docker build --build-arg BUILD_TYPE=$(BUILD_TYPE) --build-arg IMAGE_BASE=$(IMAGE_BASE) -t local-ai-backend:llama-cpp -f backend/Dockerfile.llama-cpp .
362+
docker build --build-arg BUILD_TYPE=$(BUILD_TYPE) --build-arg BASE_IMAGE=$(BASE_IMAGE) -t local-ai-backend:llama-cpp -f backend/Dockerfile.llama-cpp .
363363

364364
docker-build-bark-cpp:
365-
docker build -t local-ai-backend:bark-cpp -f backend/Dockerfile.golang --build-arg BACKEND=bark-cpp .
365+
docker build --build-arg BUILD_TYPE=$(BUILD_TYPE) --build-arg BASE_IMAGE=$(BASE_IMAGE) -t local-ai-backend:bark-cpp -f backend/Dockerfile.golang --build-arg BACKEND=bark-cpp .
366366

367367
docker-build-piper:
368-
docker build -t local-ai-backend:piper -f backend/Dockerfile.golang --build-arg BACKEND=piper .
368+
docker build --build-arg BUILD_TYPE=$(BUILD_TYPE) --build-arg BASE_IMAGE=$(BASE_IMAGE) -t local-ai-backend:piper -f backend/Dockerfile.golang --build-arg BACKEND=piper .
369369

370370
docker-build-local-store:
371-
docker build -t local-ai-backend:local-store -f backend/Dockerfile.golang --build-arg BACKEND=local-store .
371+
docker build --build-arg BUILD_TYPE=$(BUILD_TYPE) --build-arg BASE_IMAGE=$(BASE_IMAGE) -t local-ai-backend:local-store -f backend/Dockerfile.golang --build-arg BACKEND=local-store .
372372

373373
docker-build-huggingface:
374-
docker build -t local-ai-backend:huggingface -f backend/Dockerfile.golang --build-arg BACKEND=huggingface .
374+
docker build --build-arg BUILD_TYPE=$(BUILD_TYPE) --build-arg BASE_IMAGE=$(BASE_IMAGE) -t local-ai-backend:huggingface -f backend/Dockerfile.golang --build-arg BACKEND=huggingface .
375375

376376
docker-save-huggingface: backend-images
377377
docker save local-ai-backend:huggingface -o backend-images/huggingface.tar
@@ -380,7 +380,7 @@ docker-save-local-store: backend-images
380380
docker save local-ai-backend:local-store -o backend-images/local-store.tar
381381

382382
docker-build-silero-vad:
383-
docker build -t local-ai-backend:silero-vad -f backend/Dockerfile.golang --build-arg BACKEND=silero-vad .
383+
docker build --build-arg BUILD_TYPE=$(BUILD_TYPE) --build-arg BASE_IMAGE=$(BASE_IMAGE) -t local-ai-backend:silero-vad -f backend/Dockerfile.golang --build-arg BACKEND=silero-vad .
384384

385385
docker-save-silero-vad: backend-images
386386
docker save local-ai-backend:silero-vad -o backend-images/silero-vad.tar
@@ -395,25 +395,25 @@ docker-save-bark-cpp: backend-images
395395
docker save local-ai-backend:bark-cpp -o backend-images/bark-cpp.tar
396396

397397
docker-build-stablediffusion-ggml:
398-
docker build -t local-ai-backend:stablediffusion-ggml -f backend/Dockerfile.golang --build-arg BACKEND=stablediffusion-ggml .
398+
docker build --build-arg BUILD_TYPE=$(BUILD_TYPE) --build-arg BASE_IMAGE=$(BASE_IMAGE) -t local-ai-backend:stablediffusion-ggml -f backend/Dockerfile.golang --build-arg BACKEND=stablediffusion-ggml .
399399

400400
docker-save-stablediffusion-ggml: backend-images
401401
docker save local-ai-backend:stablediffusion-ggml -o backend-images/stablediffusion-ggml.tar
402402

403403
docker-build-rerankers:
404-
docker build -t local-ai-backend:rerankers -f backend/Dockerfile.python --build-arg BACKEND=rerankers .
404+
docker build --build-arg BUILD_TYPE=$(BUILD_TYPE) --build-arg BASE_IMAGE=$(BASE_IMAGE) -t local-ai-backend:rerankers -f backend/Dockerfile.python --build-arg BACKEND=rerankers .
405405

406406
docker-build-vllm:
407-
docker build -t local-ai-backend:vllm -f backend/Dockerfile.python --build-arg BACKEND=vllm .
407+
docker build --build-arg BUILD_TYPE=$(BUILD_TYPE) --build-arg BASE_IMAGE=$(BASE_IMAGE) -t local-ai-backend:vllm -f backend/Dockerfile.python --build-arg BACKEND=vllm .
408408

409409
docker-build-transformers:
410-
docker build -t local-ai-backend:transformers -f backend/Dockerfile.python --build-arg BACKEND=transformers .
410+
docker build --build-arg BUILD_TYPE=$(BUILD_TYPE) --build-arg BASE_IMAGE=$(BASE_IMAGE) -t local-ai-backend:transformers -f backend/Dockerfile.python --build-arg BACKEND=transformers .
411411

412412
docker-build-diffusers:
413-
docker build -t local-ai-backend:diffusers -f backend/Dockerfile.python --build-arg BACKEND=diffusers .
413+
docker build --build-arg BUILD_TYPE=$(BUILD_TYPE) --build-arg BASE_IMAGE=$(BASE_IMAGE) -t local-ai-backend:diffusers -f backend/Dockerfile.python --build-arg BACKEND=diffusers .
414414

415415
docker-build-kokoro:
416-
docker build -t local-ai-backend:kokoro -f backend/Dockerfile.python --build-arg BACKEND=kokoro .
416+
docker build --build-arg BUILD_TYPE=$(BUILD_TYPE) --build-arg BASE_IMAGE=$(BASE_IMAGE) -t local-ai-backend:kokoro -f backend/Dockerfile.python --build-arg BACKEND=kokoro .
417417

418418
docker-build-whisper:
419419
docker build --build-arg BUILD_TYPE=$(BUILD_TYPE) --build-arg BASE_IMAGE=$(BASE_IMAGE) -t local-ai-backend:whisper -f backend/Dockerfile.golang --build-arg BACKEND=whisper .
@@ -422,19 +422,19 @@ docker-save-whisper: backend-images
422422
docker save local-ai-backend:whisper -o backend-images/whisper.tar
423423

424424
docker-build-faster-whisper:
425-
docker build -t local-ai-backend:faster-whisper -f backend/Dockerfile.python --build-arg BACKEND=faster-whisper .
425+
docker build --build-arg BUILD_TYPE=$(BUILD_TYPE) --build-arg BASE_IMAGE=$(BASE_IMAGE) -t local-ai-backend:faster-whisper -f backend/Dockerfile.python --build-arg BACKEND=faster-whisper .
426426

427427
docker-build-coqui:
428-
docker build -t local-ai-backend:coqui -f backend/Dockerfile.python --build-arg BACKEND=coqui .
428+
docker build --build-arg BUILD_TYPE=$(BUILD_TYPE) --build-arg BASE_IMAGE=$(BASE_IMAGE) -t local-ai-backend:coqui -f backend/Dockerfile.python --build-arg BACKEND=coqui .
429429

430430
docker-build-bark:
431-
docker build -t local-ai-backend:bark -f backend/Dockerfile.python --build-arg BACKEND=bark .
431+
docker build --build-arg BUILD_TYPE=$(BUILD_TYPE) --build-arg BASE_IMAGE=$(BASE_IMAGE) -t local-ai-backend:bark -f backend/Dockerfile.python --build-arg BACKEND=bark .
432432

433433
docker-build-chatterbox:
434-
docker build -t local-ai-backend:chatterbox -f backend/Dockerfile.python --build-arg BACKEND=chatterbox .
434+
docker build --build-arg BUILD_TYPE=$(BUILD_TYPE) --build-arg BASE_IMAGE=$(BASE_IMAGE) -t local-ai-backend:chatterbox -f backend/Dockerfile.python --build-arg BACKEND=chatterbox .
435435

436436
docker-build-exllama2:
437-
docker build -t local-ai-backend:exllama2 -f backend/Dockerfile.python --build-arg BACKEND=exllama2 .
437+
docker build --build-arg BUILD_TYPE=$(BUILD_TYPE) --build-arg BASE_IMAGE=$(BASE_IMAGE) -t local-ai-backend:exllama2 -f backend/Dockerfile.python --build-arg BACKEND=exllama2 .
438438

439439
docker-build-backends: docker-build-llama-cpp docker-build-rerankers docker-build-vllm docker-build-transformers docker-build-diffusers docker-build-kokoro docker-build-faster-whisper docker-build-coqui docker-build-bark docker-build-chatterbox docker-build-exllama2
440440

backend/go/stablediffusion-ggml/Makefile

Lines changed: 6 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,8 @@ GO_TAGS?=
1818
LD_FLAGS?=
1919

2020
# stablediffusion.cpp (ggml)
21-
STABLEDIFFUSION_GGML_REPO?=https://github.com/richiejp/stable-diffusion.cpp
22-
STABLEDIFFUSION_GGML_VERSION?=10c6501bd05a697e014f1bee3a84e5664290c489
21+
STABLEDIFFUSION_GGML_REPO?=https://github.com/leejet/stable-diffusion.cpp
22+
STABLEDIFFUSION_GGML_VERSION?=1896b28ef2fd5b3643120e66979bea487385439f
2323

2424
# Disable Shared libs as we are linking on static gRPC and we can't mix shared and static
2525
CMAKE_ARGS+=-DBUILD_SHARED_LIBS=OFF
@@ -91,23 +91,18 @@ endif
9191
# (ggml can have different backends cpu, cuda, etc., each backend generates a .a archive)
9292
GGML_ARCHIVE_DIR := build/ggml/src/
9393
ALL_ARCHIVES := $(shell find $(GGML_ARCHIVE_DIR) -type f -name '*.a')
94+
ALL_OBJS := $(shell find $(GGML_ARCHIVE_DIR) -type f -name '*.o')
9495

9596
# Name of the single merged library
9697
COMBINED_LIB := libggmlall.a
9798

98-
# Rule to merge all the .a files into one
99+
# Instead of using the archives generated by GGML, use the object files directly to avoid overwriting objects with the same base name
99100
$(COMBINED_LIB): $(ALL_ARCHIVES)
100-
@echo "Merging all .a into $(COMBINED_LIB)"
101+
@echo "Merging all .o into $(COMBINED_LIB): $(ALL_OBJS)"
101102
rm -f $@
102-
mkdir -p merge-tmp
103-
for a in $(ALL_ARCHIVES); do \
104-
( cd merge-tmp && ar x ../$$a ); \
105-
done
106-
( cd merge-tmp && ar rcs ../$@ *.o )
103+
ar -qc $@ $(ALL_OBJS)
107104
# Ensure we have a proper index
108105
ranlib $@
109-
# Clean up
110-
rm -rf merge-tmp
111106

112107
build/libstable-diffusion.a:
113108
@echo "Building SD with $(BUILD_TYPE) build type and $(CMAKE_ARGS)"

backend/go/stablediffusion-ggml/gosd.cpp

Lines changed: 78 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -53,9 +53,43 @@ sd_ctx_t* sd_c;
5353

5454
sample_method_t sample_method;
5555

56+
// Copied from the upstream CLI
57+
void sd_log_cb(enum sd_log_level_t level, const char* log, void* data) {
58+
//SDParams* params = (SDParams*)data;
59+
const char* level_str;
60+
61+
if (!log /*|| (!params->verbose && level <= SD_LOG_DEBUG)*/) {
62+
return;
63+
}
64+
65+
switch (level) {
66+
case SD_LOG_DEBUG:
67+
level_str = "DEBUG";
68+
break;
69+
case SD_LOG_INFO:
70+
level_str = "INFO";
71+
break;
72+
case SD_LOG_WARN:
73+
level_str = "WARN";
74+
break;
75+
case SD_LOG_ERROR:
76+
level_str = "ERROR";
77+
break;
78+
default: /* Potential future-proofing */
79+
level_str = "?????";
80+
break;
81+
}
82+
83+
fprintf(stderr, "[%-5s] ", level_str);
84+
fputs(log, stderr);
85+
fflush(stderr);
86+
}
87+
5688
int load_model(char *model, char* options[], int threads, int diff) {
5789
fprintf (stderr, "Loading model!\n");
5890

91+
sd_set_log_callback(sd_log_cb, NULL);
92+
5993
char *stableDiffusionModel = "";
6094
if (diff == 1 ) {
6195
stableDiffusionModel = model;
@@ -70,6 +104,8 @@ int load_model(char *model, char* options[], int threads, int diff) {
70104
char *scheduler = "";
71105
char *sampler = "";
72106

107+
fprintf(stderr, "parsing options\n");
108+
73109
// If options is not NULL, parse options
74110
for (int i = 0; options[i] != NULL; i++) {
75111
char *optname = strtok(options[i], ":");
@@ -98,10 +134,13 @@ int load_model(char *model, char* options[], int threads, int diff) {
98134
}
99135
}
100136

137+
fprintf(stderr, "parsed options\n");
138+
101139
int sample_method_found = -1;
102-
for (int m = 0; m < N_SAMPLE_METHODS; m++) {
140+
for (int m = 0; m < SAMPLE_METHOD_COUNT; m++) {
103141
if (!strcmp(sampler, sample_method_str[m])) {
104142
sample_method_found = m;
143+
fprintf(stderr, "Found sampler: %s\n", sampler);
105144
}
106145
}
107146
if (sample_method_found == -1) {
@@ -111,7 +150,7 @@ int load_model(char *model, char* options[], int threads, int diff) {
111150
sample_method = (sample_method_t)sample_method_found;
112151

113152
int schedule_found = -1;
114-
for (int d = 0; d < N_SCHEDULES; d++) {
153+
for (int d = 0; d < SCHEDULE_COUNT; d++) {
115154
if (!strcmp(scheduler, schedule_str[d])) {
116155
schedule_found = d;
117156
fprintf (stderr, "Found scheduler: %s\n", scheduler);
@@ -125,30 +164,28 @@ int load_model(char *model, char* options[], int threads, int diff) {
125164
}
126165

127166
schedule_t schedule = (schedule_t)schedule_found;
128-
167+
129168
fprintf (stderr, "Creating context\n");
130-
sd_ctx_t* sd_ctx = new_sd_ctx(model,
131-
clip_l_path,
132-
clip_g_path,
133-
t5xxl_path,
134-
stableDiffusionModel,
135-
vae_path,
136-
"",
137-
"",
138-
"",
139-
"",
140-
"",
141-
false,
142-
false,
143-
false,
144-
threads,
145-
SD_TYPE_COUNT,
146-
STD_DEFAULT_RNG,
147-
schedule,
148-
false,
149-
false,
150-
false,
151-
false);
169+
sd_ctx_params_t ctx_params;
170+
sd_ctx_params_init(&ctx_params);
171+
ctx_params.model_path = model;
172+
ctx_params.clip_l_path = clip_l_path;
173+
ctx_params.clip_g_path = clip_g_path;
174+
ctx_params.t5xxl_path = t5xxl_path;
175+
ctx_params.diffusion_model_path = stableDiffusionModel;
176+
ctx_params.vae_path = vae_path;
177+
ctx_params.taesd_path = "";
178+
ctx_params.control_net_path = "";
179+
ctx_params.lora_model_dir = "";
180+
ctx_params.embedding_dir = "";
181+
ctx_params.stacked_id_embed_dir = "";
182+
ctx_params.vae_decode_only = false;
183+
ctx_params.vae_tiling = false;
184+
ctx_params.free_params_immediately = false;
185+
ctx_params.n_threads = threads;
186+
ctx_params.rng_type = STD_DEFAULT_RNG;
187+
ctx_params.schedule = schedule;
188+
sd_ctx_t* sd_ctx = new_sd_ctx(&ctx_params);
152189

153190
if (sd_ctx == NULL) {
154191
fprintf (stderr, "failed loading model (generic error)\n");
@@ -169,29 +206,22 @@ int gen_image(char *text, char *negativeText, int width, int height, int steps,
169206

170207
fprintf (stderr, "Generating image\n");
171208

172-
results = txt2img(sd_c,
173-
text,
174-
negativeText,
175-
-1, //clip_skip
176-
cfg_scale, // sfg_scale
177-
3.5f,
178-
0, // eta
179-
width,
180-
height,
181-
sample_method,
182-
steps,
183-
seed,
184-
1,
185-
NULL,
186-
0.9f,
187-
20.f,
188-
false,
189-
"",
190-
skip_layers.data(),
191-
skip_layers.size(),
192-
0,
193-
0.01,
194-
0.2);
209+
sd_img_gen_params_t p;
210+
sd_img_gen_params_init(&p);
211+
212+
p.prompt = text;
213+
p.negative_prompt = negativeText;
214+
p.guidance.txt_cfg = cfg_scale;
215+
p.guidance.slg.layers = skip_layers.data();
216+
p.guidance.slg.layer_count = skip_layers.size();
217+
p.width = width;
218+
p.height = height;
219+
p.sample_method = sample_method;
220+
p.sample_steps = steps;
221+
p.seed = seed;
222+
p.input_id_images_path = "";
223+
224+
results = generate_image(sd_c, &p);
195225

196226
if (results == NULL) {
197227
fprintf (stderr, "NO results\n");

backend/go/stablediffusion-ggml/gosd.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,8 +37,8 @@ func (sd *SDGGML) Load(opts *pb.ModelOptions) error {
3737

3838
size := C.size_t(unsafe.Sizeof((*C.char)(nil)))
3939
length := C.size_t(len(opts.Options))
40-
options = (**C.char)(C.malloc(length * size))
41-
view := (*[1 << 30]*C.char)(unsafe.Pointer(options))[0:len(opts.Options):len(opts.Options)]
40+
options = (**C.char)(C.malloc((length + 1) * size))
41+
view := (*[1 << 30]*C.char)(unsafe.Pointer(options))[0:len(opts.Options) + 1:len(opts.Options) + 1]
4242

4343
var diffusionModel int
4444

@@ -66,6 +66,7 @@ func (sd *SDGGML) Load(opts *pb.ModelOptions) error {
6666
for i, x := range oo {
6767
view[i] = C.CString(x)
6868
}
69+
view[len(oo)] = nil
6970

7071
sd.cfgScale = opts.CFGScale
7172

0 commit comments

Comments
 (0)