Nodes/ComfyUI-easygoing-nodes/Model Scale Z-Image
ComfyUI Node

Model Scale Z-Image

Per-block dials on the 6B model that became SDXL's successor

By easygoing0114·Created about a year ago·Updated 6 days ago· 9
Model Scale Z-Image
  • model
  • MODEL
◄cap_embedder1.00►
◄cap_pad_token1.00►
◄context_refiner.01.00►
◄context_refiner.11.00►
◄layers.01.00►
◄layers.11.00►
◄layers.21.00►
◄layers.31.00►
◄layers.41.00►
◄layers.51.00►
◄layers.61.00►
◄layers.71.00►
◄layers.81.00►
◄layers.91.00►
◄layers.101.00►
◄layers.111.00►
◄layers.121.00►
◄layers.131.00►
◄layers.141.00►
◄layers.151.00►
◄layers.161.00►
◄layers.171.00►
◄layers.181.00►
◄layers.191.00►
◄layers.201.00►
◄layers.211.00►
◄layers.221.00►
◄layers.231.00►
◄layers.241.00►
◄layers.251.00►
◄layers.261.00►
◄layers.271.00►
◄layers.281.00►
◄layers.291.00►
◄noise_refiner.01.00►
◄noise_refiner.11.00►
◄final_layer1.00►
◄t_embedder1.00►
◄x_embedder1.00►
◄x_pad_token1.00►

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. and x_embedder. - the time and input-patch embeddings
  • cap_embedder. plus cap_pad_token - the caption embedding path
  • context_refiner.0. / context_refiner.1. - the text-context refinement blocks
  • layers.0. through layers.29. - the 30 main transformer blocks, the meat of the model
  • noise_refiner.0. / noise_refiner.1. - the noise/refiner stages
  • final_layer. and x_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.

Categoryadvanced/model_merging/model_specific

Inputs (41)

NameTypeDefaultDescription
modelMODEL—
cap_embedderFLOAT1.000–2—
cap_pad_tokenFLOAT1.000–2—
context_refiner.0FLOAT1.000–2—
context_refiner.1FLOAT1.000–2—
layers.0FLOAT1.000–2—
layers.1FLOAT1.000–2—
layers.2FLOAT1.000–2—
layers.3FLOAT1.000–2—
layers.4FLOAT1.000–2—
layers.5FLOAT1.000–2—
layers.6FLOAT1.000–2—
layers.7FLOAT1.000–2—
layers.8FLOAT1.000–2—
layers.9FLOAT1.000–2—
layers.10FLOAT1.000–2—
layers.11FLOAT1.000–2—
layers.12FLOAT1.000–2—
layers.13FLOAT1.000–2—
layers.14FLOAT1.000–2—
layers.15FLOAT1.000–2—
layers.16FLOAT1.000–2—
layers.17FLOAT1.000–2—
layers.18FLOAT1.000–2—
layers.19FLOAT1.000–2—
layers.20FLOAT1.000–2—
layers.21FLOAT1.000–2—
layers.22FLOAT1.000–2—
layers.23FLOAT1.000–2—
layers.24FLOAT1.000–2—
layers.25FLOAT1.000–2—
layers.26FLOAT1.000–2—
layers.27FLOAT1.000–2—
layers.28FLOAT1.000–2—
layers.29FLOAT1.000–2—
noise_refiner.0FLOAT1.000–2—
noise_refiner.1FLOAT1.000–2—
final_layerFLOAT1.000–2—
t_embedderFLOAT1.000–2—
x_embedderFLOAT1.000–2—
x_pad_tokenFLOAT1.000–2—

Outputs (1)

NameTypeDescription
MODELMODEL—