Views
No views yet
H3-Regenerate-2K
module, which is not part of this or Comfy-Org's release.)minimax_h3_<fl2va|ref2va>_<variant>.safetensors.fl2va — first/last-frame mode. Zero images = text-to-video, one or two = frame-conditioned.ref2va — omni-reference mode (up to 9 images / 3 video clips / 3 audio clips).| Variant | Size | GPU | Status |
|---|---|---|---|
pruned_nvfp4_convrot_int8 | 20 GB | Blackwell only | ✅ Recommended — tested in ComfyUI |
pruned_nvfp4_fp8 | 20 GB | Blackwell only | Tested; benchmark variant — attn.qkv_proj as FP8 instead of INT8 ConvRot, for speed comparison |
pruned_nvfp4 | 20 GB | Blackwell only | Tested; slower than the above at the same size |
nvfp4 | 34 GB | Blackwell only | Unpruned base; only if you can't use the pruned path |
pruned_mixed_int4_int8_convrot_simple | 20 GB | Any (see below) | ⚠️ Experimental, quality unevaluated |
pruned_int4_convrot_simple | 17 GB | Any (see below) | ⚠️ Experimental, quality unevaluated |
int4_convrot_simple | 25 GB | Any (see below) | ⚠️ Experimental, unpruned |
fl2va only. All other variants exist for both.nvfp4 file, including the convrot_int8 ones, which are NVFP4 everywhere
except attn.qkv_proj.comfy-kitchen's TensorCoreConvRotW4A4Layout. Note that comfy-kitchen's
W4A4 CUDA kernel only uses native INT4 tensor-core MMA on major == 8 (Ampere/Ada); Blackwell
always falls through to an INT8-activation path, so there is no speed argument for INT4 there.pruned_nvfp4. It is only worth choosing if you
can't run NVFP4 — it trades away validated quality for nothing else.models/diffusion_models, models/text_encoders, and models/vae. Use the I2V / T2V / R2V
workflow templates from that repo.nvfp4_awq version of it that pairs well with these files on Blackwell.convert-to-quant (ctq) CLI using a hand-built per-layer profile (no built-in
filter exists for this architecture): NVFP4 for the bulk MLP weights, FP8 for attention QKV and
AdaLN-modulation projections, and BF16 kept for the precision-sensitive layers — the first 2 and
last 3 transformer blocks, the attention output projection, and all input/output projections. Several
of those are stored as F32 in the original checkpoint, which was taken as a signal they're sensitive.| Layers | Format |
|---|---|
blocks.{2..46}.mlp.fc1 / mlp.fc2 — 90 layers | NVFP4 |
blocks.{2..46}.attn.qkv_proj, .adaln_proj.linear — 90 layers | FP8, tensor-wise scale |
blocks.{0,1,47,48,49}.*, attn.out_proj, condition_proj, time_embedder.*, audio_patch_proj, video_patch_proj, final_layer.*, token_refiner.* — 86 layers | BF16 (untouched) |
minimax_h3_layer_config.json.hf download Comfy-Org/MiniMax-H3 --include "diffusion_models/minimax_h3_fl2va_bf16.safetensors"
ctq -i minimax_h3_fl2va_bf16.safetensors \
-o minimax_h3_fl2va_nvfp4.safetensors \
--nvfp4 --custom-type fp8 \
--layer-config minimax_h3_layer_config.json \
--comfy_quant --save-quant-metadata--custom-type fp8 enables the mixed-format path that --layer-config drives; --nvfp4 is the
default for anything the config doesn't match. Result: 985 tensors, 180 layers quantized (90 NVFP4 +
90 FP8), verified against the _quantization_metadata header.pruned_*)time_embedder.* and every *.adaln_proj.linear.{weight,bias} ([96768, 2688] per block)adaln_t_table ([1025, 8], F32) and
the collapsed *.adaln_proj.linear.{weight,bias} ([96768, 8], F16)MiniMaxH3Model detects the pruned architecture from
adaln_t_table.shape[1] → time_embed_dim.Gotcha: this only works because the file carries noconfigmetadata block.model_detection.pyappliesconfigafter shape-based detection, so a staletime_embed_dim: 2688inherited from the parent NVFP4 file silently clobbers the correct value and breaks loading.
attn.qkv_proj (pruned_nvfp4_convrot_int8)*_pruned_int8_convrot releases; this applies it just to attn.qkv_proj
on top of our pruned NVFP4 checkpoint. Same file size, faster compute.attn.qkv_proj layers in blocks 2–46 are quantized from the original BF16 weights, not
from the FP8 tensors they replace — that would compound quantization error. Built as extract →
quantize → splice rather than a full re-quantization pass:attn.qkv_proj.weight tensors from the BF16 checkpoint into a small standalone
file (no bias — qkv_proj has none).ctq -i <extracted>.safetensors -o <convrot_out>.safetensors \
--int8 --scaling-mode row --dynamic-convrot --convrot-group-size 256 \
--comfy_quant --save-quant-metadata--dynamic-convrot picks each layer's largest compatible power-of-4 group size; all 45 tensors
share in_features=5376, cleanly divisible by 256.{weight,weight_scale,comfy_quant} tensors into the pruned NVFP4 file.
Tensor count is unchanged at 892; only those layers change format (F8_E4M3 tensor-scale →
I8 row-scale + ConvRot metadata).adaln_proj.linear deliberately gets no equivalent treatment — pruning has already collapsed it to a
[*, 8] F16 lookup table, so there's nothing left worth quantizing.ctq's --layer-config JSON to support ConvRot options
(convrot/dynamic_convrot/convrot_group_size), previously only reachable via flat CLI flags —
upstream PR #54. The extract/splice
pipeline above doesn't need it, but it's the right generalization.attn.qkv_proj (pruned_nvfp4_fp8) — speed comparison baselinepruned_nvfp4_convrot_int8, but attn.qkv_proj (blocks 2–46) is FP8 tensor-scale instead
of INT8 ConvRot. Exists to A/B inference speed between the two at identical size and quality tier —
not a quality claim.ctq FP8 output, no format flags needed),
then spliced into a copy of pruned_nvfp4_convrot_int8 in place of its ConvRot attn.qkv_proj
tensors. Tensor count unchanged at 892.--simple (RTN, no learned rounding). Quality has not been evaluated — only
confirmed to load and generate end-to-end in ComfyUI. The NVFP4 variants remain the recommended
choice. These exist for people who want a smaller footprint on non-Blackwell GPUs, or who want to
help evaluate quality. fl2va only.comfy-kitchen's TensorCoreConvRotW4A4Layout.int4_convrot_simple (25 GB, unpruned)mlp.fc1/fc2, attn.qkv_proj, and adaln_proj.linear for blocks 2–46 — 180 layers, the same
scope as the base NVFP4/FP8 profile — quantized to INT4 W4A4 ConvRot instead, replacing that split
entirely. Same BF16 exclusion set as every other variant.ctq -i minimax_h3_fl2va_bf16.safetensors \
-o minimax_h3_fl2va_int4_convrot_simple.safetensors \
--int4 --dynamic-convrot --convrot-group-size 64 \
--layer-config minimax_h3_layer_config_int4_convrot.json \
--comfy_quant --save-quant-metadata --simpleminimax_h3_layer_config_int4_convrot.json. The group-size floor of 64 (vs. 256
for the INT8 pass) only exists to make adaln_proj.linear (in_features=2688) ConvRot-compatible at
all; qkv_proj/fc1 (5376) and fc2 (14336) resolve to 256/1024 regardless, since
--dynamic-convrot always takes the largest compatible size above the floor.In hindsight, includingadaln_proj.linearwas wasted work — pruning discards it either way. Drop it from the config on any future run.
pruned_int4_convrot_simple (17 GB)minimax_h3_fl2va_pruned_nvfp4.safetensors. 802 tensors. Every remaining quantized layer (135) stays
INT4 W4A4.pruned_mixed_int4_int8_convrot_simple (20 GB)int8_tensorwise, full-width,
not 4-bit packed) to recover quality._quantization_metadata (int8_ratio: 0.2, matching the
paper). The 48 overlapping tensors (41 mlp.fc1, 4 mlp.fc2, 3 attn.qkv_proj) were pulled from
Comfy-Org's minimax_h3_fl2va_pruned_int8_convrot.safetensors via targeted HTTP range requests
(~7 GB of a ~21 GB file) and spliced in, rather than requantized — they were already quantized fresh
from BF16 by the same method used elsewhere here.Gotcha: a safetensors file can carry both per-tensorcomfy_quantblobs and a global__metadata__["_quantization_metadata"]["layers"]blob describing the same layers. In ComfyUI/comfy-kitchen 0.2.26 the loader treats the global blob as authoritative. Four separate fixes patched the per-tensor bytes correctly and still failed identically, because the global blob still claimed the pre-promotion format. Always update both when hand-editing quantization metadata.
LICENSE.