Skip to content

[Bug] MiniMax-H3 Video VAE decoding extremely slow on AMD RX 7900 XTX (Vulkan) — 309s total, ~77s per iteration #2268

Open

Description

@keven1024

Git commit

null

Operating System & Version

6.18.54-Unraid

GGML backends

Vulkan

Command-line arguments used

sd-server --listen-ip 127.0.0.1 --listen-port ${PORT} --diffusion-model /models/image/minimax_h3_fl2va_pruned-Q4_K_M.gguf --llm /models/image/encode/qwen3vl_32b_minimax_h3-Q2_K_M.gguf --vae /models/image/vae/minimax_h3_video_vae_int8_convrot.safetensors --audio-vae /models/image/vae/minimax_h3_audio_vae_fp32.safetensors --cfg-scale 1.0 --steps 30 --sampling-method euler --flash-attn off,diffusion=on --conv-direct on --verbose

Steps to reproduce

align video frames from 1 to 5
generate_video 480x480x5

What you expected to happen

I would expect Video VAE decoding to make effective use of the RX 7900 XTX GPU and avoid unnecessary CPU computation or data transfers.

What actually happened

I understand that decoding performance depends heavily on video resolution, frame count, tiling, and backend implementation.

However, 309 seconds for VAE decoding alone seems unusually slow and worth investigating.

Logs / error messages / stack trace

