MOSS-Image SFT banding fix (layers 37β41)
The MOSS-Image SFT model often draws faint, evenly spaced vertical color stripes across smooth areas like skies, fog, backdrops and walls. This LoRA removes most of them while keeping the image very close to what SFT would have made.
It's an exact weight difference: it turns the SFT model's last five transformer layers (37β41) back into the Base model's weights, and leaves the other 37 layers and everything else untouched.
Usage (ComfyUI)
- Load the SFT model with Load Diffusion Model:
moss_image_sft_bf16.safetensorsfrom Comfy-Org/MOSS-Image. - Add LoraLoaderModelOnly with
moss_image_sft_banding_fix_L37-41_bf16.safetensorsat strength 1.0. - Keep the rest of your workflow as it is.
No custom nodes are needed. Strength 1.0 is the tested setting; lower values remove less banding.
Don't stack it with Kijai's blocks 21β49 LoRA at β0.5. That LoRA also covers layers 37β41, so stacking pushes those layers past Base. In testing it changed the image more without reliably removing more banding.
Related: Kijai's MOSS-Image LoRAs
Kijai/MOSS-image_experimental has the SFT-difference LoRAs this work builds on, and his README has the original β0.5 banding recipe:
moss_image_sft_lora_blocks_21_to_49_rank_512_bf16: his banding fix, applied to SFT at β0.5. It's the "Kijai" column below.moss_image_sft_lora_rank_256_bf16andmoss_image_sft_lora_rank_512_bf16: the full SFT difference as a LoRA, for applying the SFT look to the Base model at whatever strength you want. At +1 the rank-512 version reproduces SFT's banding as well (41.5 vs 41.0 on the goose bench).
His fix and this one take different routes. His subtracts half of the SFT change across layers 3, 4 and 21β41; this one fully reverts only layers 37β41. Pick by eye: the grids below show both on every test image.
Results
Same prompt, seed and settings in every column. Banding is the strength of the repeating vertical color stripe (lower is better; compare within a row). SFT similarity is SSIM against the Full SFT image (higher keeps more of the SFT look).
| Image | Full SFT banding | This fix: banding / SFT similarity | Kijai 21β49 @ β0.5 | Base model |
|---|---|---|---|---|
| Perfume bottle (768Γ1024) | 21.6 | 9.1 / 93.0% | 16.1 / 90.7% | 15.1 / 81.7% |
| Fjord sky (768Γ1024) | 39.5 | 32.7 / 90.1% | 30.8 / 88.2% | 5.6 / 77.7% |
| Goose (768Γ1024) | 122.1 | 16.0 / 69.4% | 23.0 / 50.7% | 15.8 / 45.4% |
| Fog forest (768Γ1024) | 76.8 | 14.4 / 85.5% | 32.8 / 81.0% | 7.4 / 59.0% |
| Oil still life (768Γ1024) | 54.9 | 17.5 / 89.5% | 21.3 / 85.4% | 10.4 / 60.5% |
| Goose (1024Γ1024) | 41.0 | 19.4 / 77.4% | 15.9 / 62.1% | 18.8 / 47.4% |
| Mean SFT similarity | 84.2% | 76.3% | 62.0% |
Settings: ER-SDE, 25 steps, CFG 3, Temporal Score Rescaling and skip-layer guidance (layers 22, 24) on, int8 Qwen3.5-9B text encoder, seed 11.
All six test images
These are every image tested, not a selection. Each grid shows Full SFT (top left), Base (top right), this fix (bottom left) and Kijai's 21β49 LoRA at β0.5 (bottom right), with the banding score and SFT similarity in each label. This fix keeps more of the SFT image every time; on banding alone, Kijai's LoRA scores lower on the fjord sky and the goose at 1024.
How the layers were found
- 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.
- 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.
- 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.
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.
Limitations
- Resolution matters. Banding is much stronger at smaller widths. At 768 px wide even this fix leaves some; in our tests SFT barely banded at 1280 px and above.
- Some images still band. On the fjord sky, every SFT-based fix stayed around 30; only the Base model was clean. That banding comes from somewhere other than layers 37β41.
- Small test set. Six images, mostly one seed, with the sampler settings above. Seeds swing the banding score a lot, so treat small differences in the table as noise.
- 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 file uses ComfyUI's full-difference (
.diff) LoRA keys and has only been tested in ComfyUI.
File
| File | Size | Contents |
|---|---|---|
moss_image_sft_banding_fix_L37-41_bf16.safetensors |
1.13 GB | Base minus SFT weights for layers 37β41 (40 tensors, bf16, full rank) |
SHA-256: 01329abd340dd9cf55677381a11558fe5307c7fd648f1988b441172fbbd86fd5
Credits
- OpenMOSS for MOSS-Image Base and SFT (Apache-2.0), and Comfy-Org for the ComfyUI repack.
- Kijai for the SFT-difference LoRAs, and a big thanks for pointing me in the right direction: his note that the SFT causes the banding in the later blocks, fixable with negative strength, is where this investigation started.
Model tree for MATLOWAI/MOSS-Image-SFT-banding-experimental
Base model
OpenMOSS-Team/MOSS-Image-Base











