Found by the rung-2 probe of ltx25-decode-speed.md §5 (#1006).
MEASURED on dgx.casa (kairos-17dd, GB10, driver 580.173.02, clocks.max.sm 3003 MHz, boot id 03717c9d-63c8-4652-a8fe-a63d012c5718, 20 cores), build 0e1bee42f arch 121a in vllmcpp-build:gb10, under $HOME/gpu.lock, at 320x192/25 frames with --device cuda and the full --encoder. Per-PID at 2 s, 347 samples over the first 1274 s:
- GPU utilization never exceeded 2%, and was exactly 0 in 321 of 347 samples.
- Every one of the 26 non-zero samples falls inside the DiT staging window (t <= 251 s), where it is incidental copy traffic rather than compute.
- From t = 251 s onward — over 17 minutes — GPU utilization is 0 in every sample, while the CUDA compute-app footprint sits flat at 36396 MiB (35.54 GiB) and the process holds exactly 1.00 core of 20 (
utime +116.7 s over 117 s, then +142.2 s over 142 s, then +39.5 s over 39 s across consecutive windows).
- 0 frames written.
So the render stages 35.54 GiB of transformer weights onto a GPU it then does no compute on. --device cuda was passed, the staging clearly took the device path (the process's Anonymous stayed at 0.01 GiB through staging, so no f32 widening happened — i.e. im.on_device is true at src/vllm/multimodal/ltx2_video.cpp:786), and the weights are resident. Nothing uses them.
The disjunction this leaves, stated rather than guessed. Either the denoise loop is not taking Ltx2DitForwardDevice (ltx2_video.cpp:2946 vs the host Ltx2DitForward at :2948), or it is, and something before it occupies 17+ minutes of single-threaded host time. Both are defects, and the render emits nothing that timestamps a phase boundary (#1010), so this issue cannot currently distinguish them. That is the first thing to fix here.
Two instrument caveats, both material.
- There is no positive control that
utilization.gpu reports a high value for a real compute kernel on GB10. The counter is demonstrably live — it moved 0-3% during staging — but live is not correctly scaled, and this box already returns [N/A] for --query-gpu=memory.used. That control is owed and is one command under the lock: run any known GPU-saturating job and confirm the counter reads high. Until then a 0% reading is not on its own proof.
- The CPU column does not depend on that counter and carries the claim independently. A full core of process time, a flat device counter, and no output are together only consistent with the host doing the arithmetic.
Relation to the other levers. #1007 (the video VAE decode has no device arm) is a known absence and is certainly part of this. This issue is broader: it says the GPU is idle for the whole post-load render, not only for the decode, which means #1007 alone may not close it. docs/USAGE.md:873-874 says "most of a 320x192/25f render is spent single-threaded in the host VAE decode at 0% GPU" — the 0% GPU is not a property of the decode phase; it is a property of the render after load.
Also relevant: the text encoder is host-only by declaration (ltx2_video.cpp:1684-1691 — a CPU queue is constructed at :1699 regardless of device, because ltx2_text_encoder.h is f32 by declaration), and it was measured multi-threaded at ~2.9 cores across 22 threads for ~150 s of this same run. So at least one large phase is host by design.
Listed under ## Owed in ltx25-decode-speed.md.
Found by the rung-2 probe of
ltx25-decode-speed.md§5 (#1006).MEASURED on
dgx.casa(kairos-17dd, GB10, driver580.173.02,clocks.max.sm3003 MHz, boot id03717c9d-63c8-4652-a8fe-a63d012c5718, 20 cores), build0e1bee42farch121ainvllmcpp-build:gb10, under$HOME/gpu.lock, at 320x192/25 frames with--device cudaand the full--encoder. Per-PID at 2 s, 347 samples over the first 1274 s:utime+116.7 s over 117 s, then +142.2 s over 142 s, then +39.5 s over 39 s across consecutive windows).So the render stages 35.54 GiB of transformer weights onto a GPU it then does no compute on.
--device cudawas passed, the staging clearly took the device path (the process'sAnonymousstayed at 0.01 GiB through staging, so no f32 widening happened — i.e.im.on_deviceis true atsrc/vllm/multimodal/ltx2_video.cpp:786), and the weights are resident. Nothing uses them.The disjunction this leaves, stated rather than guessed. Either the denoise loop is not taking
Ltx2DitForwardDevice(ltx2_video.cpp:2946vs the hostLtx2DitForwardat:2948), or it is, and something before it occupies 17+ minutes of single-threaded host time. Both are defects, and the render emits nothing that timestamps a phase boundary (#1010), so this issue cannot currently distinguish them. That is the first thing to fix here.Two instrument caveats, both material.
utilization.gpureports a high value for a real compute kernel on GB10. The counter is demonstrably live — it moved 0-3% during staging — but live is not correctly scaled, and this box already returns[N/A]for--query-gpu=memory.used. That control is owed and is one command under the lock: run any known GPU-saturating job and confirm the counter reads high. Until then a 0% reading is not on its own proof.Relation to the other levers. #1007 (the video VAE decode has no device arm) is a known absence and is certainly part of this. This issue is broader: it says the GPU is idle for the whole post-load render, not only for the decode, which means #1007 alone may not close it.
docs/USAGE.md:873-874says "most of a 320x192/25f render is spent single-threaded in the host VAE decode at 0% GPU" — the 0% GPU is not a property of the decode phase; it is a property of the render after load.Also relevant: the text encoder is host-only by declaration (
ltx2_video.cpp:1684-1691— a CPU queue is constructed at:1699regardless ofdevice, becauseltx2_text_encoder.his f32 by declaration), and it was measured multi-threaded at ~2.9 cores across 22 threads for ~150 s of this same run. So at least one large phase is host by design.Listed under
## Owedinltx25-decode-speed.md.