Nodes/JR MiniMax H3/JR H3 Unified Acceleration v2 (Experimental)
ComfyUI Node

JR H3 Unified Acceleration v2 (Experimental)

Four attention tricks in one node — start on legacy, not core

By Goldlionren·Created 3 months ago·Updated 15 days ago· 63
JR H3 Unified Acceleration v2 (Experimental)
  • model
  • model
◄enabletrue►
◄sage_attentionsageattn_qk_int8_pv_fp8_cuda++►
◄allow_compilefalse►
◄enable_low_vram_attentiontrue►
◄head_chunks4►
◄enable_low_vram_ffntrue►
◄ffn_chunks4►
◄ffn_seq_threshold4096►
◄enable_sol_attntrue►
◄tau1.30►
◄start_percent0.20►
◄end_percent0.90►
◄min_tokens12288►
◄int8_qktrue►
◄int8_pvtrue►
◄sink_conditioningexact_kv_and_rows►
◄mortonfalse►
◄morton_curve2d_frame►
◄verbosefalse►
◄use_tmafalse►
◄dense_blocks►
◄sparse_backendlegacy_kijai►
◄extra_tokens256►
◄tau_profile—►
◄enable_tstfalse►
◄tst_strength0.10►

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
  • sageattention or sageattn3, matching your chosen Sage mode
  • kijai/ComfyUI-SolAttn_triton and a working Triton environment - needed for legacy_kijai
  • an NVIDIA GPU, and for core a 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.

CategoryJR MiniMax H3/Optimization

Inputs (27)

NameTypeDefaultDescription
modelMODEL—
enableBOOLEANtrue—
sage_attentionCOMBOsageattn_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_compileBOOLEANfalse—
enable_low_vram_attentionBOOLEANtrue—
head_chunksINT41–56—
enable_low_vram_ffnBOOLEANtrue—
ffn_chunksINT41–64—
ffn_seq_thresholdINT4096256–262144—
enable_sol_attnBOOLEANtrue—
tauFLOAT1.300–4—
start_percentFLOAT0.200–1—
end_percentFLOAT0.900–1—
min_tokensINT122880–1048576—
int8_qkBOOLEANtrue—
int8_pvBOOLEANtrue—
sink_conditioningCOMBOexact_kv_and_rows3 options: exact_kv, exact_kv_and_rows, off
mortonBOOLEANfalse—
morton_curveCOMBO2d_frame2 options: 3d, 2d_frame
verboseBOOLEANfalse—
use_tmaBOOLEANfalse—
dense_blocksSTRING—
sparse_backendCOMBOlegacy_kijai4 options: legacy_kijai, core, auto, disabled
extra_tokensINT2560–256—
tau_profileoptSTRING—
enable_tstoptBOOLEANfalseExperimental temporal Q correction. Keep Morton and compile off.
tst_strengthoptFLOAT0.100–1Independent of Sol tau. Start with 0.1; compare motion and prompt adherence.

Outputs (1)

NameTypeDescription
modelMODEL—