voice_audio_multi/docs/reports/minimax_h3_performance.md
Fabio c36510c21e
Some checks failed
Linux Build / Linux cpu (push) Has been cancelled
Linux Build / Linux cpu-clang (push) Has been cancelled
Linux Build / Linux vulkan (push) Has been cancelled
mac-build / macOS CPU (push) Has been cancelled
Nix Build / Nix (cpu) (push) Has been cancelled
Nix Build / Nix (vulkan) (push) Has been cancelled
windows-build / Windows CPU (push) Has been cancelled
Initial import: audio.cpp with Orange Pi documentation
2026-11-04 19:05:22 +01:00

9.7 KiB

MiniMax-H3 Performance Notes

Date: 2026-08-11

Branch: dev

Hardware: NVIDIA GeForce RTX 5090, CUDA backend, server threads=8

This check compares the normal DiT GGUF against the INT8 ConvRot DiT GGUF in server mode. Server detailed logging was disabled. Each model variant used a separate server process:

Variant DiT file
DiT dit.gguf
INT8 ConvRot DiT dit_int8.gguf

Each server received one short warmup request first, then three measured requests in the same session: none, spectrum, and first_block_cache.

Prompt:

A lively four-speaker podcast roundtable in a small studio. The host, Maya, is warm and curious. The comedian, Leo, is playful and quick. The scientist, Dr. Chen, is thoughtful and calm. The producer, Sam, is dry and amused. Maya says, "Welcome back to Tiny Big Questions, where today we ask whether coffee makes us productive or just louder." Leo says, "I vote louder. My notes are mostly exclamation marks and one drawing of a croissant." Dr. Chen says, "I think the ritual matters more than the caffeine. The cup gives your brain a starting line." Sam says, "My brain missed the starting line and is currently looking for parking." The speakers laugh naturally, overlap lightly, react to each other, and continue in a friendly conversational rhythm with clear distinct voices, no music, and no background noise.

Shared measured-request options:

Option Value
seed 20260808
height 32
width 32
num_frames 481
num_inference_steps 20
guidance_scale 1.0
return_video false
minimax_h3.mem_saver default true

Warmup used num_inference_steps=2, num_frames=21, and dit_acceleration=none.

Results

DiT file Acceleration Wall ms Audio sec RTF x realtime Peak VRAM MiB Speedup vs dit.gguf
dit.gguf none 12886.40 20.05 0.6427 1.56x 16513 baseline
dit_int8.gguf none 11692.00 20.05 0.5831 1.71x 18406 9.3%
dit.gguf spectrum 7501.48 20.05 0.3741 2.67x 16617 baseline
dit_int8.gguf spectrum 7331.46 20.05 0.3657 2.73x 18522 2.3%
dit.gguf first_block_cache 8270.58 20.05 0.4125 2.42x 17389 baseline
dit_int8.gguf first_block_cache 7887.51 20.05 0.3934 2.54x 19286 4.6%

Peak VRAM was sampled with nvidia-smi during each server session. The per-row peak is estimated from the request timing interval. Whole-session peak was 17389 MiB for dit.gguf and 19286 MiB for dit_int8.gguf.

ASR Check

The common transcript content matched the main spoken prompt: Tiny Big Questions, coffee/caffeine/productivity, notes/exclamation marks/croissant, ritual/cup, starting line, and parking. ASR made small recognition errors such as coffee -> cocky and several variants of croissant, but none of the six outputs collapsed into noise.

30s DiT Step Sweep

These sweeps used CUDA server mode, threads=8, num_frames=721, height=32, width=32, guidance_scale=1.0, and seed=20260808. The prompt was a plain quoted reading passage sized for the 30s target. Framework Nemotron ASR (nemotron_asr) was used for the transcript check, and WER is computed against the quoted passage after simple lowercase alphanumeric token normalization.

dit.gguf, dit_acceleration=none:

DiT steps Wall ms Audio sec RTF x realtime Nemotron ASR WER
4 6937.46 30.675 0.2262 4.42x 100.0%
8 9410.08 30.675 0.3068 3.26x 39.1%
12 12090.60 30.675 0.3942 2.54x 1.6%
16 14629.50 30.675 0.4769 2.10x 1.6%
20 17213.50 30.675 0.5612 1.78x 1.6%
24 20091.70 30.675 0.6550 1.53x 1.6%

dit.gguf, dit_acceleration=spectrum:

DiT steps Wall ms Audio sec RTF x realtime Nemotron ASR WER
4 6320.38 30.675 0.2060 4.85x 100.0%
8 7080.35 30.675 0.2308 4.33x 100.0%
12 7720.13 30.675 0.2517 3.97x 1.6%
16 8479.36 30.675 0.2764 3.62x 4.7%
20 9270.63 30.675 0.3022 3.31x 6.2%
24 9916.69 30.675 0.3233 3.09x 3.1%

dit.gguf, dit_acceleration=first_block_cache:

DiT steps Wall ms Audio sec RTF x realtime Nemotron ASR WER
4 6801.17 30.675 0.2217 4.51x 100.0%
8 9685.66 30.675 0.3158 3.17x 39.1%
12 9546.81 30.675 0.3112 3.21x 18.8%
16 10860.90 30.675 0.3541 2.82x 4.7%
20 11016.10 30.675 0.3591 2.78x 1.6%
24 11726.50 30.675 0.3823 2.62x 6.2%

dit_int8.gguf, dit_acceleration=none:

DiT steps Wall ms Audio sec RTF x realtime Nemotron ASR WER
4 6752.33 30.675 0.2201 4.54x 56.2%
8 8822.52 30.675 0.2876 3.48x 4.7%
12 11036.60 30.675 0.3598 2.78x 3.1%
16 13253.00 30.675 0.4320 2.31x 3.1%
20 15373.80 30.675 0.5012 2.00x 3.1%
24 17600.10 30.675 0.5738 1.74x 3.1%

dit_int8.gguf, dit_acceleration=spectrum:

DiT steps Wall ms Audio sec RTF x realtime Nemotron ASR WER
4 6343.60 30.675 0.2068 4.84x 100.0%
8 6960.58 30.675 0.2269 4.41x 51.6%
12 7520.18 30.675 0.2452 4.08x 12.5%
16 8187.32 30.675 0.2669 3.75x 10.9%
20 8783.71 30.675 0.2863 3.49x 3.1%
24 9488.47 30.675 0.3093 3.23x 3.1%

dit_int8.gguf, dit_acceleration=first_block_cache:

DiT steps Wall ms Audio sec RTF x realtime Nemotron ASR WER
4 6849.84 30.675 0.2233 4.48x 56.2%
8 8927.28 30.675 0.2910 3.44x 4.7%
12 8973.95 30.675 0.2925 3.42x 21.9%
16 10095.00 30.675 0.3291 3.04x 12.5%
20 10259.20 30.675 0.3345 2.99x 45.3%
24 10916.50 30.675 0.3559 2.81x 1.6%

In this 30s reading case, the fastest stable measured point was dit.gguf + spectrum at 12 steps. The normal DiT path also reached stable ASR at 12 steps, but with higher RTF. INT8 without acceleration was transcript-stable by roughly 8-12 steps, while INT8 + first_block_cache needed 24 steps in this run.

CUDA 13 Server Sweep

This sweep reran the 30s reading case in CUDA 13 server mode with dit_acceleration=none. It used the same threads=8, num_frames=721, height=32, width=32, guidance_scale=1.0, seed, prompt, and short warmup shape as the CUDA 12.9 server rows above.

dit.gguf, CUDA 13:

DiT steps Wall ms Audio sec RTF x realtime Gain vs CUDA 12.9
4 6901.74 30.675 0.2250 4.44x +0.5%
8 9434.47 30.675 0.3076 3.25x -0.3%
12 11973.10 30.675 0.3903 2.56x +1.0%
16 14506.40 30.675 0.4729 2.11x +0.8%
20 17244.20 30.675 0.5622 1.78x -0.2%
24 19856.10 30.675 0.6473 1.54x +1.2%

dit_int8.gguf, CUDA 13:

DiT steps Wall ms Audio sec RTF x realtime Gain vs CUDA 12.9
4 6871.01 30.675 0.2240 4.46x -1.8%
8 8815.82 30.675 0.2874 3.48x +0.1%
12 10860.00 30.675 0.3540 2.82x +1.6%
16 13167.40 30.675 0.4293 2.33x +0.6%
20 15081.60 30.675 0.4917 2.03x +1.9%
24 17179.80 30.675 0.5601 1.79x +2.4%

For this no-acceleration server sweep, CUDA 13 was a small improvement rather than a large one: total wall time across the six measured step counts improved by about 0.6% for dit.gguf and about 1.2% for dit_int8.gguf. The INT8 path showed the clearest gain at larger step counts.

Memory-Reduction Options

These runs used dit.gguf only, server mode, CUDA, threads=8, no detailed server logging, the same short warmup shape, and the same measured prompt/options as the 2x3 run above. Each option set used a fresh server process. The baseline is the dit.gguf + dit_acceleration=none row above, where minimax_h3.mem_saver is already at its default true.

Option set Wall ms RTF Peak VRAM MiB Peak delta vs baseline ASR status
baseline: mem_saver=true 12886.40 0.6427 16513 baseline valid
mem_saver=true, dit_layerwise=true, dit_layerwise_batch=4 56154.80 2.8007 15796 -717 MiB valid
mem_saver=true, dit_layerwise=true, dit_layerwise_batch=4, dit_mlp_chunk_tokens=1024 56460.30 2.8160 15661 -852 MiB valid

DiT layerwise staging reduced peak VRAM by roughly 0.7-0.9 GiB, but with a large runtime cost. The MLP chunking option gave the lowest measured peak in this run.

Audio Duration Scaling

These runs used dit.gguf, default minimax_h3.mem_saver=true, dit_acceleration=none, CUDA server mode, threads=8, no detailed server logging, and one short warmup before the measured duration sweep. The prompt and all generation options other than num_frames were unchanged.

Target sec num_frames Output sec Wall ms RTF Peak VRAM MiB
5 121 5.175 7076.73 1.3675 16246
10 241 10.125 8905.27 0.8795 16366
15 361 15.075 10754.00 0.7134 16530
20 481 20.050 13046.70 0.6507 16559
25 601 25.700 15272.80 0.5943 16702
30 721 30.675 17704.70 0.5772 16830
60 1441 60.425 34435.90 0.5699 17674

With mem_saver=true, peak VRAM increased slowly across this audio-only sweep: about 1.4 GiB from the 5-second request to the 60-second request. Runtime scales more visibly than memory, while RTF improves as fixed request overhead is amortized over longer audio.