MOSS-Image SFT DeBand

The MOSS-Image SFT model often draws faint, evenly spaced vertical color stripes across smooth areas like skies, fog, backdrops and walls. This repo has two banding-fix LoRAs that remove them while keeping the image close to what SFT would have made, plus preset workflows that pair the fix with community speed LoRAs for 10–14 step (or 4–8 step) generation.

TL;DR

  1. Download the main fix, moss_image_sft_banding_fix_L37-41_bf16.safetensors, into ComfyUI/models/loras/.
  2. In your MOSS-Image workflow, add LoraLoaderModelOnly after the SFT model (moss_image_sft_bf16.safetensors from Comfy-Org/MOSS-Image) and set it to 1.0. No custom nodes needed.
  3. Still seeing stripes? That happens most on smooth skies and gradients, and on wide images (1536 px and up). Add a second LoraLoaderModelOnly with the extra fix, moss_image_sft_banding_fix_L32-36_extra_bf16.safetensors, also at 1.0. That's the Quality+ preset.
  4. Or drag workflows/moss_banding_fix_presets.json into ComfyUI and pick a preset: Quality (25 steps), Quality+ (both fixes), Balanced (14 steps), Fast / Fast alt (10 steps). The files each preset needs are listed below.
  5. Want 4–8 steps? workflows/moss_banding_fix_presets_rapid_moss.json adds the Turbo presets. It needs two custom nodes; see the setup below.

How it works: each LoRA is an exact weight difference that turns some of SFT's transformer layers back into the Base model's weights. The main fix covers the last five layers (37–41), the extra fix covers 32–36, and everything else is untouched. How those layers were found is further down, with the full write-up in ANALYSIS.md.

Examples

Before / after: same prompt and seed, 768×1024. The bottom row removes brightness and boosts color 5×, which makes the stripes easy to see.

Fog forest before and after

More before/after: anime pier and goose

Anime pier before and after Goose before and after

Every preset on the five test prompts: the exact output of the preset workflow at 768×1024, seed 11. Each label gives the banding score (about 1.0 = clean) and how close the image stays to plain SFT. The color view shows the stripes.

All presets, fog forest All presets, fog forest, color view

Fjord sky: the hardest one; only Quality+ fully cleans the sky

All presets, fjord sky All presets, fjord sky, color view

Goose at the checkout

All presets, goose All presets, goose, color view

Oil still life

All presets, oil still life All presets, oil still life, color view

Perfume bottle

All presets, perfume bottle All presets, perfume bottle, color view

The workflow's default prompt: a cozy anime illustration of a woman in a penguin sweater with a penguin mug, on a window seat over an icy bay. This is what the preset workflows produce out of the box (1024×1024, every preset). This scene doesn't band much even on plain SFT, so it shows the look and speed of each preset.

All presets on the default prompt

A busy cinematic scene, 1280×720: text, crowds, reflections, steam and neon hold up with the fix and with the speed LoRAs.

Cinematic neon street across setups

More scenes: ballroom, viking ship, anime pier, and a layout check

These were made while tuning the presets, so some speed-LoRA strengths and step counts differ from the final presets. Every label names the exact setup.

Cinematic ballroom across setups Cinematic viking ship across setups Anime pier across setups

Layout check: the prompt places four objects in four boxes, plus a card reading "LAYOUT OK". Every setup put all four objects in their boxes and got the text right, so the fix and speed LoRAs don't hurt prompt following.

Layout check across setups

Results

Same prompt, seed (11) and settings in every column, 768×1024. Each cell is banding · SFT similarity.

  • Banding measures the stripe at the exact width SFT draws it, relative to nearby patterns. About 1.0 means no stripe; plain SFT scores about 2. Fine grain and real vertical patterns (pleats, tree trunks) also raise it, so compare within a column.
  • SFT similarity is SSIM against the plain SFT image. Higher keeps more of the SFT look.
