MiniMax H3 hybrid โ fl2va base + a light ref2va reference pathway (bf16)
Full-precision (bf16) weight-selection merges of the two official MiniMax H3 checkpoints, fl2va and ref2va.
The idea and the tensor analysis behind it come from
smhfacct/Minimax-H3-fl2va-ref2va-hybrid-models;
this repo differs in two ways: the merges are built from the unpruned bf16 checkpoints instead of the pruned
int8-convrot ones, and they take fewer blocks from ref2va โ the goal is the lightest reference pathway that
still works, on top of the untouched fl2va quality.
Why
MiniMax released two H3 checkpoints with identical architecture and weight layout:
fl2vaโ first/last-keyframe conditioning only. Noticeably better visual and audio quality.ref2vaโ additionally trained on reference conditioning (image / video / audio references). It is the only checkpoint that supports references at all, but its raw output quality is worse thanfl2va, even on tasks that use no references.
Comparing the two tensor by tensor, almost everything (attention, MLPs, norms, patch and rotary embeddings, the token
refiner) is identical or near-identical. The meaningful difference sits in the per-block adaln_proj weights โ the
AdaLN modulation projections that route the text / audio / video / reference signals into each transformer block.
So a merge that keeps fl2va everywhere and takes only some blocks' adaln_proj from ref2va keeps the quality and
buys the reference pathway.
The existing int8 hybrids start at 20 swapped blocks (b30-49) and go up from there. For my use โ character /
setting references that should inform the shot, not dominate it โ even b30-49 pulled too hard toward the reference.
Hence these variants with fewer blocks.
Available variants
| File | adaln_proj blocks from ref2va |
Precision | Character |
|---|---|---|---|
minimax_h3_hybrid_fl2va_ref2va_b45-49_bf16.safetensors |
45โ49 (last 5 of 50) | bf16, 66.28 GB | Lightest possible touch: 10 tensors, 2.60 GB from ref2va. Try this first if you want the references to only nudge the shot. |
minimax_h3_hybrid_fl2va_ref2va_b40-49_bf16.safetensors |
40โ49 (last 10 of 50) | bf16, 66.28 GB | Light reference influence; 20 tensors, 5.20 GB from ref2va. |
More ranges (e.g. b35-49) can be produced in a couple of minutes with the script below; I will add the ones that
turn out useful.
What exactly was done
Sources (unmodified official weights, Comfy-Org packaging):
- base:
Comfy-Org/MiniMax-H3โdiffusion_models/minimax_h3_fl2va_bf16.safetensors(66,280,487,368 bytes) - donor:
Comfy-Org/MiniMax-H3โdiffusion_models/minimax_h3_ref2va_bf16.safetensors(66,280,487,368 bytes)
For b40-49, exactly these 20 tensors were replaced with the ref2va bytes, everything else is fl2va
(b45-49 is the same recipe restricted to blocks 45โ49: 10 tensors, 2,602,091,520 bytes):
blocks.40.adaln_proj.linear.weight [96768, 2688] bf16 blocks.40.adaln_proj.linear.bias [96768] bf16
blocks.41.adaln_proj.linear.weight ... blocks.41.adaln_proj.linear.bias ...
โฎ โฎ
blocks.49.adaln_proj.linear.weight [96768, 2688] bf16 blocks.49.adaln_proj.linear.bias [96768] bf16
That is 520,418,304 bytes per block, 5,204,183,040 bytes (5.20 GB, ~7.9 % of the checkpoint) in total. Untouched and
therefore fl2va: the adaln_proj of blocks 0โ39, final_layer.adaln_proj, final_layer.video_out /
final_layer.audio_out, and every attention / MLP / norm / embedding / token-refiner tensor.
Method: safetensors is an 8-byte header length + a JSON header (name โ dtype, shape, byte offsets) + raw tensor bytes.
The two checkpoints have identical tensor names, shapes and dtypes, so each tensor's byte range in fl2va was
overwritten with the corresponding byte range from ref2va โ no dequantisation, no rounding, no arithmetic of any
kind. Every written range was re-read and compared against the donor by BLAKE2b hash. No training or fine-tuning was
performed. The script is in this repo (h3_adaln_merge.py); it also keeps a small backup of the replaced tensors so
the operation can be undone (--restore), and --lo/--hi select the block range:
python h3_adaln_merge.py --dst minimax_h3_fl2va_bf16.safetensors --src minimax_h3_ref2va_bf16.safetensors \
--lo 40 --hi 49 --backup fl2va_adaln_b40-49_backup.safetensors
mv minimax_h3_fl2va_bf16.safetensors minimax_h3_hybrid_fl2va_ref2va_b40-49_bf16.safetensors
It patches in place (no second 66 GB copy needed) and runs on CPU in a few minutes; no GPU is involved.
Usage (ComfyUI)
Drop-in replacement for ref2va: load it with UNETLoader (weight_dtype: default) and use it through
MiniMaxH3ReferenceToVideo with your reference images / clip / voice. Pair it with the ref2va turbo LoRA
(minimax_h3_ref2v_turbo_4step_v0.1, 4 steps) or run it un-distilled; the usual H3 text encoder
(qwen3vl_32b_minimax_h3) and video/audio VAEs apply. Same VRAM footprint as fl2va_bf16.
Intended use / expectations
- Reference-conditioned generation where the references should guide identity, wardrobe or setting while the output
keeps
fl2va's look and motion quality. - Do not expect it to beat
fl2vaon non-reference generation โ it isfl2vafor 92 % of its weights. - If the references barely register, use a wider range (
b35-49, or the int8b30-49/b25-49from smhfacct).
Limitations
- Experimental. Made on 2026-09-01; evaluated subjectively on my own reference-to-video workflow, not benchmarked.
- The block boundary is a knob chosen by taste, not by any principled criterion beyond "fewer blocks = lighter reference".
- Inherits all licence terms and usage restrictions of the original MiniMax H3 checkpoints (MiniMax H3 Community License). This merge grants no rights beyond what the source checkpoints permit.
Acknowledgements
MiniMax for H3; Comfy-Org for the ComfyUI packaging of the weights; smhfacct for the tensor-level analysis of
fl2va vs ref2va and the original hybrid idea this repo builds on.