Model Scale Z-Image
Per-block dials on the 6B model that became SDXL's successor
- model
- MODEL
Z-Image is the 6B model that put near-Flux quality on a 12GB card and, by 2026, became the community's default for local photorealism - Apache 2.0, a Qwen3-4B text encoder, and an S3-DiT backbone. Model Scale Z-Image is this pack's per-block weight-scaling node for that backbone: feed it a loaded Z-Image model and it hands you a dial for every major component, letting you scale a block's weights from 0 (zeroed) to 2.0 (doubled).
Let's be plain about what this is: a research and experimentation tool for people who want to understand which parts of a DiT do what, or who like the kind of model surgery that SDXL's merge culture made famous. If you just want good Z-Image pictures, this node is not for you - leave it installed and ignore it, the model is excellent with zero intervention.
What the widgets map to
Z-Image's architecture is a single-stream diffusion transformer, and the widget list mirrors it directly. The names are the model's own key names:
t_embedder.andx_embedder.- the time and input-patch embeddingscap_embedder.pluscap_pad_token- the caption embedding pathcontext_refiner.0./context_refiner.1.- the text-context refinement blockslayers.0.throughlayers.29.- the 30 main transformer blocks, the meat of the modelnoise_refiner.0./noise_refiner.1.- the noise/refiner stagesfinal_layer.andx_pad_token- the output head
Each defaults to 1.0 and runs 0.0–2.0. The pack matches every weight to the longest matching prefix, so a dial on layers.12. touches only block 12, and a value of 1.0 is skipped entirely - untouched weights pass through unchanged.
How it works (and why it's light)
This one is different from the pack's VAE nodes. Instead of materializing a whole new model, it clones the model patcher and applies weight patches: for each layer you've changed, it registers weight × scale as a patch on the patcher, which ComfyUI folds in at sampling time. No full state-dict rebuild, no big memory spike - just a patched model. The single MODEL output wires straight into a KSampler's model socket like any other model.
The honest warnings
Zeroing or doubling arbitrary blocks of a trained model is a fast way to break it - expect garbage, black output, or weird artifacts as a first result, not insight. The productive approach is scientific: change one dial at a time, small steps around 1.0 (0.9, 1.1), and actually look at what changes. If you want a map of which keys exist before you start, the pack's Key Name Inspector prints the model's full key list to the console - it's the right first node to drop in. And remember Z-Image shares the Flux 1 VAE, so if output looks structurally broken at scale 1.0, check your VAE wiring before you blame the dials.
Installing it
Part of the easygoing0114/ComfyUI-easygoing-nodes pack. ComfyUI Manager → search Easygoing, or:
cd ComfyUI/custom_nodes
git clone https://github.com/easygoing0114/ComfyUI-easygoing-nodes.git
Restart. No model downloads (you still load Z-Image yourself with a normal loader) and no extra dependencies. The pack is written against the V3 node API, so it needs a current ComfyUI build; on an old one the nodes won't register at all.
This is deep tinkering territory. But if you've ever wanted to know what a specific transformer block in Z-Image actually contributes, this is the cleanest way to find out.
Inputs (41)
| Name | Type | Default | Description |
|---|---|---|---|
| model | MODEL | — | |
| cap_embedder. | FLOAT | 1.000–2 | — |
| cap_pad_token | FLOAT | 1.000–2 | — |
| context_refiner.0. | FLOAT | 1.000–2 | — |
| context_refiner.1. | FLOAT | 1.000–2 | — |
| layers.0. | FLOAT | 1.000–2 | — |
| layers.1. | FLOAT | 1.000–2 | — |
| layers.2. | FLOAT | 1.000–2 | — |
| layers.3. | FLOAT | 1.000–2 | — |
| layers.4. | FLOAT | 1.000–2 | — |
| layers.5. | FLOAT | 1.000–2 | — |
| layers.6. | FLOAT | 1.000–2 | — |
| layers.7. | FLOAT | 1.000–2 | — |
| layers.8. | FLOAT | 1.000–2 | — |
| layers.9. | FLOAT | 1.000–2 | — |
| layers.10. | FLOAT | 1.000–2 | — |
| layers.11. | FLOAT | 1.000–2 | — |
| layers.12. | FLOAT | 1.000–2 | — |
| layers.13. | FLOAT | 1.000–2 | — |
| layers.14. | FLOAT | 1.000–2 | — |
| layers.15. | FLOAT | 1.000–2 | — |
| layers.16. | FLOAT | 1.000–2 | — |
| layers.17. | FLOAT | 1.000–2 | — |
| layers.18. | FLOAT | 1.000–2 | — |
| layers.19. | FLOAT | 1.000–2 | — |
| layers.20. | FLOAT | 1.000–2 | — |
| layers.21. | FLOAT | 1.000–2 | — |
| layers.22. | FLOAT | 1.000–2 | — |
| layers.23. | FLOAT | 1.000–2 | — |
| layers.24. | FLOAT | 1.000–2 | — |
| layers.25. | FLOAT | 1.000–2 | — |
| layers.26. | FLOAT | 1.000–2 | — |
| layers.27. | FLOAT | 1.000–2 | — |
| layers.28. | FLOAT | 1.000–2 | — |
| layers.29. | FLOAT | 1.000–2 | — |
| noise_refiner.0. | FLOAT | 1.000–2 | — |
| noise_refiner.1. | FLOAT | 1.000–2 | — |
| final_layer. | FLOAT | 1.000–2 | — |
| t_embedder. | FLOAT | 1.000–2 | — |
| x_embedder. | FLOAT | 1.000–2 | — |
| x_pad_token | FLOAT | 1.000–2 | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| MODEL | MODEL | — |