Setup Fog forest Fjord sky Goose Oil still life Perfume bottle Mean
Off (plain SFT) 2.33 2.21 2.16 1.96 1.53 2.04
Quality 1.28 · 86% 1.74 · 90% 1.21 · 69% 1.43 · 89% 1.29 · 93% 1.39 · 86%
Quality+ 1.10 · 74% 0.93 · 84% 1.28 · 54% 1.17 · 80% 1.00 · 88% 1.09 · 76%
Balanced 1.22 · 62% 1.42 · 82% 1.00 · 45% 1.09 · 64% 1.53 · 80% 1.25 · 66%
Fast 1.26 · 58% 1.29 · 77% 1.05 · 38% 0.91 · 58% 1.18 · 81% 1.14 · 62%
Fast alt 1.22 · 57% 1.49 · 78% 1.00 · 39% 0.95 · 57% 1.21 · 81% 1.17 · 62%
Turbo 1.04 · 42% 1.30 · 44% 1.59 · 32% 1.15 · 31% 1.29 · 73% 1.27 · 45%
Turbo max 1.17 · 32% 2.41 · 65% 2.15 · 30% 1.27 · 23% 0.99 · 71% 1.60 · 44%
Kijai 21–49 @ −0.5 1.70 · 81% 1.74 · 88% 1.24 · 51% 1.46 · 85% 1.32 · 91% 1.49 · 79%
Base model 1.13 · 59% 1.19 · 78% 1.17 · 45% 0.92 · 61% 1.20 · 82% 1.12 · 65%

How to read it:

  • Quality keeps the most of SFT (86%) and removes most of the banding. Quality+ is the cleanest (about as clean as Base) but changes the image more.
  • Balanced / Fast / Fast alt are clean too, but at 10–14 steps they change more of the image.
  • Turbo / Turbo max redraw the scene (30–70% similarity). Turbo max's high scores on the fjord and goose come mostly from fine grain the 4-step adapter adds, not SFT's stripes; check its color views above.

Settings: ER-SDE, CFG 3, Temporal Score Rescaling and skip-layer guidance (layers 22, 24) on, int8 Qwen3.5-9B text encoder. These are the preset workflow's own settings; the Turbo presets use the rapid-moss sampler.

Image size: when does banding go away?

It doesn't, really. SFT draws fine stripes at 768 and 1024 px wide. At 1536 and 2048 px wide it draws wider, wavy stripes instead. These are center crops of the color view at 1:1 pixels, height 1024, seed 11:

Fjord sky across widths

Fog forest across widths

Fog forest across widths

Width Plain SFT Quality Quality+
768 strong stripes fainter; still visible on the fjord sky clean
1024 strong stripes faint clean
1280 clean on both prompts clean clean
1536 wide wavy stripes fog clean; fjord sky still striped fog clean; fjord sky very faint
2048 wide wavy stripes fog clean; faint waves on the fjord sky clean

So: use Quality+ for wide images or big smooth skies. 1280 wide was clean for every setup here, but that's two prompts and one seed. The wavy stripes at 1536+ are wider than the ones the banding score looks for, so this table is by eye.

Preset workflows in detail

Two ready-made ComfyUI workflows are in workflows/. Pick a Preset from the dropdown at the top; it sets every LoRA strength and the step count for you.

Preset What it does Steps
Quality SFT + main banding fix (layers 37–41) 25
Quality+ SFT + main fix + extra fix (layers 32–36). Cleanest, slightly different look 25
Balanced main fix + lodestones 8-step DMD LoRA at 0.28 14
Fast main fix + lodestones 8-step DMD LoRA at 0.35 10
Fast alt main fix + darask0 4-step LoRA at 0.35 10
Off plain SFT, to compare 25
Turbo (rapid-moss workflow only) lodestones 8-step adapter + main fix, its own sampler 8
Turbo max (rapid-moss workflow only) darask0 4-step adapter + main fix, its own sampler (about 3 s per image on an RTX 5090) 4

