The Threshold of Dissatisfaction: A User's Challenge to 72 tok/s

"Seems really low throughput."

This single sentence, appearing in message [msg 5928] of an intensive opencode coding session, marks a pivotal moment of judgment. After the assistant had just completed an arduous multi-hour effort to upgrade an entire machine learning inference stack to nightly builds, build custom CUDA kernels from source for a brand-new GPU architecture, and successfully deploy a 397-billion-parameter Mixture-of-Experts model (Qwen3.5-397B-A17B-NVFP4) on an 8× RTX PRO 6000 Blackwell workstation, the user's reaction was not celebration but dissatisfaction. The measured throughput of approximately 72 tokens per second for single-request decoding was deemed insufficient.

The full message reads:

Seems really low throughput. 1. Is there built-in MTP? Qwen supports but is it in the quant? 2. can we tune gemms for SM120 (different SMs vs B200)? Is the backend the fastest one we can get?

This is a remarkable piece of communication for what it reveals about the user's mental model, technical sophistication, and the implicit assumptions driving the session. To understand why this message was written, we must reconstruct the context in which it landed.

The Context: A Hard-Won Victory

The assistant had just completed an extraordinary engineering effort documented across the preceding messages ([msg 5903] through [msg 5927]). The session had begun with a directive to "update all to nightly" — a seemingly simple instruction that spiraled into a complex dependency resolution problem. The assistant had:

  1. Upgraded PyTorch from 2.9.1 to the nightly 2.12.0.dev20260307+cu130
  2. Upgraded flashinfer from 0.6.4 to 0.6.5
  3. Built sgl-kernel from source with SM120 (Blackwell) support, applying patches from a developer named "catid" to fix CMake policy guards, CUDA 13 cccl include paths, and FA3 fallback mechanisms
  4. Compiled with TORCH_CUDA_ARCH_LIST=12.0a to enable FP4 kernels for the Blackwell architecture
  5. Tested multiple backend configurations to find one that produced correct output — discovering that flashinfer_trtllm and flashinfer_cutedsl crashed or produced NaN/garbage, while flashinfer_cutlass for MoE and flashinfer_cudnn for FP4 GEMM worked correctly
  6. Identified and fixed a critical accuracy issue where the checkpoint's default FP8 KV cache lacked proper scaling factors, forcing BF16 instead
  7. Deployed the model as a systemd service and verified it with a comprehensive smoke test The assistant's summary message ([msg 5927]) presented this as a success: "All Done." It reported ~72 tok/s single-request decode throughput and noted the model loaded in ~75 seconds. From an engineering perspective, this was a triumph — getting a cutting-edge quantized model running on a brand-new GPU architecture with custom-built kernels, achieving correct numerical output, and serving it through a production-quality systemd service.

The User's Perspective: A Different Yardstick

