--- title: FastH3 8-Step V2 emoji: ๐ŸŽฌ colorFrom: purple colorTo: green sdk: gradio sdk_version: 6.27.0 app_file: app.py short_description: 8-step MiniMax-H3 โ€” video with a matching soundtrack python_version: "3.12" startup_duration_timeout: 1h suggested_hardware: zero-a10g --- # FastVideo FastH3 8-Step V2 โ€” MiniMax-H3 in eight forward passes [`FastVideo/FastVideo-FastH3-8-Step-V2`](https://huggingface.co/FastVideo/FastVideo-FastH3-8-Step-V2) is a **data-free DMD2 + VSA-H3 distillation** (80% sparsity, 64-token tiles, step 1300) of [`MiniMaxAI/MiniMax-H3`](https://huggingface.co/MiniMaxAI/MiniMax-H3), the 33B dual-modality DiT that emits a video *and* its synchronized soundtrack from one denoising pass. The student keeps the teacher's architecture exactly and only replaces `transformer/`, so it is a drop-in for the same `diffusers` modular pipeline โ€” but it needs **eight** DiT forwards instead of fifty. Everything runs unquantized at **bfloat16**. ## The sampling contract: nine grid points, eight forwards, shift 10 The checkpoint ships its own inference contract in `fastvideo_inference.json`: ```json { "num_inference_steps": 9, "transformer_forwards": 8, "dmd_denoising_steps": [999, 874, 749, 624, 500, 375, 250, 125], "video_scheduler_shift": 10.0, "audio_scheduler_shift": 3.0, "guidance_scale": 1.0, "task": "t2av", "vsa_sparsity": 0.8 } ``` `MiniMaxH3Scheduler.set_timesteps(n)` builds `linspace(1, 0, n)`, applies the shift `ฯƒ' = sยทฯƒ / (1 + (sโˆ’1)ยทฯƒ)`, and then drops the trailing zero when it forms the timesteps โ€” so **`n` sigma grid points drive `n โˆ’ 1` model evaluations**. `linspace(1, 0, 9) ร— 1000` is `[1000, 875, 750, 625, 500, 375, 250, 125, 0]`, which is the trained rung ladder above: nine points, eight forwards. This Space therefore fixes `num_inference_steps = 9`, which is exactly what FastVideo's own reference script [`examples/inference/basic/basic_fasth3_8step.py`](https://github.com/hao-ai-lab/FastVideo/blob/main/examples/inference/basic/basic_fasth3_8step.py) pins (`GRID_POINTS = 9`) โ€” and that script *errors out* on any other value, because the trained ladder has eight rungs and a different grid is not a valid recipe for this student. It is not a knob. The V2-specific part of the recipe is the **video scheduler shift of 10.0**, against the base model's 12.0 (audio stays at 3.0). Both shifts live in this checkpoint's `scheduler/` and `audio_scheduler/` configs, so the schedule is read out of the checkpoint rather than hardcoded here; the app logs what it found at startup and warns if it is not 10.0. There is no CFG and no negative prompt โ€” the teacher is guidance-distilled and the student inherits that. ## Split across two Spaces MiniMax-H3 is ~196 GiB in bfloat16 and a ZeroGPU Space is evicted at 150 GB of storage, so the pipeline is cut at its text-encoder step: | half | components | size | where | |---|---|---|---| | conditioner | Qwen3-VL `text_encoder`, `processor`, `tokenizer` | 62 GiB | [`multimodalart/qwen3vl-conditioner`](https://huggingface.co/spaces/multimodalart/qwen3vl-conditioner) | | denoiser (this Space) | distilled `transformer`, `vae`, `audio_vae`, both schedulers | 80 GB on disk, 72 GiB resident | here | `prompt_embeds` + `text_token_tags` โ€” a safetensors file with the resolved canvas in its metadata header โ€” is the whole wire format between them. V2 ships the base release's conditioner verbatim, so that Space encodes this checkpoint exactly. Every request calls `/encode` over the gradio API; `gradio_client` attaches the caller's own ZeroGPU token, so the conditioner's booking is billed to whoever asked for the video. `h3_split_blocks.py` is `MiniMaxH3Blocks` with its `text_encoder` step removed, which also drops the three components that step declares โ€” so `load_components` never fetches `text_encoder/`, and never touches the `transformer_ref/` entry that this checkpoint's `modular_model_index.json` points back at the base repo. ## Placement, attention, and hardware - **`xlarge` ZeroGPU** (full 96 GB card). 72 GiB of weights plus activations does not fit a `large` 48 GiB slice. - **Lazy placement.** The pipeline is moved to CUDA on the first GPU call rather than packed at startup: `spaces` writes every startup-resident CUDA tensor to a second on-disk copy, and a 70.1 GB transformer would bust the 150 GB storage quota. Each cold worker pays ~11 s of PCIe, which the duration estimate books for. - **Dense attention (`_native_cudnn`).** The student was *trained* under VSA-H3 block-sparse attention and its sidecar asks for `VIDEO_SPARSE_ATTN_H3` with `vsa_kernel: sm100a` โ€” datacenter-Blackwell only. ZeroGPU is sm120, so the route here is dense; cuDNN's fused kernel is 10โ€“20% faster than the SDPA default on this pool. This is the one deliberate deviation from the checkpoint's reference config, and it is the same trade the 4-step sibling Space makes. - **The 50 unused tensors.** The distilled `transformer/` carries one extra `attn.to_gate_compress` per layer โ€” the trained VSA sparse-gate parameters. Dense inference does not read them, so diffusers reports them as unused and drops them; the resident module is byte-for-byte the shape of the base release's. - **Both autoencoders stay float32** (`_keep_in_fp32_modules` covers every module). A bfloat16 audio VAE decodes the soundtrack roughly 20 dB too quiet. The default canvas is one notch below the distillation's own operating point (`1344x768`, 124 frames, 24 fps): eight forwards is twice the 4-step sibling's GPU bill at the same size, and an `xlarge` booking is charged double against a visitor's ZeroGPU quota. The operating point is one dropdown away. ## Prompts MiniMax-H3 was trained on a structured request, not a caption: ```text integrated_multimodal_description: [Shot 1] ... [English] spoken line. [Shot 2] At 00:04.500, ... overall_soundscape: ... non_diegetic_music: ... ``` **Expand prompt** (on by default) sends a plain sentence through the conditioner's own Qwen3-VL language-model head first, which writes that format with the same weights that then encode it. All four bundled examples are the authors' own prompts: the structured one-liner from FastVideo's [`basic_fasth3_simplified.sh`](https://github.com/hao-ai-lab/FastVideo/blob/main/examples/inference/basic/basic_fasth3_simplified.sh), the plain-prose request from its [`basic_fasth3_spark.yaml`](https://github.com/hao-ai-lab/FastVideo/blob/main/examples/inference/basic/basic_fasth3_spark.yaml) (with that file's own seed, 2026), and two published showcase prompts from the [FastH3 blog post](https://haoailab.com/blogs/fasth3-preview/). ## Scope and limitations - **Text to video + audio only.** FL2VA (first/last-frame) and Ref2VA (reference) were not distilled for this checkpoint. - It is a **step-1300** checkpoint; difficult motion, fine detail, and some audio may still sit below the base MiniMax-H3 model's 50-step sampling. The 4-step sibling is faster, this one is better. - Inherits the [MiniMax H3 Community License](https://huggingface.co/FastVideo/FastVideo-FastH3-8-Step-V2/blob/main/LICENSE).