Nodes/ComfyCollectorNodes/MoE Sigma Split (CCN)
ComfyUI Node

MoE Sigma Split (CCN)

Where Exactly Do the Wan 2.2 Experts Hand Off? MoE Sigma Split (CCN)

By valkymaera·Created 4 months ago·Updated 10 days ago· 1
MoE Sigma Split (CCN)
  • sigmas
  • sigmas_high
  • sigmas_low
  • high_steps
  • low_steps
  • switch_sigma
  • info
boundaryi2v (0.900)
custom_boundary0.875

Wan 2.2's two-expert setup has one awkward question: at exactly which step does the high-noise expert hand off to the low-noise one? The official answer is a sigma boundary (0.875 for t2v, 0.900 for i2v, from Wan's own configs), but ComfyUI samples Wan as flow matching with sigma in [0, 1], and which step crosses that boundary depends on your scheduler, step count, shift, and denoise. It is not a fixed step ratio - the community thread on this is explicit that the split is "only partially knowable," and the index shifts around a lot between configs. MoE Sigma Split (CCN) computes it for you, deterministically, from the actual schedule you're using.

Feed it a sigmas tensor - the flow-matching schedule from an upstream scheduler, e.g. BasicScheduler reading your shift-patched Wan model - plus a boundary (t2v 0.875, i2v 0.900, or custom with custom_boundary). It finds the first step whose sigma drops below the boundary and splits the schedule there: sigmas_high gets the high-noise segment (including the shared hand-off sigma), sigmas_low gets the rest. The two schedules share that boundary sigma, which is the subtle detail that makes the hand-off lossless - the low phase starts from exactly where the high phase ended.

The outputs are generous because debugging this is half the battle:

  • sigmas_high / sigmas_low - the per-expert schedules, wire them into two SamplerCustomAdvanced nodes (high with add_noise on, low with add_noise off, latent chained between).
  • high_steps / low_steps - how many steps each phase gets. If either is 0, that phase is empty and the node hands you an inert stub schedule instead of crashing.
  • switch_sigma - the sigma value where the switch happens, as a number.
  • info - a full text report: boundary, schedule stats, step counts, the hand-off line, and any warnings (like a schedule that crosses the boundary multiple times - it uses the first crossing only).

Two guardrails matter. It validates that the input is actually a flow-matching schedule (sigma in [0,1]) and refuses EDM/eps-style schedules from SD-family models, where the boundary concept is meaningless - that's a deliberate error, not a bug. And it handles degenerate schedules explicitly: all-high or all-low runs get stub schedules and clear warnings about where noise must enter. The one thing to remember in the all-low case: enable add_noise on the LOW phase sampler, because noise normally enters through the high phase and the inert stub can't carry it.

Install

WIP pack member, git clone:

cd ComfyUI/custom_nodes
git clone https://github.com/valkymaera/ComfyCollectorNodes

Restart ComfyUI; "MoE Sigma Split (CCN)" is in the "CCN" category. Stock deps only (torch, ComfyUI's SIGMAS type), no model downloads, MIT, WIP-label caveat applies.

Common issues

If you see the sigma-range refusal, you're feeding it a non-flow schedule - check you're sampling Wan (flow) and not accidentally passing an SD-style Karras schedule. If high_steps or low_steps is 0, read the info output and follow its noise-placement advice rather than assuming the node is broken. And if the boundary landing spot feels wrong for your aesthetic, don't fight the node - change boundary to custom and sweep. The community genuinely doesn't agree on the "best" split, and this node hands you the lever to test it.

CategoryCCN

Inputs (3)

NameTypeDefaultDescription
sigmasSIGMASFlow-matching sigma schedule, e.g. from BasicScheduler reading a shift-patched Wan model.
boundaryCOMBOi2v (0.900)Trained expert boundary in timestep space (t = sigma * 1000). Steps evaluated at sigma >= boundary run on the high-noise expert.
custom_boundaryFLOAT0.8750–1Boundary used only when 'boundary' is set to custom.

Outputs (6)

NameTypeDescription
sigmas_highSIGMAS
sigmas_lowSIGMAS
high_stepsINT
low_stepsINT
switch_sigmaFLOAT
infoSTRING