The speed and Turbo presets use only the main fix. For wide images with smooth skies, Quality+ is the safe choice.

moss_banding_fix_presets.json: stock ComfyUI, no custom nodes

Put these files in your ComfyUI models folder (each link downloads the file directly):

Save as Into folder Download
moss_image_sft_bf16.safetensors diffusion_models Comfy-Org
qwen3.5_9b_int8_convrot.safetensors text_encoders Comfy-Org
flux2-vae.safetensors vae Comfy-Org
moss_image_sft_banding_fix_L37-41_bf16.safetensors loras this repo
moss_image_sft_banding_fix_L32-36_extra_bf16.safetensors loras this repo
lodestones_moss_sft_8step_dmd_lora_latest.safetensors loras lora_latest.safetensors from lodestones, renamed
darask0_moss_sft_4step_dmad_lora.safetensors loras lora.safetensors from darask0, renamed

The two speed LoRAs are both called lora.safetensors upstream, so rename them as shown. A LoRA at strength 0 is skipped, but ComfyUI still checks that every file exists. If you don't want a speed LoRA, delete its node and don't pick its preset.

moss_banding_fix_presets_rapid_moss.json: adds the Turbo presets

Everything above, plus:

  • Custom nodes, each folder copied into ComfyUI/custom_nodes/:
    • OpenMOSS's moss-image (the comfyui/moss-image folder of their GitHub repo);
    • darask0's rapid-moss (the comfyui/rapid-moss folder of their Hugging Face repo).
  • moss_image_sft_bf16_split_qkv.safetensors (10.2 GB, this repo) → models/diffusion_models. The rapid-moss adapters patch q, k and v separately, so they need the SFT model with q/k/v stored apart. This file is the official OpenMOSS-Team/MOSS-Image-SFT transformer as a single file, with the same 463 tensors. The Comfy-Org file fuses q/k/v; with it, the rapid-moss adapters produce noise or a black image without raising an error.
  • moss_image_sft_banding_fix_L37-41_bf16_splitqkv.safetensors (this repo) → models/loras. The same main fix, laid out for the split model.
  • Adapter folders, each holding three files with exactly these names:
Folder lora.safetensors time_embedding.safetensors dataspace.safetensors
models/rapid_moss/lodestones-8step-latest/ lodestones' lora_latest.safetensors, renamed to lora.safetensors download download
models/rapid_moss/rapid-moss-4step/ darask0's lora.safetensors download download

Only the branch for the chosen preset runs, so the normal presets don't load the split model.

Compared with Kijai's LoRA and the Base model

Kijai/MOSS-image_experimental has the SFT-difference LoRAs this work builds on, and its README has the original −0.5 banding recipe:

The two fixes take different routes. Kijai's subtracts half of the SFT change across layers 3, 4 and 21–41; the main fix here fully reverts only layers 37–41. On these images the main fix bands less or the same and keeps more of the SFT image every time. Pick by eye: each grid shows Full SFT (top left), Base (top right), the main fix (bottom left) and Kijai's LoRA (bottom right).

Perfume bottle: fix 1.29 vs Kijai 1.32

Perfume bottle

Fjord sky: tie, 1.74 each. Neither cleans this sky; Base and Quality+ do.

Fjord sky

Goose, 768×1024: fix 1.21 vs Kijai 1.24

Goose at 768x1024

Fog forest: fix 1.28 vs Kijai 1.70

Fog forest

Oil still life: fix 1.43 vs Kijai 1.46

Oil still life

Goose, 1024×1024: fix 1.07 vs Kijai 1.24

Goose at 1024x1024

Color views: brightness removed and color boosted 5×, where the stripes are easy to see

Perfume bottle, color view Fjord sky, color view Goose 768x1024, color view Fog forest, color view Oil still life, color view Goose 1024x1024, color view

