Signed-off-by: MosCloud <bwzhang1991@163.com> Co-authored-by: Hongsheng Liu <liuhongsheng4@huawei.com>
266 lines
9.2 KiB
Markdown
Executable File
266 lines
9.2 KiB
Markdown
Executable File
# MiniMax H3 on Ascend NPU
|
|
|
|
> Joint video and audio generation with text, first/last keyframes, and mixed
|
|
> image/video/audio references — Ascend NPU deployment guide
|
|
|
|
## Summary
|
|
|
|
- Vendor: MiniMaxAI
|
|
- Model: [`MiniMaxAI/MiniMax-H3`](https://huggingface.co/MiniMaxAI/MiniMax-H3)
|
|
- Tasks: T2VA, FL2VA, and Ref2VA
|
|
- Mode: OpenAI-compatible `/v1/videos` HTTP serving
|
|
- Hardware: Atlas 800I A3
|
|
- Maintainer: Community
|
|
|
|
This recipe adapts [MiniMax-H3.md](MiniMax-H3.md) for Ascend NPU
|
|
environments. Differences from the GPU path:
|
|
|
|
- Runs on a CPU-only (aarch64) PyTorch build with `torch_npu`; no CUDA
|
|
runtime is present.
|
|
- Audio loading does **not** require TorchCodec (whose aarch64 wheels are
|
|
built against CUDA torch and fail to load on CPU-only builds). vLLM-Omni
|
|
automatically falls back to soundfile / ffmpeg for wav/mp3/m4a/mp4 audio
|
|
inputs.
|
|
|
|
## Prerequisites
|
|
|
|
### Checkpoint
|
|
|
|
Same as the GPU recipe — Hugging Face access approval is required. Authenticate
|
|
once; `vllm serve` downloads the required nested components automatically:
|
|
|
|
```bash
|
|
hf auth login
|
|
export MODEL=MiniMaxAI/MiniMax-H3
|
|
```
|
|
|
|
### Environment
|
|
|
|
- Ascend driver & firmware: 25.5.1
|
|
- CANN toolkit: 9.0.1
|
|
- Python: 3.12
|
|
- PyTorch: 2.10.0+cpu
|
|
- torch_npu: 2.10.0.post2
|
|
- Install vLLM-Omni from a checkout with MiniMax H3 support:
|
|
|
|
```bash
|
|
uv venv
|
|
source .venv/bin/activate
|
|
uv pip install -e .
|
|
```
|
|
|
|
Install the **mindie-sd** operator library to enable Ascend-optimized fused
|
|
operators (`adalayernorm`, etc.) and the RainFusion `rf_v2` block-sparse
|
|
attention kernel:
|
|
|
|
```bash
|
|
git clone https://gitcode.com/Ascend/MindIE-SD.git && cd MindIE-SD
|
|
|
|
# Comment out the tik_ops build step (not needed for this use case)
|
|
sed -i 's|^\(\s*\)source ${current_script_dir}/build_tik_ops.sh|\1# source ${current_script_dir}/build_tik_ops.sh|' build/build_ops.sh
|
|
|
|
python setup.py bdist_wheel
|
|
cd dist
|
|
pip install mindiesd-*.whl
|
|
```
|
|
|
|
- `ffmpeg` and `ffprobe` must be available on `PATH`. They are used for
|
|
reference-video preparation and MP4 output.
|
|
- Reference-video decoding uses `decord` when available and falls back to
|
|
PyAV otherwise.
|
|
- Audio inputs do not require TorchCodec: wav/mp3/m4a/mp4 files are loaded
|
|
at native sample rate through the soundfile / ffmpeg fallback.
|
|
|
|
## Start a server
|
|
|
|
Pass the repository ID directly. The pipeline loads the two nested DiTs while
|
|
sharing the tokenizer, processor, text encoder, and VAEs from `FL2VA`.
|
|
|
|
### Multi-NPU: 768P combined-service configuration
|
|
|
|
Use Ulysses sequence parallelism degree 8, text-encoder tensor parallelism
|
|
degree 8, native tiled VAE patch parallelism degree 8, and distributed
|
|
layerwise offload:
|
|
|
|
```bash
|
|
export ASCEND_RT_VISIBLE_DEVICES=0,1,2,3,4,5,6,7
|
|
export PORT=9098
|
|
export MODEL=MiniMaxAI/MiniMax-H3
|
|
export VLLM_WORKER_MULTIPROC_METHOD=spawn
|
|
export VLLM_OMNI_VIDEO_SYNC_TIMEOUT=1800
|
|
export PYTHONDONTWRITEBYTECODE=1
|
|
|
|
vllm serve "${MODEL}" \
|
|
--omni \
|
|
--host 0.0.0.0 \
|
|
--port "${PORT}" \
|
|
--trust-remote-code \
|
|
--num-gpus 8 \
|
|
--usp 8 \
|
|
--ring 1 \
|
|
--text-encoder-tp-size 8 \
|
|
--enable-distributed-layerwise-offload \
|
|
--vae-parallel-mode tile \
|
|
--vae-use-tiling \
|
|
--vae-patch-parallel-size 8 \
|
|
--diffusion-attention-backend FLASH_ATTN
|
|
```
|
|
|
|
Do not add `--enforce-eager`. The first request includes regional
|
|
compilation; warm the server once before measuring steady-state latency.
|
|
H3 is CFG-distilled, so `--cfg-parallel-size` must remain 1.
|
|
|
|
The same endpoint accepts `task=t2va`, `task=fl2va`, and `task=ref2va`; no
|
|
partition restart is required. Layerwise offload applies to both DiTs.
|
|
|
|
On Atlas 800I A3 (64 GB HBM per device) the combined service does not fit at
|
|
768P without offloading or sharding: use distributed layerwise offload (as
|
|
above) or HSDP — see
|
|
[§ Memory and attention optimizations](#memory-and-attention-optimizations-a3).
|
|
|
|
### CPU MP4 response encoding (Atlas A2)
|
|
|
|
Non-streaming MP4 responses use one public automatic encoder. It checks the
|
|
runtime frame shape, common dtype, and RGB channel-plane contiguity for every
|
|
request; compatible inputs use direct planar PyAV frames, while unsupported
|
|
inputs fall back to the legacy muxer before opening the PyAV container. No CLI
|
|
flag, model declaration, or user configuration is required. Streaming fMP4
|
|
output remains on its existing incremental path.
|
|
|
|
Current performance and correctness validation is limited to one Atlas A2 host
|
|
with 8x Ascend 910B4-1 NPUs, the `FL2VA`/`t2va` partition, one request at a
|
|
time, 1344x768 at 24 fps, and 5, 8.7, and 15 second requests. This optimization
|
|
only changes CPU MP4 response encoding; it does not change DiT execution or
|
|
stage 0.
|
|
|
|
### Optional optimizations
|
|
|
|
Two independent optimizations may be enabled on top of the configuration
|
|
above. Both are validated for T2VA only.
|
|
|
|
**RainFusion block-sparse attention** — switch the attention backend, keeping
|
|
every other flag unchanged:
|
|
|
|
```bash
|
|
--diffusion-attention-backend RAINFUSION_ATTN
|
|
```
|
|
|
|
**INT8 online quantization** — add one flag to the server command above:
|
|
|
|
```bash
|
|
--quantization int8
|
|
```
|
|
|
|
Keep `--ring 1` when using RainFusion: the `rf_v2` kernel ranks key blocks
|
|
over the whole sequence, so ring parallelism would split away the keys it
|
|
needs. Scale with `--usp` instead.
|
|
|
|
## Memory and attention optimizations (A3)
|
|
|
|
### Fitting 768P into 64 GB HBM: distributed layerwise offload or HSDP
|
|
|
|
Each Atlas 800I A3 NPU has 64 GB of HBM, which is not enough for the
|
|
combined MiniMax-H3 service at 768P. Enable **one** of the following at
|
|
server startup:
|
|
|
|
**Distributed layerwise offload** — DiT layers are offloaded with parameters
|
|
gathered across the parallel group instead of replicated per rank:
|
|
|
|
```bash
|
|
--enable-distributed-layerwise-offload
|
|
```
|
|
|
|
Measured peak NPU memory is about 45 GB per device for Ref2VA with a 13.88 s
|
|
input video generating a 15 s 768P (1344x768) output video. Host (CPU) memory
|
|
usage is high with this option.
|
|
|
|
**HSDP** — hybrid sharded data parallelism for the DiT parameters. The
|
|
multi-stream memory-reuse knob is mandatory with this flag:
|
|
|
|
```bash
|
|
export MULTI_STREAM_MEMORY_REUSE=2
|
|
```
|
|
|
|
```bash
|
|
--use-hsdp
|
|
```
|
|
|
|
Host memory usage is small, but large shapes may still OOM; HBM usage
|
|
optimizations for this path are ongoing.
|
|
|
|
### FLASH_ATTN backend with MindIE-SD
|
|
|
|
Keep `--diffusion-attention-backend FLASH_ATTN` and install MindIE-SD (see
|
|
[§ Environment](#environment)). On NPU this backend carries most of the
|
|
memory-reduction and performance work: a mask-free packed varlen path that
|
|
never materializes the quadratic `full_qk` padding mask, and K/V prefix
|
|
slicing, both driven by the packed `cu_seqlens` metadata emitted by the H3
|
|
transformer.
|
|
|
|
### Optional: LaserAttention fused kernel
|
|
|
|
For an additional attention speedup, select the Ascend LaserAttention fused
|
|
kernel before starting the server:
|
|
|
|
```bash
|
|
export MINDIE_SD_FA_TYPE="ascend_laser_attention"
|
|
```
|
|
|
|
This requires the FLASH_ATTN backend and MindIE-SD. H3 automatically applies
|
|
exact power-of-two input pre-scaling (`laser_input_scale=256`) so the
|
|
kernel's fp16 workspace cannot overflow on outlier activations. Measured
|
|
speedup numbers will be added here.
|
|
|
|
|
|
## HTTP API examples
|
|
|
|
The request format is identical to the GPU recipe; see
|
|
[MiniMax-H3.md § HTTP API examples](MiniMax-H3.md#http-api-examples).
|
|
Use the validated 768P shapes (e.g. `width=1344 height=768`) on NPU.
|
|
|
|
## Key parameters
|
|
|
|
Same as the GPU recipe; see
|
|
[MiniMax-H3.md § Key parameters](MiniMax-H3.md#key-parameters).
|
|
The validated resolution on NPU is 768P (e.g. 1344x768).
|
|
|
|
## Validated NPU evidence
|
|
|
|
Measured on an Atlas 800I A3 server (8x NPU) with CANN 9.0.1,
|
|
PyTorch 2.10.0+cpu, and torch_npu 2.10.0.post2, using the multi-NPU
|
|
configuration above:
|
|
|
|
| Workload | Configuration |
|
|
|----------|---------------|
|
|
| T2VA, 209 frames, 1344x768 | TE TP8, distributed layerwise offload, Ulysses 8, VPP8 tile, regional compile |
|
|
| Ref2VA (prompt + video), 124 frames, 1344x768 | TE TP8, distributed layerwise offload, Ulysses 8, VPP8 tile, regional compile |
|
|
|
|
These measurements describe the validated shapes rather than a general
|
|
throughput guarantee.
|
|
|
|
## Known limitations
|
|
|
|
- Combined serving requires sibling `FL2VA` and `Ref2VA` directories, loads
|
|
both task-specific DiTs, and loads one copy of every shared component.
|
|
- H3 currently executes one generation request per diffusion batch.
|
|
- The first regional-compile request is a warmup and should not be included
|
|
in steady-state performance measurements.
|
|
- The official H3 input matrix and media limits are documented in the [GPU
|
|
recipe](MiniMax-H3.md#official-input-matrix-and-limits); this NPU path uses
|
|
the same HTTP request contract.
|
|
- VAE patch parallelism requires size 1 or the full DiT group size and
|
|
supports the H3 native `tile` mode only.
|
|
- RainFusion block-sparse attention and INT8 quantization are validated for
|
|
T2VA only; use the BF16 dense configuration for FL2VA and Ref2VA.
|
|
- Online quantization cannot be combined with distributed layerwise offload
|
|
while AllGather is enabled; pass `--dlo-no-use-allgather` in that case.
|
|
|
|
## Additional resources
|
|
|
|
- [MiniMax-H3.md](MiniMax-H3.md) — full GPU guide
|
|
- [Attention backends § RAINFUSION_ATTN](../../docs/user_guide/diffusion/attention_backends.md#rainfusion_attn-backend-and-block-sparse-video-attention)
|
|
— RainFusion knobs and tuning
|
|
- [Int8 quantization](../../docs/user_guide/quantization/int8.md)
|
|
- [Supported models](../../docs/models/supported_models.md)
|
|
- [Video API](../../docs/serving/videos_api.md)
|