⭐ Star FP16 Unet Converter
Dequantizing It Back to fp16
- status
Most model files you download these days are not what they claim to be at the bit level. An "fp8" Flux or Qwen checkpoint isn't a different model - it's the same weights stored in 8 bits, with a little bookkeeping metadata that tells the loader how to scale them back up. fp8 is the settled default for large diffusion transformers: half the VRAM of fp16 at near-zero quality cost, which is why "just use it" is the standard advice.
⭐ Star FP16 Unet Converter is the node for going the other way. It reads a quantized diffusion_models file, unpacks the quantization back into plain weights, and writes a fresh fp16 safetensors next to the original. It doesn't sample, it doesn't load anything into your graph, and it doesn't touch your image pipeline. You run it once, restart, and you have a second model file.
Let's be clear about what it does not do, because this is where people get their hopes up: it does not restore lost quality. fp8 → fp16 is an upcast of already-quantized values, so whatever tiny error the 8-bit cast baked in stays baked in. The real reasons to reach for it are compatibility and control. Some non-ComfyUI loaders choke on the comfy_quant/scaled_fp8 metadata markers. Some setups have a broken fp8 path, or you want a plain file you can hand to another tool, or you want to archiving something that will still load in three years. If your card happily runs the original fp8 file, converting it buys you nothing but disk space gone.
What you feed it
Two inputs, both plain widgets. model_name is the same dropdown list you see in the UNET/Model loader - it comes straight from your ComfyUI/models/diffusion_models folder, so the quantized file has to be sitting there first. device picks where the dequantization math happens: CPU (the default, low memory footprint) or GPU (faster, but it needs a working CUDA device and it will briefly push tensors onto the card).
There's one output, status, a STRING. Don't ignore it - it's the entire report: where the new file was written, old and new file sizes, how many layers were dequantized, how many tensors were converted, and which compute device was used. When something goes wrong, the error comes back through this string rather than as a crash.
How the conversion actually works
Under the hood it loads the whole state dict with ComfyUI's own load_torch_file, quantization metadata included. It then finds every quantized layer two ways: from the model's _quantization_metadata entry and from per-layer .comfy_quant marker tensors, which it strips out. Each layer's weight gets multiplied by its stored weight_scale in fp32 and cast to fp16 - on CPU by default, or on the GPU if you asked for it. Supported formats are fp8 (float8_e4m3fn, float8_e5m2) and int8_tensorwise.
Then it sweeps every remaining tensor, casts floats to fp16, and deletes all the quant bookkeeping keys - .input_scale, .pre_quant_scale, .weight_scale_2, scaled_fp8 and friends. The result is saved as <original name>_FP16.safetensors in the same folder, with the non-quantization metadata preserved.
Two guards worth knowing. If the output file already exists, the node refuses to run and tells you so - no silent overwrite, but also no re-conversion until you rename or delete it. And if a layer uses rotated quantization (convrot), the node aborts entirely rather than write a broken file. That's a real limitation, not a bug: it can't dequantize those layers to fp16, so the file stays on the fp8 path.
Installing it
Same pack, same steps as everything else in StarNodes.
ComfyUI Manager: open it, search Starnodes, click Install, restart.
Manual:
cd ComfyUI/custom_nodes
git clone https://github.com/Starnodes2024/ComfyUI_StarNodes
cd ComfyUI_StarNodes
pip install -r requirements.txt
That requirements.txt covers the whole 100-plus-node pack (psd-tools, opencv-python, imageio-ffmpeg, ollama and so on). This particular node needs none of those extras - just torch and safetensors, which you already have. StarNodes also loads defensively: a missing dependency skips the affected node and prints what to install, rather than taking the whole pack down.
Where people get burned
The node won't do anything when you queue the prompt. It's not an output node - nothing displays, nothing gets saved to your output folder - so ComfyUI will skip it unless its status output goes somewhere. Wire status into a Show Text / preview node (the pack has ⭐ Star Show Everything for exactly this) and then run the graph.
Your disk. fp16 is double the size of fp8. A 12B model file is roughly 24GB before you start feeling clever. Check free space first.
Your RAM. In CPU mode the whole model sits in system memory while it works. On a 20B model you want the machine otherwise idle; this is not a thing to run while a video render is going.
The new file doesn't show up in the loader. The status string says it: restart ComfyUI, or press r in the model dropdown to refresh the list. You don't need a restart if you just refresh.
"Output file already exists, nothing was converted." Working as intended. Rename or delete the _FP16 file if you actually want to redo it.
Inputs (2)
| Name | Type | Default | Description |
|---|---|---|---|
| model_name | COMBO | 0 options: | |
| device | COMBO | CPU | 2 options: CPU, GPU |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| status | STRING | — |