How the layers were found

  1. Block swaps with exact weights. Copying the Base model's weights into SFT for one block range at a time showed that removing SFT's changes in layers 21–41 fixes the banding, while reverting layers 0–20 alone does not. Within that range, attention (qkv, o) and MLP (ffn_up_gate, ffn_down) weights all contribute; the norms don't.
  2. An activation probe. Running the residual stream at every layer and step through the model's own output head showed the stripe frequency. In SFT it starts in the top layers (37–41) and then builds up across sampling steps, because each step's striped output feeds the next.
  3. Bakeoff. Reverting layers 37–41 for every step was the best trade-off across five prompts. It removed more banding than a late-step-only revert and changed the image less than Kijai's LoRA. Adding 32–36 cleans the stubborn cases (the fjord sky, wide images) at the cost of more change, so it ships as the separate extra fix.

Stripe energy by layer and sampling step

The stripe frequency inside the model, by layer (vertical) and sampling step (horizontal). In Full SFT (left) it builds up from about step 7 and spreads through every layer; it never starts with the fix or in Base.

The full write-up, with the ablation charts, probe figures, step-window tests, open questions and the tools to reproduce it all, is in ANALYSIS.md. It uses an earlier banding score with a different scale (plain SFT about 20–120, lower is better); the ordering of setups is the same.

Limitations

  • Image size matters. At 768 px wide the main fix still leaves faint stripes on smooth skies, and at 1536 px and up SFT switches to wider stripes the main fix doesn't always catch. Quality+ handled every size tested. See Image size.
  • Small test set. Five prompts at one seed for the presets, two prompts for the size sweep. Seeds swing the banding score a lot, so treat small differences in the table as noise.
  • The banding score is a guide, not ground truth. Fine grain and real vertical patterns raise it. When in doubt, check the color views.
  • Not pixel-identical to an exact layer swap. ComfyUI's LoRA loader rounds the merged weights slightly differently, which changes fine details the way a nearby seed would. On average it scores the same.
  • ComfyUI format. The files use ComfyUI's full-difference (.diff) LoRA keys and have only been tested in ComfyUI.

Files

File Size Contents
moss_image_sft_banding_fix_L37-41_bf16.safetensors 1.13 GB Main fix: Base minus SFT weights for layers 37–41 (40 tensors, bf16, full rank)
moss_image_sft_banding_fix_L32-36_extra_bf16.safetensors 1.13 GB Extra fix for layers 32–36; stack it with the main fix for Quality+
moss_image_sft_banding_fix_L37-41_bf16_splitqkv.safetensors 1.13 GB The main fix with q/k/v split, for the split model (rapid-moss workflow)
split_qkv/moss_image_sft_bf16_split_qkv.safetensors 10.2 GB The official MOSS-Image-SFT transformer as one file with q/k/v separate (rapid-moss workflow only)
workflows/*.json The two preset workflows; *_api.json are API-format copies for scripting

SHA-256:

  • main fix 01329abd340dd9cf55677381a11558fe5307c7fd648f1988b441172fbbd86fd5
  • extra 32–36 7f6e43c7566b0c04ad9772cf3efdf9da973b65e242d1a384b17e8db91a6337cd
  • main fix, split q/k/v 34b29f56c168f33a50624a5b9728cae4026db43b88b46b381a739926921bc882
  • split SFT model 0e5803a087c07cb4c7d8010a2d44153494a053706337edc7f76b455e9900b3a6

Credits

  • OpenMOSS for MOSS-Image Base and SFT (Apache-2.0), and Comfy-Org for the ComfyUI repack.
  • lodestones and darask0 for the 8-step DMD and 4-step adapters used in the speed and Turbo presets.
  • Kijai for the SFT-difference LoRAs, and a big thanks for pointing me in the right direction: Kijai's note that the SFT causes the banding in the later blocks, fixable with negative strength, is where this investigation started.
Downloads last month

-

Downloads are not tracked for this model. How to track
Inference Providers NEW
This model isn't deployed by any Inference Provider. 🙋 Ask for provider support

Model tree for MATLOWAI/MOSS-Image-SFT-DeBand

Adapter
(3)
this model