NormalCrafter Clean - Load
The Load node that keeps your model downloads in one place
- model
Every NormalCrafter workflow starts here. This node pulls all the pieces of the model together into one object you can hand to the Generate node, and it's the only place you deal with downloads and precision settings. Load it once, wire the model output forward, and stop thinking about it.
The reason it loads four things at once is that NormalCrafter isn't a single self-contained checkpoint. It's a diffusion recipe built from two repos: NormalCrafter's own fine-tuned UNet and temporal VAE (Yanrui95/NormalCrafter), plus the CLIP vision encoder and Euler scheduler borrowed from Stable Video Diffusion (stabilityai/stable-video-diffusion-img2vid-xt). The pack assembles them into one NormalCrafterModel object - one owner per component, no module-level globals, nothing half-loaded.
What you actually set
Three required inputs, and honestly two of them have sane defaults:
dtype-autois the right answer for almost everyone. It selects FP16 on CUDA and FP32 on CPU. If you know you wantfloat16,bfloat16, orfloat32explicitly, pick it; note that a CPU-only run gets forced to FP32 regardless, because FP16 CPU kernels are slow and numerically fragile.attention-autopicks a sensible implementation;xformersis there if you've already got it installed and want it forced. Leave it onauto.local_files_only- this is the one worth knowing.False(default) means the loader will hit Hugging Face and download weights on first run if they're not cached. Flip it toTruefor a fully offline box that only uses what's already in the HF cache - great for air-gapped setups, and it's the only input that changes how the node behaves beyond precision.
Then there are two optional string fields, model_repo and base_repo, defaulting to the official Yanrui95/NormalCrafter and stabilityai/stable-video-diffusion-img2vid-xt. These exist so you can point at a mirror, a fork, or a local repository path instead of the Hugging Face originals. Most people never touch them.
The single output is model - a custom NORMALCRAFTER_CLEAN_MODEL type that only wires into the other two nodes in this pack. Important detail: the loader does not move anything to CUDA. The model is created on CPU, and the Generate node decides whether to stage components one at a time or keep them resident. That's the design that keeps VRAM low - the loader never claims the GPU up front.
Installing
Same steps as the rest of the pack, done once:
cd ComfyUI/custom_nodes
git clone https://github.com/kaski23/BetterNormalCrafterWrapper
cd BetterNormalCrafterWrapper
pip install -r requirements.txt
Or search for BetterNormalCrafterWrapper in ComfyUI Manager. Either way, restart ComfyUI afterward. Dependencies are the standard huggingface stack - diffusers, transformers, accelerate, safetensors - so no pip conflicts beyond the usual suspects.
Gotchas
Budget for the first run: it downloads multi-gigabyte weights from Hugging Face, and that happens in the loader, so your first workflow execution can look "stuck" while it pulls. That's expected, not a hang. The model sits on CPU until generate runs, so loading itself is cheap on VRAM. If you're on a machine that can't reach Hugging Face, pre-download the repos with the HF CLI and set local_files_only to True - the rest of the workflow won't notice.
Inputs (5)
| Name | Type | Default | Description |
|---|---|---|---|
| dtype | COMBO | auto | 4 options: auto, float16, bfloat16, float32 |
| attention | COMBO | auto | 3 options: auto, default, xformers |
| local_files_only | BOOLEAN | false | — |
| model_repoopt | STRING | Yanrui95/NormalCrafter | — |
| base_repoopt | STRING | stabilityai/stable-video-diffusion-img2vid-xt | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| model | NORMALCRAFTER_CLEAN_MODEL | — |