Releases: Saganaki22/ComfyUI-VDN-H3
Release list
v1.4.3 — comfy Comfy-Compiler compatibility fix, quiet logs, tooltips
Hotfix series for the comfy "Comfy Compiler" update, plus quality-of-life cleanup. Full v1.4.0 feature set restored, so if you skipped 1.4.x over the crashes, this is the one to take.
Compatibility fix: comfy 2026-09-04 "Comfy Compiler" builds
Comfy's new model compiler + aimdo malloc-graph planner (comfy commits 804eb551, which also removed a MiniMax memory workaround in 5c23fb7b) cannot trace VDN-patched MiniMax-H3 forwards. On those builds VDN workflows failed with aimdo memory compile error or the whole process aborted mid-step.
v1.4.3 handles it automatically:
- While a VDN workflow is sampling, the node switches comfy's compiler off; the switch flips back on the moment each step ends (try/finally — cancel-safe, unload-safe, nothing persists)
- Non-VDN workflows always run with comfy's compiler fully active
- If you launch with
--disable-comfy-compileryourself, the node respects it and never touches your setting - On comfy builds without the compiler stack, the code path never activates
- One console warning (once per session) marks when it engages
Verified against the 2026-09-04 comfy build: render, mid-run cancel, full unload, and immediate re-run all clean.
Quiet logs
- The six SDPA "kernel not used / runtime disabled" UserWarnings from the windowed-attention backend probe are gone; the one-line
window SDPA backend: ...info remains - The
compile of ... failed; using eagerfallback line is now debug-level (the fallback itself is unchanged and seamless)
Node polish
- Every input on both Apply VDN-H3 nodes now has a tooltip (model, checkpoint, verbose, branch_weights, retain_buffers, attention_backend on the Advanced node, fast_kernels drift note, and more)
Docs
- README (EN + ZH): new troubleshooting entry documenting the comfy compiler clash, what the node does about it, and the manual fallbacks (
--disable-comfy-compileror a pre-2026-09-04 comfy build) - Updated example workflows
Note on 1.4.1/1.4.2
v1.4.1 briefly shipped conservative v1.3.1 defaults and a fast_kernels force-off while the crash was being traced; v1.4.2 reverted that. v1.4.3 keeps the full v1.4.0 defaults (branch_weights: auto, retain_buffers: auto, fast_kernels opt-in as before) plus the compatibility shim — downgrading behavior is no longer necessary.
Verification
- 12/12 unit tests
- Bit-identical output to v1.3.1 in default configurations (unchanged from v1.4.0; the shim only touches a comfy runtime switch)
v1.4.0 — Faster streaming, VRAM-aware buffer retention
An optimization release focused on consumer GPUs: less allocator churn, smarter weight placement, and faster sampling at long-clip settings. Defaults are proven bit-identical to v1.3.1 (latent PSNR ∞, frame LPIPS 0.0000 vs v1.3.1 across 3 prompts at both 512x320/56f and 1280x736/145f, in every buffer mode).
Performance
- ~15% faster sampling at 1280x736 / 145 frames in stream mode (13.87 vs 16.30 s/it on an RTX 5090; ~9% against warm-cache baseline repeats). One-block lookahead prefetch: the next block's weights stream to GPU while the current block computes.
branch_weights: auto(new default) — pickscache_gpuwhen free VRAM allows (1.5x stage + 4 GiB headroom) andstreamotherwise, so small cards get the safe path without touching settings. Under memory pressure it also prefers the int8_convrot stage file when both versions exist in a stage directory. Decision is logged to the console.retain_buffers: auto/on/off— retained mode keeps the branch's scratch buffers alive between blocks (scan banks, delta-solve scratch, window gather, q/k/v copies) for churn-free steps. Auto resolves from free VRAM (retain when free ≥ stage + 10 GiB) and falls back to the transient v1.3.1 allocation pattern on tight cards.- Allocator traces (CUDA memory snapshots) confirm the peak working set is unchanged vs v1.3.1; the speedup comes from launch/churn reduction, not memory tricks.
fast_kernels (Advanced node)
- Now also compiles the bidirectional scan into a single CUDA-graph replay (replacing 2xF kernel launches per block per step). The compiled scan is exact (0.0 max error vs eager, cudagraph replays included).
- Known issue, now documented + warned: on torch 2.10 the pre-existing fused epilogue/gather kernels measurably drift on 8-step DMD stages. The node logs a warning and the README marks fast_kernels as ablation-only. Keep it off for final renders.
Visibility
- The windowed softmax logs which exact SDPA kernel it dispatches to (flash / cuDNN / mem-efficient), once per session.
- New env override
VDN_H3_WINDOW_SDPA=flash|cudnn|mem_efficientto force a specific exact backend where faster for your card. Exact kernels only — quantized overrides are still never used for the windows.
Hygiene
- Removed the dead duplicated ApplyVDNH3 class definition
- Bypass-mode LoRA weight casts are cached per (dtype, device) instead of re-cast every step
- Adapter safetensors are no longer held as loaded fp32 dicts for the process lifetime (loaded at apply time)
- README updates: video VAE table row now matches the example workflow (int8_convrot), tiled VAE decode recommendation with seam note,
--lowvramcosts documented (20-40%), clickable int8-convrot checkpoint link
Verification
- 12/12 unit tests, including new compiled-scan vs eager parity and transient/retained buffer parity tests
- E2E A/B matrix vs v1.3.1 at fixed seed: bit-identical latents and frames in all default configurations
- Full measurement tables and methodology in Benchmarks.md
Thanks for the crash reports and int8 testing that fed this release. If you run into issues, include your GPU, VRAM, and the console log from [vdn] lines.
v1.3.1 - hotfix: clean state after cancelling a run
Hotfix: rerunning after a mid-run cancel no longer OOMs. Cancelling a prompt used to leave the node's GPU cache and a fragmented CUDA allocator pool behind, so an immediate rerun could fail to find contiguous space for its first big activation even though the same prompt ran fine before. The VDN forward wrapper now catches the interrupt, clears everything the node owns, and releases the pool — the next run starts clean. (Base-model residency that comfy itself put host-side under VRAM pressure is unchanged; free/unload it manually if needed.)
Also: README download commands for both the original and pre-quantized stages (EN/ZH), and the branch_weights: stream description now reflects true disk-to-GPU streaming. No workflow changes.
v1.3.0 - INT8 ConvRot stages + disk-backed branch streaming
Pre-quantized INT8 ConvRot stages are now supported natively. A stage whose linear_branch weights were quantized with ComfyUI's own int8-convrot serialization (<layer>.weight int8 + <layer>.weight_scale + <layer>.comfy_quant JSON) loads as real Comfy Kitchen QuantizedTensor/TensorWiseINT8Layout weights — convrot metadata intact, nothing dequantized at load time, and F.linear dispatches straight into the Kitchen INT8 kernel (2.7x faster per dispatched matmul). A ready-made quantized 8-step stage is at drbaph/vdn-minimax-h3-int8-convrot-comfyui (branch 4.3 -> 2.2 GB, ~4.7 GB lower peak VRAM while loading, A/B-rendered visually identical); make your own from any stage with tools/quantize_vdn_branch_int8.py.
Branch weights are now disk-backed. branch_weights: stream reads each block's weights straight from the safetensors file to the GPU on demand instead of materializing the full branch in system RAM first — the node no longer adds gigabytes of committed RAM. This also removes the VRAM pressure that made comfy offload the base model into pinned RAM on 32 GB cards; prefer stream over cache_gpu unless you have VRAM to spare.
- int8 A/B + ref2v demo videos in
assets/; BF16-vs-INT8 timing table in both READMEs - docs:
lora_modemerge-default guidance, hardware reality check, fl2v/ref2v tested note (EN/ZH) - verified: bitwise parity tests vs the materialized path, pytest 10/10, live A/B renders
No workflow changes needed.
v1.2.0 - merge default, fast kernels, bypass stacking fix
lora_mode now defaults to merge — use merge, especially on 8-step DMD checkpoints (stage-dmd-*). Measured on pruned int8 bases: bypass applies the same adapter math, but each module's delta carries bf16 rounding noise instead of being baked into the weights. Blocks 0-33 stay bit-identical to merge, the deep blocks amplify that noise to ~10% of feature magnitude, and bypass renders of the 8-step model come out degraded; a coherent same-size perturbation (strength 1.016) renders clean, so it is specifically the off-manifold rounding noise. This supersedes v1.1.2's advice to prefer bypass on pruned bases.
Also in v1.2.0:
- Fixed: bypass hook stacking. Re-running an Apply-VDN node (e.g. after flipping
lora_mode) stacked another full set of bypass hooks on the shared model, doubling the LoRA delta per rerun (measured exactly 2.00x) and progressively degrading output. Live hook sets are now tracked on the shared inner model and ejected before re-injection. fast_kernels(Advanced node): torch.compiles the linear branch's hot spots (RMSNorm+gate epilogue, state gather, frame-major q store) into single kernels. Same math, eager fallback, first run compiles.vdn_scaleddelta backend registered alongside the scan backend.- ~3 GiB less VRAM pressure: dead q/k/v projections are freed before the gate/out-projection/branch readout (upstream parity).
- READMEs (EN/ZH):
lora_modeguidance rewrite; note that bothfl2v(fl2va) andref2v(ref2va) bases are tested and working. - Tests: fused-epilogue parity,
vdn_scaledcoverage, scoped window-dispatch stub, folder-agnostic bypass test. 10/10 green.
int8 A/B demo media
Demo videos for the exp/int8-branch-kitchen README.
v1.1.2 — pruned-base merge fix
Merge mode on pruned (curve) bases: the adaln deltas are now skipped with one warning instead of producing 50 [96768, 8] reshape errors per load (the v1.1.1 fix only covered bypass mode). The deltas cannot merge into a collapsed adaln by construction; use lora_mode: bypass with the MiniMax-H3-Turbo node installed to keep them via e-grid re-injection.
v1.1.1 — issue triage (Windows SDPA, pruned bases, docs)
Issue triage
- #1 — the windowed softmax no longer uses raw SDPA: it dispatches through comfy's backend-priority chain (flash -> cuDNN -> mem-efficient), so Windows lands on cuDNN attention instead of the slow mem-efficient backend.
- #3 / #5 — pruned (curve) bases are now detected by weight shape (the model flag alone missed them), so the adaln adapters route to the e-grid re-injection when the MiniMax-H3-Turbo node is installed; without it they are skipped with ONE warning instead of 50 [ERROR] lora ... [96768, 8] lines.
- #2 — install command fixed to hf download OpenVDN/vdn-minimax-h3 --include "stage-dmd-step-250/*" --local-dir /models/vdn.
v1.1.0 — Advanced node (ablations, per-adapter strengths, fused epilogue)
Advanced node
New Apply VDN-H3 Advanced node alongside the base one — defaults reproduce the released model exactly; knobs for experimenters:
- Per-adapter strengths: separate stage_b_strength / urbo_strength
- Ablation knobs: window radius/chunk, anchor frames (�oth/columns/rows/none), text-state toggle, linear-branch off (window-only ablation) — console warns when deviating from the trained spec
- **ast_kernels**: torch.compile fuses the branch's RMSNorm+gate epilogue into one kernel (same math; permanent eager fallback if compilation fails)
Also: branch weights placement and the windowed softmax are unchanged; the window and linear-branch toggles are now independently decoupled in the forward path.
Verified: full unit suite (window partition, delta scans, adapter folding, bypass reload stability, flex mask, fused/eager epilogue parity). GPU verification of the compiled epilogue pending a render.
v1.0.2 — windows stay exact
Quality fix
VDN's windowed softmax no longer routes through the model's optimized_attention_override. Quantized backends (sage / kitchen int8) on the local window measurably softened output versus the exact SDPA the released model was validated with — windows are exact again. Backend overrides still apply to the base model's own attention (text refiner, dense fallback on short clips).
Also in this release: example workflow re-exported from the UI with a preview image.