Skip to content

Commit 56b88af

Browse files
committed
refactor: deduplicate and automatically manage CPU backend
1 parent cf6362f commit 56b88af

1 file changed

Lines changed: 12 additions & 14 deletions

File tree

src/stable-diffusion.cpp

Lines changed: 12 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,7 @@ class StableDiffusionGGML {
114114
ggml_backend_t vae_backend = nullptr;
115115

116116
sd_ggml_backend_ptr main_backend;
117+
sd_ggml_backend_ptr cpu_backend;
117118

118119
SDVersion version;
119120
bool vae_decode_only = false;
@@ -161,23 +162,20 @@ class StableDiffusionGGML {
161162

162163
StableDiffusionGGML() = default;
163164

164-
~StableDiffusionGGML() {
165-
if (clip_backend != backend) {
166-
ggml_backend_free(clip_backend);
167-
}
168-
if (control_net_backend != backend) {
169-
ggml_backend_free(control_net_backend);
170-
}
171-
if (vae_backend != backend) {
172-
ggml_backend_free(vae_backend);
173-
}
174-
}
165+
~StableDiffusionGGML() = default;
175166

176167
void init_backend() {
177168
main_backend = sd_get_default_backend();
178169
backend = main_backend.get();
179170
}
180171

172+
ggml_backend_t get_cpu_backend() {
173+
if (!cpu_backend) {
174+
cpu_backend = sd_ggml_backend_ptr(ggml_backend_cpu_init());
175+
}
176+
return cpu_backend.get();
177+
}
178+
181179
std::shared_ptr<RNG> get_rng(rng_type_t rng_type) {
182180
if (rng_type == STD_DEFAULT_RNG) {
183181
return std::make_shared<STDDefaultRNG>();
@@ -387,7 +385,7 @@ class StableDiffusionGGML {
387385
clip_backend = backend;
388386
if (clip_on_cpu && !ggml_backend_is_cpu(backend)) {
389387
LOG_INFO("CLIP: Using CPU backend");
390-
clip_backend = ggml_backend_cpu_init();
388+
clip_backend = get_cpu_backend();
391389
}
392390
if (sd_version_is_sd3(version)) {
393391
cond_stage_model = std::make_shared<SD3CLIPEmbedder>(clip_backend,
@@ -569,7 +567,7 @@ class StableDiffusionGGML {
569567

570568
if (sd_ctx_params->keep_vae_on_cpu && !ggml_backend_is_cpu(backend)) {
571569
LOG_INFO("VAE Autoencoder: Using CPU backend");
572-
vae_backend = ggml_backend_cpu_init();
570+
vae_backend = get_cpu_backend();
573571
} else {
574572
vae_backend = backend;
575573
}
@@ -665,7 +663,7 @@ class StableDiffusionGGML {
665663
ggml_backend_t controlnet_backend = nullptr;
666664
if (sd_ctx_params->keep_control_net_on_cpu && !ggml_backend_is_cpu(backend)) {
667665
LOG_DEBUG("ControlNet: Using CPU backend");
668-
controlnet_backend = ggml_backend_cpu_init();
666+
controlnet_backend = get_cpu_backend();
669667
} else {
670668
controlnet_backend = backend;
671669
}

0 commit comments

Comments
 (0)