CivArchive
    ← All articles
    Published November 4, 2026by lepetitprince716355

    MOSS Image in ComfyUI: 9.3 s down to 4.35 s per image on an RTX 5080, and what the speed costs

    75 views0 reactions0 comments on CivitAI0 collected
    generation guideoptimizationworkflowmoss imagecomfyui

    TL;DR

    Test setup unless noted: RTX 5080 16 GB, ComfyUI 0.42.1, int8 DiT (moss_image_sft_int8_convrot), w4a8 text encoder (qwen3.5_9b_w4a8_gptq) in the graph, flux2-vae_small, about 1 MP, warm.

    • Our default: 25 steps, CFG 2.5, er_sde / simple, shift 5. 9.3 s.

    • Fast option: two samplers on one 12-step grid. 4.35 s warm, 5.6 s cold.

    Stage 1: KSamplerAdvanced
      model: UNETLoader > ModelSamplingAuraFlow (shift 5)
      add_noise enable, steps 12, cfg 2.5, er_sde, normal
      start_at_step 0, end_at_step 4
      return_with_leftover_noise enable
    
    Stage 2: KSamplerAdvanced, latent from stage 1
      model: UNETLoader > LoraLoaderModelOnly (TurboLoRA, 1.0)
             > ModelSamplingAuraFlow (shift 5)
      add_noise disable, steps 12, cfg 1, euler, normal
      start_at_step 4, end_at_step 12
      return_with_leftover_noise disable
    
    Both stages: same positive, negative and noise_seed.
    • The LoRA is DiffSynth-Studio's MOSS-Image-SFT-TurboLoRA. As published, ComfyUI maps 0 of its 524 keys. The fix is below.

    • We did not make this graph our default. Side by side, we found the 25-step images more natural. Hands and new small artifacts did not pass our review, and we picked it on one test set. Other seeds and prompts are untested.

    Timings

    Test set: 19 prompts, 2 seeds each, 38 cells, about 1 MP. "Hybrid 4 + 8" means 4 base steps, then 8 LoRA steps.

    Setup                                Steps  CFG          Warm s
    -----------------------------------  -----  -----------  ------
    Base, euler / normal                 50     2.5          17.75
    Base, er_sde / simple (our default)  25     2.5          9.3
    Hybrid 8 + 4                         12     2.5, then 1  5.01
    Hybrid 6 + 6                         12     2.5, then 1  4.68
    Hybrid 4 + 8                         12     2.5, then 1  4.35
    TurboLoRA alone, euler / normal      16     1            3.6
    TurboLoRA alone, euler / normal      8      1            2.20

    You can estimate your own split. One model pass took about 0.175 s at this size. CFG above 1 makes two passes per step, CFG 1 makes one. Add about 0.8 s fixed and about 0.7 s for the switch from base to LoRA. Hybrid 4 + 8 is 16 passes, which predicts 4.3 s.

    Tone against the 25-step default, as saturation / contrast in percent:

    Setup                      Anime scenes (8 prompts)  Painted media (5)  Anime, hand-focused (6)
    -------------------------  ------------------------  -----------------  -----------------------
    Base, 50 steps             +2.6 / -3.0               +9.7 / -2.8        +7.4 / +0.2
    Hybrid 8 + 4               +0.7 / -6.5               +1.3 / -0.5        -1.3 / -1.0
    Hybrid 6 + 6               -0.4 / -6.3               +1.4 / +1.2        -2.5 / -0.1
    Hybrid 4 + 8               -1.9 / -6.8               +3.2 / +2.8        -0.9 / +0.3
    TurboLoRA alone, 16 steps  -15.3 / +0.5              +13.1 / +7.1       -7.1 / -3.3

    TurboLoRA alone is faster, but it fully kept the medium in only 2 of 6 painted cells at 16 steps and 0 of 6 at 8 steps. The 25-step default kept all 6. At 8 steps we also saw an extra hand, a broken face and ink blots.

    Why the first four steps do the work

    The first steps set composition and palette. Running them on the base model with real CFG moves the look back toward the default, and the tail matters much less after that.

    Two controls support this:

    • Head sampler: with an Euler head instead of er_sde, saturation on the painted prompts was +10.8 % instead of +2.1 %. That run used a test LoRA of ours in the tail.

    • Tail LoRA: we trained that LoRA for 200 iterations and compared it with the untrained TurboLoRA in a blind test on 17 full-resolution cells, with one reviewer. Hands came out 2 to 2 with 13 ties, and overall 16 ties and 1 win for the TurboLoRA. The mean pixel difference was 5.2 of 255.

    Other few-step LoRAs did not help in the tail. lodestones SFT DMD at 0.7, Kromoss DMD2 at 1.0 and akhaliq 4-step at 1.0 pushed anime-scene saturation to between +14.1 and +20.5 %, and none was crisper.

    What it costs

    Tone and painted media held up about at the default level. The rest fell short.

    • Naturalness: side by side, we preferred the 25-step images.

    • Same seed, different image: poses shift, so this is not a faster copy of the 25-step render.

    • Hands fall short of the 25-step default: crowded hands with an unclear lump, a needle reduced to a short piece, a vague hand.

    • New small artifacts: pseudo-text plaques, faint rings on window glass, a hole in an orange.

    • Softness: high-pass detail was 11.69 against 13.08 for the default. This is a whole-image statistic and compositions differ, so treat it as a lead. Longer heads brought tone closer but barely changed softness.

    • Lower highlights: 15 to 22 % lower in the two images we measured. Black level is unchanged, so images look darker, not hazy.

    • Test scope: we chose this graph on the same 38 cells that scored it, one sample per cell. Other seeds and prompts are untested.

    The hand, artifact and highlight notes come from reviewing the variant with our own LoRA, which was nearly the same image. They stayed with the TurboLoRA.

    Check hands on full-resolution crops. When we trained our LoRA further, tone improved while hands got worse. At 300 iterations the crops showed a lumpy mug and a black hole in an orange. No checkpoint from 50 to 300 beat the untrained TurboLoRA on hands in the four crops we read. That is four cells on one seed, so it is a reading, not a measurement.

    Make the TurboLoRA load

    The file is model-8steps.safetensors, about 621 MB. Its keys start with layers.N..., but ComfyUI 0.42.1 only maps MOSS Image LoRA keys under diffusion_model.. We ran its key map against the file: 0 of 524 keys mapped, so the LoRA would do nothing. With the prefix added, all 524 map.

    Run this with ComfyUI's own Python. It writes a new file and leaves the original alone:

    from safetensors import safe_open
    from safetensors.torch import save_file
    
    src = "model-8steps.safetensors"
    dst = "moss_turbolora_comfy.safetensors"
    
    with safe_open(src, framework="pt") as f:
        meta = f.metadata()
        tensors = {"diffusion_model." + k: f.get_tensor(k) for k in f.keys()}
    
    save_file(tensors, dst, metadata=meta)
    print(len(tensors), "tensors written")

    Expect 524. Put the new file in your loras folder and load it with LoraLoaderModelOnly.

    Other settings we measured

    Change                                                           Result
    ---------------------------------------------------------------  ----------------------------------------------------
    int8 DiT against BF16 DiT (exact attention), both on UNETLoader  0.325 against 1.010 s per step
    Exact attention on int8                                          0.409 s per step, 26 % slower, no closer to FP32
    BF16 text encoder instead of w4a8                                +0.6 s warm, +2.7 s cold
    1024x1536 instead of 1024x1024                                   1.61x per step, 13.57 against 8.53 s (cached prompt)
    50 steps instead of 25                                           linear, 16.84 against 8.53 s (cached prompt)
    Sage on an FP16 file through UNETLoader                          8.5 % faster per step, 1.7x the distance from FP32
    • Add no attention node on int8. The file stores its own INT8 attention in all 42 image blocks, so the global Sage flag barely reaches it.

    • The w4a8 encoder moves the picture about as far as the int8 DiT does. Whether BF16 looks better is your call.

    • At CFG 1, ComfyUI skips the unconditional pass, so the negative prompt has no effect. In the hybrid it acts only during the four head steps.

    • One public report of washed-out images under Sage on an RTX 3090 did not reproduce on our 5080: saturation and contrast stayed within 1 %. The 3090 itself is untested.

    img2img: set steps to the tail

    At denoise below 1, KSampler samples the last steps of an int(steps / denoise) schedule. With steps 25 and denoise 0.35, you resample the same noise range on a finer grid. Set steps to ceil(25 x denoise) instead.

    Pass                                 25 steps  Tail steps        Tail + EasyCache
    -----------------------------------  --------  ----------------  ----------------
    Upscale, denoise 0.35, about 2.1 MP  20.9 s    8.8 s (9 steps)   6.2 s
    Vary, denoise 0.35, about 1 MP       9.3 s     4.0 s (9 steps)   3.0 s
    Vary, denoise 0.6, about 1 MP        9.3 s     6.0 s (15 steps)  not run

    We saw no visible change on crops. The tail steps are now our default. EasyCache goes after ModelSamplingAuraFlow with reuse_threshold 0.2, start_percent 0.15 and end_percent 0.95. It was one round of three images, so we keep it optional.

    On a 16 GB RTX 4060 Ti

    BF16 DiT through UNETLoader, LoraLoaderModelOnly, BF16 encoder, 832x1248, with --fast fp16_accumulation --use-sage-attention:

    Steps      Warm s
    ---------  ------------------
    25         63 to 66 (86 cold)
    16         22
    8 (CFG 1)  12
    4          8

    On the one FP16 graph we ran on both cards, the 4060 Ti took 2.9 to 3.0 times as long as the 5080. The int8 path and the hybrid graph are untested on this card.

    If every render turns to noise

    MOSS can break silently. One of our ComfyUI services, after running for days, began rendering every MOSS graph as a colorful noise mosaic. With or without a LoRA, int8 or BF16, all of it was noise. Other model families stayed clean. The log showed no warning and no file had changed. We lost hours suspecting a LoRA.

    • Before blaming a LoRA, replay a graph and seed that rendered clean earlier. ComfyUI's history has the old graph.

    • If that is noise too, restart the service. Ours came back pixel-identical on the same graph and seed.

    • We never found the cause, so it can recur. Our evaluation jobs now include a known-good control render and fail if it drifts.

    Links

    If you run this on another card or with other seeds, your timings would help: the hybrid is only tested on the set above.

    Two of our MOSS Image style LoRAs, if you want something to test with:

    The cover is a 25-step default render with a style LoRA, not a hybrid render.

    Archived from CivitAI · Updated November 4, 2026View source