World models on MI355X

We brought up the open real-time video models we work with on AMD Instinct MI355X cards on Daytona between 12 and 14 September. This is what ran, how fast it ran against the NVIDIA setups we used before, and every fix it took, with the pull requests that send those fixes back upstream.

Four results

MiniMax H3: seconds of content per second of compute

Each bar is one 345-frame window, 14.375 seconds of video with audio, generated end to end: text encoding, four DiT forwards, video and audio decode and the file write. The ratio is content seconds divided by wall-clock seconds, so anything right of the 1.0 line keeps up with playback.

MI355X bars in color, NVIDIA reference points in grey. H100 is our own production profile, the midpoint of 12.98–14.4 s. B200 figures are FastVideo's published sm_100a sparse runs. MI355X rows use FastVideo's Triton sparse kernels (VSA 0.9, 64-token tiles) or dense SDPA with regional compile, whichever was faster at that size.

LingBot-World v2: native frames per second by card count

Measured with the camera held forward over 30 chunks. The MI355X rows use an incremental Ulysses KV exchange that swaps only the new frames' keys and values instead of the whole cache window on every attention call. It is bit-exact against the stock path over 757 attention calls, and it is what lets two cards beat one on MI355X links.

Model · frameSystem1 card2 cards4 cards8 cards
14B · 704×384MI355X16.317.335.140.4
14B · 832×480MI355X10.612.925.535.6
14B · 832×480H100, stock5.28.5916.1526.8
1.3B · 832×480MI355X53.3———
1.3B · 832×480H10029.3———

JoyAI-Video-Edit: camera frame to edited pixels

A synthetic H.264 camera streams into the worker for 60 seconds with one instruction change at 30 seconds. Latency runs from a camera frame arriving at the worker to the edited frame existing, before network and browser playback. The ROCm build of JoyAI's FP8 and fused kernels comes from Aaryaman Vasishta's fork, jammm/JoyAI-Video-Edit.

Canvas · clockCardDelivered fpsFrame → pixels p50 / p90First frame
1248×720 · 24MI355X24.0443 / 578 ms871 ms
1248×720 · 24RTX PRO 600015.81733 / 1890 ms2440 ms
1248×720 · 30MI355X28.1428 / 532 ms861 ms
840×480 · 24MI355X24.0304 / 435 ms586 ms
840×480 · 24RTX PRO 600024.0441 / 576 ms1107 ms

ABot-World and Helios also moved to single MI355X cards on 14 September after passing the same release gates. Helios needed no code change beyond turning off a CUDA-only FlashAttention 3 hub kernel. ABot-World needed a scaled-dot-product fallback for its flash-attention calls, listed below.

What it took

Everything we changed or worked around to run these models on ROCm, and where each fix now lives.

WhereWhat happened on ROCmStatus
FastVideo platform detectionThe rocm/pytorch images ship no amdsmi Python package, so FastVideo resolved the CPU platform on an AMD GPU. Installing the PyPI amdsmi wheel instead breaks import torch.Merged FastVideo #1849
FastVideo sparse attentionBackend selection on ROCm crashed with a TypeError for both video sparse attention backends. With that fixed, FastVideo's Triton sparse kernels run on gfx950, match PyTorch references, and one MI355X renders a 1344×768 window in 62.9 s against 87.8 s dense.Merged FastVideo #1851
fastvideo-kernel installThe Python and Triton parts of fastvideo_kernel import and run straight from the source tree, which is all the sparse path needs. Building its compiled extension with build.sh --rocm fails in the rocm/pytorch 7.14.1 image: CMake cannot enable the HIP language, because the pip-packaged ROCm SDK carries no hip-lang CMake package. Since FastVideo #1871 the build falls back to the Python and Triton package there.Merged FastVideo #1871
FastVideo FP8 activation quantizationThe dynamic FP8 activation quantization ran as four to five passes over each activation, about as long as the FP8 GEMM it feeds. Fused Triton kernels do it in one pass: 3× (tensorwise) and 4× (rowwise) faster on MI355X.Merged FastVideo #1861
SANA GDN kernelsThe fused Gated DeltaNet Triton kernels pass input_precision="tf32" to tl.dot, which Triton on ROCm rejects, so every SANA-WM and SANA-Streaming forward failed at the first kernel compile. One module constant resolves it per backend.Pull request Sana #510
LightX2V recipeLightX2V had no MiniMax-H3 configuration for ROCm. A single-GPU aiter-attention recipe with the 4-step Turbo LoRA renders a 15-second 1344×768 clip in 111.5 s on one MI355X.Pull request LightX2V #1534
ABot-World attentionflash_attention() asserted a flash-attn build with no fallback, so the model crashed on machines without one. It now falls back to SDPA with the same variable-length semantics.Merged ABot-World #14
PyTorch caching allocatorWith expandable_segments:True, the ROCm 7.14.1 image stops allocating after 242 tensors of 84 MiB, or 2036 tensors of 1 MiB, with more than 260 GiB still free. The ROCm 10.1 nightly passes the same test, but we keep the setting off on both stacks.Setting
RCCLMulti-card runs need HSA_NO_SCRATCH_RECLAIM=1. With it, Ulysses sequence parallelism over two to eight cards ran without a hang.Setting
FlashDreams runtimeLingBot's engine loads libcudart through ctypes at start-up, and PyTorch's cuDNN attention has no ROCm kernels, so we route it to the flash backend.Carried patch
FlashDreams context parallelUlysses attention re-sends the whole KV window on every call, which made two MI355X slower than one. The incremental exchange above fixes it.Carried patch
torchao FP8torchao 0.17 limited FP8 to NVIDIA compute capability 8.9 and the MI300 family, which kept LingBot's FP8 path off gfx950.Fixed upstream
TheRock nightly torchvisionThe nightly torchvision wheels carry no gfx950 GPU kernels, so operators such as nms fail on the GPU.Avoided

How we measured

Hardware

Daytona MI355X VF spot sandboxes, 308.9 GB of device memory per card, eight cards on one XGMI hop. NVIDIA reference points ran on H100 SXM, RTX PRO 6000 and B200.

Software

ROCm 7.14.1 and PyTorch 2.12.0 from the rocm/pytorch image. JoyAI used the TheRock nightly, ROCm 10.1 with PyTorch 2.13.

MiniMax H3

FastVideo main from 13 September with the ROCm changes listed above applied as runtime patches, one excluded warmup window, then the median of the measured windows at seed 1000. On 15 September the single-card runs were repeated on FastVideo 37d06a8 with the two pull requests applied.

LingBot and JoyAI

Our streaming worker on the box over loopback: native fps over 30 chunks for LingBot, a 60-second camera stream for JoyAI.