@@ -1196,7 +1196,18 @@ class StableDiffusionGGML {
1196
1196
1197
1197
float * deltas = vec_denoised;
1198
1198
1199
- // https://arxiv.org/pdf/2410.02416
1199
+ // APG: https://arxiv.org/pdf/2410.02416
1200
+
1201
+ bool log_cfg_norm = false ;
1202
+ const char * SD_LOG_CFG_DELTA_NORM = getenv (" SD_LOG_CFG_DELTA_NORM" );
1203
+ if (SD_LOG_CFG_DELTA_NORM != nullptr ) {
1204
+ std::string sd_log_cfg_norm_str = SD_LOG_CFG_DELTA_NORM;
1205
+ if (sd_log_cfg_norm_str == " ON" || sd_log_cfg_norm_str == " TRUE" ) {
1206
+ log_cfg_norm = true ;
1207
+ } else if (sd_log_cfg_norm_str != " OFF" && sd_log_cfg_norm_str != " FALSE" ) {
1208
+ LOG_WARN (" SD_LOG_CFG_DELTA_NORM environment variable has unexpected value. Assuming default (\" OFF\" ). (Expected \" ON\" /\" TRUE\" or\" OFF\" /\" FALSE\" , got \" %s\" )" , SD_LOG_CFG_DELTA_NORM);
1209
+ }
1210
+ }
1200
1211
float apg_scale_factor = 1 .;
1201
1212
float diff_norm = 0 ;
1202
1213
float cond_norm_sq = 0 ;
@@ -1224,7 +1235,7 @@ class StableDiffusionGGML {
1224
1235
delta += guidance.apg .momentum * apg_momentum_buffer[i];
1225
1236
apg_momentum_buffer[i] = delta;
1226
1237
}
1227
- if (guidance.apg .norm_treshold > 0 ) {
1238
+ if (guidance.apg .norm_treshold > 0 || log_cfg_norm ) {
1228
1239
diff_norm += delta * delta;
1229
1240
}
1230
1241
if (guidance.apg .eta != 1 .0f ) {
@@ -1233,6 +1244,9 @@ class StableDiffusionGGML {
1233
1244
}
1234
1245
deltas[i] = delta;
1235
1246
}
1247
+ if (log_cfg_norm){
1248
+ LOG_INFO (" CFG Delta norm: %.2f" , sqrtf (diff_norm));
1249
+ }
1236
1250
if (guidance.apg .norm_treshold > 0 ) {
1237
1251
diff_norm = sqrtf (diff_norm);
1238
1252
if (guidance.apg .norm_treshold_smoothing <= 0 ) {
0 commit comments