Two workflows for picking the best checkpoint of a LoRA training run.
1. The compare (mbl9-moss-sft-v1-lora-compare-v7.json) renders every checkpoint, plus the bare model, on four prompts with one seed. It saves one labeled contact sheet per prompt, and tile 0 of every sheet is a real training image, so every checkpoint is judged against the training data, not against the other tiles.
Replay: that training image's own caption. The closest tile to tile 0 has the best likeness.
Likeness: a plain portrait.
Stress: everything the dataset lacks: bright clothes, a crowd, a laugh, off-center framing, a second person, a sign with exact text.
Style: a watercolor. An overcooked LoRA pulls it back into a photo or into its training wardrobe.
Each checkpoint is its own group. Mute any of them in Checkpoints (mute) and it drops out of the sheets.
2. The head-to-head (mbl9-finalists-head-to-head-v7.json) settles it. The finalists render 3 more training captions plus 2 everyday prompts on 3 seeds, each row next to a training image. One seed can crown the wrong checkpoint: in my test run the one-seed winner scored 0 of 15 here.
Both files are built for the synthetic example character from my article (Moss/mbl9_moss_sft_v1/, 12 checkpoints). Build your own with build_moss_lora_compare.py and build_head_to_head.py from the lora-picker-kit folder in this download (set RUNS, PEOPLE and HEAD_TO_HEAD in config.py). See my article Picking the best LoRA checkpoint: judge it against your training images for the full routine: the AI review prompt, the circle script and the exact merge.
Files: the download holds both workflow JSONs and the lora-picker-kit scripts (builders, review prompt, circle script, exact merge, config.py). The two workflow pictures and the example sheet are the images on this page.
Custom Nodes
Models
moss_image_sft_int8_convrot.safetensors→models/diffusion_models/: https://huggingface.co/Comfy-Org/MOSS-Image/resolve/main/diffusion_models/moss_image_sft_int8_convrot.safetensorsqwen3.5_9b_w4a8_gptq.safetensors→models/text_encoders/: https://huggingface.co/Comfy-Org/MOSS-Image/resolve/main/text_encoders/qwen3.5_9b_w4a8_gptq.safetensorsflux2-vae_small.safetensors→models/vae/: https://huggingface.co/Comfy-Org/MOSS-Image/resolve/main/vae/flux2-vae_small.safetensors
Not downloadable, bring your own:
your training run's checkpoints, e.g.
Moss/mbl9_moss_sft_v1/(12 checkpoints)one training image with its caption
.txt, copied toinput/lora_compare/by the builder (tile 0)
First run
Each workflow has a bypassed Download models group. Turn it on in Toggle stages, queue once, then turn it off again. Files you already have are skipped. Civitai models and gated Hugging Face models need a token, set where ComfyUI starts (never in the workflow):
# Linux / macOS (~/.bashrc, ~/.zshrc or your start script)
export CIVITAI_API_KEY="your-civitai-key"
export HF_TOKEN="hf_your-token"
# Windows (Command Prompt once, then a new window)
setx CIVITAI_API_KEY "your-civitai-key"
setx HF_TOKEN "hf_your-token"Restart ComfyUI after setting them.
Example and workflow images
kiko-moss-lora-compare-example.png is the replay sheet from the compare: tile 0 is the training image, tile 1 the bare model, then steps 250 to 3000. Rendered with mbl9-moss-sft-v1-lora-compare-v7.json at its defaults (shown here as a JPEG).
The two -workflow.png files are pictures of the whole graphs, exported with ComfyUI-Custom-Scripts' Workflow Image → Export → png. They have the workflows embedded: drag one into ComfyUI to load it. Prompt boxes and image previews are page elements, so they show empty in the pictures.
Happy rendering! Kiko