[V] version: stable-diffusion.cpp version unknown, commit 290148d --- main.cpp:90
ggml_vulkan: Found 4 Vulkan devices:
ggml_vulkan: 0 = AMD Radeon RX 7900 XTX (RADV NAVI31) (radv) | uma: 0 | fp16: 1 | bf16: 0 | fp4: 0 | warp size: 64 | shared memory: 65536 | int dot: 0 | matrix cores: KHR_coopmat
ggml_vulkan: 1 = Intel(R) Graphics (RPL-S) (Intel open-source Mesa driver) | uma: 1 | fp16: 1 | bf16: 0 | fp4: 0 | warp size: 32 | shared memory: 65536 | int dot: 0 | matrix cores: none
ggml_vulkan: 2 = Intel(R) Graphics (RPL-S) (Intel open-source Mesa driver) | uma: 1 | fp16: 1 | bf16: 0 | fp4: 0 | warp size: 32 | shared memory: 65536 | int dot: 0 | matrix cores: none
ggml_vulkan: 3 = Intel(R) Graphics (RPL-S) (Intel open-source Mesa driver) | uma: 1 | fp16: 1 | bf16: 0 | fp4: 0 | warp size: 32 | shared memory: 65536 | int dot: 0 | matrix cores: none
[V] System Info:
SSE3 = 1 | SSSE3 = 1 | AVX = 1 | AVX2 = 1 | F16C = 1 | FMA = 1 | BMI2 = 1 | OPENMP = 1 | REPACK = 1 | --- main.cpp:91
[V] using 14 threads for model loading --- model_loader.cpp:190
[I] loading diffusion model from '/models/image/minimax_h3_fl2va_pruned-Q4_K_M.gguf' --- diffusion_engine.cpp:692
[I] load /models/image/minimax_h3_fl2va_pruned-Q4_K_M.gguf using gguf format --- model_loader.cpp:216
[V] init from '/models/image/minimax_h3_fl2va_pruned-Q4_K_M.gguf' --- model_loader.cpp:262
[V] GGUF v3, tensor_count=532, metadata_kv_count=0 --- gguf_reader_ext.h:224
[I] loading llm from '/models/image/encode/qwen3vl_32b_minimax_h3-Q2_K_M.gguf' --- diffusion_engine.cpp:749
[I] load /models/image/encode/qwen3vl_32b_minimax_h3-Q2_K_M.gguf using gguf format --- model_loader.cpp:216
[V] init from '/models/image/encode/qwen3vl_32b_minimax_h3-Q2_K_M.gguf' --- model_loader.cpp:262
[V] GGUF v3, tensor_count=902, metadata_kv_count=0 --- gguf_reader_ext.h:224
[I] loading vae from '/models/image/vae/minimax_h3_video_vae_int8_convrot.safetensors' --- diffusion_engine.cpp:763
[I] load /models/image/vae/minimax_h3_video_vae_int8_convrot.safetensors using safetensors format --- model_loader.cpp:222
[V] init from '/models/image/vae/minimax_h3_video_vae_int8_convrot.safetensors', prefix = 'vae.' --- model_loader.cpp:290
[I] loading audio VAE from '/models/image/vae/minimax_h3_audio_vae_fp32.safetensors' --- diffusion_engine.cpp:787
[I] load /models/image/vae/minimax_h3_audio_vae_fp32.safetensors using safetensors format --- model_loader.cpp:222
[V] init from '/models/image/vae/minimax_h3_audio_vae_fp32.safetensors', prefix = '' --- model_loader.cpp:290
[I] Version: MiniMax-H3 --- diffusion_engine.cpp:975
[I] auto-fit plan: --- backend_fit.cpp:334
[I] devices: --- backend_fit.cpp:335
[I] Vulkan0 AMD Radeon RX 7900 XTX (RADV NAVI31) free 21385 MiB, budget 20873 MiB --- backend_fit.cpp:337
[I] Vulkan1 Intel(R) Graphics (RPL-S) free 8805 MiB, budget 8293 MiB --- backend_fit.cpp:337
[I] Vulkan2 Intel(R) Graphics (RPL-S) free 8805 MiB, budget 8293 MiB --- backend_fit.cpp:337
[I] Vulkan3 Intel(R) Graphics (RPL-S) free 8805 MiB, budget 8293 MiB --- backend_fit.cpp:337
[I] RAM free 9783 MiB, params budget 7735 MiB --- backend_fit.cpp:344
[I] compute-device weight cache priority: diffusion > te > vae --- backend_fit.cpp:347
[I] components (params: compute device -> RAM -> other GPU -> disk): --- backend_fit.cpp:348
[I] DiT params 10891 MiB, compute reserve 2048 MiB -> compute Vulkan0, params Vulkan0 --- backend_fit.cpp:357
[I] Conditioner params 12495 MiB, compute reserve 2048 MiB -> compute Vulkan0, params disk --- backend_fit.cpp:357
[I] VAE params 2680 MiB, compute reserve 1024 MiB -> compute Vulkan0, params cpu --- backend_fit.cpp:357
[I] auto-fit: --backend "diffusion=Vulkan0,te=Vulkan0,vae=Vulkan0" --params-backend "te=disk,vae=cpu" --- backend_fit.cpp:485
[V] Initializing backend: Vulkan0 --- ggml_extend_backend.cpp:420
[V] using 14 threads for model loading --- model_loader.cpp:190
[I] Weight type stat: f32: 1454 | f16: 137 | q2_K: 300 | q4_K: 208 | q5_K: 50 | i8: 144 | bf16: 764 --- diffusion_engine.cpp:1548
[I] Conditioner weight type stat: q2_K: 300 | q5_K: 50 | bf16: 552 --- diffusion_engine.cpp:1549
[I] Diffusion model weight type stat: f32: 10 | f16: 102 | q4_K: 208 | bf16: 212 --- diffusion_engine.cpp:1550
[I] VAE weight type stat: f32: 527 | f16: 35 | i8: 144 --- diffusion_engine.cpp:1551
[V] llm: num_layers = 50, vocab_size = 151936, hidden_size = 5120, intermediate_size = 25600 --- llm.hpp:442
[V] enable llm vision --- llm.hpp:2435
[V] minimax_h3: layers=50, hidden=5376, heads=56, head_dim=128, ffn=14336, adaln_curve=1025 --- minimax_h3.hpp:112
[V] Initializing backend: CPU --- ggml_extend_backend.cpp:420
[I] using VAE for encoding / decoding --- model_builders.cpp:210
[V] validating model metadata --- diffusion_engine.cpp:1307
[V] model metadata validated; weights will be prepared lazily --- diffusion_engine.cpp:1377
[I] total params memory size = 26730.80MB (VRAM 23472.95MB, RAM 3257.85MB): text_encoders 12497.02MB(VRAM), diffusion_model 10975.93MB(VRAM), vae 3257.85MB(RAM), controlnet 0.00MB(N/A), extensions 0.00MB(N/A) --- diffusion_engine.cpp:1423
[I] running in MiniMax H3 AV FLOW mode --- diffusion_engine.cpp:1493
[I] listening on: http://127.0.0.1:5804 --- main.cpp:170
[W] MiniMax-H3 uses 24 fps; overriding requested fps 16 --- request.cpp:171
[W] align video frames from 1 to 5 for MiniMax-H3 --- request.cpp:198
[V] using 14 threads for model loading --- model_loader.cpp:190
[I] get_sigmas with discrete scheduler --- denoiser.hpp:1129
[I] sampling using Euler method --- request.cpp:477
[V] parse 'a girl' to [['a girl', 1], ] --- conditioner.hpp:2181
[V] split prompt "a girl" to 2 tokens ["a", "Ġgirl", ] --- bpe_tokenizer.cpp:245
[I] qwen3vl build cached graph cut plan done (taking 1 ms) --- ggml_graph_cut.cpp:1032
[V] loading 551/902 tensors from /models/image/encode/qwen3vl_32b_minimax_h3-Q2_K_M.gguf --- model_loader.cpp:1152

