Nodes/ComfyArt/ComfyArt Precise UNET Loader
ComfyUI Node

ComfyArt Precise UNET Loader

Your fp8 model came out as static? This loader skips ComfyUI's fast path

By jtydhr88·Created about a month ago·Updated a day ago· 522
ComfyArt Precise UNET Loader
    • MODEL
    ◄unet_name▾►

    You swapped in a shiny new fp8 checkpoint, hit Queue, and got grey noise or a black frame. Nothing else changed. If you launched ComfyUI with --fast fp8_matrix_mult and the model you just loaded is an unscaled fp8 file - qwen_image_2512_fp8_e4m3fn.safetensors is the obvious example - that flag is your culprit.

    The other way out is to delete the flag. Keep reading, because when you shouldn't delete it is the whole reason this node exists.

    What it actually does

    Here's the entire node, more or less:

    comfy.sd.load_diffusion_model(path, model_options={"custom_operations": comfy.ops.manual_cast})
    

    That's it. One input, one output, no dropdowns. It's ComfyUI's stock UNETLoader minus the clever part.

    The clever part being skipped: fp8 checkpoints usually ship with per-tensor scale factors baked in ("scaled" fp8). On a 40-series-or-newer card, ComfyUI can run the matrix multiply itself in fp8 and apply those scales afterward - that's the fast path fp8_matrix_mult turns on, and it is genuinely quicker. Unscaled fp8 files don't have the scales to apply. The fast path still runs, doesn't apply what isn't there, and what comes out is noise, not a slightly worse picture.

    Manual cast sidesteps it. Weights stay in the file's fp8 dtype, but each op upcasts to the compute dtype (bf16 on modern cards, fp16 on older ones) before doing the math. Correct results, no fp8 matmul, slower. ComfyUI prints this at load as model weight dtype torch.float8_e4m3fn, manual cast: torch.bfloat16 - which is also how you verify the node is doing its job: load through it, check the console line says manual cast: something rather than None.

    The trade is real. You lose the fp8 speedup, and Qwen 2512 is a 20B model, so "fp8-sized file, bf16-ish math" is precisely where people find out their card was only just big enough. If dropping the flag gets you correct images at acceptable speed, drop the flag. This node is for people who want --fast fp8_matrix_mult for everything else and don't fancy a ComfyUI restart every time they switch models.

    The inputs and output that matter

    One input, unet_name. It's a dropdown populated from ComfyUI's diffusion_models folder list - same folder the core UNETLoader reads, so your file goes in ComfyUI/models/diffusion_models/ (or models/unet/, both are scanned). No weight_dtype selector: the core loader lets you pick fp8_e4m3fn_fast and friends, this one doesn't offer the choice that breaks.

    One output, MODEL, wired wherever a UNET loader output would go: ModelSamplingAuraFlow (the Qwen workflow uses shift 3.1), your sampler, a LoRA loader. Straight drop-in.

    Installing it

    The node lives in the ComfyArt pack, which is a whole design-canvas app with two nodes bolted on. You don't need the canvas to use the loader, but you do install the pack.

    ComfyUI Manager: search ComfyArt, install, restart. Or by hand:

    cd ComfyUI/custom_nodes
    git clone https://github.com/jtydhr88/ComfyArt
    cd ComfyArt && pip install -r requirements.txt
    

    Then restart ComfyUI - the node shows up under the ComfyArt category, not loaders.

    That requirements.txt is pypdfium2 and rapidocr, both for the canvas's PDF and OCR features, and neither has anything to do with this loader. The dependency that matters isn't in there: timeline/__init__.py imports PyAV at module level and nodes.py imports that module on load. PyAV normally comes with ComfyUI, so most people never notice. On a portable build or a hand-rolled venv you get ModuleNotFoundError: No module named 'av' and the whole pack - this loader included - fails to register. One line fixes it:

    pip install av
    

    No model downloads are involved in the node. Bring the checkpoint yourself.

    Troubleshooting

    Static, noise, or black output. Confirm the flag is actually set (python main.py --fast fp8_matrix_mult ...), then confirm your checkpoint is unscaled fp8. Scaled files are the normal case and work fine with the fast path; unscaled ones, notably the plain qwen_image_2512_fp8_e4m3fn naming, are what breaks. Load the same file through core UNETLoader and through this node. If only the core one fails, you have your answer.

    The node isn't in the add-node menu. Check the console for IMPORT FAILED against ComfyArt. Because of that top-level av import, a broken Python dependency takes this loader down with it even though it has nothing to do with video.

    Out of memory where fp8 used to fit. Expected - manual cast runs the math at bf16, so activations aren't fp8-sized anymore even though the file is. Levers: drop to a GGUF quant of the same model, or go back to stock UNETLoader with the flag removed.

    Works locally, not on Comfy Cloud. ComfyArt swaps this node for core UNETLoader with weight_dtype: default when it sends jobs to Cloud, since Cloud has Comfy's own nodes preinstalled. A workflow containing it is portable, but "portable" here means "silently becomes a different loader" - the manual-cast behaviour doesn't travel with it.

    One last piece of context: ComfyArt is young, there's essentially no Reddit chatter about it yet, so no one's posted a thread with your exact error. Read the console instead. The source is 30 lines.

    CategoryComfyArt

    Inputs (1)

    NameTypeDefaultDescription
    unet_nameCOMBO0 options:

    Outputs (1)

    NameTypeDescription
    MODELMODEL—