The user's reaction reveals a fundamentally different evaluation criterion. Where the assistant saw successful deployment, the user saw suboptimal performance. The 72 tok/s figure, which the assistant presented as a benchmark result comparable to the developer's own measurements (catid's 67.76 tok/s on a 4-GPU setup), was interpreted by the user as a problem to be solved, not a milestone to be celebrated.

This divergence is instructive. The assistant's frame was correctness-first: "Is the model serving correctly? Are the outputs coherent? Does thinking mode work?" The user's frame was performance-first: "72 tok/s is slow for this hardware. What can we do to make it faster?" The user implicitly assumes that the 8× RTX PRO 6000 Blackwell setup — a top-tier workstation GPU configuration — should deliver significantly higher throughput than what was measured.

The user's message contains two specific technical probes, each revealing deep knowledge of the model architecture and the inference stack.## Question 1: Built-in MTP Speculative Decoding

The user's first question — "Is there built-in MTP? Qwen supports but is it in the quant?" — demonstrates a sophisticated understanding of the Qwen3.5 model architecture. Multi-Token Prediction (MTP) is a speculative decoding technique where the model is trained with additional "draft" heads that predict multiple future tokens in parallel. The base model predicts the next token, while MTP layers predict tokens N+1, N+2, etc. During inference, these draft predictions can be verified in a single forward pass, potentially doubling or tripling throughput if the drafts are accurate enough.

The user knows that Qwen3.5 supports MTP at the architectural level. The question is whether the NVFP4 quantization checkpoint — which is a compressed, quantized version of the model — retains the MTP weight tensors. This is not a trivial question. Quantization pipelines sometimes strip auxiliary modules to reduce model size, or the quantization format may not support the additional MTP layers. The user is asking the assistant to verify that the weights exist and that the inference engine (SGLang) can load and use them.

The phrase "is it in the quant?" reveals the user's mental model of quantization as a potentially lossy transformation that might discard architectural features. This is a correct instinct — model compression techniques often make trade-offs, and speculative decoding heads are a natural candidate for removal since they are auxiliary to the core model's functionality.

The user's assumption here is that MTP, if available, would provide a meaningful throughput improvement. This assumption would later prove partially incorrect — the assistant would discover that while MTP weights do exist in the checkpoint and SGLang's NEXTN speculative decoding can load them, the throughput gain on synthetic benchmarks was negligible, confirming that the baseline performance was already near-optimal for this model on this hardware.

Question 2: GEMM Tuning for SM120

The second question — "can we tune gemms for SM120 (different SMs vs B200)? Is the backend the fastest one we can get?" — reveals an even deeper technical understanding. The user is making a critical architectural distinction between the RTX PRO 6000 Blackwell (compute capability 12.0, SM120) and the B200/B100 datacenter GPUs (compute capability 10.0, SM100). These are both "Blackwell" architecture GPUs, but they have different numbers of streaming multiprocessors (SMs), different memory hierarchies, and potentially different optimal kernel configurations.

The user's reasoning is that the GEMM (General Matrix Multiply) backends selected by the assistant — flashinfer_cutlass for MoE and flashinfer_cudnn for FP4 — were validated primarily on SM100 GPUs (B200/B100). These backends might not be optimally tuned for SM120's different SM count and scheduling characteristics. The user is essentially asking: "Are we running kernels tuned for a different Blackwell variant, and could we get better performance by tuning for our specific GPU?"

This question carries an implicit assumption that the assistant may not have exhaustively explored the backend space. The assistant had indeed tested multiple backends — discovering that flashinfer_trtllm and flashinfer_cutedsl produced incorrect results on SM120 — but the user is pushing further: even among the working backends, is the fastest possible configuration selected? The user suspects that the answer might be "no," and that further tuning could unlock additional throughput.

The phrase "different SMs vs B200" is particularly telling. The user knows that SM count directly affects occupancy, memory bandwidth utilization, and the optimal tile sizes for matrix multiplication kernels. A kernel tuned for 160 SMs (B200) may not be optimal for a different SM count on the RTX PRO 6000. This is a nuanced hardware-software co-optimization concern that only someone with deep GPU architecture knowledge would raise.

The Thinking Process Behind the Message

Examining the user's message as a whole, we can reconstruct their reasoning process. The user received the assistant's summary reporting 72 tok/s. Their first reaction was disappointment — "Seems really low throughput" — which frames the entire subsequent inquiry. This is not a neutral observation but a judgment that sets a new goal: improve performance.

The user then generates two hypotheses for why throughput might be low:

  1. Missing feature hypothesis: The model supports MTP but it hasn't been enabled. If MTP works, throughput could potentially double or more.
  2. Suboptimal kernel hypothesis: The GEMM backends are not optimally tuned for SM120. Different backends or tuning parameters could yield better performance. Both hypotheses are testable, and the user is tasking the assistant with investigating them. The user's tone is directive but collaborative — they are not demanding answers but suggesting avenues of investigation. The message functions as a re-prioritization: "Stop celebrating the deployment and start optimizing."

Assumptions and Potential Mistakes

The user makes several assumptions, some of which are well-founded and others that may be questionable:

Correct assumptions:

Input and Output Knowledge

To fully understand this message, the reader needs knowledge of:

Conclusion

Message [msg 5928] is a masterclass in concise, technically informed feedback. In just two sentences and two questions, the user communicates dissatisfaction with the current state, identifies two specific optimization hypotheses, demonstrates deep knowledge of both the model architecture and the hardware platform, and sets a new direction for the session. The message transforms what could have been a stopping point — "the model is deployed and working" — into a launching point for further optimization. It is the kind of message that separates a merely functional deployment from a truly high-performance one, and it exemplifies the value of a technically sophisticated user who knows when to say "this is not good enough."