From 2e7b2d9926de40a7b9119322c1d8fc085b1283e4 Mon Sep 17 00:00:00 2001 From: Jaret Burkett Date: Mon, 10 Nov 2025 09:38:25 -0700 Subject: [PATCH] Added Differential Guidance training target --- extensions_built_in/sd_trainer/SDTrainer.py | 6 ++- toolkit/config_modules.py | 5 ++- toolkit/stable_diffusion_model.py | 2 +- ui/public/imgs/diff_guidance.png | Bin 0 -> 45796 bytes ui/src/app/jobs/new/SimpleJob.tsx | 39 ++++++++++++++++++++ ui/src/components/Card.tsx | 32 +++++++++++++++- ui/src/docs.tsx | 19 ++++++++++ ui/src/types.ts | 2 + version.py | 2 +- 9 files changed, 101 insertions(+), 6 deletions(-) create mode 100644 ui/public/imgs/diff_guidance.png diff --git a/extensions_built_in/sd_trainer/SDTrainer.py b/extensions_built_in/sd_trainer/SDTrainer.py index 2233e073..2b504e21 100644 --- a/extensions_built_in/sd_trainer/SDTrainer.py +++ b/extensions_built_in/sd_trainer/SDTrainer.py @@ -708,7 +708,11 @@ class SDTrainer(BaseSDTrainProcess): unconditional_target = unconditional_target * alpha target = unconditional_target + guidance_scale * (target - unconditional_target) - + + if self.train_config.do_differential_guidance: + with torch.no_grad(): + guidance_scale = self.train_config.differential_guidance_scale + target = noise_pred + guidance_scale * (target - noise_pred) if target is None: target = noise diff --git a/toolkit/config_modules.py b/toolkit/config_modules.py index 22a78189..96617620 100644 --- a/toolkit/config_modules.py +++ b/toolkit/config_modules.py @@ -545,7 +545,10 @@ class TrainConfig: self.unconditional_prompt: str = kwargs.get('unconditional_prompt', '') if isinstance(self.guidance_loss_target, tuple): self.guidance_loss_target = list(self.guidance_loss_target) - + + self.do_differential_guidance = kwargs.get('do_differential_guidance', False) + self.differential_guidance_scale = kwargs.get('differential_guidance_scale', 3.0) + # for multi stage models, how often to switch the boundary self.switch_boundary_every: int = kwargs.get('switch_boundary_every', 1) diff --git a/toolkit/stable_diffusion_model.py b/toolkit/stable_diffusion_model.py index 11bae8b1..ab9a57f5 100644 --- a/toolkit/stable_diffusion_model.py +++ b/toolkit/stable_diffusion_model.py @@ -2907,7 +2907,7 @@ class StableDiffusion: try: te_has_grad = encoder.text_model.final_layer_norm.weight.requires_grad except: - te_has_grad = encoder.encoder.block[0].layer[0].SelfAttention.q.weight.requires_grad + te_has_grad = False self.device_state['text_encoder'].append({ 'training': encoder.training, 'device': encoder.device, diff --git a/ui/public/imgs/diff_guidance.png b/ui/public/imgs/diff_guidance.png new file mode 100644 index 0000000000000000000000000000000000000000..9697c978cd305d7a429f90fef8ba1eed24757a1a GIT binary patch literal 45796 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 literal 0 HcmV?d00001 diff --git a/ui/src/app/jobs/new/SimpleJob.tsx b/ui/src/app/jobs/new/SimpleJob.tsx index fa9d532a..093481ed 100644 --- a/ui/src/app/jobs/new/SimpleJob.tsx +++ b/ui/src/app/jobs/new/SimpleJob.tsx @@ -669,6 +669,45 @@ export default function SimpleJob({ +
+ +
+
+ { + let newValue = value == false ? undefined : value; + setJobConfig(newValue, 'config.process[0].train.do_differential_guidance'); + if (!newValue) { + setJobConfig(undefined, 'config.process[0].train.differential_guidance_scale'); + } else if ( + jobConfig.config.process[0].train.differential_guidance_scale === undefined || + jobConfig.config.process[0].train.differential_guidance_scale === null + ) { + // set default differential guidance scale to 3.0 + setJobConfig(3.0, 'config.process[0].train.differential_guidance_scale'); + } + }} + /> + {jobConfig.config.process[0].train.differential_guidance_scale && ( + <> + setJobConfig(value, 'config.process[0].train.differential_guidance_scale')} + placeholder="eg. 3.0" + min={0} + /> + + )} +
+
+
+
<> diff --git a/ui/src/components/Card.tsx b/ui/src/components/Card.tsx index 13c7409b..14875181 100644 --- a/ui/src/components/Card.tsx +++ b/ui/src/components/Card.tsx @@ -1,13 +1,41 @@ +import { Disclosure, DisclosureButton, DisclosurePanel } from '@headlessui/react'; +import { FaChevronDown } from 'react-icons/fa'; +import classNames from 'classnames'; + interface CardProps { title?: string; children?: React.ReactNode; + collapsible?: boolean; + defaultOpen?: boolean; } -const Card: React.FC = ({ title, children }) => { +const Card: React.FC = ({ title, children, collapsible, defaultOpen }) => { + if (collapsible) { + return ( + + {({ open }) => ( + <> + +
+ {title && ( +

+ {title} +

+ )} +
+ +
+ {children ?? null} + {open &&
} + + )} +
+ ); + } return (
{title &&

{title}

} - {children ? children : null} + {children ?? null}
); }; diff --git a/ui/src/docs.tsx b/ui/src/docs.tsx index c7545793..291d9ee3 100644 --- a/ui/src/docs.tsx +++ b/ui/src/docs.tsx @@ -258,6 +258,25 @@ const docs: { [key: string]: ConfigDoc } = { ), }, + 'train.do_differential_guidance': { + title: 'Differential Guidance', + description: ( + <> + Differential Guidance will amplify the difference of the model prediction and the target during training to make + a new target. Differential Guidance Scale will be the multiplier for the difference. This is still experimental, + but in my tests, it makes the model train faster, and learns details better in every scenario I have tried with + it. +
+
+ The idea is that normal training inches closer to the target but never actually gets there, because it is + limited by the learning rate. With differential guidance, we amplify the difference for a new target beyond the + actual target, this would make the model learn to hit or overshoot the target instead of falling short. +
+
+ Differential Guidance Diagram + + ), + }, }; export const getDoc = (key: string | null | undefined): ConfigDoc | null => { diff --git a/ui/src/types.ts b/ui/src/types.ts index d01bd89f..80f0b782 100644 --- a/ui/src/types.ts +++ b/ui/src/types.ts @@ -139,6 +139,8 @@ export interface TrainConfig { blank_prompt_preservation_multiplier?: number; switch_boundary_every: number; loss_type: 'mse' | 'mae' | 'wavelet' | 'stepped'; + do_differential_guidance?: boolean; + differential_guidance_scale?: number; } export interface QuantizeKwargsConfig { diff --git a/version.py b/version.py index 48879f5b..9b8720f5 100644 --- a/version.py +++ b/version.py @@ -1 +1 @@ -VERSION = "0.7.3" \ No newline at end of file +VERSION = "0.7.4" \ No newline at end of file