MATLOWAI/MiniMax-H3-Motion-Adapter

🤗 On Hugging Faceimage-to-videomit1.1 GBotherChecksums witnessedupdated today
Magnet

MiniMax-H3 motion adapter (pilot, r16)

A rank-16 LoRA that makes the de-rope pass in

ComfyUI-MAINodes behave better

on fast motion. It needs that pass; it is not a general-purpose motion LoRA.

What it looks like

One 5 s clip, four ways. Every panel has its numbers burned in.

Download the comparison clip (mp4, 2.9 MB)

| | left | right |

|---|---|---|

| top | the source plate, straight out of H3 | the whole clip re-generated on a stretched clock, base model, 139.9 s |

| bottom | only the fast span re-generated, no adapter, inject 0.45. 63.6 s, alternation 0.370, rate 1.416 | the same span with this adapter at strength 0.75, inject 0.30. 49.9 s, alternation 0.134, rate 1.011 |

Watch the bottom two panels, not the stills. Without the adapter the fighters

advance and snap, advance and snap, frame to frame. With it they keep moving.

Rate 1.011 means the motion comes out at the speed the shot called for; 1.416

means the pass invented about 40 percent more movement than it should have.

Two things this exhibit is not. It is not the adapter on its own: the stretched

clock comes from the ComfyUI-MAINodes

de-rope pass, and the adapter only changes how the model behaves once that pass

has stretched it. Load this file on a plain text-to-video render and you get the

costs listed below with none of the benefit. And the settings shown here are

0.75 / inject 0.30, the lower-invention cell; see "Settings that work" for when

to prefer strength 1.0.

How it is actually wired, and what the adapter is not responsible for

Same clip, same seed, same graph in all four tiles. An anime sword ring, which

is the content type it helps most.

Download the comparison clip (mp4, 2.7 MB)

| | left | right |

|---|---|---|

| top | the source plate | the burst window re-generated at denoise 0.70 with nothing anchoring it, so it drifts off the plate and jumps at both splices |

| bottom | the same graph with the window's first and last frames pinned. Two extra wires, no extra time (10m41s either way): jitter 0.103 to 0.006, entry jank 2.05 to 1.58, invented objects 109 to 60 | pins plus this adapter at 0.75, one LoraLoaderModelOnly: alternation 0.129 to 0.093, objects 60 to 54, for 39 s more wall time |

The order matters, and it is the opposite of what people expect. **The pins do

most of the work**, and they are free: pinning the window's boundary frames to

the plate frames they must butt against is what stops the splice jump, adapter

or no adapter. The adapter then converts spare capacity into smoothness on top

of that. If your seams are jumping, pin first and only then reach for this file.

The same tile also shows the cost honestly: warm colour goes 1.04 to -1.59 with

the adapter on. That is the colour muting described below, visible in the one

exhibit where everything else improves.

Play to the end for a card listing every setting: window, hold map, denoise,

sampler, seed, quantisation and wall time per tile. (It labels the LoRA by its

training name, p4_pilot_k100.safetensors; that is this file, published here as

minimax_h3_motion_adapter_pilot_r16.safetensors.)

More before/after clips, including the two cases where it makes things worse,

are on the demo page.

About this release

It is a pilot: rank 16, trained for a few hours on

38 clips we generated ourselves. It works, it is measurable, and it has

clear rough edges listed below. We are publishing it as an intermediate

release while we try something considerably more ambitious that may or may

not work (an all-in-one adapter that internalises the whole two-pass

pipeline). If that lands it will replace this file; if it does not, this

one still does a useful job. Part of that work is finding out whether an

adapter can be made to actually assign more compute to the burst on its

own (a variable-rate attention behaviour learned inside the model, rather

than the nodes stretching the clock for it); this pilot does not do that,

see the mechanics note below.

What it does

MAINodes' Motion Lab regenerates the fast span of a clip on a stretched

clock (the "de-rope") and recovers it back to real time. That pass has a

known bad habit: on very fast motion the base model over-produces, and the

result alternates between advance and snap frame to frame. This adapter

