Spaces:
Running on Zero
Running on Zero
| """The denoising half of a **split** MiniMax-H3 deployment. | |
| MiniMax-H3 is ~196 GiB in bfloat16 and a ZeroGPU Space is evicted at 150 GB of storage, so `MiniMaxH3Blocks` is cut at | |
| its `text_encoder` step: the 62.14 GiB Qwen3-VL conditioner runs in its own Space and everything else — the distilled | |
| transformer and the two autoencoders — runs here. `prompt_embeds` + `text_token_tags` is the whole wire format between | |
| the two halves. | |
| For a text-only (`t2va`) request the full `MiniMaxH3Blocks` sequence is `before_encode -> text_encoder -> vae_encoder | |
| -> denoise -> decode`, and the two `Auto*` encoder steps select nothing without a keyframe or a reference. What is | |
| left once the text encoder goes is exactly `MiniMaxH3CoreDenoiseStep -> MiniMaxH3DecodeStep`, and those two declare | |
| only `transformer`, the two schedulers, both autoencoders and `video_processor` — so `load_components` resolves those | |
| out of the checkpoint's `modular_model_index.json` and never fetches the conditioner or the `ref2va` partition. | |
| Adapted from `multimodalart/minimax-h3`, trimmed to the `t2va` (text -> video + audio) branch this Space serves. | |
| """ | |
| import torch | |
| from diffusers.modular_pipelines.minimax_h3.modular_blocks_minimax_h3 import ( | |
| MiniMaxH3CoreDenoiseStep, | |
| MiniMaxH3DecodeStep, | |
| ) | |
| from diffusers.modular_pipelines.modular_pipeline import SequentialPipelineBlocks | |
| from diffusers.modular_pipelines.modular_pipeline_utils import OutputParam | |
| class MiniMaxH3GeneratorBlocks(SequentialPipelineBlocks): | |
| """The denoising half of a split MiniMax-H3: the `t2va` branch of `MiniMaxH3Blocks` without its text encoder.""" | |
| model_name = "minimax-h3" | |
| block_classes = [MiniMaxH3CoreDenoiseStep, MiniMaxH3DecodeStep] | |
| block_names = ["denoise", "decode"] | |
| def description(self): | |
| return ( | |
| "The denoising half of a split MiniMax-H3 deployment: the `t2va` branch of `MiniMaxH3Blocks` without its " | |
| "text-encoder step, so `prompt_embeds` and `text_token_tags` come in as inputs and the 62.14 GiB Qwen3-VL " | |
| "conditioner is never loaded here." | |
| ) | |
| def outputs(self): | |
| return [ | |
| OutputParam.template("videos", description="The generated video."), | |
| OutputParam( | |
| "audio", | |
| type_hint=torch.Tensor, | |
| description="The generated soundtrack, of shape `(1, 2, num_samples)`.", | |
| ), | |
| OutputParam("sampling_rate", type_hint=int, description="Sample rate of the generated soundtrack in Hz."), | |
| ] | |