CMK Z-Image Turbo Loader -Pipe-
Three files, one pipe, and a cache that saves you 20GB of reloading
- PROCESS
- LOG
- MODEL
- LOG
Z-Image Turbo is the model the local community actually settled on for photorealism in 2026 - 6.15B parameters, Apache 2.0, uncensored, and small enough to run on the 12GB cards most people own. Three files make it work, and this node is the CMK way of loading all three as one model pipe.
It's CMK/Developer/Pipe/Load, so it's the pipe-ecosystem loader rather than a Toolbox toy. Inside the guided flow it's the thing that comes before the sampler; standalone, it's still the cleanest way to get a ZIT model context if you want to use CMK's post-process modules afterwards.
What it loads, and how
Under the hood it's ComfyUI Core doing the work, called for you:
- the diffusion model through core
UNETLoaderwith the chosen weight dtype, - the text encoder through core
CLIPLoaderwith typelumina2, - the VAE through core
VAELoader.
Useful thing to know about that second one: Z-Image's text encoder is not CLIP at all, it's Qwen3-4B, a real language model, which is why the model handles instructions instead of tag soup and why the loader has a clip_device option at all. That encoder is the single biggest chunk of your VRAM budget on a small card, and pushing it to CPU is the standard escape hatch - slower per run, but it stops the encoder and the UNet fighting for the same memory.
The defaults are the officially-named files, so if you've downloaded them in the usual place you can leave the dropdowns alone:
diffusion_model→z_image_turbo_bf16.safetensors(frommodels/diffusion_models)text_encoder→qwen_3_4b.safetensors(frommodels/text_encoders)vae→ae.safetensors(frommodels/vae)
Each dropdown surfaces whatever ComfyUI actually finds in that folder, with the expected filename promoted to the top if it's present.
The genuinely clever part is the resource cache. Because the node takes PROCESS as an input - and the process pipe carries prompt, seed and ControlNet settings - a naive implementation would reload ~20GB of weights every time you changed a prompt. It doesn't. The cache key is filenames plus weight_dtype plus clip_device, so process changes reuse the loaded set. It reports the state in its log block (MISS · LOADED, HIT · REUSED, or HIT · TEXT ENCODER REMATERIALIZED if something evicted just the encoder). When unload_models_after_use is set in the process pipe, switching resource sets releases the stale ones and clears the cache before loading the new set - the single most useful behaviour on a 12GB card.
weight_dtype gives you the fp8 options (fp8_e4m3fn, fp8_e4m3fn_fast, fp8_e5m2) alongside default. On a card that fits bf16, default is fine; fp8 is the lever when it doesn't.
Inputs and outputs
Required: PROCESS (CMK_PROCESS_Z_IMAGE) plus the three file dropdowns, then weight_dtype and clip_device (both marked advanced). Optional: LOG.
Outputs: MODEL (a CMK_MODEL_PIPE carrying model, clip, VAE and the family metadata) and LOG.
The family check is strict and worth quoting for the error you'll see: it raises "CMK Z-Image Turbo Loader requires PROCESS ZIT" if the process pipe isn't ZIT. And if the process says the family is inactive, both outputs come back blocked instead - so a ZIT loader parked in a HYBRID graph costs nothing when SDXL is the live family.
Install
Manager → search CMK Flow → install → restart. Manual:
cd ComfyUI/custom_nodes
git clone https://github.com/CMKFlow/cmk_nodes
python3 custom_nodes/cmk_nodes/scripts/install_cmk_requirements.py
python3 custom_nodes/cmk_nodes/scripts/check_cmk_resources.py --models-root "/path/to/shared/models"
Models are not part of the Python package - that's deliberate, and it's why the resource checker exists. It looks for the specific filenames the shipped workflows use, prints each as FOUND or MISSING, and offers to download missing ones with explicit confirmation and SHA-256 checks where a reference version is pinned. Run it before you start blaming the node:
python3 custom_nodes/cmk_nodes/scripts/check_cmk_resources.py --models-root "/path/to/ComfyUI-shared"
Common issues
- "ComfyUI Core did not return model, text encoder and VAE." One of the three filenames isn't resolvable in its folder. Check the exact names - a renamed file breaks the default selection even if the weights are fine.
- OOM at load on a 12GB card. Set
weight_dtypeto an fp8 option, or move the text encoder withclip_device = cpu. Bigger runs also benefit from the process pipe's unload-after-use behaviour. - Repeated multi-second stalls between runs. You're switching resource sets back and forth (two different dtypes in parallel branches, say). Each switch deliberately drops the previous cache.
- Z-Image looks over-cooked and slow. Guidance-distilled models want CFG 1; raising CFG on Turbo doesn't increase prompt adherence, it burns the image and roughly doubles the work. That's a sampler setting, not this node - but it's the most common ZIT mistake and it gets blamed on loaders.
Inputs (7)
| Name | Type | Default | Description |
|---|---|---|---|
| PROCESS | CMK_PROCESS_Z_IMAGE | — | |
| diffusion_model | COMBO | z_image_turbo_bf16.safetensors | 1 options: z_image_turbo_bf16.safetensors |
| text_encoder | COMBO | qwen_3_4b.safetensors | 1 options: qwen_3_4b.safetensors |
| vae | COMBO | ae.safetensors | 1 options: ae.safetensors |
| weight_dtype | COMBO | default | 4 options: default, fp8_e4m3fn, fp8_e4m3fn_fast, fp8_e5m2 |
| clip_device | COMBO | default | 2 options: default, cpu |
| LOGopt | CMK_LOG_PIPE | — |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| MODEL | CMK_MODEL_PIPE | — |
| LOG | CMK_LOG_PIPE | — |