MOSS DyPE-M (Position Extrapolation)
Your 8 MP MOSS render has weirdly long arms. This node is the fix
- model
- model
MOSS-Image is trained in a band around 4 megapixels. Push the canvas past that and the model doesn't refuse - it renders happily, and then you notice the arms are too long, the face is squashed, the arches bow outward. The usual answer is to render small and upscale. The other answer is to change the story the model is told about how big the canvas is, and that's what this node does.
What it is
MossDyPEPatch takes a MODEL and gives you back a MODEL. That's it - it's a patch, not a sampler and not an upscaler. It ports DyPE (arXiv 2510.20766, Issachar et al.) to MOSS-Image's 4-axis rotary encoding, so the model can render well beyond its training range without retraining and, per the author's own measurement, for about half a percent more wall clock.
Context worth having: DyPE had a real moment in late 2025, mostly bolted onto Flux Krea workflows, then the noise died down. The skeptics were half right - coherency beats a bigger number, and upscaling is easy. But a tiled upscale repaints patches of an image that already exists; this keeps the whole canvas in one denoising trajectory, and for a single dominant subject at 6–9 MP the difference shows up in the proportions.
How it works
MOSS-Image is a 42-layer DiT with a four-axis RoPE (r, f, h, w), 32 dims per axis, 16 frequency bands each, and the h/w axes are the ones carrying the image extent. The node wraps the diffusion model's rope callable in a per-step wrapper, rebuilds the position embedding with YaRN-style frequency interpolation, and restores the original rope in a finally block after the forward pass. Nothing sticky, nothing left patched behind.
Strength is a scalar κ that decays across the run: early steps get heavy extrapolation, late steps fall back toward the training frequencies. Scale comes from the latent extent against base_resolution / 16, floored at 1.0 - which is why the patch is a genuine no-op at or below your base resolution.
The settings that actually matter
target_scale- the main dial.1.2–1.3is the sweet spot. It means "pretend the model is 1.25× smaller than this canvas" at any size, so 1.25 transfers from 6 MP to 8 MP to 16 MP. At0it falls back tobase_resolution- and then the strength climbs with your canvas, which is how you get "it was fine yesterday" bug reports.isotropic_scale- leave it on. Off, the two axes get scaled separately and disagree by exactly the aspect ratio; at 3200×2560 that's a 25% horizontal stretch. The author's sphere test measures an axis ratio of 1.200 with per-axis scaling versus 1.015 with isotropic - that's the funhouse-mirror look.method-yarnis the paper's branch and gives the most detail.uniformis milder,ntksmoothest,offdisables extrapolation without unwiring anything.
base_resolution (256–4096, step 16) only does anything when target_scale = 0. Heads up: the README's table still claims 2048 while the widget ships at 1024 - trust the widget. Leave lambda_s/lambda_t alone unless you're experimenting, and if composition keeps drifting, start_percent = 0.125 skips step 0, the step that commits the layout. The rest (mscale_mode, fix_ramp_clamp, spectral_weight, spectral_hi) are the author's own bug fixes for the reference formulation; defaults are the right answer.
One output, model, wired into your sampler - after the LoRA and ModelSampling nodes, like any MODEL patch.
Install
comfy node install comfyui-mossdype
Or, the old-fashioned way:
cd ComfyUI/custom_nodes
git clone https://github.com/IxMxAMAR/comfyui-mossdype
Restart ComfyUI. The pleasant surprise: this pack declares no dependencies at all - it only uses what ComfyUI already ships, so no pip roulette and no fighting transformers versions against whatever you installed last week. You do need a MOSS-Image checkpoint loaded, obviously.
Where people get burned
It refuses to run on anything else. The node checks the model type and raises DyPE-M: this node patches MOSS-Image only (got ...). This is a MOSS-specific port, not a general high-resolution button - Flux and SDXL users get nothing from it.
"I see no difference." Two causes, both boring. You're rendering at or below your base resolution, where the patch is designed to be inert; or target_scale = 0 with a base that's close to your canvas. Set target_scale and try again.
Pushing it too far. Past roughly 2.5 the model stops adding detail and starts inventing it: halos, plastic skin, crunchy grain, and corrupted text. The author watched a marquee that should read MOSS render as MOUSS. If an image looks over-sharpened rather than detailed, you're past the useful range - come back to 1.2.
VRAM is still VRAM. The patch adds almost no time, but the decode is what bites at 8 MP - use VAEDecodeTiled.
Leave it wired in permanently: enabled = false is byte-identical to not having the node, and below base resolution it does nothing anyway.
Inputs (16)
| Name | Type | Default | Description |
|---|---|---|---|
| model | MODEL | — | |
| enabled | BOOLEAN | true | — |
| method | COMBO | yarn | 4 options: yarn, uniform, ntk, off |
| schedule | COMBO | adaptive | 8 options: adaptive, aniso, spectral, hybrid, sigma, progress, +2 |
| base_resolution | INT | 1024256–4096 | Reference resolution the model was trained at. Scale = patch extent / base_patches. No-op at or below this resolution. |
| lambda_s | FLOAT | 1.000–4 | Overall scaling strength. |
| lambda_t | FLOAT | 2.00.1–8 | Decay exponent of kappa(t). |
| target_scaleopt | FLOAT | 0.000–4 | Pin the extrapolation strength instead of deriving it from base_resolution. 0 = off (use base_resolution). 1.25 means 'pretend the model is 1.25x smaller than this canvas' at ANY resolution, so one setting transfers from 6MP to 8MP to 16MP. Smaller = milder = less object inflation. |
| isotropic_scaleopt | BOOLEAN | true | Derive ONE scale from the pixel area, applied to both axes. Per-axis scaling (False) makes the axes disagree by exactly the aspect ratio - a 25% horizontal stretch at 3200x2560 and 78% at 4096x2304. Only turn off to reproduce the old behaviour. |
| mscale_modeopt | COMBO | kappa | 3 options: kappa, vanilla, off |
| spectral_weightopt | FLOAT | 0.500–1 | Blend of the measured spectrum against the analytic time curve (spectral only). |
| spectral_hiopt | FLOAT | 0.900.5–0.99 | Cumulative energy fraction that defines the bandwidth. |
| start_percentopt | FLOAT | 0.000–1 | — |
| end_percentopt | FLOAT | 1.000–1 | — |
| axesopt | COMBO | both | 3 options: both, h, w |
| fix_ramp_clampopt | BOOLEAN | true | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| model | MODEL | — |