diff --git a/fooocus_version.py b/fooocus_version.py index 090441a..c7df6d4 100644 --- a/fooocus_version.py +++ b/fooocus_version.py @@ -1 +1 @@ -version = '2.0.90' +version = '2.0.91' diff --git a/modules/async_worker.py b/modules/async_worker.py index 2b3b17d..45a906a 100644 --- a/modules/async_worker.py +++ b/modules/async_worker.py @@ -48,7 +48,7 @@ def worker(): execution_start_time = time.perf_counter() prompt, negative_prompt, style_selections, performance_selection, \ - aspect_ratios_selection, image_number, image_seed, sharpness, adm_scaler_positive, adm_scaler_negative, guidance_scale, adaptive_cfg, sampler_name, scheduler_name, \ + aspect_ratios_selection, image_number, image_seed, sharpness, adm_scaler_positive, adm_scaler_negative, adm_scaler_end, guidance_scale, adaptive_cfg, sampler_name, scheduler_name, \ overwrite_step, overwrite_switch, overwrite_width, overwrite_height, overwrite_vary_strength, overwrite_upscale_strength, \ base_model_name, refiner_model_name, \ l1, w1, l2, w2, l3, w3, l4, w4, l5, w5, \ @@ -80,7 +80,8 @@ def worker(): modules.patch.positive_adm_scale = adm_scaler_positive modules.patch.negative_adm_scale = adm_scaler_negative - print(f'[Parameters] ADM Scale = {modules.patch.positive_adm_scale} / {modules.patch.negative_adm_scale}') + modules.patch.adm_scaler_end = adm_scaler_end + print(f'[Parameters] ADM Scale = {modules.patch.positive_adm_scale} : {modules.patch.negative_adm_scale} : {modules.patch.adm_scaler_end}') cfg_scale = float(guidance_scale) print(f'[Parameters] CFG = {cfg_scale}') diff --git a/modules/patch.py b/modules/patch.py index 7a41c9e..32e7a25 100644 --- a/modules/patch.py +++ b/modules/patch.py @@ -20,6 +20,8 @@ from comfy.ldm.modules.diffusionmodules.openaimodel import timestep_embedding, f sharpness = 2.0 + +adm_scaler_end = 0.3 positive_adm_scale = 1.5 negative_adm_scale = 0.8 @@ -340,10 +342,10 @@ def patched_unet_forward(self, x, timesteps=None, context=None, y=None, control= transformer_patches = transformer_options.get("patches", {}) if isinstance(y, torch.Tensor) and int(y.dim()) == 2 and int(y.shape[1]) == 5632: - t = (timesteps / 999.0)[:, None].clone().to(x) ** 2.0 - ya = y[..., :2816].clone() - yb = y[..., 2816:].clone() - y = t * ya + (1 - t) * yb + y_mask = (timesteps > 999.0 * (1.0 - float(adm_scaler_end))).to(y)[..., None] + y_with_adm = y[..., :2816].clone() + y_without_adm = y[..., 2816:].clone() + y = y_with_adm * y_mask + y_without_adm * (1.0 - y_mask) hs = [] t_emb = timestep_embedding(timesteps, self.model_channels, repeat_only=False).to(self.dtype) diff --git a/webui.py b/webui.py index d6e7402..1bf2509 100644 --- a/webui.py +++ b/webui.py @@ -165,6 +165,9 @@ with shared.gradio_root: step=0.001, value=1.5, info='The scaler multiplied to positive ADM (use 1.0 to disable). ') adm_scaler_negative = gr.Slider(label='Negative ADM Guidance Scaler', minimum=0.1, maximum=3.0, step=0.001, value=0.8, info='The scaler multiplied to negative ADM (use 1.0 to disable). ') + adm_scaler_end = gr.Slider(label='ADM Guidance End At Step', minimum=0.0, maximum=1.0, + step=0.001, value=0.3, + info='When to end the guidance from positive/negative ADM. ') adaptive_cfg = gr.Slider(label='CFG Mimicking from TSNR', minimum=1.0, maximum=30.0, step=0.01, value=7.0, info='Enabling Fooocus\'s implementation of CFG mimicking for TSNR ' '(effective when real CFG > mimicked CFG).') @@ -211,7 +214,7 @@ with shared.gradio_root: advanced_checkbox.change(lambda x: gr.update(visible=x), advanced_checkbox, right_col, queue=False) ctrls = [ prompt, negative_prompt, style_selections, - performance_selection, aspect_ratios_selection, image_number, image_seed, sharpness, adm_scaler_positive, adm_scaler_negative, guidance_scale, adaptive_cfg, sampler_name, scheduler_name + performance_selection, aspect_ratios_selection, image_number, image_seed, sharpness, adm_scaler_positive, adm_scaler_negative, adm_scaler_end, guidance_scale, adaptive_cfg, sampler_name, scheduler_name ] ctrls += overwrite_ctrls ctrls += [base_model, refiner_model] + lora_ctrls