@@ -800,7 +800,7 @@ class StableDiffusionGGML {
800
800
const std::vector<float >& sigmas,
801
801
int start_merge_step,
802
802
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 },
804
804
sd_apg_params_t apg_params = {1 , 0 , 0 , 0 },
805
805
ggml_tensor* noise_mask = nullptr ) {
806
806
std::vector<int > skip_layers (slg_params.skip_layers , slg_params.skip_layers + slg_params.skip_layers_count );
@@ -827,7 +827,7 @@ class StableDiffusionGGML {
827
827
struct ggml_tensor * noised_input = ggml_dup_tensor (work_ctx, noise);
828
828
829
829
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 ;
831
831
832
832
// denoise wrapper
833
833
struct ggml_tensor * out_cond = ggml_dup_tensor (work_ctx, x);
@@ -839,7 +839,9 @@ class StableDiffusionGGML {
839
839
}
840
840
if (has_skiplayer) {
841
841
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
+ }
843
845
} else {
844
846
has_skiplayer = false ;
845
847
LOG_WARN (" SLG is incompatible with %s models" , model_version_to_str[version]);
@@ -908,6 +910,8 @@ class StableDiffusionGGML {
908
910
control_strength,
909
911
&out_cond);
910
912
}
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);
911
915
912
916
float * negative_data = NULL ;
913
917
if (has_unconditioned) {
@@ -916,24 +920,39 @@ class StableDiffusionGGML {
916
920
control_net->compute (n_threads, noised_input, control_hint, timesteps, uncond.c_crossattn , uncond.c_vector );
917
921
controls = control_net->controls ;
918
922
}
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
+ }
930
951
negative_data = (float *)out_uncond->data ;
931
952
}
932
953
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);
935
954
float * skip_layer_data = NULL ;
936
- if (is_skiplayer_step) {
955
+ if (is_skiplayer_step && slg_params. scale != 0.0 ) {
937
956
LOG_DEBUG (" Skipping layers at step %d\n " , step);
938
957
// skip layer (same as conditionned)
939
958
diffusion_model->compute (n_threads,
@@ -1021,7 +1040,7 @@ class StableDiffusionGGML {
1021
1040
latent_result = positive_data[i] + (cfg_scale - 1 ) * delta;
1022
1041
}
1023
1042
}
1024
- if (is_skiplayer_step) {
1043
+ if (is_skiplayer_step && slg_params. scale != 0.0 ) {
1025
1044
latent_result = latent_result + (positive_data[i] - skip_layer_data[i]) * slg_params.scale ;
1026
1045
}
1027
1046
// v = latent_result, eps = latent_result
0 commit comments