🍳 Cyberdelia Quantizer
Turn a dense FP16 checkpoint into ComfyUI-native INT8 ConvRot
- status
- output_path
Honestly, you don't need this node most days. Comfy Org and the community packers ship pre-quantized copies of every major model within days - download the INT8 ConvRot or FP8 file, done. The Cyberdelia Quantizer is for the gaps: a new architecture that only ships dense FP16/BF16, a fine-tune you trained yourself that nobody will pack for you, or a format the packs skipped (NVFP4, MXFP8, W4A8). Call it the first-48-hours node - and the one Forge Neo users reach for, for a reason we'll get to.
It's a converter, not a loader: feed it a full-precision .safetensors, get a new quantized one written beside it, then load that with your usual model loader nodes. Nothing in your generation graph changes.
How it works
Under the hood it's a deliberate re-implementation of the "Kitchen converter" lineage (the Tritant-style converters that drove ComfyUI's native quantization in 2026) - with meaningful differences. It reads the source one tensor at a time instead of loading a whole 24 GB BF16 checkpoint into RAM, converts each eligible Linear weight to your chosen format, writes to a temporary file, validates markers and header, then atomically renames it into place. Existing files are protected unless you flip overwrite on.
The load-bearing design choice is the metadata layout. Every quantized weight gets an explicit marker tensored right next to the exact physical layer name, prefix intact:
model.diffusion_model.blocks.0.attn.to_q.weight
model.diffusion_model.blocks.0.attn.to_q.weight_scale
model.diffusion_model.blocks.0.attn.to_q.comfy_quant
That prefix-never-stripped convention is why the file loads correctly in both ComfyUI and Forge Neo - the old central _quantization_metadata blob, keyed without that prefix, is what made Forge Neo mistake INT8 checkpoints for FP16 and choke on SingleStreamDiT keys. This node refuses to write the legacy layout and strips it from source metadata.
The format ladder
quant_format offers eight options; the honest read:
- FP8_E4M3 (and FP8_E5M2) - FP8 storage with a full-precision matmul. The quality-per-byte sweet spot where fp8 runs native; E5M2 trades mantissa for range and is niche.
- INT8 / INT8_CONVROT - per-channel INT8, accelerated on NVIDIA Turing or newer.
INT8_CONVROTis the default and the recommended broad pick: the format ComfyUI adopted natively in v0.27.0 and touted as "2x faster than fp16 and gguf on most 20/30/40/50-series GPUs." It's the fast path for 30-series owners, who get no fp8 acceleration. - INT4_CONVROT - packed 4-bit, smaller but profile-sensitive. Community tests show roughly FP8 quality with a real speed bump on some cards - and occasionally slower than INT8 on Turing, where the fast kernel doesn't land.
- NVFP4 / MXFP8 - the Blackwell-native options. They load anywhere, but elsewhere ComfyUI falls back to dequantized compute: file savings, no speed-up.
- W4A8_INT8 - grouped 4-bit weights with an INT8 runtime; wants a recent ComfyUI, Ampere or newer.
The model_profile decides which sensitive layers stay in their original dtype. Twenty profiles are included - Krea2 (the default), Z-Image, Anima, Flux 1/2 incl. Klein-9b, Qwen Image, Wan 2.2, LTX-2, ACE-Step, Boogu, Chroma, ERNIE, Ideogram 4, MiniMax H3, SeedVR - plus a conservative Generic (safe) fallback for anything unlisted. Pick the one matching your checkpoint: the profile keeps norms, biases and architecture-sensitive layers dense, and the Qwen 2512 profile even forces touchy weights to stay FP8 under a more aggressive format choice.
The rest are small but matter:
- model_name - dropdown populated from your
diffusion_modelsfolder. - output_filename - leave empty for the source name plus a format suffix; the file always lands beside the source.
- dry_run - plan and validate without writing a file. Use it first. Always.
- strict - defaults on: abort on a quantization error instead of silently leaving that layer dense. Off is for experimenting only.
- device -
autodoes the right thing;cudaorcpuforces the hand.
Outputs are status (a readable summary) and output_path (where the file landed), both strings.
Installing it
ComfyUI Manager: search Cyberdelia Quantizer and install, then restart. Or clone it:
cd ComfyUI/custom_nodes
git clone https://github.com/cyberdeliaAI/ComfyUI-Cyberdelia-Quantizer.git
There is no node-level pip install, and that's deliberate: the conversion calls ComfyUI's bundled quantization runtime (comfy.quant_ops - the "comfy-kitchen" stack), so Torch, safetensors and kitchen must match your host ComfyUI. You need a current ComfyUI (0.34+). Do not manually upgrade only comfy-kitchen and leave ComfyUI behind - the quantization contracts will disagree and you'll get confusing errors.
Where people get burned
- The source must be original dense FP16/BF16. The node rejects already-quantized inputs - GGUF, FP8, INT8, NVFP4 - with an explicit error rather than silently stacking a second lossy conversion. Don't fight it; that rejection is saving you.
- Wrong profile = weird output. A profile that doesn't match your architecture keeps more layers dense or, worse, lets
strictabort the whole run. If your status line is full of "kept dense" notes, check the profile first. - New release, no track record. This shipped v1.0.0 in September 2026, so there's no community war-story backlog yet. If something misbehaves, you're an early adopter - check the GitHub issues and report it. And always run
dry_run=truefirst: it costs nothing and shows you the plan before anything touches your model.
Inputs (8)
| Name | Type | Default | Description |
|---|---|---|---|
| model_name | COMBO | 0 options: | |
| output_filename | STRING | A filename only; output is written beside the source model. | |
| model_profile | COMBO | Krea2 | 20 options: Generic (safe), Krea2, Z-Image-Turbo, Z-Image-Base, Anima, Flux.1-dev, +14 |
| quant_format | COMBO | INT8_CONVROT | 8 options: FP8_E4M3, FP8_E5M2, NVFP4, MXFP8, INT8, INT8_CONVROT, +2 |
| device | COMBO | auto | 3 options: auto, cuda, cpu |
| strict | BOOLEAN | true | Abort on a quantization error instead of silently keeping that layer dense. |
| overwrite | BOOLEAN | false | — |
| dry_run | BOOLEAN | false | Plan and validate without writing a checkpoint. |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| status | STRING | — |
| output_path | STRING | — |