Skip to content
FastVideo
Esc
↑↓navigate↵open⌘Jpreview
On this page

FastH3 distilled checkpoint schedules

Base MiniMax-H3 still uses the scheduler shifts in its checkpoint (video 12, audio 3), BF16 text encoding, and the existing uniform schedule. The default basic_fasth3.py example still targets the four-forward preview. Selecting a shift-10 eight-forward checkpoint is an explicit choice of model and recipe; it does not change either default or enable NVFP4.

Eight-forward T2AV recipe

The public checkpoint is FastVideo/FastVideo-FastH3-8-Step-V2 (MiniMax H3 Community License), trained with video/audio shifts 10/3, VSA sparsity 0.8, 64-token tiles, and the DMD rungs [999, 874, 749, 624, 500, 375, 250, 125]. basic_fasth3_8step.py pins that checkpoint and recipe as defaults; it shares the preview example’s CLI, so every other flag works unchanged:

python examples/inference/basic/basic_fasth3_8step.py \
  --prompt 'A slow cinematic drone shot glides over a coastal town; gulls call over the harbor.' \
  --num-gpus 4 --vsa-kernel ptx_blackwell \
  --profile strict --no-inference-torch-compile --no-compile-vae \
  --height 768 --width 1344 --num-frames 124 \
  --output outputs/fasth3-8step

Pass --model-path to use a local snapshot of the full export (not just its transformer subdirectory). --steps is the number of sigma-grid points, including the terminal zero; nine points run exactly eight transformer forwards, and the script rejects any other value because the checkpoint’s ladder has eight rungs. The rungs are unshifted noise levels on the 1000-step training clock; each scheduler applies its own shift once, and the transformer receives H3 clean-time values (1 - sigma). A uniform nine-point grid is not a substitute for those rungs.

Compilation and H3 fusions are disabled above to establish an eager reference; they can be evaluated separately. Where the ptx_blackwell kernel is unavailable (non-Blackwell GPUs, or a build without it), use --vsa-kernel triton; compare outputs and performance before adopting that backend. This recipe is T2AV-only, not a distilled transformer_ref model.

Export metadata and validation

The export’s fastvideo_inference.json supplies the trained ladder. The schedule fields of fasth3-inference-contract-v1 are:

{
  "schema_version": "fasth3-inference-contract-v1",
  "dmd_denoising_steps": [999, 874, 749, 624, 500, 375, 250, 125],
  "num_inference_steps": 9,
  "transformer_forwards": 8,
  "video_scheduler_shift": 10.0,
  "audio_scheduler_shift": 3.0
}

The loader keeps this file when downloading the selected H3 components from Hugging Face. It checks that the two declared shifts agree with scheduler/scheduler_config.json and audio_scheduler/scheduler_config.json. Missing/invalid rungs, inconsistent counts, or an explicit conflicting ladder are errors. The denoiser rejects a request with the wrong number of grid points. The metadata does not silently change request dimensions, step count, attention backend, sparsity, precision, or offload/compile settings: set those explicitly as above.

For exports without this sidecar, an explicit ladder is supported via MiniMaxH3PipelineConfig.dmd_denoising_steps, or through the typed API’s PipelineSelection(experimental={"dmd_denoising_steps": [...]}). The shifts still come from the checkpoint scheduler configs. Keep generic flow_shift unset: H3 has separate video and audio shifts, not one shared shift.

This documents execution support for the published checkpoint. It is not a quality claim: compare video/audio output against base MiniMax-H3 on your own prompts before adopting it.

Ref2VA PDD students

A Parallel Decoding Distillation (PDD) student widens the transformer’s two output projections to pdd_steps heads, one per interval of a fixed fine time grid on [0, 0.999]. Each transformer forward fuses a block of consecutive heads into their integration-weighted mean, and an ordinary Euler step over the block’s two node sigmas applies it. The FastH3 OmniRef PDD-8 student is a Ref2VA (transformer_ref) student with 32 heads, sampled in eight blocks of four.

Its export carries only what distillation changed:

Path Contents
transformer_ref/ Widened proj_out and audio_proj_out, trained VSA compression gates; config.json records pdd_steps
scheduler/, audio_scheduler/ Video and audio shifts (12 and 3)
fastvideo_inference.json The sampling contract below
modular_model_index.json The Diffusers manifest

The text encoder, tokenizer, processor, and both VAEs are base MiniMax-H3’s. basic_fasth3_omniref_pdd.py composes the two into one local directory of symlinks and runs the recipe the contract records. --model-path is the export, as a local directory or a Hugging Face repo id. The base comes from the revision the contract pins in base_model_revision, or from --base-model-path:

python examples/inference/basic/basic_fasth3_omniref_pdd.py \
  --model-path <local export directory or Hugging Face repo id> \
  --video reference.mp4 --image character.png \
  --prompt 'The dancer from the video performs the routine in the pictured outfit.' \
  --height 480 --width 832 --num-frames 124 \
  --output outputs/fasth3-omniref-pdd

