mcuo's picture
|
download
raw
6.65 kB
---
title: PlagueKind MiniMax H3
emoji: ๐ŸฆŠ
colorFrom: gray
colorTo: indigo
sdk: gradio
sdk_version: 6.20.0
app_file: app.py
short_description: The PlagueKind V1.5 workflow for MiniMax-H3 video + audio
license: gpl-3.0
startup_duration_timeout: 1h
suggested_hardware: zero-a10g
---
# `Plaguekind/Minimax-H3` โ€” the V1.5 workflow, as a Space
[`Plaguekind/Minimax-H3`](https://huggingface.co/Plaguekind/Minimax-H3) ships **no weights**. It is a ComfyUI graph
(`PlagueKind-MinimaxH3-V1.5.json`) over [`Comfy-Org/MiniMax-H3`](https://huggingface.co/Comfy-Org/MiniMax-H3), and
everything it contributes is in the sampling and the post chain. So what this Space reproduces is the *graph*, on the
[`MiniMaxAI/MiniMax-H3`](https://huggingface.co/MiniMaxAI/MiniMax-H3) diffusers checkpoint.
**MiniMax-H3** is a 33B-parameter single-stream omni DiT that denoises video and a synchronized stereo soundtrack โ€”
ambience, foley, speech โ€” as one packed sequence, in one pass. Text-to-video, first frame, last frame, or both.
## What the workflow changes
| ComfyUI node | widget | here |
|---|---|---|
| `KSamplerSelect` | `euler` | MiniMax-H3's only sampler; the checkpoint is CFG-distilled, so one forward per step and no negative prompt |
| `BasicScheduler` | `linear_quadratic`, 15 steps, denoise 1.0 | **Sigma schedule** / **Steps** โ€” `pk_workflow.linear_quadratic_sigmas` |
| `MiniMaxH3ImageToVideo` | prompt, first/last frame | **Prompt** / **First frame** / **Last frame** |
| `UnifiedResizeImageMask` ("Target Dimension") | longer side 1344 | **Target dimension** |
| `ImageSharpenKJ` | `rcas`, 0.3 | **RCAS sharpening** โ€” `pk_workflow.rcas` |
| `FrameInterpolate` + `FrameInterpolationModelLoader` | `film_net_fp16.safetensors`, multiplier 2 | **FILM frame interpolation** โ€” `pk_workflow.interpolate` |
| `CreateVideo` | fps `24 * 2` | 48 fps output |
| `ComfyMathExpression` | `max(5, round(a*24)) + (5 - (โ€ฆ % 17)) % 17` | **Duration** snapped to `17n + 5` frames |
| `RTXVideoSuperResolution` | 2x, `ULTRA` | **not reproduced** |
| `PathchSageAttentionKJ` | `sageattn_qk_int8_pv_fp8_cuda++` | cuDNN fused attention |
The sigma schedule is the part that changes the pixels most, and the part that is easy to get subtly wrong.
`linear_quadratic` is Mochi's schedule, ported from `comfy/samplers.py`: half the steps crawl through the first 2.5 %
of the trajectory and the rest sprint the remaining 97.5 %, which is why PlagueKind's 15 steps hold up against ~28 of
MiniMax-H3's native grid.
Transplanting it into `diffusers` exactly needs one observation. MiniMax-H3 carries **two** rectified-flow schedules
per request, `shift = 12` for the video rows and `shift = 3` for the audio rows. `diffusers` builds both from one
`linspace(1, 0, steps)` base grid; ComfyUI instead samples the *video* schedule and derives the audio one in closed
form (`comfy/ldm/minimax/model.py::time_shift_sigma`). The two agree, because the exponential shift is a bijection of
the base grid that fixes both 0 and 1 โ€” so handing `MiniMaxH3Scheduler.set_timesteps` the `linear_quadratic` grid for
the video stream and `time_shift_sigma(grid, 12, 3)` for the audio stream is the ComfyUI path, not an approximation of
it.
### Two deliberate deviations
- **`RTXVideoSuperResolution`** is NVIDIA's NGX super-resolution, shipped as a driver-level Windows/RTX component with
no Linux Python path. The workflow's 2x upscale is therefore missing; pick a larger **Target dimension** instead of
upscaling a small one.
- **SageAttention**'s `qk_int8_pv_fp8_cuda++` kernel is not built for this pool's sm120 cards. Attention runs cuDNN's
fused kernel, which is both the fastest available here and the numerically faithful choice โ€” SageAttention is a
quantized approximation of it.
### One upgrade
The workflow loads `minimax_h3_fl2va_pruned_int8_convrot.safetensors` and a `qwen3vl_32b_โ€ฆ_int8_convrot` text encoder
because that is what fits a consumer card. This Space runs both **unquantized bfloat16**.
## Why the deployment is split
MiniMax-H3 at bfloat16 is 195.9 GiB, and a Space is evicted above 150 GB of storage. So the halves live apart:
- **this Space** โ€” the 61.73 GiB transformer and the two autoencoders (10.43 GiB, float32: a bfloat16 audio VAE
decodes the soundtrack about 20 dB too quiet). 77.3 GB downloaded.
- **[`multimodalart/qwen3vl-conditioner`](https://huggingface.co/spaces/multimodalart/qwen3vl-conditioner)** โ€” the
62.14 GiB Qwen3-VL text encoder, called over the gradio API once per request. `prompt_embeds` +
`text_token_tags` in a safetensors file is the whole wire format. `gradio_client` forwards the caller's own ZeroGPU
token, so that booking is billed to whoever asked for the video.
`H3_PLACEMENT=pack` moves only the transformer to CUDA at startup: `spaces` packs every startup-resident CUDA tensor
into a second on-disk copy, and packing all 77.3 GB busts the storage quota while the 61.7 GB transformer alone fits.
The VAEs move on the first GPU call. `H3_GPU_SIZE=xlarge` is required โ€” `large` does not fit. `H3_AOTI=1` loads
[`multimodalart/minimax-h3-aoti`](https://huggingface.co/multimodalart/minimax-h3-aoti), one ahead-of-time-compiled
transformer block serving all 50, which removes roughly 0.5 s/step.
## Measured
The default request โ€” 960x544, 124 frames (5.167 s), 15 steps of `linear_quadratic`, RCAS 0.3, FILM 2x to 48 fps:
| | |
|---|---|
| startup | 97โ€“153 s (77.3 GB over Xet, 50 AoTI blocks patched) |
| denoise + both decoders | 61 s, 4.1 s/step |
| RCAS + FILM + h264 mux | 9 s |
| **booked ZeroGPU** | **89 s** for a 70 s call |
First-and-last-frame at the same canvas costs 79 s โ€” the two keyframes add 510 conditioning rows each โ€” and its
output's first and last frames reproduce the supplied keyframes to a mean absolute error of 2โ€“3/255. The estimator is
quadratic in the canvas, so 1344x768 is roughly 2.7x the denoise of 960x544; every run prints its measured GPU time
against what it booked.
## Files
| file | |
|---|---|
| `app.py` | the demo |
| `pk_workflow.py` | the workflow's own parts: `linear_quadratic` sigmas, RCAS, FILM |
| `film_net.py` | FILM, vendored from ComfyUI (GPL-3.0) |
| `h3_split_blocks.py` | the modular blocks that skip the text encoder |
| `h3_aoti.py` | the AoTI package loader |
## License
The demo code is GPL-3.0, because `film_net.py` is vendored from [ComfyUI](https://github.com/comfyanonymous/ComfyUI)
and `pk_workflow.py` ports kernels from ComfyUI and
[ComfyUI-KJNodes](https://github.com/kijai/ComfyUI-KJNodes), both GPL-3.0. The workflow itself is MIT; the
`MiniMaxAI/MiniMax-H3` weights carry their own license.

Xet Storage Details

Size:
6.65 kB
ยท
Xet hash:
391702ef75a016d85f7454bc95e7245fafd96b6b9990bb4f322ed99b02f72f2e

Xet efficiently stores files, intelligently splitting them into unique chunks and accelerating uploads and downloads. More info.