@@ -800,7 +800,7 @@ class StableDiffusionGGML {
800800 const std::vector<float >& sigmas,
801801 int start_merge_step,
802802 SDCondition id_cond,
803- sd_slg_params_t slg_params = {NULL , 0 , 0 , 0 , 0 },
803+ sd_slg_params_t slg_params = {NULL , 0 , 0 , 0 , false },
804804 sd_apg_params_t apg_params = {1 , 0 , 0 , 0 },
805805 ggml_tensor* noise_mask = nullptr ) {
806806 std::vector<int > skip_layers (slg_params.skip_layers , slg_params.skip_layers + slg_params.skip_layers_count );
@@ -827,7 +827,7 @@ class StableDiffusionGGML {
827827 struct ggml_tensor * noised_input = ggml_dup_tensor (work_ctx, noise);
828828
829829 bool has_unconditioned = cfg_scale != 1.0 && uncond.c_crossattn != NULL ;
830- bool has_skiplayer = slg_params.scale != 0.0 && skip_layers.size () > 0 ;
830+ bool has_skiplayer = ( slg_params.scale != 0.0 || slg_params. slg_uncond ) && skip_layers.size () > 0 ;
831831
832832 // denoise wrapper
833833 struct ggml_tensor * out_cond = ggml_dup_tensor (work_ctx, x);
@@ -839,7 +839,9 @@ class StableDiffusionGGML {
839839 }
840840 if (has_skiplayer) {
841841 if (sd_version_is_dit (version)) {
842- out_skip = ggml_dup_tensor (work_ctx, x);
842+ if (slg_params.scale != 0.0 ) {
843+ out_skip = ggml_dup_tensor (work_ctx, x);
844+ }
843845 } else {
844846 has_skiplayer = false ;
845847 LOG_WARN (" SLG is incompatible with %s models" , model_version_to_str[version]);
@@ -908,6 +910,8 @@ class StableDiffusionGGML {
908910 control_strength,
909911 &out_cond);
910912 }
913+ int step_count = sigmas.size ();
914+ bool is_skiplayer_step = has_skiplayer && step > (int )(slg_params.skip_layer_start * step_count) && step < (int )(slg_params.skip_layer_end * step_count);
911915
912916 float * negative_data = NULL ;
913917 if (has_unconditioned) {
@@ -916,24 +920,39 @@ class StableDiffusionGGML {
916920 control_net->compute (n_threads, noised_input, control_hint, timesteps, uncond.c_crossattn , uncond.c_vector );
917921 controls = control_net->controls ;
918922 }
919- diffusion_model->compute (n_threads,
920- noised_input,
921- timesteps,
922- uncond.c_crossattn ,
923- uncond.c_concat ,
924- uncond.c_vector ,
925- guidance_tensor,
926- -1 ,
927- controls,
928- control_strength,
929- &out_uncond);
923+ if (is_skiplayer_step && slg_params.slg_uncond ) {
924+ LOG_DEBUG (" Skipping layers at uncond step %d\n " , step);
925+ diffusion_model->compute (n_threads,
926+ noised_input,
927+ timesteps,
928+ uncond.c_crossattn ,
929+ uncond.c_concat ,
930+ uncond.c_vector ,
931+ guidance_tensor,
932+ -1 ,
933+ controls,
934+ control_strength,
935+ &out_uncond,
936+ NULL ,
937+ skip_layers);
938+ } else {
939+ diffusion_model->compute (n_threads,
940+ noised_input,
941+ timesteps,
942+ uncond.c_crossattn ,
943+ uncond.c_concat ,
944+ uncond.c_vector ,
945+ guidance_tensor,
946+ -1 ,
947+ controls,
948+ control_strength,
949+ &out_uncond);
950+ }
930951 negative_data = (float *)out_uncond->data ;
931952 }
932953
933- int step_count = sigmas.size ();
934- bool is_skiplayer_step = has_skiplayer && step > (int )(slg_params.skip_layer_start * step_count) && step < (int )(slg_params.skip_layer_end * step_count);
935954 float * skip_layer_data = NULL ;
936- if (is_skiplayer_step) {
955+ if (is_skiplayer_step && slg_params. scale != 0.0 ) {
937956 LOG_DEBUG (" Skipping layers at step %d\n " , step);
938957 // skip layer (same as conditionned)
939958 diffusion_model->compute (n_threads,
@@ -1021,7 +1040,7 @@ class StableDiffusionGGML {
10211040 latent_result = positive_data[i] + (cfg_scale - 1 ) * delta;
10221041 }
10231042 }
1024- if (is_skiplayer_step) {
1043+ if (is_skiplayer_step && slg_params. scale != 0.0 ) {
10251044 latent_result = latent_result + (positive_data[i] - skip_layer_data[i]) * slg_params.scale ;
10261045 }
10271046 // v = latent_result, eps = latent_result
0 commit comments