@@ -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