Skip to content

Commit 80229ee

Browse files
committed
fix: default to empty reference on pix2pix models to avoid segfault
1 parent b758a14 commit 80229ee

File tree

1 file changed

+26
-9
lines changed

1 file changed

+26
-9
lines changed

stable-diffusion.cpp

Lines changed: 26 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -386,6 +386,10 @@ class StableDiffusionGGML {
386386
diffusion_model->alloc_params_buffer();
387387
diffusion_model->get_param_tensors(tensors);
388388

389+
if (sd_version_is_unet_edit(version)) {
390+
vae_decode_only = false;
391+
}
392+
389393
if (!use_tiny_autoencoder) {
390394
if (sd_ctx_params->keep_vae_on_cpu && !ggml_backend_is_cpu(backend)) {
391395
LOG_INFO("VAE Autoencoder: Using CPU backend");
@@ -2037,23 +2041,36 @@ sd_image_t* generate_image(sd_ctx_t* sd_ctx, const sd_img_gen_params_t* sd_img_g
20372041
init_latent = generate_init_latent(sd_ctx, work_ctx, width, height);
20382042
}
20392043

2044+
sd_guidance_params_t guidance = sd_img_gen_params->guidance;
2045+
std::vector<sd_image_t*> ref_images;
2046+
for (int i = 0; i < sd_img_gen_params->ref_images_count; i++) {
2047+
ref_images.push_back(&sd_img_gen_params->ref_images[i]);
2048+
}
2049+
2050+
std::vector<uint8_t> empty_image_data;
2051+
sd_image_t empty_image = {(uint32_t)width, (uint32_t)height, 3, nullptr};
2052+
if (ref_images.empty() && sd_version_is_unet_edit(sd_ctx->sd->version))
2053+
{
2054+
LOG_WARN("This model needs at least one reference image; using empty reference");
2055+
empty_image_data.reserve(width * height * 3);
2056+
ref_images.push_back(&empty_image);
2057+
empty_image.data = empty_image_data.data();
2058+
guidance.img_cfg = 0.f;
2059+
}
2060+
20402061
if (sd_img_gen_params->ref_images_count > 0) {
20412062
LOG_INFO("EDIT mode");
20422063
}
2043-
else if (sd_ctx->sd->version == VERSION_SD1_PIX2PIX || sd_ctx->sd->version == VERSION_SDXL_PIX2PIX) {
2044-
LOG_ERROR("This model needs at least one reference image");
2045-
return NULL;
2046-
}
20472064

20482065
std::vector<struct ggml_tensor*> ref_latents;
2049-
for (int i = 0; i < sd_img_gen_params->ref_images_count; i++) {
2066+
for (int i = 0; i < ref_images.size(); i++) {
20502067
ggml_tensor* img = ggml_new_tensor_4d(work_ctx,
20512068
GGML_TYPE_F32,
2052-
sd_img_gen_params->ref_images[i].width,
2053-
sd_img_gen_params->ref_images[i].height,
2069+
ref_images[i]->width,
2070+
ref_images[i]->height,
20542071
3,
20552072
1);
2056-
sd_image_to_tensor(sd_img_gen_params->ref_images[i].data, img);
2073+
sd_image_to_tensor(ref_images[i]->data, img);
20572074

20582075
ggml_tensor* latent = NULL;
20592076
if (sd_ctx->sd->use_tiny_autoencoder) {
@@ -2086,7 +2103,7 @@ sd_image_t* generate_image(sd_ctx_t* sd_ctx, const sd_img_gen_params_t* sd_img_g
20862103
SAFE_STR(sd_img_gen_params->prompt),
20872104
SAFE_STR(sd_img_gen_params->negative_prompt),
20882105
sd_img_gen_params->clip_skip,
2089-
sd_img_gen_params->guidance,
2106+
guidance,
20902107
sd_img_gen_params->eta,
20912108
width,
20922109
height,

0 commit comments

Comments
 (0)