Files
silveroxides-ComfyUI-ModelU…/docs/consensus_mergers.md
T

338 lines
19 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Consensus-Weighted Blending Mergers
The dedicated CWB nodes merge two or three safetensors files using
Consensus-Weighted Blending. They calculate an element-wise mean or median
consensus, compare each aligned source vector to that consensus, and normalize
similarity-derived weights before producing the output vector.
The broad mathematical and integration reference is maintained in
[`references/Spec-CWB`](../references/Spec-CWB/README.md). This document
describes the behavior actually exposed by this repository's offline merger
nodes. The specification covers additional contexts, including online
conditioning and spatial fusion, which are not controls of these nodes.
## Node families
Two-input and three-input variants are provided for checkpoints, standalone
diffusion models, text encoders, LoRAs, and embeddings. LoRA also provides a
Multi-Merge variant for 2 to 8 equal-prior inputs.
## Embedding coalescing
`CWB Embedding Self-Coalesce` reduces one embedding by replacing mutually
nearest body-vector pairs that meet both cosine and normalized-position limits.
`CWB Embedding Multi-Merge` accepts 2 to 8 embeddings, performs normal CWB
alignment first, then applies the same reduction. A target row count of zero
continues until no eligible pair remains.
Vision Boundary Embeddings preserves encoded vision-start and vision-end rows
unchanged and applies CWB only to their interior. Normal vision inputs validate
their outer rows before writing. Legacy Boundary Search trims accidental outer
template rows by matching a selected known-clean visual embedding; an absent,
ambiguous, or low-similarity boundary pair is an error rather than a guessed
crop. Disable Vision Boundary Embeddings for open textual-inversion tensors.
Model A supplies output metadata and anchors shared-layer shape, naming, and
mismatch behavior. The output key set is the union of all inputs. A valid
tensor found only in a secondary input is copied unchanged. When Model A lacks
a tensor that is present in multiple secondary inputs, those available sources
are CWB-merged without inserting a zero contribution for Model A. Embedding
mergers additionally use the longest compatible first dimension as their
alignment reference.
## Presets and custom controls
Presets are separated by merge type. Dense tensors, embeddings, and LoRA
factor pairs never share one menu. Every named preset supplies every CWB
setting and cannot inherit hidden widget state.
Manual controls live in the separate CWB Custom Configuration node. Connecting
its `CWB_CONFIG` output completely overrides the selected preset. Leaving it
unconnected uses the named preset.
Preset names expose categorical and boolean behavior. `_idx` and `_sim`
identify alignment, `_medn` and `_mean` identify consensus, and `_rn`, `_dsc`,
`_softcb`, and `_pcp` identify enabled boolean transformations. Dense presets
omit alignment tokens because dense model coordinates are fixed.
Similarity alignment greedily matches source rows to the reference by cosine
similarity. Index alignment keeps absolute row positions. Position weight can
bias similarity matches toward nearby normalized positions. Preserve Common
Prefix copies the longest numerically identical leading row span directly from
the first input.
Inputs have equal prior weight. The similarity calculation supplies the
effective contribution for each aligned vector. If every candidate is rejected
or receives zero weight, CWB falls back to equal weighting.
### Weighting sequence
For each aligned vector group, the merger performs these operations in order:
1. Compute an element-wise mean or median consensus.
2. Measure each vector's cosine similarity to that consensus.
3. Reject similarities below `similarity_threshold`.
4. Optionally remap unequal accepted similarities with Dynamic Similarity
Contrast.
5. Apply `similarity^power_alpha` and, when enabled, the diversity bandpass.
6. Normalize the resulting contributor weights and calculate their weighted
sum. If no usable weight remains, use equal contributor weights.
7. Optionally apply `rescale_norm`.
8. Apply `global_scale`.
### Complete control reference
- **Execution Mode**: `MERGE` writes an output. `DOCUMENTATION ONLY` returns
this document without opening model inputs.
- **Model A**: primary contributor and preservation anchor. It supplies output
metadata and anchors shared names and shapes. The output key set remains the
union of all inputs.
- **Model B / Model C**: additional equal-prior contributors. CWB derives their
effective per-vector influence from consensus similarity; these nodes do not
expose model-level weights.
- **CWB Preset**: complete use-case settings selected from the node's own dense,
embedding, or LoRA registry. A connected CWB Config overrides it completely.
- **Consensus Type**: `mean` uses the arithmetic center; `median` uses the
element-wise median and is less sensitive to coordinate outliers.
- **Alignment Method**: `index` pairs first-axis vectors by position;
`similarity` uses greedy one-to-one cosine matching. Row reordering is
enabled only for embeddings and paired LoRA rank components. Ordinary
checkpoint, diffusion-model, and text-encoder tensors retain fixed
coordinates.
- **Alignment Threshold**: minimum original cosine score for accepting a
greedy row match. It does not filter already-paired contributors during CWB
weighting; that is `similarity_threshold`.
- **Similarity Threshold**: minimum cosine similarity between a participating
vector and the group consensus. Rejected vectors receive zero weight. If all
are rejected, the implementation falls back to equal weights.
- **Power Alpha**: exponent applied to accepted non-negative similarities.
Values above 1 increasingly favor contributors closest to consensus. Zero
makes every accepted contributor's similarity term equal to one.
- **Diversity Beta**: exponent for the diversity bandpass. Values above zero
suppress vectors extremely close to consensus relative to more varied
accepted vectors. Zero disables this term.
- **Rescale Norm**: after blending, preserve the merged direction but replace
its L2 magnitude with the mean L2 magnitude of the participating vectors:
`merged = merged / ||merged|| × mean(||source_i||)`
A zero merged vector remains unchanged. This is performed per aligned row,
not once per complete tensor. For LoRA, it is performed separately for each
paired A row and B column, so enabling it can materially change the effective
low-rank delta magnitude.
- **Global Scale**: multiplies the merged result after CWB. For LoRA it is
applied once through B/up so the represented delta is scaled once rather
than once per factor.
- **Dynamic Similarity Contrast**: when consensus similarities differ, remaps
them into the range 0.7–1.0 before alpha/beta weighting. It does not alter
row-alignment scores.
- **Soft Comfort Bandpass**: when beta is positive, uses
`(1.5 - similarity)^beta` instead of the narrower
`(1.001 - similarity)^beta`. It has no effect when beta is zero.
- **Position Weight**: blends normalized positional affinity into greedy row
selection. Zero uses cosine only and one uses positional affinity only. It
affects only similarity-aligned embeddings and LoRA rank components; the
original cosine score is still checked against the alignment threshold.
- **Preserve Common Prefix**: copies Model A's longest numerically identical
leading first-axis span before CWB. The current implementation applies this
to all tensors with at least two dimensions, including fixed-coordinate
model tensors.
- **Mismatch Mode**: for anchored tensors that are missing or incompatible,
`skip` preserves the anchor, `zeros` supplies a compatible zero contribution
where possible, and `error` aborts. A valid tensor supplied by only one
secondary input is copied unchanged.
- **Output Filename**: filename without extension, written atomically beneath
the matching category in ComfyUI's models directory.
- **Save Dtype**: requested dtype for generated floating tensors. Unless
Override Dtype is enabled, any participating FP32 source keeps the generated
logical result FP32.
- **Process Device**: device for per-layer FP32 arithmetic. A CUDA OOM releases
the failed working set and retries only that layer on CPU.
- **Exclude Patterns**: matching layers are preserved from their anchor instead
of merged.
- **Discard Patterns**: matching tensors or logical LoRA groups are absent from
the output.
- **Glob Patterns**: switches exclude/discard syntax from regular expressions
to shell-style globs. Pattern fields accept one entry per line.
- **Lazy Load**: enables UEL low-memory loading so tensors are streamed by work
unit and explicitly released.
- **Force Clear Cache**: runs garbage collection and clears the CUDA allocator
cache before each layer. This can reduce retained memory at a substantial
speed cost.
- **Override Dtype**: forces generated floating tensors to Save Dtype. Guarded
low-bit tensors and enabled 1D direct differences are exempt.
- **Include 1D Diffs** (LoRA nodes): enables CWB merging of recognized 1D
direct-difference tensors in FP32. When disabled, shared tensors preserve
Model A and secondary-only tensors preserve their earliest provider.
Scalars and 1D generic tensors use direct mean/median handling. Alignment,
similarity weighting, alpha/beta, DSC, and norm rescaling apply to vector groups
in tensors with at least two dimensions, not to those scalar/1D paths.
### Presets implemented by these nodes
Dense nodes offer `balanced_mean`, `robust_medn`, `selective_mean`,
`varied_mean_rn_softcb`, `diverse_medn_rn_dsc_softcb`, and
`strongdiv_medn_rn_dsc_softcb`.
Embedding nodes offer `balanced_idx_mean`, `balanced_sim_mean`,
`robust_idx_medn`, `robust_sim_medn`, `varied_sim_mean_rn_softcb`, and
`diverse_sim_medn_rn_dsc_softcb`.
LoRA nodes offer `broad_sim_medn_rn_softcb`,
`moderate_sim_medn_rn_softcb`, `conservative_sim_medn_rn_softcb`,
`direct_idx_medn_rn_softcb`, `broad_sim_mean_rn_softcb`,
`neutral_sim_medn_rn`, `focused_sim_medn_rn_dsc_softcb`, and
`strongfocus_sim_medn_rn_dsc_softcb`.
The LoRA default is `broad_sim_medn_rn_softcb`: median consensus,
similarity alignment, zero similarity threshold, alpha 2, beta 4, norm
rescaling, scale 1, DSC disabled, soft comfort bandpass enabled, position
weight 0.05, and common-prefix preservation disabled. Broad, moderate, and
conservative use alignment thresholds 0, 0.0005, and 0.0025. They represent
increasing anchor preservation in automated mixed-rank LoRA tests.
Every LoRA preset fixes all 12 controls explicitly:
| preset | consensus | alignment | align threshold | sim threshold | alpha | beta | RN | scale | DSC | soft CB | position | prefix | intent |
|---|---|---|---:|---:|---:|---:|---|---:|---|---|---:|---|---|
| `broad_sim_medn_rn_softcb` | median | similarity | 0 | 0 | 2 | 4 | on | 1 | off | on | 0.05 | off | Broad row matching; default |
| `moderate_sim_medn_rn_softcb` | median | similarity | 0.0005 | 0 | 2 | 4 | on | 1 | off | on | 0.05 | off | Moderate anchor preservation |
| `conservative_sim_medn_rn_softcb` | median | similarity | 0.0025 | 0 | 2 | 4 | on | 1 | off | on | 0.05 | off | Strong anchor preservation |
| `direct_idx_medn_rn_softcb` | median | index | 0 | 0 | 2 | 4 | on | 1 | off | on | 0.05 | off | Fixed rank-row correspondence |
| `broad_sim_mean_rn_softcb` | mean | similarity | 0 | 0 | 2 | 4 | on | 1 | off | on | 0.05 | off | Mean-consensus broad merge |
| `neutral_sim_medn_rn` | median | similarity | 0 | 0 | 2 | 0 | on | 1 | off | off | 0.05 | off | Similarity weighting without diversity modulation |
| `focused_sim_medn_rn_dsc_softcb` | median | similarity | 0 | 0 | 2 | 4 | on | 1 | on | on | 0.05 | off | Moderate DSC concentration |
| `strongfocus_sim_medn_rn_dsc_softcb` | median | similarity | 0 | 0 | 2 | 7 | on | 1 | on | on | 0.05 | off | Strong DSC concentration |
The LoRA Multi-Merge counterfactual weight sweep reuses each consensus vector
already computed by the active merge. It reports mean and median consensus
results across configured alpha, beta, similarity-threshold, DSC, and comfort
bandpass values without additional model loads or output files.
## Missing tensors and filtering
- `skip` preserves Model A when an anchored input is missing or incompatible.
In embedding-union mode it omits that source for the affected key.
- `zeros` supplies a compatible zero tensor for the missing source.
- `error` stops the merge.
- Exclude patterns preserve the anchored source tensor.
- Discard patterns remove the matching output tensor or logical LoRA layer.
The missing-input modes above apply to Model-A-owned layers. Model A being
absent from a secondary-only layer is not itself a mismatch. A shape conflict
between multiple available secondary providers does use the selected mismatch
mode, with the earliest available input as its preservation anchor.
Patterns use regular expressions by default. Enable Glob Patterns to use glob
syntax instead.
## LoRA behavior
LoRA inputs use the same parser as the resize and multi-merge nodes. It accepts
all seven low-rank A/B spellings recognized by ComfyUI's `LoRAAdapter`, plus
direct `.diff`, `.diff_b`, `.w_norm`, `.b_norm`, and `.set_weight` layers.
Recognized diffusion-model outputs use the canonical
`diffusion_model.<layer>.lora_A.weight` / `.lora_B.weight` convention.
Secondary formats are matched by normalized logical layer name. Alpha is
absorbed mathematically into each B/up factor using its original rank before
alignment, weighting, or merge. Genuine factor ranks remain variable during
CWB. The first maximum-rank input supplies the output component space, so the
output rank remains the largest genuine input rank. Merged outputs never
contain or invent alpha tensors.
Every CWB merge node writes a `cwb.merge` safetensors metadata record. It
contains selected source model names, fully resolved CWB settings, and merge
options. Presets are stored as effective settings rather than by preset name.
Non-empty exclude/discard filters and their glob mode are included. CWB reports
and diagnostics are not saved in metadata.
Similarity alignment operates on paired latent-rank components. A rows and B
columns share one mapping; fixed input/output feature axes are never reordered.
For a rank-R reference and rank-r source it evaluates an R-by-r similarity
matrix, reduced only by a preserved common prefix. Every genuine source
component can therefore match any genuine reference component. Index alignment
maps source component i to reference component i. In either mode, reference
components without a genuine contributor remain singleton groups and are not
weighted or norm-rescaled against nonexistent rank padding.
Structural rank absence is different from `mismatch_mode=zeros`. The latter is
an explicit request for a semantic zero contributor and continues to apply to
every output-rank component where the mismatch policy is active. Numerical zero
values inside a genuine factor do not identify padding; validity comes from the
factor's original rank.
Global scale is applied once to the resulting pair rather than once per factor.
Incomplete pairs and unrecognized tensors are copied from the earliest
available source unchanged.
Companion-bearing groups (`lora_mid`, reshape, DoRA, or set-weight) are kept
atomically from their earliest available source rather than partially
transformed. Secondary-only logical groups are included automatically: a group
from one source is copied unchanged, while compatible groups from multiple
secondary sources are merged using only those sources. Recognized roles are
written with the same canonical output convention as shared layers.
`include_1d_diffs` is disabled by default. Disabled shared 1D direct layers
preserve Model A, while secondary-only layers preserve their earliest source.
Enabled 1D direct layers participate as complete tensors and are always saved
in FP32.
## Precision and quantized inputs
CWB computes in FP32. Unless Override Dtype is enabled, any participating FP32
source keeps the generated logical layer in FP32. Guarded low-bit tensors and
enabled 1D direct diffs are never downcast by the override.
ComfyUI/comfy-kitchen quantized inputs are rejected before an output writer is
opened. Files with three or more bare INT8, UINT8, FP8, or FP4 tensors are also
rejected. One or two isolated low-bit tensors produce one warning per input and
are preserved without CWB arithmetic; an affected LoRA causes its complete
logical layer to be preserved.
## CWB report output
Every CWB merge node provides a separate `cwb_report` string output after the
existing filename and documentation outputs. Documentation-only execution
returns an explicit message that no report exists because no tensors were
processed.
The filename output uses ComfyUI's wildcard socket type and returns the path
relative to the matching ComfyUI model category. A filename such as
`groupfolder/modelname` therefore returns
`groupfolder/modelname.safetensors`. It can connect directly to compatible
loader Combo inputs without exposing the absolute models-directory path.
The report begins with model-wide counters. LoRA arithmetic then adds grouped
mathematical evidence without retaining tensors or dumping complete similarity
matrices. Layers are grouped only when they share:
- down non-rank dimensions;
- up non-rank dimensions;
- ordered genuine input ranks;
- selected reference input and rank;
- alignment method.
Each dimension group reports layer count, effective matrix dimensions, genuine
source-component match coverage, reference-only components, structural rank
slots excluded from arithmetic, explicit mismatch-zero contributors, candidate
similarity min/mean/max, accepted-match similarity percentiles, and rank-one
delta norm ratios. A compact exception section identifies the lowest match
coverage and largest norm changes by layer name.
For a rank-384 reference and rank-128 source, the report identifies a `384x128`
matrix, at most 128 genuine matches, and the 256 structural rank slots that were
excluded rather than treated as zero-valued contributors.
## Streaming and failure safety
Model parameters and direct patches use fixed-coordinate blending; similarity
row matching is limited to embeddings and LoRA rank components. Each logical
layer is loaded, transferred to the processing device, completed, copied back
to CPU, queued for writing, and released before the next layer. Outputs are
written to a temporary sibling and atomically published only after every layer
and asynchronous write succeeds. Failed merges do not replace or finalize the
requested output. A CUDA OOM retries only the affected layer on CPU after
releasing the failed GPU working set; failure of that retry aborts atomically.
Generated files are published under the matching category inside
`folder_paths.models_dir`, never ComfyUI's general output directory.