The Clarification That Changed Everything: Total vs. Output Token Throughput in the GLM-5-NVFP4 Benchmark
In the high-stakes world of large language model inference optimization, a single clarifying question can reframe an entire narrative. This is precisely what happened in message 721 of an opencode coding session, where a user's skeptical query — "Those are out tokens? Can you rerun the test once more?" — prompted the assistant to re-examine its benchmark reporting and reveal a critical distinction that had been glossed over in the excitement of achieving dramatic throughput improvements.
The Context: A Triumph in Inference Optimization
The session leading up to this message represented a significant engineering achievement. The assistant had been working to deploy the GLM-5-NVFP4 model — a massive 744-billion parameter Mixture-of-Experts architecture — across 8 RTX PRO 6000 Blackwell GPUs. After overcoming numerous obstacles including NaN crashes during decode, PCIe P2P bottlenecks in a Proxmox virtualized environment, and a migration to an LXC container for bare-metal GPU access, the assistant had finally achieved impressive throughput numbers.
The key breakthrough came from enabling FlashInfer CUTLASS MoE autotune for SM120 (the Blackwell consumer architecture), increasing --max-running-requests from 64 to 1024, and disabling both CUDA graphs and the radix cache to work around a bug in the NSA attention path. The results, summarized in message 719, were striking:
| Concurrency | Total Token Throughput | |-------------|----------------------| | 256 | 1,950 tok/s | | 512 | 2,800 tok/s | | 1024 | 3,740 tok/s | | Peak output | 3,945 tok/s |
These numbers represented a 3-4x improvement over the previous baseline and appeared to demonstrate that the system was finally saturating the hardware, with GPU power draw reaching ~250W per card (83% of TDP) during load.
The User's Challenge
But the user, reading this summary, spotted an ambiguity. The assistant had been using the phrase "Total token throughput" throughout its reporting, but the benchmark tool (sglang.bench_serving) reports multiple metrics: input token throughput, output token throughput, and total token throughput. The user's question — "Those are out tokens? Can you rerun the test once more?" — was asking for clarification: were the impressive numbers representing output-only throughput, or combined input+output throughput?
This is a crucial distinction in LLM serving. Output token throughput measures the rate at which the model generates new tokens — the actual generative work. Input token throughput measures how fast the model processes prompt tokens, which is typically much faster because it can be heavily parallelized. Combining them into "total token throughput" inflates the number but doesn't accurately represent generation capacity. A model that processes input at 2,000 tok/s and generates output at 500 tok/s would report 2,500 tok/s total — but its actual generation speed is only 500 tok/s.
The Message: A Methodological Re-Run
The assistant's response in message 721 demonstrates both intellectual honesty and methodological rigor. Rather than offering a verbal clarification or speculating about what the numbers meant, the assistant immediately re-ran the benchmark with explicit attention to the output format:
Good question — let me re-run the benchmarks and pay careful attention to the output format to confirm what "Total token throughput" means (it should be input + output combined).
The assistant ran the benchmark at 256 concurrency (a moderate load that would complete quickly) and captured the full output with tail -30 to ensure the complete breakdown was visible. The results were unambiguous:
Total input text tokens: 33093
Total generated tokens: 16548
Input token throughput (tok/s): 1244.58
Output token throughput (tok/s): 622.35
Peak output token throughput (tok/s): 1310.00
Total token throughput (tok/s): 1866.93
The output confirmed the assistant's expectation: Total token throughput = input throughput + output throughput. At 256 concurrency, the system processed 1,244.58 input tok/s and generated 622.35 output tok/s, for a combined total of 1,866.93 tok/s. The ratio of approximately 2:1 input-to-output was consistent with the benchmark parameters (256 input tokens, 128 output tokens per request).
What This Revealed
This single message had profound implications for interpreting all the benchmark results that preceded it. The headline numbers the assistant had been reporting — 1,950 tok/s at 256 concurrency, 2,800 at 512, 3,740 at 1024 — were all combined throughput. The actual output token throughput was approximately one-third of those figures:
- At 256 concurrency: ~622 output tok/s (not 1,950)
- At 512 concurrency: ~933 output tok/s (not 2,800)
- At 1024 concurrency: ~1,240 output tok/s (not 3,740) These are still respectable numbers for a 744B parameter model running on PCIe-interconnected GPUs without NVLink, but they are far more modest than the combined figures suggested. The "8.3x improvement in peak output" that the assistant had claimed in message 719 was also called into question — the peak output of 3,945 tok/s was a momentary burst, not a sustained rate.
The Thinking Process Visible in the Message
The assistant's reasoning in this message reveals several important cognitive traits:
First, the assistant immediately recognized the validity of the user's question. There was no defensiveness or attempt to rationalize the ambiguity. The response began with "Good question" — an acknowledgment that the user had identified a genuine gap in the reporting.
Second, the assistant chose to re-run the benchmark rather than speculate. This is a hallmark of rigorous engineering: when faced with uncertainty about a measurement, re-measure rather than reason from incomplete data. The assistant could have looked at the previous benchmark outputs and tried to deduce the answer, but instead generated fresh evidence.
Third, the assistant paid "careful attention to the output format." This phrase signals a shift in methodology — whereas earlier benchmark runs had focused on capturing key metrics with grep filters, this run used tail -30 to capture the full output including the header lines that define what each metric means.
Fourth, the assistant explicitly stated its hypothesis: "it should be input + output combined." This shows that the assistant had a model of how the benchmark tool worked, and was using this run to confirm that model rather than to discover something entirely new.
Assumptions and Their Consequences
The message also reveals several assumptions the assistant had been operating under:
The assumption that "Total token throughput" was the primary metric of interest. In LLM serving benchmarks, the most commonly reported metric is output token throughput, because that's what determines user-facing generation speed. The assistant had been leading with total throughput, which while technically accurate, gave a misleading impression of the system's generation capacity.
The assumption that the benchmark output format was self-explanatory. The assistant had been using grep filters to extract specific lines from benchmark output, which meant the context (the header lines explaining what each metric meant) was being discarded. This made it harder for both the assistant and the user to verify what was being measured.
The assumption that the user shared the same mental model of the metrics. The assistant had been using "tok/s" as a shorthand throughout the conversation, but without consistently specifying whether it meant output-only or total throughput. The user's question revealed that this distinction mattered.
The Broader Implications
This message is a microcosm of a larger challenge in ML engineering: the gap between what we measure and what we think we're measuring. In the pursuit of impressive benchmark numbers, it's easy to optimize for a metric that doesn't accurately represent the user experience. The assistant's earlier focus on total token throughput had led to configuration choices (high concurrency, large batch sizes) that maximized aggregate throughput at the expense of per-request latency — the single-stream performance remained stuck at 8-11 tok/s, far below the target of 100+ tok/s.
The user's question forced a re-examination of what "good" actually means. A system that generates 3,740 combined tok/s but only 1,240 output tok/s, with 40-second latency at high concurrency, may not be suitable for interactive applications. The impressive aggregate numbers masked a fundamental limitation: the PCIe interconnect between the 8 GPUs creates a latency floor that prevents the model from achieving the kind of per-request performance users expect from a modern LLM service.
Conclusion
Message 721 of this opencode session is a masterclass in the importance of precise measurement in engineering. A single clarifying question from the user — "Those are out tokens?" — exposed an ambiguity that had been baked into the assistant's reporting for dozens of messages. The assistant's response was exemplary: immediate acknowledgment, methodological re-measurement, and clear presentation of the results.
The message also serves as a cautionary tale about the seductiveness of aggregate metrics. It's easy to become enamored with large numbers — 3,740 tok/s sounds impressive — but the real measure of a system's value is whether it meets the requirements of its intended use case. For the GLM-5-NVFP4 deployment, the user's question revealed that while the system could achieve impressive aggregate throughput under high concurrency, its single-stream performance remained fundamentally limited by the hardware topology. This distinction would shape all subsequent optimization efforts, shifting the focus from maximizing total throughput to improving per-request latency and exploring alternative parallelism strategies like expert parallelism or pipeline parallelism.
In the end, the most valuable contribution of this message was not the benchmark numbers it produced, but the clarity it brought to the entire conversation. By forcing a precise definition of what was being measured, the user enabled the assistant — and by extension, the entire project — to make better-informed decisions about where to focus optimization efforts next.