|# | 5/551 - 0.00MB/s
|#### | 42/551 - 845.07MB/s
|###### | 62/551 - 1.92GB/s
|########## | 100/551 - 2.27GB/s
|############ | 124/551 - 2.30GB/s
|############### | 161/551 - 2.42GB/s
|################# | 187/551 - 2.49GB/s
|##################### | 221/551 - 2.44GB/s
|####################### | 246/551 - 2.47GB/s
|########################## | 280/551 - 2.45GB/s
|############################ | 306/551 - 2.52GB/s
|############################### | 334/551 - 2.50GB/s
|################################# | 356/551 - 2.49GB/s
|################################# | 356/551 - 2.30GB/s
|#################################### | 392/551 - 2.86GB/s
|####################################### | 424/551 - 2.83GB/s
|########################################### | 463/551 - 2.87GB/s
|############################################## | 496/551 - 2.88GB/s
|################################################# | 532/551 - 2.89GB/s
|##################################################| 551/551 - 2.86GB/s
[I] loading tensors completed, taking 3.88s (read: 1.01s, memcpy: 0.00s, convert: 0.00s, copy_to_backend: 2.58s) --- model_loader.cpp:1422
[V] model manager prepared params backend buffers (11360.75 MB, 551 tensors, 12 blocks, VRAM) on Vulkan0 --- model_manager.cpp:492
[V] qwen3vl compute buffer size: 0.02 MB(RAM) on CPU (peak across 1 segment) --- ggml_runner.cpp:1065
[V] qwen3vl compute buffer size: 0.66 MB(VRAM) on Vulkan0 (peak across 1 segment) --- ggml_runner.cpp:1065
[V] computing condition graph completed, taking 3969 ms --- conditioner.hpp:3287
[V] conditioning cache stored (1/4) --- conditioning_cache.h:102
[I] get_learned_condition completed, taking 3.97s --- video.cpp:1259
[V] model manager released params backend buffers (11360.75 MB, 551 tensors, 12 blocks, VRAM) from Vulkan0 --- model_manager.cpp:1297
[I] generate_video 480x480x5 --- video.cpp:1676
[V] sample 30x30x2 --- video.cpp:1742
[I] minimax_h3 build cached graph cut plan done (taking 6 ms) --- ggml_graph_cut.cpp:1032
[V] loading 532/532 tensors from /models/image/minimax_h3_fl2va_pruned-Q4_K_M.gguf --- model_loader.cpp:1152

|# | 5/532 - 0.00MB/s
|#### | 36/532 - 1.03GB/s
|###### | 61/532 - 1.88GB/s
|########## | 96/532 - 2.27GB/s
|############ | 121/532 - 2.21GB/s
|############## | 143/532 - 2.46GB/s
|################# | 177/532 - 2.49GB/s
|#################### | 206/532 - 2.57GB/s
|###################### | 231/532 - 2.63GB/s
|########################## | 267/532 - 2.68GB/s
|############################ | 295/532 - 2.76GB/s
|############################### | 327/532 - 2.78GB/s
|################################## | 358/532 - 2.80GB/s
|##################################### | 389/532 - 2.83GB/s
|######################################## | 419/532 - 2.86GB/s
|########################################### | 451/532 - 2.89GB/s
|############################################## | 481/532 - 2.90GB/s
|################################################# | 518/532 - 2.94GB/s
|##################################################| 532/532 - 2.95GB/s
[I] loading tensors completed, taking 3.60s (read: 0.80s, memcpy: 0.00s, convert: 0.01s, copy_to_backend: 2.59s) --- model_loader.cpp:1422
[V] model manager prepared params backend buffers (10975.93 MB, 532 tensors, 12 blocks, VRAM) on Vulkan0 --- model_manager.cpp:492
[V] minimax_h3 compute buffer size: 0.24 MB(RAM) on CPU (peak across 1 segment) --- ggml_runner.cpp:1065
[V] minimax_h3 compute buffer size: 113.22 MB(VRAM) on Vulkan0 (peak across 1 segment) --- ggml_runner.cpp:1065

