From a9e77675a8e89df64110de8304f7bcde96b85919 Mon Sep 17 00:00:00 2001 From: Sergey Borisov Date: Thu, 6 Jul 2023 17:39:49 +0300 Subject: [PATCH] Move clip skip to separate node --- invokeai/app/invocations/compel.py | 21 +++++++++++++++++++-- invokeai/app/invocations/model.py | 2 ++ 2 files changed, 21 insertions(+), 2 deletions(-) diff --git a/invokeai/app/invocations/compel.py b/invokeai/app/invocations/compel.py index 4941f9ee8a..f48e4aa648 100644 --- a/invokeai/app/invocations/compel.py +++ b/invokeai/app/invocations/compel.py @@ -44,7 +44,6 @@ class CompelInvocation(BaseInvocation): prompt: str = Field(default="", description="Prompt") clip: ClipField = Field(None, description="Clip to use") - clip_skip: int = Field(0, description="Layers to skip in text_encoder") # Schema customisation class Config(InvocationConfig): @@ -96,7 +95,7 @@ class CompelInvocation(BaseInvocation): with ModelPatcher.apply_lora_text_encoder(text_encoder_info.context.model, _lora_loader()),\ ModelPatcher.apply_ti(tokenizer_info.context.model, text_encoder_info.context.model, ti_list) as (tokenizer, ti_manager),\ - ModelPatcher.apply_clip_skip(text_encoder_info.context.model, self.clip_skip),\ + ModelPatcher.apply_clip_skip(text_encoder_info.context.model, self.clip.skipped_layers),\ text_encoder_info as text_encoder: compel = Compel( @@ -136,6 +135,24 @@ class CompelInvocation(BaseInvocation): ), ) +class ClipSkipInvocationOutput(BaseInvocationOutput): + """Clip skip node output""" + type: Literal["clip_skip_output"] = "clip_skip_output" + clip: ClipField = Field(None, description="Clip with skipped layers") + +class ClipSkipInvocation(BaseInvocation): + """Skip layers in clip text_encoder model.""" + type: Literal["clip_skip"] = "clip_skip" + + clip: ClipField = Field(None, description="Clip to use") + skipped_layers: int = Field(0, description="Number of layers to skip in text_encoder") + + def invoke(self, context: InvocationContext) -> ClipSkipInvocationOutput: + self.clip.skipped_layers += self.skipped_layers + return ClipSkipInvocationOutput( + clip=self.clip, + ) + def get_max_token_count( tokenizer, prompt: Union[FlattenedPrompt, Blend, Conjunction], diff --git a/invokeai/app/invocations/model.py b/invokeai/app/invocations/model.py index 17297ba417..34836eabd2 100644 --- a/invokeai/app/invocations/model.py +++ b/invokeai/app/invocations/model.py @@ -30,6 +30,7 @@ class UNetField(BaseModel): class ClipField(BaseModel): tokenizer: ModelInfo = Field(description="Info to load tokenizer submodel") text_encoder: ModelInfo = Field(description="Info to load text_encoder submodel") + skipped_layers: int = Field(description="Number of skipped layers in text_encoder") loras: List[LoraInfo] = Field(description="Loras to apply on model loading") @@ -154,6 +155,7 @@ class MainModelLoaderInvocation(BaseInvocation): submodel=SubModelType.TextEncoder, ), loras=[], + skipped_layers=0, ), vae=VaeField( vae=ModelInfo(