refactor(pipelines): split kandinsky into kandinsky3 and kandinsky5

K3 and K5 share only the marketing name: different diffusers pipeline
classes (Kandinsky3Pipeline vs Kandinsky5T2I/I2IPipeline), different
denoiser classes (Kandinsky3UNet vs Kandinsky5Transformer3DModel), no
shared scaffolding. Separate packages so each spec lives next to the
arch it serves.

K2.1 and K2.2 stay outside both packages since they go through
KandinskyCombinedPipeline.from_pretrained directly with no spec.
This commit is contained in:
CalamitousFelicitousness
2026-05-25 19:28:39 +01:00
parent bd60372cc5
commit d55af33d36
4 changed files with 27 additions and 25 deletions
-23
View File
@@ -1,23 +0,0 @@
"""Kandinsky pipeline package.
Exports :data:`KANDINSKY3_UNET_SPEC` and :data:`KANDINSKY5_SPEC`.
Kandinsky ships several generations under one family:
- Kandinsky 2.1 / 2.2 are unet-based and load through diffusers'
combined pipelines without going through the native loader, so no
spec is needed.
- Kandinsky 3 uses :class:`Kandinsky3UNet` in the ``unet`` subfolder of
the repo, hence ``subfolder='unet'`` instead of the default
``'transformer'``.
- Kandinsky 5 uses the new :class:`Kandinsky5Transformer3DModel` and
follows the default layout.
"""
import diffusers
from pipelines.native_transformer import TransformerSpec
KANDINSKY3_UNET_SPEC = TransformerSpec(cls=diffusers.Kandinsky3UNet, subfolder='unet')
KANDINSKY5_SPEC = TransformerSpec(cls=diffusers.Kandinsky5Transformer3DModel)
+13
View File
@@ -0,0 +1,13 @@
"""Kandinsky 3.0 pipeline package.
Exports :data:`KANDINSKY3_UNET_SPEC`. Kandinsky 3 uses
:class:`Kandinsky3UNet` in the ``unet`` subfolder of the repo, hence
``subfolder='unet'`` instead of the default ``'transformer'``.
"""
import diffusers
from pipelines.native_transformer import TransformerSpec
KANDINSKY3_UNET_SPEC = TransformerSpec(cls=diffusers.Kandinsky3UNet, subfolder='unet')
+12
View File
@@ -0,0 +1,12 @@
"""Kandinsky 5.0 pipeline package.
Exports :data:`KANDINSKY5_SPEC`. Kandinsky 5 uses
:class:`Kandinsky5Transformer3DModel` and follows the default layout.
"""
import diffusers
from pipelines.native_transformer import TransformerSpec
KANDINSKY5_SPEC = TransformerSpec(cls=diffusers.Kandinsky5Transformer3DModel)
+2 -2
View File
@@ -50,7 +50,7 @@ def load_kandinsky3(checkpoint_info, diffusers_load_config=None):
load_args, _quant_args = model_quant.get_dit_args(diffusers_load_config)
log.debug(f'Load model: type=Kandinsky30 repo="{repo_id}" config={diffusers_load_config} offload={shared.opts.diffusers_offload_mode} dtype={devices.dtype} args={load_args}')
from pipelines.kandinsky import KANDINSKY3_UNET_SPEC
from pipelines.kandinsky3 import KANDINSKY3_UNET_SPEC
unet = generic.load_transformer(repo_id, cls_name=diffusers.Kandinsky3UNet, load_config=diffusers_load_config, subfolder="unet", variant="fp16", native_spec=KANDINSKY3_UNET_SPEC)
text_encoder = generic.load_text_encoder(repo_id, cls_name=transformers.T5EncoderModel, load_config=diffusers_load_config, subfolder="text_encoder", variant="fp16", allow_shared=False)
@@ -84,7 +84,7 @@ def load_kandinsky5(checkpoint_info, diffusers_load_config=None):
load_args, _quant_args = model_quant.get_dit_args(diffusers_load_config)
log.debug(f'Load model: type=Kandinsky50 repo="{repo_id}" config={diffusers_load_config} offload={shared.opts.diffusers_offload_mode} dtype={devices.dtype} args={load_args}')
from pipelines.kandinsky import KANDINSKY5_SPEC
from pipelines.kandinsky5 import KANDINSKY5_SPEC
transformer = generic.load_transformer(repo_id, cls_name=diffusers.Kandinsky5Transformer3DModel, load_config=diffusers_load_config, native_spec=KANDINSKY5_SPEC)
text_encoder = generic.load_text_encoder(repo_id, cls_name=transformers.Qwen2_5_VLForConditionalGeneration, load_config=diffusers_load_config)