|=> | 1/30 - 4.24s/it - ETA 02:02[I] minimax_h3 build cached graph cut plan done (taking 5 ms) --- ggml_graph_cut.cpp:1032
[V] minimax_h3 compute buffer size: 0.24 MB(RAM) on CPU (peak across 1 segment) --- ggml_runner.cpp:1065
[V] minimax_h3 compute buffer size: 113.22 MB(VRAM) on Vulkan0 (peak across 1 segment) --- ggml_runner.cpp:1065

|===> | 2/30 - 1.73it/s - ETA 01:07
|=====> | 3/30 - 1.75it/s - ETA 00:48
|======> | 4/30 - 1.76it/s - ETA 00:38
|========> | 5/30 - 1.76it/s - ETA 00:32
|==========> | 6/30 - 1.76it/s - ETA 00:28
|===========> | 7/30 - 1.76it/s - ETA 00:25
|=============> | 8/30 - 1.76it/s - ETA 00:22
|===============> | 9/30 - 1.76it/s - ETA 00:20
|================> | 10/30 - 1.76it/s - ETA 00:18
|==================> | 11/30 - 1.76it/s - ETA 00:17
|====================> | 12/30 - 1.76it/s - ETA 00:15
|=====================> | 13/30 - 1.76it/s - ETA 00:14
|=======================> | 14/30 - 1.75it/s - ETA 00:13
|=========================> | 15/30 - 1.76it/s - ETA 00:12
|==========================> | 16/30 - 1.76it/s - ETA 00:11
|============================> | 17/30 - 1.75it/s - ETA 00:10
|==============================> | 18/30 - 1.75it/s - ETA 00:09
|===============================> | 19/30 - 1.75it/s - ETA 00:08
|=================================> | 20/30 - 1.75it/s - ETA 00:07
|===================================> | 21/30 - 1.75it/s - ETA 00:06
|====================================> | 22/30 - 1.75it/s - ETA 00:05
|======================================> | 23/30 - 1.75it/s - ETA 00:05
|========================================> | 24/30 - 1.75it/s - ETA 00:04
|=========================================> | 25/30 - 1.75it/s - ETA 00:03
|===========================================> | 26/30 - 1.75it/s - ETA 00:02
|=============================================> | 27/30 - 1.75it/s - ETA 00:02
|==============================================> | 28/30 - 1.75it/s - ETA 00:01
|================================================> | 29/30 - 1.74it/s - ETA 00:00
|==================================================| 30/30 - 1.70it/s
[I] sampling completed, taking 20.79s --- video.cpp:1776
[I] generating latent video completed, taking 20.79s --- video.cpp:1920
[V] decode audio latent 8x2x32x1 --- video.cpp:1967
[I] minimax_h3_audio_vae build cached graph cut plan done (taking 7 ms) --- ggml_graph_cut.cpp:1032
[V] loading 781/917 tensors from /models/image/vae/minimax_h3_audio_vae_fp32.safetensors --- model_loader.cpp:1152