References are ordered: pass --image, --video, and --audio in the order the prompt refers to them. At least one image or video is required.

A PDD export uses fasth3-inference-contract-v1 with PDD fields in place of the DMD ladder:

{
  "schema_version": "fasth3-inference-contract-v1",
  "model_type": "ref2va",
  "transformer_component": "transformer_ref",
  "pdd_steps": 32,
  "pdd_step_indices": [0, 4, 8, 12, 16, 20, 24, 28, 32],
  "num_inference_steps": 8,
  "transformer_forwards": 8,
  "grid_max_t": 0.999,
  "video_scheduler_shift": 12.0,
  "audio_scheduler_shift": 3.0,
  "guidance_scale": 1.0,
  "attention_backend": "VIDEO_SPARSE_ATTN_H3",
  "vsa_sparsity": 0.9,
  "vsa_tile_size": 128,
  "vsa_ref_policy": "p2_multi_region",
  "vsa_ref_keep_rate": 0.1
}

The export also records schema, conditioning, and base_model_revision, the base snapshot it was distilled against, as hf://<repo id>@<revision> (for example hf://MiniMaxAI/MiniMax-H3@<commit>); any other form is an error. FastVideo reads the file once, when the run’s arguments are built and before any weights load. The file must carry exactly these fields: a missing or unknown field is an error. Fields that repeat a value stored elsewhere must equal it: pdd_steps equals transformer_ref/config.json, the shifts equal the scheduler configs, and num_inference_steps and transformer_forwards equal the block count of pdd_step_indices, a strictly increasing partition of the grid from 0 to pdd_steps. Only MiniMaxH3Ref2VAModularPipeline runs the export. A transformer_ref whose config.json sets pdd_steps without this file is an error.

Each sampling setting has one source, the file:

Setting Run leaves it unset Run sets a different value
pdd_step_indices Taken from the file Error
num_inference_steps (request) Set to the block count Error
attention_backend Taken from the file Error, including FASTVIDEO_ATTENTION_BACKEND
VSA_tile_size Taken from the file Error
VSA_sparsity Taken from the file The run’s value, with a warning
vsa_ref_keep_rate Taken from the file The run’s value, with a warning

A request leaves num_inference_steps unset only when it is parsed from a mapping or a config file. A GenerationRequest built in Python counts every field as set, so it must pass the block count. The trained compression gates of transformer_ref load only under VIDEO_SPARSE_ATTN_H3, so the attention backend cannot change. dmd_denoising_steps must stay unset.

A MiniMax-H3 checkpoint without PDD fields, such as a DMD export, whose transformer carries VSA compression gates (to_gate_compress weights) also runs only with VIDEO_SPARSE_ATTN_H3. The pipeline reads the shard index (or the safetensors headers) and rejects any other backend, including automatic selection, before it loads any component.

Reference-video sparsity

Every PDD contract sets "vsa_ref_policy": "p2_multi_region", the only value FastVideo accepts, which means: VIDEO_SPARSE_ATTN_H3 tiles every reference video as its own sparse region, in place in the packed sequence. Each video query keeps vsa_ref_keep_rate of every reference video’s tiles and 1 - VSA_sparsity of the target video’s tiles. Text, audio, and image references stay dense. With VSA_sparsity 0, every region is dense and the reference keep rate has no effect. Checkpoints other than PDD students keep every conditioning row dense.

Hardware

The contract’s 128-token tiles, (4, 4, 8), run only on the sm_100a/sm_103a CUDA block-sparse kernel (B200, B300, GB200, GB300) of a fastvideo-kernel build with the Blackwell VSA extension. There is no Triton fallback for tile 128: the backend raises instead. Tile 128 runs eagerly. Regional compile requires 64-token tiles. With --num-gpus above 1 the example shards the DiT across the GPUs (FSDP) and splits the sequence across them.

On GB200, a 480x832, 124-frame request fits on one GPU: the eight forwards take about 54 s, and device memory in use peaks near 103 GiB. A 768x1344, 345-frame request with --num-gpus 4 takes about 36 s for the eight forwards. With the DiT sharded, peak allocated memory is about 66 GiB per GPU (about 95 GiB in use), against 83 GiB (103 GiB) with a full DiT copy on each GPU; the output is identical. Model loading and decoding come on top of this.

Apple Silicon

mlx_fasth3.py stays on FastH3 V1 and its uniform AdaLN cache. mlx_fasth3_8step.py is the eight-forward MLX recipe for FastH3 V2. It reads the same fastvideo_inference.json rungs and shifts, and it expects an MLX DiT whose AdaLN cache was converted from that contract. Reuse the V1 snapshot’s VAE, audio VAE, text encoder, and tokenizer; only the DiT and the sidecar change. Rank-reduced AdaLN checkpoints are unchanged and are not produced by the MLX converter.

Install is in the MLX install guide. Generation and serving are in the MiniMax H3 cookbook and the H3 server guide.

Was this page helpful?