From ded26d1fbc5e56fc71938028626f3bed96e2cdbe Mon Sep 17 00:00:00 2001 From: Vladimir Mandic Date: Sun, 24 May 2026 08:45:41 +0200 Subject: [PATCH] lens fixes Signed-off-by: Vladimir Mandic --- TODO.md | 2 +- pipelines/lens/pipeline.py | 6 +++--- pipelines/lens/text_encoder.py | 12 +++++++++--- pipelines/model_lens.py | 6 ++---- ui/imageViewer.ts | 2 +- 5 files changed, 16 insertions(+), 12 deletions(-) diff --git a/TODO.md b/TODO.md index 5bed4d485..bcb8c536a 100644 --- a/TODO.md +++ b/TODO.md @@ -4,7 +4,6 @@ - Inpaint: https://discord.com/channels/1101998836328697867/1130536562422186044/1506850651035144322 - Torch lazy-load -- pnpm-vs-npm ## Features @@ -13,6 +12,7 @@ - Chat-based interface, @vladmandic - Control tab verify overrides handling, @vladmandic - Reimplement `llama` remover for Kanvas, @vladmandic + Object clear: https://huggingface.co/jixin0101/ObjectClear - Detailer postprocessing, @CalamitousFelicitousness - Cloud providers, @CalamitousFelicitousness diff --git a/pipelines/lens/pipeline.py b/pipelines/lens/pipeline.py index c167b5312..051269b82 100644 --- a/pipelines/lens/pipeline.py +++ b/pipelines/lens/pipeline.py @@ -131,7 +131,8 @@ class LensPipeline(DiffusionPipeline): text_encoder: LensGptOssEncoder, tokenizer: PreTrainedTokenizerBase, transformer: LensTransformer2DModel, - reasoner: Optional[PromptReasoner] = True, + reasoner: Optional[PromptReasoner] = None, + use_reasoner=False, ) -> None: super().__init__() self.register_modules( @@ -156,7 +157,7 @@ class LensPipeline(DiffusionPipeline): self.transformer.config.selected_layer_index ) - if reasoner is not None: + if use_reasoner and reasoner is None: self.reasoner = PromptReasoner( text_encoder=self.text_encoder, tokenizer=self.tokenizer ) @@ -296,7 +297,6 @@ class LensPipeline(DiffusionPipeline): ) -> List[str]: if self.reasoner is None: return list(prompts) - print('HERE REFINE') return self.reasoner.refine(prompts, enable=enable_reasoner) # ------------------------------------------------------------------ diff --git a/pipelines/lens/text_encoder.py b/pipelines/lens/text_encoder.py index 0b16410e4..d5d3bc63d 100644 --- a/pipelines/lens/text_encoder.py +++ b/pipelines/lens/text_encoder.py @@ -38,11 +38,11 @@ class LensGptOssEncoder(GptOssForCausalLM): f"layer_indices out of range; got {layers}, " f"model has {len(self.model.layers)} layers" ) - self._lens_selected_layers = layers - self._lens_max_layer = max(layers) + self._lens_selected_layers = layers # pylint: disable=attribute-defined-outside-init + self._lens_max_layer = max(layers) # pylint: disable=attribute-defined-outside-init @torch.no_grad() - def forward( # type: ignore[override] + def forward( # type: ignore[override] # pylint: keyword-arg-before-vararg self, input_ids: Optional[torch.LongTensor] = None, attention_mask: Optional[torch.Tensor] = None, @@ -78,6 +78,12 @@ class LensGptOssEncoder(GptOssForCausalLM): model = self.model inputs_embeds = model.embed_tokens(input_ids) + target_dtype = inputs_embeds.dtype + if len(model.layers) > 0: + target_dtype = model.layers[0].self_attn.k_proj.weight.dtype + if inputs_embeds.dtype != target_dtype: + inputs_embeds = inputs_embeds.to(dtype=target_dtype) + position_ids = torch.arange( inputs_embeds.shape[1], device=inputs_embeds.device ).unsqueeze(0).expand_as(input_ids) diff --git a/pipelines/model_lens.py b/pipelines/model_lens.py index 8c422eb7d..60f340f4d 100644 --- a/pipelines/model_lens.py +++ b/pipelines/model_lens.py @@ -11,16 +11,14 @@ def load_lens(checkpoint_info, diffusers_load_config=None): sd_models.hf_auth_check(checkpoint_info) load_args, _quant_args = model_quant.get_dit_args(diffusers_load_config, allow_quant=False) - log.debug(f'Load model: type=Lens repo="{repo_id}" config={diffusers_load_config} offload={shared.opts.diffusers_offload_mode} dtype={devices.dtype} args={load_args}') + log.debug(f'Load model: type=Lens repo="{repo_id}" config={diffusers_load_config} offload={shared.opts.diffusers_offload_mode} dtype={devices.dtype} reasoner={shared.opts.model_lens_enable_pe} args={load_args}') from pipelines import lens transformer = generic.load_transformer(repo_id, cls_name=lens.LensTransformer2DModel, load_config=diffusers_load_config) text_encoder = generic.load_text_encoder(repo_id, cls_name=lens.LensGptOssEncoder, load_config=diffusers_load_config, allow_quant=False) # te is prequantized using mxfp4 - if not shared.opts.model_lens_enable_pe: - load_args['reasoner'] = None - + load_args['use_reasoner'] = shared.opts.model_lens_enable_pe pipe = lens.LensPipeline.from_pretrained( repo_id, transformer=transformer, diff --git a/ui/imageViewer.ts b/ui/imageViewer.ts index 63eea1ffd..1891ced6e 100644 --- a/ui/imageViewer.ts +++ b/ui/imageViewer.ts @@ -125,7 +125,6 @@ export async function getExif(el) { // let html = `Image ${el.src} Size ${el.naturalWidth}x${el.naturalHeight}
`; let html = ''; let params; - debug('getExif', exif); if (exif.parameters) { params = exif.parameters; } else if (exif.userComment) { @@ -133,6 +132,7 @@ export async function getExif(el) { } else { params = ''; } + debug('getExif', params); if (params.length > 0) html += `Prompt ${params || ''}
`; html = html.replace('Negative prompt:', '
Negative'); html = html.replace('Steps:', '
Params Steps:');