JR H3 Unified Acceleration v2 (Experimental)
Four attention tricks in one node — start on legacy, not core
- model
- model
What it's for
MiniMax H3 is a 33B omni-modal video model with native stereo audio, and it earns its results the hard way: every sampler step at 24 fps is real compute. The community's standard levers are well known - SageAttention for the attention math, chunked attention and feed-forward for the VRAM peaks, a sparse path for the stretches that don't need full quadratic attention. Each one is a separate node from a separate pack, and they have to go in the right order.
This node is the bundler: one MODEL in, one MODEL out, four passes applied in a fixed tested order. It's the second version of the pack's existing Unified Acceleration node - same inputs, same defaults, plus an explicit choice of sparse backend. The original is untouched, so your existing workflows keep working; you add v2 yourself.
How it works
The internal order is fixed, and it explains the wiring rules:
KJ Sage
→ MiniMax H3 Low VRAM Attention
→ MiniMax H3 Chunk FeedForward
→ Sol-Attn (or ComfyUI core block sparse)
Sparse goes last so Sage stays in place as the previous dense backend: when a call lands outside the sparse window, or a shape or head dimension isn't eligible, it degrades to Sage instead of slow unpatched attention. Every enable_* switch is a genuine bypass, not a fake one implemented with a chunk size of 1.
The v2 addition is sparse_backend: legacy_kijai (the default, needs Kijai's Sol-Attn node installed), core (ComfyUI's native BlockSparseAttention with comfy-kitchen Sol), auto, or disabled. auto checks your configuration before sampling and picks legacy only for known-missing capability, logging the reason. It never switches after a CUDA or runtime failure - a mid-sample backend change would give you two inconsistent halves of a video.
The controls worth touching
enable is the master switch: off, and the node returns your MODEL completely unchanged with no dependency checks - which is what lets the rest of the pack load when your Sage/KJ nodes are missing.
sage_attention defaults to sageattn_qk_int8_pv_fp8_cuda++, one of eight options including disabled, auto, the fp16 CUDA/triton variants and the sageattn3 pair. The default is the fast one, so if you're chasing a corruption bug, try disabled first.
The memory passes are enable_low_vram_attention with head_chunks (default 4) and enable_low_vram_ffn with ffn_chunks (4) plus ffn_seq_threshold: a little speed for a lower peak, skippable with headroom and essential on a 16GB card.
Then the trap: min_tokens defaults to 12288 in v2, triple the old node's 4096. Below that the sparse path doesn't engage at all, so a five-frame smoke test tells you nothing.
start_percent / end_percent (0.2 / 0.9) and tau (1.3) control where in the sigma schedule sparse applies and how hard it pushes. dense_blocks takes a legacy-style string with negative indexing - on 50 blocks, -1 is block 49 - and extra_tokens (256) goes to the core backend only. enable_tst / tst_strength are the experimental temporal Q correction (start at 0.1, legacy or disabled only). And verbose is the only way to see which path each call actually took.
Wiring and installing
Put it on a clean MODEL - after the H3 loader and any Turbo LoRA and sigma config, before the sampler, as the last attention patch.
Load Diffusion Model → Turbo LoRA → (Reserved VRAM Setter) → JR H3 Unified Acceleration v2
→ JR H3 Adaptive Cache (optional) → Basic Guider / Basic Scheduler → sampler
The pack installs the usual way (Manager, search ComfyUI JR MiniMax H3 Node, or clone into custom_nodes and pip install -r requirements.txt with ComfyUI's own Python). What it does not install - the part people miss:
- kijai/ComfyUI-KJNodes - needed for Sage, low-VRAM attention and chunked FFN
sageattentionorsageattn3, matching your chosen Sage mode- kijai/ComfyUI-SolAttn_triton and a working Triton environment - needed for
legacy_kijai - an NVIDIA GPU, and for
corea BF16-capable one
These resolve at execution time, so a missing Sol-Attn won't stop the other 31 nodes from loading; you just get an error when you queue.
Common issues
Don't stack it with a DiT block cache. EasyCache, TeaCache, First Block Cache, CacheDiT, other block-replacement caches and a second JR cache all conflict - Sage, Flash Attention, quantization, Dynamic VRAM and offload are fine. If quality drops, that pairing is the first thing to isolate.
It refuses your MODEL. With enable = true on a MODEL that already carries attention, block, FFN, TST or another Unified patch, v2 errors instead of stacking. One v2 per clean branch; it even detects a later replacement of the attention stack mid-run.
Core mode rejects things, and that's correct. Explicit core errors on TST, tau_profile, morton, use_tma, allow_compile or the legacy quant flags turned off; auto resolves those to legacy before sampling. Core also needs the native H3 model, the attention= block interface, and BF16 CUDA activations with head dimension 128 and RoPE.
Benchmark honestly. Core bootstraps its QKV statistics with two producer passes on first use after a cleanup, so measure warm requests - and change one variable: same Stage 1 latent, same seed, Sage / low-VRAM / FFN fixed, only sparse_backend moving between disabled, legacy_kijai and core. The requested versus resolved line tells you what got installed; it isn't a promise every call was sparse.
Inputs (27)
| Name | Type | Default | Description |
|---|---|---|---|
| model | MODEL | — | |
| enable | BOOLEAN | true | — |
| sage_attention | COMBO | sageattn_qk_int8_pv_fp8_cuda++ | 8 options: disabled, auto, sageattn_qk_int8_pv_fp16_cuda, sageattn_qk_int8_pv_fp16_triton, sageattn_qk_int8_pv_fp8_cuda, sageattn_qk_int8_pv_fp8_cuda++, +2 |
| allow_compile | BOOLEAN | false | — |
| enable_low_vram_attention | BOOLEAN | true | — |
| head_chunks | INT | 41–56 | — |
| enable_low_vram_ffn | BOOLEAN | true | — |
| ffn_chunks | INT | 41–64 | — |
| ffn_seq_threshold | INT | 4096256–262144 | — |
| enable_sol_attn | BOOLEAN | true | — |
| tau | FLOAT | 1.300–4 | — |
| start_percent | FLOAT | 0.200–1 | — |
| end_percent | FLOAT | 0.900–1 | — |
| min_tokens | INT | 122880–1048576 | — |
| int8_qk | BOOLEAN | true | — |
| int8_pv | BOOLEAN | true | — |
| sink_conditioning | COMBO | exact_kv_and_rows | 3 options: exact_kv, exact_kv_and_rows, off |
| morton | BOOLEAN | false | — |
| morton_curve | COMBO | 2d_frame | 2 options: 3d, 2d_frame |
| verbose | BOOLEAN | false | — |
| use_tma | BOOLEAN | false | — |
| dense_blocks | STRING | — | |
| sparse_backend | COMBO | legacy_kijai | 4 options: legacy_kijai, core, auto, disabled |
| extra_tokens | INT | 2560–256 | — |
| tau_profileopt | STRING | — | |
| enable_tstopt | BOOLEAN | false | Experimental temporal Q correction. Keep Morton and compile off. |
| tst_strengthopt | FLOAT | 0.100–1 | Independent of Sol tau. Start with 0.1; compare motion and prompt adherence. |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| model | MODEL | — |