Model Merger (MBW/DARE)
DARE merging with MBW-style per-block weights
- model_a
- model_b
- model_mask
- MODEL
Model Merger (MBW/DARE) is the one with the giant wall of sliders. MBW stands for "merge block weighted" - the classic approach, inherited from the A1111-era merge tools, where instead of six coarse stage ratios you get a weight for every individual block of the UNet: 12 input blocks, 3 middle blocks, 12 output blocks, plus the out layer and the time/label embeddings. Now take that fine-grained control and run DARE-TIES on top of it, and you have this node.
If that sounds like overkill, it is - and that's the appeal. The six-slider Block/DARE node groups the whole encoder under one knob; MBW/DARE lets you say "blocks 4 and 7 of the input stay fully on model A, block 2 of the output is fully model B, everything else gets DARE'd at full strength." That level of granularity is how people chase specific failure modes - a merge that collapses hands or melts the background can often be traced to a specific block range, and MBW is the tool that lets you pin the blame to a block and zero it out.
The inputs that matter
- model_a, model_b - base and injected model.
- input_blocks.0 through input_blocks.11 - one slider per encoder block. 1 = keep model A, 0 = take model B.
- middle_block.0 through middle_block.2 - the bottleneck blocks.
- output_blocks.0 through output_blocks.11 - one slider per decoder block.
- out, time, label - the output layer and the conditioning embeddings.
- drop_rate (default 0.9), ties, rescale, seed, method, iterations - the standard DARE controls, all defaulted to the pack's recommended settings (rescale off, ties on sum).
- model_mask (optional) - parameter-level protection on top of the block weights.
Note the block sliders all default to 0 on this node, unlike the six-ratio nodes which default to 1. That means out of the box, every block is set to "take model B" - so if you wire one up fresh and it just hands you model B, that's not a bug, that's the defaults staring at you. Push the blocks you care about up toward 1 before you judge the result.
How it works
Under the hood it's the same engine as Model Merger (Advanced/DARE): your per-block sliders become a LAYER_GRADIENT (each layer inherits the weight of the block it belongs to), and the DARE merge reads that gradient per layer. The block structure is hardcoded for the SD1.5 layout - 12/3/12 - which is what the pack's sniff_model_type checks for. SDXL's block count differs, so treat this node as SD1.5-flavored in practice.
The output
A MODEL patch for the KSampler or the Save Checkpoint node (MODEL + CLIP + VAE). In-memory only until you save it.
Install and gotchas
ComfyUI Manager (search "DareMerge") or:
cd ComfyUI/custom_nodes
git clone https://github.com/54rt1n/ComfyUI-DareMerge
Restart ComfyUI. Dependencies are matplotlib, numpy, torch, pillow - nothing to download.
The honest caveat: this is a fiddly, expert-oriented node, and the community threads about this pack are overwhelmingly beginners asking "how do I use these?" - there isn't a well-trodden MBW recipe waiting for you. Start from a working Block/DARE merge, then zero out one block at a time and see what changes; don't try to tune all 30 sliders at once, because with a stochastic merge behind them you won't be able to tell which slider did what. Fix the seed, change one block, compare.
Inputs (39)
| Name | Type | Default | Description |
|---|---|---|---|
| time | FLOAT | 1.000–1 | — |
| label | FLOAT | 1.000–1 | — |
| input_blocks.0 | FLOAT | 0.000–1 | — |
| input_blocks.1 | FLOAT | 0.000–1 | — |
| input_blocks.2 | FLOAT | 0.000–1 | — |
| input_blocks.3 | FLOAT | 0.000–1 | — |
| input_blocks.4 | FLOAT | 0.000–1 | — |
| input_blocks.5 | FLOAT | 0.000–1 | — |
| input_blocks.6 | FLOAT | 0.000–1 | — |
| input_blocks.7 | FLOAT | 0.000–1 | — |
| input_blocks.8 | FLOAT | 0.000–1 | — |
| input_blocks.9 | FLOAT | 0.000–1 | — |
| input_blocks.10 | FLOAT | 0.000–1 | — |
| input_blocks.11 | FLOAT | 0.000–1 | — |
| middle_block.0 | FLOAT | 0.000–1 | — |
| middle_block.1 | FLOAT | 0.000–1 | — |
| middle_block.2 | FLOAT | 0.000–1 | — |
| output_blocks.0 | FLOAT | 0.000–1 | — |
| output_blocks.1 | FLOAT | 0.000–1 | — |
| output_blocks.2 | FLOAT | 0.000–1 | — |
| output_blocks.3 | FLOAT | 0.000–1 | — |
| output_blocks.4 | FLOAT | 0.000–1 | — |
| output_blocks.5 | FLOAT | 0.000–1 | — |
| output_blocks.6 | FLOAT | 0.000–1 | — |
| output_blocks.7 | FLOAT | 0.000–1 | — |
| output_blocks.8 | FLOAT | 0.000–1 | — |
| output_blocks.9 | FLOAT | 0.000–1 | — |
| output_blocks.10 | FLOAT | 0.000–1 | — |
| output_blocks.11 | FLOAT | 0.000–1 | — |
| out | FLOAT | 0.000–1 | — |
| model_a | MODEL | — | |
| model_b | MODEL | — | |
| drop_rate | FLOAT | 0.900–1 | — |
| ties | COMBO | sum | 3 options: sum, count, off |
| rescale | COMBO | off | 2 options: off, on |
| seed | INT | 10–99999999999 | — |
| method | COMBO | comfy | 12 options: comfy, lerp, slerp, slice, cyclic, gradient, +6 |
| iterations | INT | 11–100 | — |
| model_maskopt | MODEL_MASK | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| MODEL | MODEL | — |