The Diagnostic Pivot: Interpreting GPU Underutilization After a Failed Allreduce Fusion Experiment
Introduction
In the long arc of optimizing GLM-5-NVFP4 inference on 8× RTX PRO 6000 Blackwell GPUs, message [msg 806] occupies a quiet but critical position. It is not a message of breakthrough — no throughput records are set here, no novel patches are applied. Instead, it is a message of assessment: a deliberate pause after a failed experiment to measure the state of the system, interpret the data, and decide the next direction. The assistant has just reverted a disastrous attempt to enable FlashInfer allreduce fusion on SM120 hardware — an experiment that collapsed throughput from ~2,800 tok/s to 236 tok/s and dropped GPU power to a mere 125 W. Now, with the server restarted and the baseline restored, the assistant runs a benchmark at 512 concurrency and reads the power telemetry. The resulting message is a masterclass in diagnostic reasoning under uncertainty, blending quantitative observation, architectural intuition, and strategic decision-making.
The Context: A Failed Patch and a Reversion
To understand message [msg 806], one must understand the events immediately preceding it. The assistant had been chasing a persistent performance ceiling: the GLM-5-NVFP4 model, a large Mixture-of-Experts (MoE) transformer running with tensor parallelism 8 across eight RTX PRO 6000 GPUs, was achieving approximately 2,800 total tokens per second at 512 concurrent requests. GPU power draw hovered around 250 W — barely 42% of the 600 W thermal design power (TDP). The hardware was clearly underutilized, and the assistant hypothesized that the missing piece was FlashInfer's allreduce fusion, a technique that overlaps allreduce communication with GEMM computation to hide synchronization latency.
The allreduce fusion kernels in FlashInfer were gated to SM90 (Hopper) and SM100 (datacenter Blackwell) architectures, explicitly excluding SM120 (consumer Blackwell, the RTX PRO 6000's architecture) via a __CUDA_ARCH__ >= 900 && __CUDA_ARCH__ < 1200 condition. The assistant patched this gate to include SM120, cleared the JIT cache, and restarted the server with --enable-flashinfer-allreduce-fusion. The server started successfully — the JIT compilation worked, the IPC handles allocated across all eight ranks — but the performance was catastrophic. Throughput collapsed to 236 tok/s, and power dropped to 125 W, barely a whisper of the GPU's capability. The assistant correctly diagnosed that cudaGridDependencySynchronize(), a cooperative grid synchronization primitive used in the fusion kernel, was either unsupported or behaved pathologically on SM120, causing excessive serialization or deadlock-like stalls.
The reversion was swift and clean: the assistant removed SM120 from the architecture gates in both communicator.py and server_args.py, killed the server processes, and restarted without the fusion flag. The server came back up quickly, benefiting from the cached autotune profiles from earlier runs.
The Message Itself: Reading the Vital Signs
Message [msg 806] opens with the assistant processing the power and clock data retrieved in the previous message [msg 805]:
OK so at 512 concurrency the GPUs are at ~330W, 98% util, ~2300MHz. That's 55% of 600W TDP. The clocks are ~2300MHz vs max 2430MHz — close to max boost. The GPUs have headroom but the SMs aren't being fully utilized — the compute pipeline is being stalled by allreduce waits.
This single paragraph encapsulates a remarkable amount of diagnostic reasoning. The assistant is reading three telemetry signals — power draw, utilization percentage, and SM clock frequency — and synthesizing them into a coherent picture of the system's state.
The power reading of ~330 W is a significant improvement over the ~250 W observed before the allreduce fusion experiment. This is not due to the fusion itself (which was reverted) but rather the cumulative effect of earlier optimizations: enabling FlashInfer CUTLASS MoE autotune for SM120, raising --max-running-requests from 64 to 1024, and disabling CUDA graphs and radix cache. These changes had already boosted throughput from ~880 tok/s to ~2,800 tok/s at 512 concurrency. The power increase from 250 W to 330 W reflects the GPU working harder — but still far from the 600 W TDP.
The utilization reading of 98% is a classic trap for the unwary. At first glance, 98% GPU utilization suggests the hardware is nearly saturated. But the assistant knows better: GPU utilization in nvidia-smi measures the percentage of time that at least one kernel was running on the GPU. It does not measure how many of the GPU's streaming multiprocessors (SMs) were active, nor how intensely they were computing. A GPU can show 98% utilization while most of its SMs are idle, waiting on data from other GPUs over PCIe. This is precisely the scenario the assistant identifies: "the SMs aren't being fully utilized — the compute pipeline is being stalled by allreduce waits."
The clock frequency of ~2300 MHz versus the maximum boost of 2430 MHz tells a subtler story. The GPUs are running close to their peak clock speed, which means the voltage-frequency curve is not the limiting factor. If the GPUs were thermally constrained or power-limited, the clocks would be lower. The fact that clocks are near max while power is only 330 W confirms that the SMs are simply not busy enough to draw more power. The GPU's power management firmware will not boost voltage (and thus power) if the computational units are not actively issuing instructions — and stalled warps waiting for allreduce data do not count as active computation.
The Benchmark: Confirming the Baseline
The assistant then launches a benchmark at 512 concurrency:
ssh root@10.1.230.174 "source /root/ml-env/bin/activate && python3 -m sglang.bench_serving \
--backend sglang-oai --model glm-5 --tokenizer lukealonso/GLM-5-NVFP4 \
--base-url http://localhost:8000 --dataset-name random --num-prompts 512 \
--random-input-len 256 --random-output-len 128 --request-rate inf 2>&1 | tail -20"
The results show a mean end-to-end latency of 24.6 seconds, median 24.8 seconds, with P99 at 35.4 seconds. Time-to-first-token (TTFT) averages 7.3 seconds with P99 at 12.1 seconds. These are not stellar numbers — a user waiting 7+ seconds for the first token and 25+ seconds for completion would experience a poor interactive experience — but they represent the best the system has achieved so far at this concurrency level.
Crucially, the message cuts off before showing the throughput numbers (the output token throughput line is truncated with "-----Time per Output Token (excl. ..."). The reader must infer from the context and subsequent messages that the total token throughput is approximately 2,800 tok/s, consistent with the pre-fusion baseline.
The Thinking Process: What the Assistant Is Really Doing
Message [msg 806] reveals the assistant's thinking process in several layers:
- Hypothesis formation: The assistant has a clear mental model of the system's bottleneck. The allreduce fusion experiment failed, but the diagnostic data from that failure — combined with the power/utilization telemetry from the reverted system — confirms the original hypothesis: allreduce communication over PCIe is the primary limiter. The assistant is not grasping at straws; it is methodically testing and refining its understanding.
- Signal versus noise: The assistant distinguishes between the utilization metric (98%, which looks good) and the power metric (330 W, which looks bad) and recognizes that these two signals tell a consistent story when properly interpreted. The utilization number is misleading because it measures kernel occupancy, not SM utilization. The power number is the more honest indicator of actual computational work being done.
- The allreduce wait model: The phrase "the compute pipeline is being stalled by allreduce waits" reveals the assistant's microarchitectural understanding of how tensor parallelism works. In TP-8, each transformer layer requires allreduce operations to synchronize the output across all eight GPUs. On a PCIe-switched topology without P2P DMA (as documented in earlier segments, the GPUs are in separate IOMMU groups on a Proxmox VM), these allreduce operations must go through the CPU's memory, adding significant latency. The GPU's SMs issue the allreduce, then stall waiting for the result. During this stall, the GPU reports "utilization" because a kernel is still resident, but no useful computation occurs.
- Strategic patience: The assistant does not immediately jump to another intervention. It waits for the benchmark to complete, reads the results, and only then decides the next step. This is a deliberate, scientific approach: measure the baseline, form a hypothesis, test the hypothesis, measure again, and iterate.
Assumptions and Their Validity
The assistant makes several assumptions in this message, some explicit and some implicit:
- Allreduce is the primary bottleneck: This is the central assumption. The assistant believes that if allreduce latency could be reduced, SM utilization and power draw would increase proportionally. This is a reasonable assumption given the PCIe topology, but it is not proven. Other factors could be limiting throughput: the MoE kernel implementation, the attention backend, the scheduler overhead, or the KV cache management.
- Higher power draw would correlate with higher throughput: The assistant treats the 330 W reading as evidence of underutilization, implicitly assuming that a fully utilized system would draw closer to 600 W. This is generally true for compute-bound workloads, but it is worth noting that memory-bound kernels can achieve high throughput without drawing peak power. The allreduce-heavy workload is inherently communication-bound, so the power ceiling may be unachievable regardless of optimization.
- The SM120 architecture is fundamentally compatible with the CUDA kernel code: The assistant has already discovered that
cudaGridDependencySynchronize()does not work correctly on SM120, but it assumes that the rest of the allreduce kernel logic is portable. This assumption is tested and partially validated by the fact that the kernel compiled and ran (albeit poorly), but the deeper question of whether SM120's memory subsystem and synchronization primitives are suited for the TRT-LLM allreduce fusion approach remains open. - The benchmark at 512 concurrency is representative: The assistant uses a single concurrency level (512) and a single prompt/output length configuration (256/128 tokens). This is a reasonable choice for establishing a baseline, but it may not capture the full performance landscape. Different batch sizes, sequence lengths, or request arrival patterns could reveal different bottlenecks.
Knowledge Required and Knowledge Created
To fully understand this message, the reader needs:
- Familiarity with GPU architecture concepts: streaming multiprocessors (SMs), thermal design power (TDP), clock boosting, and the relationship between utilization and power draw.
- Understanding of tensor parallelism and allreduce communication in distributed inference.
- Knowledge of the specific hardware topology: eight RTX PRO 6000 GPUs in a Proxmox VM with PCIe passthrough, lacking P2P DMA between GPUs.
- Awareness of the previous failed allreduce fusion experiment and the reversion. The message creates new knowledge:
- A confirmed baseline performance at 512 concurrency: ~2,800 total tok/s, ~330 W power draw, ~98% utilization, ~2300 MHz clocks.
- A validated diagnostic framework: power draw is a more reliable indicator of actual SM utilization than the
nvidia-smiutilization percentage. - A refined bottleneck hypothesis: allreduce waits are stalling the compute pipeline, preventing the SMs from reaching full throughput.
- A strategic direction: since allreduce fusion on SM120 is not viable, the assistant will explore alternative approaches (NCCL tuning, continuous decode steps, alternative MoE backends) in subsequent messages.
Conclusion
Message [msg 806] is a diagnostic anchor point in a long optimization journey. It is the moment when the assistant, having just suffered a failed experiment, steps back to assess the state of the system with clear eyes. The interpretation of the power and utilization data — 330 W at 98% utilization with near-max clocks — is a textbook example of reading GPU telemetry correctly, recognizing that "utilization" is not the same as "productivity." The assistant's decision to wait for the benchmark results before acting, rather than rushing into another intervention, reflects a disciplined, scientific approach to performance optimization. This message may not contain the most dramatic numbers in the session, but it contains the reasoning that makes the subsequent breakthroughs possible.