GGUF Checkpoint Converter π
Make your own quantized model files (and when it's not worth it)
- output_path
- report
Every other GGUF node in OmniNodes reads quantized files. This one writes them: it takes any checkpoint ComfyUI can load - safetensors, ckpt, whatever comfy.utils.load_torch_file handles - and re-emits it as a real .gguf file, quantized from Q4_0 up through Q8_0, or kept plain as F16/F32. It's the pack's make-your-own-GGUF corner, and it uses the gguf package's own GGML block-quantization code, not some custom scheme only this pack understands. A file it produces will round-trip through the pack's own loaders and any other GGUF-aware tool (ComfyUI-GGUF, llama.cpp).
Let me be straight about when you'd bother, though. GGUF came to ComfyUI in the Flux era because 12B-parameter DiTs don't fit consumer cards at fp16, and the community already keeps pre-quantized conversions of basically every popular model - city96 and bullerwins host most of them on HuggingFace. Downloading is cheaper than converting, every time. You'd reach for this node in two narrower cases: you're exporting one component of a big checkpoint (say, just the UNet out of a Flux file that also bundles text encoders) for a friend on a low-VRAM card, or you want a specific quant level that nobody happens to have posted.
How it works
Under the hood it's a tensor-by-tensor pass. The node loads the source into a state dict, walks every tensor, and calls gguf.quants.quantize to produce real GGML block types, then writes the file with gguf.GGUFWriter. The one structural constraint: block quant types (Q4_0/Q4_1/Q5_0/Q5_1/Q8_0) need each tensor's last dimension divisible by 32. Small 1-D bias/norm vectors usually don't satisfy that - so instead of dropping them (which would leave you with an unloadable, incomplete model), the node quietly keeps those at F16 and tells you how many fell back in the report output. The output file is always complete.
What you won't find in quant_type is any K-quant - no Q4_K_M, no Q5_K. That's deliberate: faithful K-quant conversion needs an importance-matrix-aware pipeline, and a single generic tensor pass can't do it honestly, so the author left them out rather than silently ship worse files. Fair enough, but it matters for you: the Q4_K_M that the community treats as the 12GB sweet spot isn't producible here. You're limited to the block types plus F16/F32.
The inputs and outputs that matter
source_name- dropdown of checkpoints/diffusion models/UNets/CLIPs/VAEs ComfyUI already sees. Not finding your file? That's whatpath_overrideis for.quant_type- default Q8_0, and that's a good default. Q8 is effectively fp16 at half the file size; it's the "if it fits, just use it" tier.output_filename- defaults toconverted_model.gguf; the file lands in ComfyUI's output directory (or wherever you point an absolute path).key_filter(optional) - keep only tensors whose names contain this substring.model.diffusion_model.exports just the UNet from a bundled checkpoint. This is arguably the node's most useful trick.architecture_name(optional) - thegeneral.architecturetag written into the file. Leave it unless you know the target expects a specific one.
Both outputs are strings: output_path tells you where the file went, and report gives you the counts - how many tensors were actually quantized, how many fell back to F16, how many errored.
Installing
OmniNodes is a big multi-category pack from TensorVizion, and this GGUF section is its newest corner (added September 2026). Install the pack once, then give it its one extra dependency:
cd ComfyUI/custom_nodes/
git clone https://github.com/TensorVizion/OmniNodes
cd OmniNodes
pip install -r requirements.txt # installs gguf, among others
Then restart ComfyUI. The node lives under TensorVizion/GGUF in the search menu. If you prefer, ComfyUI Manager can install it by searching "OmniNodes" - just remember the pip install gguf step either way; it's not bundled with ComfyUI. Every GGUF node checks for it and returns a clear error string instead of crashing if it's missing.
Honest gotchas
The biggest trap is expecting a benefit that never materializes. Converting a checkpoint with this node and then loading it back through OmniNodes' own GGUF loaders buys you nothing: those loaders fully dequantize to fp16 at load time, so you've spent a conversion for zero memory savings. Converting only pays off when the file is consumed by genuinely quantized-inference tooling (ComfyUI-GGUF) or shipped to someone who uses that. Also keep in mind the source checkpoint gets loaded whole into memory to convert - a 12B model needs the RAM to hold it. And if report shows a big fallback count or errors, read the first few - they name exactly which tensors skipped the quant treatment you asked for.
Inputs (6)
| Name | Type | Default | Description |
|---|---|---|---|
| source_name | COMBO | 1 options: <none found in model folders β use path_override> | |
| quant_type | COMBO | Q8_0 | 7 options: F16, F32, Q8_0, Q5_1, Q5_0, Q4_1, +1 |
| output_filename | STRING | converted_model.gguf | β |
| path_overrideopt | STRING | β | |
| key_filteropt | STRING | β | |
| architecture_nameopt | STRING | comfyui-export | β |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| output_path | STRING | β |
| report | STRING | β |