ModelMergeSD3_2B
Block-merge control for the SD3 MMDiT, for the few who still merge it
- model1
- model2
- MODEL
ModelMergeSD3_2B is the block-merge node for Stable Diffusion 3 Medium, the 2B MMDiT - and honestly, it's a node you'll reach for rarely, because the SD3 ecosystem never really formed. The SD3 KB story here is worth remembering before you spend an afternoon on this: a genuinely novel architecture whose June 2024 launch was so broken it got the family banned from CivitAI, and no real ecosystem grew behind it. People do not merge SD3 Medium in large numbers today.
So why does the node exist, and when is it useful? Because SD3 Medium is still a real, decent 2B model you can run on modest hardware, and if you have two fine-tunes of it, this is the tool that lets you blend them block-by-block instead of eyeballing one global ratio. The MMDiT (Multi-Modal DiT) architecture is a transformer where text and image tokens are processed together in the same blocks - no U-Net encoder/decoder split. That means the block map looks completely different from ModelMergeSDXL, and you don't want to be typing these keys by hand, hence this node.
How it works
It subclasses ModelMergeBlocks with the SD3 Medium key map pre-filled, so the math is the same per-tensor interpolation: result = ratio · model1 + (1 − ratio) · model2, with the ratio chosen by the longest matching prefix. The inputs map onto the MMDiT's components:
pos_embed.- positional embeddings.x_embedder.,context_embedder.- the patch embedding for image tokens and the projection for text context.y_embedder.,t_embedder.- the pooled-text (vector) conditioning and the timestep embedding.joint_blocks.0–23- the 24 joint transformer blocks where image and text attend to each other. These are the meat of the model; mid-range blocks are where most of the "style" lives.final_layer.- the output projection back to latent space.
Every slider defaults to 1.0 (all model1). The two embedder groups are small and generally stay at 1.0; the joint blocks are where merging actually changes the character of the output. Early joint blocks ≈ global structure, later ones ≈ detail.
The inputs that matter
For a beginner, the honest answer is: only model1, model2, and maybe a 50/50 pass on all the joint_blocks sliders to start. The granular version of this node is for someone who already knows which layer range does what in a DiT - and even they're usually experimenting. The embedder inputs (pos_embed., x_embedder., y_embedder., t_embedder., context_embedder.) are tiny relative to the model and rarely worth touching.
Output is one MODEL, straight into a KSampler or a Save Checkpoint node.
Where people get burned
The same shape-mismatch warning as every merge: both inputs must be actual SD3 Medium (2B) checkpoints. SD3.5 Large is a different, bigger MMDiT - it has 38 joint blocks and its own node (ModelMergeSD35_Large); do not cross the streams. And since SD3's community momentum stalled, fine-tuned SD3 checkpoints to merge are thin on the ground - you may genuinely have nothing interesting to blend. If that's the case, the node is still a clean way to A/B test two SD3 fine-tunes against each other at any ratio, which is a legitimate use on its own.
How you get it
Core ComfyUI, model/merging/model specific, ships in the program. The proper SD3_2B version landed June 2024 (an earlier generic SD3 merge existed the week before and was replaced). Nothing to install.
Inputs (32)
| Name | Type | Default | Description |
|---|---|---|---|
| model1 | MODEL | — | |
| model2 | MODEL | — | |
| pos_embed. | FLOAT | 1.000–1 | — |
| x_embedder. | FLOAT | 1.000–1 | — |
| context_embedder. | FLOAT | 1.000–1 | — |
| y_embedder. | FLOAT | 1.000–1 | — |
| t_embedder. | FLOAT | 1.000–1 | — |
| joint_blocks.0. | FLOAT | 1.000–1 | — |
| joint_blocks.1. | FLOAT | 1.000–1 | — |
| joint_blocks.2. | FLOAT | 1.000–1 | — |
| joint_blocks.3. | FLOAT | 1.000–1 | — |
| joint_blocks.4. | FLOAT | 1.000–1 | — |
| joint_blocks.5. | FLOAT | 1.000–1 | — |
| joint_blocks.6. | FLOAT | 1.000–1 | — |
| joint_blocks.7. | FLOAT | 1.000–1 | — |
| joint_blocks.8. | FLOAT | 1.000–1 | — |
| joint_blocks.9. | FLOAT | 1.000–1 | — |
| joint_blocks.10. | FLOAT | 1.000–1 | — |
| joint_blocks.11. | FLOAT | 1.000–1 | — |
| joint_blocks.12. | FLOAT | 1.000–1 | — |
| joint_blocks.13. | FLOAT | 1.000–1 | — |
| joint_blocks.14. | FLOAT | 1.000–1 | — |
| joint_blocks.15. | FLOAT | 1.000–1 | — |
| joint_blocks.16. | FLOAT | 1.000–1 | — |
| joint_blocks.17. | FLOAT | 1.000–1 | — |
| joint_blocks.18. | FLOAT | 1.000–1 | — |
| joint_blocks.19. | FLOAT | 1.000–1 | — |
| joint_blocks.20. | FLOAT | 1.000–1 | — |
| joint_blocks.21. | FLOAT | 1.000–1 | — |
| joint_blocks.22. | FLOAT | 1.000–1 | — |
| joint_blocks.23. | FLOAT | 1.000–1 | — |
| final_layer. | FLOAT | 1.000–1 | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| MODEL | MODEL | — |