Skip to main content

MiniMax H3's 4B Encoder Swap: One 1080 Ti Experiment

MODELS & COSTS

MiniMax H3's 4B Encoder Swap: One 1080 Ti Experiment

Open Source Factory · Aug 10, 2026 · 4 min read

The encoder swap solved a concrete setup problem on this 11GB card, but the controls are the part worth inspecting. With one prompt and seed, the learned projection produced the intended scene while the zero and identity matrices did not. That is a small result, with a useful boundary.

In this article
  1. The encoder being replaced
  2. The verification: "a red ball on a wood table"
  3. Timing and offloading on the 1080 Ti
  4. Observed losses and test limits
  5. What this experiment supports

The encoder being replaced

The baseline encoder is Qwen3-VL-32B truncated to 50 layers, with 15.7GB of NVFP4 weights producing a [seq, 5120] conditioning tensor. That exceeds the card's 11GB VRAM before accounting for the video model. It explains why encoder placement was worth testing on this setup; other machines may have a different bottleneck.

ClipProj, an MIT-licensed project by NicoLab28, uses a 4.9GB Qwen3-VL-4B encoder and a learned 2560-to-5120 projection. A shared tokenizer gives aligned token positions for fitting the map. The calibration uses ridge regression on paired representations: a small fitting procedure, rather than full retraining of the encoder or video model.

ClipProj projection diagram: 4B hidden states through learned matrix W into 5120-dim conditioning
The whole trick: 2560-dim hidden states × one learned matrix → the 5120-dim space the DiT expects
VRAM comparison: 15.7GB encoder vs 4.9GB, 11GB card limit line
15.7GB → 4.9GB. The card limit line is the point.

The authors were refreshingly honest about the numbers: test cosine 0.71, R² 0.51, and an explicit "this is a proof of concept." A cosine of 0.71 sounds bad until you learn the DiT tolerates far more error than the metric suggests. I wasn't going to trust any of it — I have a GPU and a test prompt.

The verification: "a red ball on a wood table"

The project ships two control matrices alongside the real one, specifically so you can prove the learned matrix is doing the work and not the diffusion model hallucinating compliance. Same prompt, same seed, only the matrix changes:

MatrixWhat "a red ball on a wood table" produced
Zero control (W = 0, no prompt info)A countryside landscape — prompt completely ignored
Identity control (raw 4B dims, no learning)A golden object in flames — unusable
Learned matrixA red ball on a wood table
Generated frame: red ball on a wood table
Actual output frame from my 1080Ti (320x320, 5s clip, turbo 10 steps) — the ball even has a gloss reflection on the wood
Another generated frame: red ball on wood table, later in the clip
Later in the same clip — prompt adherence holds across the whole 5 seconds

The loader reported cos_test 0.8450 for this matrix. That logged value describes the supplied projection evaluation, while the red-ball controls show one end-to-end example. The controls support the narrower observation that this learned matrix affected this generation; they do not establish general projection accuracy.

Timing and offloading on the 1080 Ti

My first headless run was a disaster: 18 minutes per sampling step at a modest resolution. That's ~10x slower than my normal H3 runs, and I spent hours chasing it — GPU clocks fine, no throttling, same install, same workflow shape. The culprit turned out to be which VRAM mode ComfyUI picked at model-load time, and it split into two separate discoveries:

  • Normal mode (async weight offloading): fast — 43s per step at 0.1MP. But the turbo LoRA fails to patch: ERROR lora ... Allocation on device on a dozen blocks every step. The video would have been generated WITHOUT the LoRA — invalid turbo output.
  • Lowvram mode: the mode my Desktop app has been using all along. LoRA applies cleanly, output is valid — at ~151s per step, which matches my usual pace.
Sampling speed per work unit across setups
Per-work-unit sampling speed: fast mode is 3.5s but breaks the LoRA; lowvram is valid at 12.2s — roughly my normal pace

The faster mode failed to apply the turbo LoRA, so it is not a valid speed comparison with the working low-VRAM run. I kept the configuration where the patch applied correctly. Any future speed claim needs the same prompt, output settings and successfully applied LoRA in both runs.

Observed losses and test limits

1. Named references vanish. The 4B stores far fewer facts than the 32B. In the author's tests one famous actor rendered correctly while another became a generic figure. No projection can restore knowledge that was never encoded. Fix: describe instead of name — "the actress X as [role], blonde, blue eyes" survives; the bare name often doesn't.

2. Non-English speech degrades. The audio branch of the DiT is far more demanding than the video branch. English lines reconstruct fine; French (their test) came out phonetically broken. Korean voice work would be the first thing I'd A/B before trusting this for real projects.

This remains a proof of concept on a small set of configurations. The developer reports that eight times more calibration data improved cosine similarity by only 1.8%. A nonlinear projection is a possible direction to test, not a demonstrated solution to the observed losses.

What this experiment supports

The swap is most relevant when the encoder's placement is a measured bottleneck. An 11GB result does not establish a recommendation for every 12GB, 16GB or 24GB card. The video model, precision, context and offload path all affect memory use, while named-reference and speech quality need their own comparisons.

The controls are the strongest part of this small test: the zero and identity matrices fail, while the learned projection produces the intended red ball on a wood table. One prompt does not establish general prompt fidelity, Korean speech quality or production reliability. It is a reason to extend the test set, not to treat the encoder swap as lossless.

If you try it: put the .safetensors matrices in ComfyUI/models/clip_projections/, load the 4B encoder on CPU with dynamic mode, and run the zero/identity controls first — the README walks through it. Project: github.com/nicolab28/ComfyUI-ClipProj.

All numbers measured on my machine (1080Ti 11GB, ComfyUI 0.30.2, turbo LoRA 10 steps), Aug 10 2026. The MiniMax H3 setup post is on this blog if you want the baseline.

Related on this blog: MiniMax Music 3: Five-Minute Songs, Open Weights, One $20M Catch · MiniMax H3 went open-weight, so I did the math on whether my PC can run it

Comments