Image-Text-to-Video
Diffusers
Safetensors
text-to-video
image-to-video
video-to-video
text-to-audio-video
image-to-audio-video
image-text-to-audio-video
video-to-audio-video
audio-to-audio-video
audio-video-generation
multimodal
synchronized-audio-video
reference-to-audio-video
Instructions to use MiniMaxAI/MiniMax-H3 with libraries, inference providers, notebooks, and local apps. Follow these links to get started.
- Libraries
- Diffusers
How to use MiniMaxAI/MiniMax-H3 with Diffusers:
pip install -U diffusers transformers accelerate
import torch from diffusers import DiffusionPipeline # switch to "mps" for apple devices pipe = DiffusionPipeline.from_pretrained("MiniMaxAI/MiniMax-H3", dtype=torch.bfloat16, device_map="cuda") prompt = "Astronaut in a jungle, cold color palette, muted colors, detailed, 8k" image = pipe(prompt).images[0] - Notebooks
- Google Colab
- Kaggle
| # SPDX-License-Identifier: Apache-2.0 | |
| # Remote entry: self-contained MiniMax H3 visual VAE (3D CNN encoder + ViT3D decoder). | |
| # Loaded via config.json:auto_map with trust_remote_code. | |
| from __future__ import annotations | |
| import json | |
| from pathlib import Path | |
| import safetensors.torch | |
| import torch.nn as nn | |
| # --- dependency manifest --- | |
| # diffusers' dynamic-module loader only copies ONE level of relative | |
| # imports into its cache; list every bundle module here so all files | |
| # are copied, letting their own second-level imports resolve. | |
| from .attention import Attention as _dep_attention # noqa: F401 | |
| from .base_module import FeedForward as _dep_base_module # noqa: F401 | |
| from .conv import SpatialParallelConv3d as _dep_conv # noqa: F401 | |
| from .flash import make_block_causal_mask_mod as _dep_flash # noqa: F401 | |
| from .func import create_token_ids as _dep_func # noqa: F401 | |
| from .klvae import AutoencoderKL as _dep_klvae # noqa: F401 | |
| from .norm import FusedGroupNorm3D as _dep_norm # noqa: F401 | |
| from .normalize import get_norm_constants as _dep_normalize # noqa: F401 | |
| from .parallel import get_parallel_state as _dep_parallel # noqa: F401 | |
| from .utils import apply_spatial_parallel as _dep_utils # noqa: F401 | |
| from .vae_cnn import EncoderFCN3D as _dep_vae_cnn # noqa: F401 | |
| from .vae_module import DiagonalGaussianDistribution as _dep_vae_module # noqa: F401 | |
| from .vae_processor import VAEProcessor as _dep_vae_processor # noqa: F401 | |
| from .vae_vit import ViTBase as _dep_vae_vit # noqa: F401 | |
| # --- end dependency manifest --- | |
| from .klvae import AutoencoderKLLegacy | |
| from .parallel import get_parallel_state | |
| _SOURCE_CLASSES = { | |
| "AutoencoderKLLegacy": AutoencoderKLLegacy, | |
| } | |
| def _ensure_vae_parallel_state() -> None: | |
| """Seed the bundled VAE parallel state for single-process inference.""" | |
| state = get_parallel_state() | |
| if not isinstance(state, dict): | |
| raise TypeError("get_parallel_state() must return a dict") | |
| if state: | |
| return | |
| state.update( | |
| { | |
| "group_size": 1, | |
| "group_rank": 0, | |
| "local_process_group": None, | |
| "sp_size": 1, | |
| "sp_rank": 0, | |
| "sp_enabled": False, | |
| "sp_process_group": None, | |
| "tp_size": 1, | |
| "tp_rank": 0, | |
| } | |
| ) | |
| class MiniMaxH3VideoVAE(nn.Module): | |
| def __init__(self, model: nn.Module) -> None: | |
| super().__init__() | |
| self.model = model | |
| def from_pretrained(cls, pretrained_model_name_or_path: str, **kwargs): | |
| component_dir = Path(pretrained_model_name_or_path) | |
| with (component_dir / "config.json").open("r", encoding="utf-8") as f: | |
| config = json.load(f) | |
| source_path = component_dir / config["source_path"] | |
| source_class_name = config["source_class_name"] | |
| if source_class_name not in _SOURCE_CLASSES: | |
| raise ValueError( | |
| f"unsupported source_class_name {source_class_name!r}; " | |
| f"bundled: {sorted(_SOURCE_CLASSES)}" | |
| ) | |
| source_cls = _SOURCE_CLASSES[source_class_name] | |
| if "source_safetensors_path" not in config: | |
| raise ValueError( | |
| "source_safetensors_path is required; pickle checkpoints are " | |
| "not supported" | |
| ) | |
| weights_path = source_path / config["source_safetensors_path"] | |
| if not weights_path.is_file(): | |
| raise FileNotFoundError(f"source weights not found: {weights_path}") | |
| if bool(config["vae_parallel_tiling"]): | |
| _ensure_vae_parallel_state() | |
| load_kwargs = { | |
| "clip_length": int(config["vae_clip_length"]), | |
| "token_drop": int(config["vae_token_drop"]), | |
| "encoder_tiling": int(config["vae_encoder_tiling"]), | |
| "decoder_tiling": int(config["vae_decoder_tiling"]), | |
| "parallel_tiling": int(config["vae_parallel_tiling"]), | |
| "tile_size": int(config["vae_tile_size"]), | |
| "tile_overlap_min": int(config["vae_tile_overlap_min"]), | |
| "encoder_parallel": int(config["vae_encoder_parallel"]), | |
| "decoder_parallel": int(config["vae_decoder_parallel"]), | |
| "chunk_dim": int(config["vae_chunk_dim"]), | |
| } | |
| # Mirror diffusers ModelMixin.from_pretrained instantiation semantics | |
| # (config-driven init via from_config) but load the state dict from an | |
| # explicitly named safetensors file instead of the diffusers default | |
| # weight filename. | |
| source_config = source_cls.load_config(str(source_path)) | |
| model, _unused = source_cls.from_config( | |
| source_config, return_unused_kwargs=True, **load_kwargs | |
| ) | |
| state_dict = safetensors.torch.load_file(str(weights_path)) | |
| model.load_state_dict(state_dict, strict=True) | |
| model.eval() | |
| return cls(model) | |
| def forward(self, *args, **kwargs): | |
| return self.model(*args, **kwargs) | |
| def __getattr__(self, name: str): | |
| try: | |
| return super().__getattr__(name) | |
| except AttributeError: | |
| return getattr(self.model, name) | |