MiniMax H3 ControlNet 2.0 v1 config: a silent load_state_dict failure

Loading the v1 5-block config on the 2.0 checkpoint drops control_blocks.5~9 without an error. Use the post_norm config. Sume rejects bad fields with a 400.

4 min readSume
All posts

Use minimax_h3_control_inpaint_post_norm.yaml with the 2.0 checkpoint. The model card says loading the v1 config, minimax_h3_control.yaml, builds only half the control branch, and load_state_dict(strict=False) drops control_blocks.5~9 as unexpected keys without raising an error.

Checkpoint facts are from the model card, read 2026-10-01. Sume's request behavior is from Video generation and the Image API.

Why is the failure silent?

The 2.0 checkpoint holds control_proj_in plus 10 control_blocks (about 13.5 GB). The v1 config has 5 control blocks at layers 0, 10, 20, 30 and 40; 2.0 uses layers 0, 5, 10 through 45. With strict=False the loader ignores keys it has no module for, so a mismatched config still returns a model. The card says the rest are misplaced and the outputs come out wrong.

v1 versus 2.0 control branch, from the model card, read 2026-10-01.
Itemv12.0
Control blocks5 (layers 0, 10, 20, 30, 40)10 (layers 0, 5, ..., 45)
Checkpoint sizeabout 6.8 GBabout 13.5 GB
Required configminimax_h3_control.yamlminimax_h3_control_inpaint_post_norm.yaml
Inpaint mask recipepre_normpost_norm

How do I catch it before a render?

Load with strict=True once, or print the missing and unexpected keys that load_state_dict returns, and fail if control_blocks.5 to control_blocks.9 appear as unexpected. Checking the config filename in your launch script is the cheaper guard. These are generic PyTorch practices, not steps from the card, which only says to always use the post_norm config.

How does Sume treat a field the model does not accept?

Loudly. The image docs say a request that sets a parameter the selected model does not list is rejected with 400 unsupported_parameter rather than silently dropped. The video docs say the same for size (every v1 model reports supported_sizes: null) and for seed (no v1 model accepts it). So a wrong field fails at submit time instead of producing a quietly different render.

What should a retry look like on a hosted video job?

Send Idempotency-Key on the create call. The video docs say it makes retries safe and that a replay returns the original job. A 400 from a bad field is a different case: fix the body, then submit again. The input types a model accepts are advertised in the catalog as supported_input_references, for example image_url, video_url and audio_url; check them before sending references. See also idempotency keys for AI video APIs.

Sources

Related posts

More in Developers

All Developers posts

Written by Sume