Nodes/VRGameDevGirl Video Enhancement Nodes/VRGDG H3 Save Draft Checkpoint
ComfyUI Node

VRGDG H3 Save Draft Checkpoint

Stop re-rendering 90 seconds of video to test one prompt change

By vrgamegirl19·Created about a year ago·Updated about 23 hours ago· 819
VRGDG H3 Save Draft Checkpoint
  • latent
  • LATENT
◄checkpoint_path—►

MiniMax H3 is a 33B omni-modal model and it is not fast on consumer hardware. People running this pack's scene-by-scene music-video workflows have posted seventeen-hour jobs for a single track on a 12GB card. At that scale, the difference between "keep the latent I just paid for" and "run it again" is most of a day.

That's the entire pitch of the draft checkpoint pair: Save Draft dumps the raw sampled latent to a file, Load Draft reads it back. No decode, no encode, no loss. It's a save/load button for the intermediate result that H3 normally throws away.

What it saves, exactly

The input is a LATENT and the output is the same LATENT - the node is a passthrough so you can splice it into a wire mid-graph without rerouting anything. That's a small design decision with real consequences: you can put it between the sampler and the VAE Decode, leave it there, and the graph still runs normally while dropping a checkpoint to disk on every queue.

Under the hood it walks the latent structure and moves everything to CPU first - detach().cpu().contiguous() - which matters because an H3 AV latent is a nested object with a video member and an audio member, and a naive torch.save on a CUDA-nested tensor is how you get a file that won't load on the machine you share it with. The nested wrapper gets flattened to a {"__h3_nested__": [...]} dict, so the file is portable and reads back into a proper NestedTensor on load.

The write itself is atomic: it saves to checkpoint_path + ".tmp" and then os.replacees it over the real file. If you've ever cancelled a run halfway and ended up with a truncated checkpoint that crashes the loader, this is the fix for exactly that. It also creates the parent directory for you, so a path into a folder that doesn't exist yet just works.

checkpoint_path is a plain string widget - full path, including the filename. There's no folder browser, no model-directory convention. Type absolute paths and save yourself the confusion.

Why you'd have one

Three real uses, in the order you'll hit them.

Iterating on the second half. You rendered a scene, it's good, and you want to try a different upscale or a different decoder path. Save the latent once, then reload it for every experiment instead of re-sampling. H3 sampling is the expensive part; a VAE decode is not.

Scene continuation. This is the pack's home turf. A masked-continuation chain feeds the previous scene's latent into the next scene's head, and having that predecessor on disk means the chain survives you closing ComfyUI, rebooting, or moving the project to another machine.

Reusing a take. The pack ships a separate save/load pair for full scene latents keyed by project folder and scene number; this draft pair is the dumb-simple version - one tensor, one path, no project structure required. If you're hand-building a graph rather than using the Builder, this is the one you want.

Install

ComfyUI Manager → search vrgamedev, or:

cd ComfyUI/custom_nodes
git clone https://github.com/vrgamegirl19/comfyui-vrgamedevgirl

Restart and hard-refresh the browser. No models to download, no extra Python packages needed for this node specifically - the pack's requirements.txt exists for its Builder, audio and training tooling (demucs, stable-ts, torchcodec, llama-cpp-python), not for latent I/O.

Things that will bite you

Disk space, not VRAM. An H3 AV latent is small next to a render, but it's not nothing, and if you leave this node in a graph that runs per-scene in a loop you'll accumulate a folder of them. Point checkpoint_path somewhere you actually look.

This is not a video file. Don't expect to open the result in a player, and don't hand it to anything except VRGDG H3 Load Draft Checkpoint or another node that takes LATENT. It's a pickled tensor dict.

Load Draft runs off the file's stat, not its contents. It only re-executes when the mtime or size changes, which is the right behaviour for iteration - re-queueing the graph without touching the file skips the reload. If you overwrite a checkpoint with something the same size in the same second you might confuse the cache, which is a very funny way to waste an afternoon and a very rare one.

The pair is symmetric by design, and only with itself. Save with this node, load with the matching Load Draft, and keep ComfyUI's H3 support at a version recent enough to have NestedTensor. Older builds will read the file back as a plain dict and fail somewhere further downstream with a less helpful message.

CategoryVRGDG/MiniMax H3

Inputs (2)

NameTypeDefaultDescription
latentLATENT—
checkpoint_pathSTRING—

Outputs (1)

NameTypeDescription
LATENTLATENT—