was trained on that exact task (frames held out of the middle of a burst,

the model asked to fill them back in), and it teaches the base model to

spend the extra clock on smoothness instead of invention. To be precise

about the mechanics: the LoRA is a plain rank-16 weight delta and adds no

compute and needs no custom node. The extra clock comes from the nodes

(the de-rope stretches the burst into more latent tokens); the LoRA

changes how the model behaves on that stretched clock, because it was

trained in that exact situation.

Measured on four clips the adapter never saw during training (a fight,

an anime sword ring, a character swap, a dialogue close-up), against the

same graph without the adapter and against a same-seed noise floor:

  • advance/snap alternation improved on 4 of 4 clips (4.6 to 6.1 times the

floor)

  • frame-to-frame over-production dropped from 1.76 to 2.93 down to 1.09

to 1.23 on all four

  • blind operator picks, adapter vs no adapter, same seed: 7 for, 0

against, 1 no preference

  • it transfers to the Ref2VA checkpoint (span, alternation and jitter

wins of the same size on the two clips we tried), so one file serves

both fl2va and ref2va graphs

  • one end-to-end run of the shipped graph on a scene it had never seen

(the fight choreography moved to a neon rooftop, same seed for both

arms): alternation 0.24 to 0.19, jitter 0.09 to 0.04, fewer invented

objects, and it kept the plate's setting where the no-adapter pass

rewrote the signage. One clip, and each graph at its own shipped inject

(0.70 vs 0.45), so read it as a smoke test, not a study

Where it is not great (also measured):

  • it costs about 1 dB of anchor fidelity on native keyframes and it

over-corrects calm chains (it smooths things that did not need

smoothing); keep it off on calm content

  • it mutes strong colour and thins particle effects. A prismatic creature

came out as a plain calico on the Ref2VA checkpoint (mean saturation 46

to 38 at denoise 0.40, 54 to 40 at 0.70) and again on the fl2va

checkpoint when the whole clip was de-roped at 3x. Worst on Ref2VA and

on full-clip passes; a windowed de-rope on the same creature kept its

colour. If the subject is the colour, lower the strength or accept the

trade

  • it is anime-heavy in effect: on the one very fast anime clip we

measured it wins clearly at every setting; on live-action character

work it needs the lower inject values below

Settings that work

  • Strength 1.0. Strength and inject turned out to be the same dial. 1.0

wins on alternation in every paired cell we ran (8 of 8), while 0.75

invents fewer objects (7 of 8), so 1.0 is the smoothness setting and

0.75 the lower-invention one; the old 0.75 to 0.80 band was

in-distribution tuning on one fight plate and does not hold elsewhere.

  • Inject is the dial. Starting points: 0.45 for character or dialogue

where the base model over-produces hard; 0.30 where identity or props

are the deliverable and the base is only mildly inflated; on very fast

anime it does not matter (every setting wins).

  • Keep the tail guide on. Turning it off costs identity about 3 times the

floor across seeds and checkpoints, adapter or not.

  • Apply it to the de-rope pass only, not to the first (text-to-video)

pass.

Use in ComfyUI

Put the file in models/loras/minimax_h3/. Load it with a stock

LoraLoaderModelOnly at strength 1.0 on the model that feeds the de-rope

pass. A ready graph is in ComfyUI-MAINodes:

examples/motion_pipeline_adapter_api.json (API format, loads through the

API and through the frontend's API import). The stock

LoraLoaderModelOnly is fine for this file; the key mismatch that bites

turbo LoRAs does not apply here.

Training facts

  • Base: MiniMax-H3 (fl2va), rank 16, alpha 16, 375 steps, lr 1e-4,

adamw8bit, bf16, about 4.6 h on one GPU

  • Data: 38 holdout-infilling items cut from 15 clips we generated with

MiniMax-H3 (physics scenes, fights, chains, a dialogue plate); no real

footage, no third-party footage

  • Task: hold out the frames inside a motion burst, keep the rest as clean

context (kept_label 1.0), predict the held tokens

  • Trainer: our ai-toolkit extension for H3 (span-aware packing verified

bit-exact against ComfyUI)

The temporal-expansion ladder (new, 2026-08-24)

The "considerably more ambitious" follow-up mentioned above has produced its

first shippable piece. The pilot learned its task from targets the model

generated itself; these checkpoints retrain the same recipe against real

intermediate frames, and every training step is published so you can pick

your own point on the curve.

What changed. Same rank-16, attention-only construction, warm-started

from the pilot. The training targets are now real: windows cut from the

public GOPRO_Large deblurring dataset (240 fps source), decimated to the

working frame rate and re-expanded, so the held tokens are scored against

frames a real camera actually captured rather than an interpolation. The

world clock in training is truthful (each token labelled with the real time

it spans).

Measured, on scenes the adapter never saw (four camera shoots fully

disjoint from training, held-token error in latent space, lower is better;

the no-adapter baseline is 1.23 and the plain interpolation the pass starts

from scores 0.26):

| step | 25 | 100 | 175 | 250 | 375 |

|---|---|---|---|---|---|

| error | 0.158 | 0.133 | 0.116 | 0.105 | 0.086 |

The curve never turns: more steps keep measuring better, through the last

checkpoint. And here is the honest part: **the numbers and the eye disagree

about where to stop.** Step 100 was the pick in playback: fast motion comes

out smooth and the clip still feels like itself. Step 375 measures best by

a wide margin, but in side-by-side viewing it can read over-smooth, as if

the motion had been graded. On a static-content probe the family does not

invent motion (it lands below the interpolation floor rather than above

it), so the disagreement is about feel, not correctness. We publish every

25th step so you can find your own point; if you only take one file, take

warm100.

Watch instead of reading. Six arms of one clip, every panel with its

settings and wall time burned in; the bottom-right panel is the full

de-rope end to end for cost comparison:

Download the comparison tile (mp4, 11 MB)

Use. Exactly like the pilot: drop a file from temporal_expansion/

into models/loras/minimax_h3/, load with a stock LoraLoaderModelOnly

at strength 1.0 on the model that feeds the de-rope or windowed-insertion

pass. Not for the first text-to-video pass.

Files. temporal_expansion/minimax_h3_temporal_expansion_warm100_r16.safetensors

(the playback pick, sha256 cbb23ad4...) and

minimax_h3_temporal_expansion_step025_r16.safetensors through

step375_r16.safetensors, every 25 steps of the same run (step375 sha256

28f3d41d...). 63 MB each.

Training facts. Warm-started from the pilot above; 375 steps, lr 1e-4,

adamw8bit, bf16; 48 samples derived from GOPRO_Large (Nah et al., the

public deblurring benchmark) plus the pilot's self-generated set for the

difficulty gate; the trainer's span-aware packing verified bit-exact

against ComfyUI. Unlike the pilot, this data includes real footage; the

source dataset is public and widely used for research, and the derivation

(decimate, re-expand, score held tokens) is described so it can be

reproduced or swapped for your own footage.

Base model and licence

This is a LoRA for MiniMax-H3

by MiniMax; it does nothing without their base weights and is trained on

clips generated with them. The adapter weights and the graph here are

released under the MIT licence (LICENSE); use of the base model, and so

of this adapter with it, is subject to the MiniMax H3 Community License

Agreement, included as LICENSE-MiniMax-H3 (copied from the MiniMax-H3

repository at commit 42ed227e). Thanks to MiniMax for releasing H3.

Files

  • minimax_h3_motion_adapter_pilot_r16.safetensors (63 MB)
  • motion_pipeline_adapter_api.json (the same graph as in the node pack)
  • LICENSE (this repository, MIT) and LICENSE-MiniMax-H3 (the base

model's community licence)

Examples and before/after clips, including the colour-muting case, are on

the demo page: https://matlowai.github.io/ComfyUI-MAINodes/#adapter

The node pack, the example graph and the tuning notes are at

https://github.com/matlowai/ComfyUI-MAINodes (see README, "The motion

adapter (pilot)", and TUNING.md).