|# | 2/781 - 0.00MB/s
|##################################################| 781/781 - 1.20GB/s
[I] loading tensors completed, taking 0.20s (read: 0.07s, memcpy: 0.00s, convert: 0.00s, copy_to_backend: 0.00s) --- model_loader.cpp:1422
[V] model manager prepared params backend buffers (249.99 MB, 781 tensors, 1 blocks, RAM) on Vulkan_Host --- model_manager.cpp:492
[V] model manager staged compute params (247.64 MB, 781 tensors, 1 blocks) to Vulkan0, taking 0.05s --- model_manager.cpp:620
[V] minimax_h3_audio_vae compute buffer size: 0.01 MB(RAM) on CPU (peak across 1 segment) --- ggml_runner.cpp:1065
[V] minimax_h3_audio_vae compute buffer size: 4.30 MB(VRAM) on Vulkan0 (peak across 1 segment) --- ggml_runner.cpp:1065
[I] MiniMax-H3 audio VAE decode completed, taking 0.44s --- minimax_h3_audio_vae.hpp:494
[I] decoding audio latent completed, taking 0.44s --- video.cpp:1980
[V] decode_video_outputs latent 30x30x2x24 --- video.cpp:1281
[V] VAE decode tile size: 256x256 pixels (16x16 latent) --- vae.hpp:347
[V] num tiles : 2, 2 --- tiling.cpp:178
[V] processing 4 tiles --- tiling.cpp:179
[I] minimax_h3_video_vae build cached graph cut plan done (taking 3 ms) --- ggml_graph_cut.cpp:1032
[V] loading 585/706 tensors from /models/image/vae/minimax_h3_video_vae_int8_convrot.safetensors --- model_loader.cpp:1152

|# | 5/585 - 7.81MB/s
|#################### | 231/585 - 3.15GB/s
|#################################### | 413/585 - 3.31GB/s
|##################################################| 585/585 - 3.65GB/s
[I] loading tensors completed, taking 0.63s (read: 0.60s, memcpy: 0.00s, convert: 0.00s, copy_to_backend: 0.00s) --- model_loader.cpp:1422
[V] model manager prepared params backend buffers (2336.70 MB, 585 tensors, 3 blocks, RAM) on Vulkan_Host --- model_manager.cpp:492
[V] model manager staged compute params (2336.69 MB, 585 tensors, 3 blocks) to Vulkan0, taking 0.47s --- model_manager.cpp:620
[V] minimax_h3_video_vae compute buffer size: 7620.06 MB(RAM) on CPU (peak across 1 segment) --- ggml_runner.cpp:1065
[V] minimax_h3_video_vae compute buffer size: 493.13 MB(VRAM) on Vulkan0 (peak across 1 segment) --- ggml_runner.cpp:1065

|============> | 1/4 - 77.07s/it - ETA 03:51[I] minimax_h3_video_vae build cached graph cut plan done (taking 2 ms) --- ggml_graph_cut.cpp:1032

|=========================> | 2/4 - 76.00s/it - ETA 02:33[I] minimax_h3_video_vae build cached graph cut plan done (taking 1 ms) --- ggml_graph_cut.cpp:1032

|=====================================> | 3/4 - 78.03s/it - ETA 01:17
|==================================================| 4/4 - 78.03s/it
[V] computing vae decode graph completed, taking 309.13s --- vae.hpp:384
[I] decode_first_stage completed, taking 309.19s --- video.cpp:1290
[V] decode_video_outputs decoded 480x480x5x3 --- video.cpp:1295
[I] generate_video completed in 334.43s --- video.cpp:2008

Additional context / environment details

No response

Activity

  1. farawayso commented on Nov 3, 2026

    @farawayso
    Contributor

    Same card (RX 7900 XTX) and same commit 290148d, but on Windows + ROCm the VAE decode graph stays on the GPU:

    [V] minimax_h3_video_vae compute buffer size: 521.32 MB(VRAM) on ROCm1
    

    A 1024x576x124 video decodes at ~1.9 it/s per 15-tile segment (~8 s each, decode_first_stage total ~66 s). So the decode pipeline itself is fine —your 77 s/tile looks like CPU execution of the decode graph.

    The smoking gun in your log:

    [V] minimax_h3_video_vae compute buffer size: 7620.06 MB(RAM) on CPU
    

    The 7.6 GB activation buffer did not fit the Vulkan budget, so it landed in RAM. Two things to try:

    1. Force the VAE onto the GPU with explicit overrides, e.g.
      --backend "diffusion=Vulkan0,te=Vulkan0,vae=Vulkan0"
      --params-backend "vae=Vulkan0" (you have ~21 GB free VRAM, which should cover the 2.3 GB staged params + 7.6 GB compute buffer).
    2. If the buffer still goes to CPU, the question becomes why the runner rejects a 7.6 GB Vulkan allocation on RADV — the "staged compute params"
      / "compute buffer" lines under --verbose should show which side failed.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions