@@ -922,7 +922,7 @@ class StableDiffusionGGML {
922
922
const std::vector<float >& sigmas,
923
923
int start_merge_step,
924
924
SDCondition id_cond,
925
- sd_slg_params_t slg_params = {NULL , 0 , 0 , 0 , 0 },
925
+ sd_slg_params_t slg_params = {NULL , 0 , 0 , 0 , false },
926
926
sd_apg_params_t apg_params = {1 , 0 , 0 , 0 },
927
927
ggml_tensor* noise_mask = nullptr ) {
928
928
std::vector<int > skip_layers (slg_params.skip_layers , slg_params.skip_layers + slg_params.skip_layers_count );
@@ -949,7 +949,7 @@ class StableDiffusionGGML {
949
949
struct ggml_tensor * noised_input = ggml_dup_tensor (work_ctx, noise);
950
950
951
951
bool has_unconditioned = cfg_scale != 1.0 && uncond.c_crossattn != NULL ;
952
- bool has_skiplayer = slg_params.scale != 0.0 && skip_layers.size () > 0 ;
952
+ bool has_skiplayer = ( slg_params.scale != 0.0 || slg_params. slg_uncond ) && skip_layers.size () > 0 ;
953
953
954
954
// denoise wrapper
955
955
struct ggml_tensor * out_cond = ggml_dup_tensor (work_ctx, x);
@@ -961,7 +961,9 @@ class StableDiffusionGGML {
961
961
}
962
962
if (has_skiplayer) {
963
963
if (sd_version_is_dit (version)) {
964
- out_skip = ggml_dup_tensor (work_ctx, x);
964
+ if (slg_params.scale != 0.0 ) {
965
+ out_skip = ggml_dup_tensor (work_ctx, x);
966
+ }
965
967
} else {
966
968
has_skiplayer = false ;
967
969
LOG_WARN (" SLG is incompatible with %s models" , model_version_to_str[version]);
@@ -970,7 +972,7 @@ class StableDiffusionGGML {
970
972
struct ggml_tensor * denoised = ggml_dup_tensor (work_ctx, x);
971
973
972
974
struct ggml_tensor * preview_tensor = NULL ;
973
- auto sd_preview_mode = sd_get_preview_mode ();
975
+ auto sd_preview_mode = sd_get_preview_mode ();
974
976
if (sd_preview_mode != SD_PREVIEW_NONE && sd_preview_mode != SD_PREVIEW_PROJ) {
975
977
preview_tensor = ggml_new_tensor_4d (work_ctx, GGML_TYPE_F32,
976
978
(denoised->ne [0 ] * 8 ),
@@ -1040,6 +1042,8 @@ class StableDiffusionGGML {
1040
1042
control_strength,
1041
1043
&out_cond);
1042
1044
}
1045
+ int step_count = sigmas.size ();
1046
+ bool is_skiplayer_step = has_skiplayer && step > (int )(slg_params.skip_layer_start * step_count) && step < (int )(slg_params.skip_layer_end * step_count);
1043
1047
1044
1048
float * negative_data = NULL ;
1045
1049
if (has_unconditioned) {
@@ -1048,24 +1052,39 @@ class StableDiffusionGGML {
1048
1052
control_net->compute (n_threads, noised_input, control_hint, timesteps, uncond.c_crossattn , uncond.c_vector );
1049
1053
controls = control_net->controls ;
1050
1054
}
1051
- diffusion_model->compute (n_threads,
1052
- noised_input,
1053
- timesteps,
1054
- uncond.c_crossattn ,
1055
- uncond.c_concat ,
1056
- uncond.c_vector ,
1057
- guidance_tensor,
1058
- -1 ,
1059
- controls,
1060
- control_strength,
1061
- &out_uncond);
1055
+ if (is_skiplayer_step && slg_params.slg_uncond ) {
1056
+ LOG_DEBUG (" Skipping layers at uncond step %d\n " , step);
1057
+ diffusion_model->compute (n_threads,
1058
+ noised_input,
1059
+ timesteps,
1060
+ uncond.c_crossattn ,
1061
+ uncond.c_concat ,
1062
+ uncond.c_vector ,
1063
+ guidance_tensor,
1064
+ -1 ,
1065
+ controls,
1066
+ control_strength,
1067
+ &out_uncond,
1068
+ NULL ,
1069
+ skip_layers);
1070
+ } else {
1071
+ diffusion_model->compute (n_threads,
1072
+ noised_input,
1073
+ timesteps,
1074
+ uncond.c_crossattn ,
1075
+ uncond.c_concat ,
1076
+ uncond.c_vector ,
1077
+ guidance_tensor,
1078
+ -1 ,
1079
+ controls,
1080
+ control_strength,
1081
+ &out_uncond);
1082
+ }
1062
1083
negative_data = (float *)out_uncond->data ;
1063
1084
}
1064
1085
1065
- int step_count = sigmas.size ();
1066
- bool is_skiplayer_step = has_skiplayer && step > (int )(slg_params.skip_layer_start * step_count) && step < (int )(slg_params.skip_layer_end * step_count);
1067
1086
float * skip_layer_data = NULL ;
1068
- if (is_skiplayer_step) {
1087
+ if (is_skiplayer_step && slg_params. scale != 0.0 ) {
1069
1088
LOG_DEBUG (" Skipping layers at step %d\n " , step);
1070
1089
// skip layer (same as conditionned)
1071
1090
diffusion_model->compute (n_threads,
@@ -1153,7 +1172,7 @@ class StableDiffusionGGML {
1153
1172
latent_result = positive_data[i] + (cfg_scale - 1 ) * delta;
1154
1173
}
1155
1174
}
1156
- if (is_skiplayer_step) {
1175
+ if (is_skiplayer_step && slg_params. scale != 0.0 ) {
1157
1176
latent_result = latent_result + (positive_data[i] - skip_layer_data[i]) * slg_params.scale ;
1158
1177
}
1159
1178
// v = latent_result, eps = latent_result
@@ -1177,7 +1196,7 @@ class StableDiffusionGGML {
1177
1196
pretty_progress (step, (int )steps, (t1 - t0) / 1000000 .f );
1178
1197
// LOG_INFO("step %d sampling completed taking %.2fs", step, (t1 - t0) * 1.0f / 1000000);
1179
1198
}
1180
- auto sd_preview_cb = sd_get_preview_callback ();
1199
+ auto sd_preview_cb = sd_get_preview_callback ();
1181
1200
auto sd_preview_mode = sd_get_preview_mode ();
1182
1201
if (sd_preview_cb != NULL ) {
1183
1202
if (step % sd_get_preview_interval () == 0 ) {
0 commit comments