The Missing Config: How a Single File Explained 45% of GPU Performance
In the middle of a deep debugging session spanning GPU kernel configurations, MoE runner backends, and virtualization overhead, a single discovery crystallized weeks of investigation into a clear root cause. Message 286 in this opencode conversation represents the "aha" moment — the point at which the assistant identified that FlashInfer, the GPU kernel library powering the MoE (Mixture-of-Experts) inference engine, had no pre-tuned configuration for the very GPU it was running on.
The Context: A Performance Mystery
The session had been grappling with a perplexing performance problem. The team had successfully deployed the massive GLM-5-NVFP4 model (a 256-expert MoE model with FP4 quantization) across 8 NVIDIA RTX PRO 6000 Blackwell GPUs. The model was running, producing coherent output, and the GPUs were showing 100% utilization. Yet something was wrong: the GPUs were only drawing about 330W of their 600W TDP — just 55% of their power budget. The tensor cores weren't being saturated.
Previous investigation ([msg 269]) had confirmed that SM clocks were at 2422 MHz (near the 2430 MHz maximum), there was no thermal throttling, and no hardware slowdown was active. The GPUs were compute-bound but underpowered. The assistant had hypothesized that "kernel launch overhead and small matmul efficiency in single-token decode" was the bottleneck — each decode step involves tiny matrix operations (1-token batches through MoE experts) that can't saturate the GPU's compute units.
The user had then suggested tuning the kernels, noting "this is really new gpu" ([msg 280]). The assistant had been exploring MoE runner backends — trying flashinfer_trtllm (which crashed because it's SM100-only), then investigating flashinfer_cutlass and flashinfer_cutedsl paths. In message 283, the assistant discovered that FlashInfer has SM120-specific CUTLASS MoE support via gen_cutlass_fused_moe_sm120_module. Then in message 285, the assistant checked whether a tuning config existed for the RTX PRO 6000:
Module path: flashinfer.tuning_configs.v0_1_trtllm_fused_moe_NVIDIA_RTX_PRO_6000_Blackwell_Server_Edition
File path: /home/theuser/ml-env/lib/python3.12/site-packages/flashinfer/tuning_configs/v0_1_trtllm_fused_moe_NVIDIA_RTX_PRO_6000_Blackwell_Server_Edition.py
File exists: False
The config file didn't exist. And a listing of the tuning_configs directory showed only two files: one for NVIDIA B200 and one for NVIDIA GB200 — both datacenter Blackwell GPUs, not the workstation-class RTX PRO 6000.
The Discovery: Message 286
Message 286 is the assistant's immediate reaction to this finding. The message opens with "There it is." — a moment of recognition that carries the weight of the entire investigation. The assistant articulates the finding clearly:
Flashinfer has tuning configs for B200 and GB200 but not for RTX PRO 6000. When the config doesn't exist, the autotuner either falls back to defaults or tries to autotune at runtime (which is slow and may not find optimal configs).
This is the critical insight. The RTX PRO 6000 Blackwell is an SM120 GPU — the same architecture generation as the B200 and GB200 datacenter parts. But it's a different physical chip with different characteristics: different memory subsystem, different clock speeds, different power limits, different cache sizes. The kernel tuning parameters that work optimally on a B200 — block sizes, tile dimensions, pipeline depths, thread layouts — may be suboptimal on the RTX PRO 6000.
The assistant then takes the logical next step: examine the existing B200 config to understand the tuning format. The bash command head -80 on the B200 config file reveals the structure:
best_configs = {
"('trtllm::fused_moe::gemm1', 'MoERunner', ((1, 3584), (256, 512, 448), (0,), (256, 7168, 16), (0,)))": (
0,
5,
),
...
}
Each entry is a mapping from a kernel signature — encoding the operation name, runner type, and tensor dimensions — to a tuple of configuration indices. These indices select specific kernel launch parameters (block sizes, tile configurations, etc.) from a predefined set of candidates. The config file is essentially a lookup table that tells FlashInfer "for this specific matrix shape on this specific GPU, use tuning configuration #X."
Why This Matters
The absence of this config file has concrete performance consequences. When FlashInfer's MoE kernels run without a device-specific tuning config, the autotuner has two options:
- Fall back to default parameters — These are generic choices that work across many GPUs but are unlikely to be optimal for any specific one. On a brand-new architecture like Blackwell SM120, the defaults may be particularly poor because they were designed for older GPU generations.
- Autotune at runtime — This involves running each kernel with multiple candidate configurations, measuring performance, and selecting the best one. While this can find good configurations, it's slow (adding seconds or minutes to model loading), and the search space may not be comprehensive enough to find the truly optimal settings. The assistant correctly identifies both of these failure modes. The runtime autotuning path is "slow and may not find optimal configs" — a concise summary of why pre-tuned configs exist in the first place.
The Reasoning Process
The thinking visible in this message is a textbook example of diagnostic reasoning:
- Observation: The autotuner looks for a device-specific config file, and it doesn't exist for this GPU.
- Hypothesis: The missing config is causing suboptimal kernel performance, explaining the 100% utilization but only 55% power draw.
- Evidence gathering: Examine the B200 config to understand what a correct config looks like.
- Next step planning: "Figure out how to run the tuner" to generate a config for the RTX PRO 6000. The assistant doesn't just note the problem — it immediately takes action to understand the solution space. By reading the B200 config, it's gathering the information needed to either (a) run the FlashInfer autotuner to generate a new config, or (b) manually construct one if the autotuner doesn't support this GPU.
Input Knowledge Required
To fully understand this message, a reader needs:
- Understanding of GPU kernel autotuning: The concept that GPU kernels (especially for matrix operations) have many tunable parameters (block sizes, tile dimensions, thread counts) that affect performance differently on different hardware.
- Knowledge of the Blackwell GPU family: That B200, GB200, and RTX PRO 6000 are all Blackwell-architecture GPUs (SM120) but different products with different characteristics.
- Context about MoE inference: That Mixture-of-Experts models route tokens through different "expert" sub-networks, creating many small matrix multiplications that are sensitive to kernel configuration.
- The FlashInfer library architecture: That it uses a JIT compilation system with pre-tuned configs for specific GPU models.
- The ongoing investigation: That the team had been struggling with GPUs at 100% utilization but only 55% power draw, and had been exploring various explanations.
Output Knowledge Created
This message produces several valuable pieces of knowledge:
- The specific gap: FlashInfer's tuning configs cover B200 and GB200 but not RTX PRO 6000 Blackwell, despite all being SM120 GPUs.
- The config format: The tuning config is a Python dictionary mapping kernel operation signatures to configuration index tuples.
- The config location: The file would need to be at
flashinfer/tuning_configs/v0_1_trtllm_fused_moe_NVIDIA_RTX_PRO_6000_Blackwell_Server_Edition.py. - The next steps: Run the FlashInfer autotuner to generate this config, which could significantly improve MoE kernel performance.
Assumptions and Potential Pitfalls
The assistant makes several assumptions worth examining:
- That the missing config is a primary bottleneck: This is well-supported by the evidence (100% utilization, 55% power), but other factors (virtualization overhead, PCIe topology) were also later identified as contributors.
- That the B200 config format is directly applicable: The RTX PRO 6000 may need different tuning parameters than B200, but the format and tuning infrastructure should be the same.
- That the autotuner can be run successfully: The autotuner may not support the RTX PRO 6000's device ID, or may require modifications to recognize the new GPU.
The Broader Significance
This message is a classic example of a pattern that appears throughout systems debugging: the most impactful discoveries often come not from complex analysis but from asking the right simple question. "Does a tuning config exist for this GPU?" — a question that took seconds to answer — revealed a root cause that explained the performance gap the team had been chasing for hours.
The message also illustrates the challenge of deploying cutting-edge hardware. The RTX PRO 6000 Blackwell was a new GPU at the time of this session, and the software ecosystem hadn't fully caught up. FlashInfer had been updated to support the SM120 architecture (the gen_cutlass_fused_moe_sm120_module function existed), but the tuning configs — which require running extensive benchmarks on the actual hardware — hadn't been generated yet. This is a common lag in the ML infrastructure world: architecture support lands first, but optimal performance requires hardware-specific tuning that takes additional time and access to physical hardware.
The assistant's response — immediately examining the B200 config to understand the format — demonstrates a pragmatic approach to the problem. Rather than waiting for upstream to provide RTX PRO 6000 configs, the assistant plans to generate them locally. This is the kind of self-sufficient debugging that characterizes effective ML engineering: when the tool doesn't support your hardware, you figure out how to make it work yourself.