# MiniMaxAI/MiniMax-H3-Image — vLLM serving recipe

> Open-weight text-to-image and reference-image editing on the MiniMax-H3 DiT — six CFG-distilled steps per image, up to nine reference images, 2K-class canvases, served via vLLM-Omni

Configuration: hardware `h200` (8× H200) · variant `default` (BF16) · task `t2i`

- Interactive page: https://recipes.vllm.ai/MiniMaxAI/MiniMax-H3-Image
- This configuration as JSON: https://recipes.vllm.ai/MiniMaxAI/MiniMax-H3-Image.json?hardware=h200

The commands below were rendered for exactly this configuration and take precedence over any example in the guide.

## Other configurations

Change the query string (the same parameters as the page URL) and fetch this URL again. Unknown or incompatible values fall back to the recipe default, so check the Configuration line.

- `hardware`: `h100`, `h200`, `b200`, `gb200`, `b300`, `gb300`, `rtx_pro_6000_2x`, `rtx_pro_6000_4x`, `mi300x`, `mi325x`, `mi350x`, `mi355x`
- `variant`: `default`, `dlo`
- `task`: `t2i`, `i2i`

## Install

Requires vLLM >= 0.33.0.

MiniMax-H3-Image support is in vLLM-Omni source; install it on top of vLLM 0.33.0.

```bash
uv venv --python 3.12 --seed && source .venv/bin/activate
uv pip install vllm==0.33.0 --torch-backend=cu130
git clone https://github.com/vllm-project/vllm-omni.git && cd vllm-omni && uv pip install -e .
```

## Serve

vLLM-Omni recipe — the generation endpoints and request examples are in the guide below.

```bash
vllm serve MiniMaxAI/MiniMax-H3-Image \
  --host 0.0.0.0 \
  --num-gpus 4 \
  --usp 4 \
  --text-encoder-tp-size 4 \
  --port 8000 \
  --omni
```

## Guide

> Background reference. Commands in it are examples and may target another configuration — use the Serve section above.

### Overview

MiniMax-H3-Image generates and edits images with the MiniMax-H3 DiT
(33.1B, audio disabled), the base model's Qwen3-VL text encoder, a native
2D-decoder image VAE and fused per-step PDD output heads. Every request runs
six CFG-distilled steps and returns one image. A request with reference
images is an edit; there is no task flag.

| Component | Source | Precision | Parameters |
|---|---|---|---|
| DiT | `MiniMaxAI/MiniMax-H3-Image/transformer` | BF16 | 33.1B |
| Text encoder (Qwen3-VL) | `MiniMaxAI/MiniMax-H3/text_encoder` | BF16 | 33.4B |
| Image VAE | `MiniMaxAI/MiniMax-H3-Image/vae` | FP32 | 0.58B |

`model_index.json` names the base repository for the text encoder; vLLM-Omni
downloads only that folder. Plan for about 127 GB of disk.

### Request contract

- `num_inference_steps`: omit or 6. `guidance_scale`: omit or 1.
  `negative_prompt` is not supported. One image per request.
- `size` defaults to `1024x1024`. Requests below 2048² pixels are generated on
  a same-aspect canvas of at least 2048² (sides on a 32-pixel grid) and
  resized back with LANCZOS. Requesting the canvas size directly (2048x2048,
  2720x1536, 1536x2720, 2368x1760, 2496x1664, 3136x1344) skips the resize.
- `extra_args.min_generation_area` overrides the canvas area per request
  (32² to 4096²).
- Edits: give references at the canvas size of the requested aspect ratio and
  request that size for the best alignment; combine several changes into one
  edit rather than chaining edits.

### Deployment profiles

All rows were run on H200; the RTX PRO 6000 recipe has its own measurements.
Other accelerators reuse these commands sized from the H200 peaks
(configuration-only). DLO is `--diffusion-offload-config` with
`mode: layer`.

| GPUs | Profile | Extra flags | Peak / GPU | 2048² t2i |
|---|---|---|---|---|
| 1 | DiT resident, text encoder offloaded | `--num-gpus 1 --diffusion-offload-config '{"mode":"layer","components":["text_encoder"]}'` | 73.4 GiB | 3.2 s |
| 1 | DLO, DiT and text encoder | `--num-gpus 1 --diffusion-offload-config '{"mode":"layer","components":["dit","text_encoder"]}'` | 14.7 GiB | 8.3 s |
| 2 | Ulysses SP 2, resident | `--num-gpus 2 --usp 2 --text-encoder-tp-size 2` | 94.6 GiB | 1.5 s |
| 2 | Ulysses SP 2 + DLO (DiT AllGather) | `--num-gpus 2 --usp 2 --text-encoder-tp-size 2 --diffusion-offload-config '{"mode":"layer","components":["dit","text_encoder"],"layer_options":{"dit":{"weight_transfer":"allgather"},"text_encoder":{"weight_transfer":"rank-local"}}}'` | 12.0 GiB | 5.6 s |
| 2 | DiT TP 2, resident | `--num-gpus 2 --tensor-parallel-size 2 --usp 1 --text-encoder-tp-size 2` | 63.3 GiB | 1.5 s |
| 4 | Ulysses SP 4, resident (default) | `--num-gpus 4 --usp 4 --text-encoder-tp-size 4` | 81.3 GiB | 0.88 s |
| 4 | DiT TP 4, resident | `--num-gpus 4 --tensor-parallel-size 4 --usp 1 --text-encoder-tp-size 4` | 36.2 GiB | 1.0 s |

Full single-GPU residency needs an estimated 135 GiB and was not measured; it
is the natural choice on B200 and B300 (`--num-gpus 1`). On 80 GB H100, use DLO
on one or two GPUs, or TP 4 on four (SP 4 does not fit). On 96 GB RTX PRO 6000,
every resident layout fits (SP 2 peaks at 68.1 GiB, TP 2 at 49.7 GiB), and SP 4
is the fastest four-GPU layout over PCIe. Keep `resident_layers` at 0:
24 resident blocks ran at about 15 s per step on H200. CFG parallel and HSDP
are rejected; model CPU offload, quantization and cache acceleration are not
qualified.

### Measured latency (4×H200, SP 4)

Median of three warm requests at concurrency 1, client end-to-end time:

| Request | Latency |
|---|---|
| t2i 1024x1024 | 0.77 s |
| t2i 2048x2048 | 0.88 s |
| t2i 4736x3552 | 3.84 s |
| edit 2048x2048 (one reference) | 1.35 s |

Per-profile numbers and the correctness guard are in the in-repo recipe.

### References

- [Model card](https://huggingface.co/MiniMaxAI/MiniMax-H3-Image)
- [H200 recipe with measurements](https://github.com/vllm-project/vllm-omni/blob/main/recipes/MiniMaxAI/MiniMax-H3-Image-H200.md)
- [MiniMax-H3 recipe](https://recipes.vllm.ai/MiniMaxAI/MiniMax-H3)
