CUDA categorical scoring benchmarks

September 16, 2026 · View on GitHub

This records the initial 128-score deployment. See the subsequent engine-tuning experiments for the batch-budget sweep, cache ablation, and 256-score patch.

Test hardware: NVIDIA RTX PRO 6000 Blackwell (96 GB class), Qwen3.8-27B-FP8, vLLM 0.29.0. The existing vLLM process was reused, without restarting it or loading a second GPU model. Other ASR/transcription services remained running.

260 measured requests, 13 distinct synthetic fixtures, five repetitions per fixture/method/cache regime. Both automatic scoring and constrained JSON matched all 850 scored field values in their 130 measured requests. No HTTP errors or schema violations. Repetitions are not independent new examples; this is a correctness/performance smoke benchmark, not clinical validation.

The automatic path uses batching for small schemas and cache-aligned prefill for >=16 fields, or >=4 fields with context at least one cache block long. Probabilities remain uncalibrated relative label scores.

Fresh prefix

All latencies are end-to-end milliseconds. Speedup compares medians. p95 is based on only five samples per cell.

FixtureJSON p50Auto p50SpeedupJSON p95Auto p95
Spanish summary intent (1 field)343.6105.73.25×347.7108.8
English medication intent (1 field)361.9102.93.52×376.0106.3
Negated intent (1 field)317.9104.23.05×321.6110.8
Spanish facts (4 fields)877.5109.97.98×881.1185.0
Explicit negatives (4 fields)897.2107.88.32×903.5169.4
Missing information (4 fields)921.1111.28.28×940.4215.4
Shared-prefix category names (1 field)399.2102.73.89×404.5105.3
Incident facts (4 fields)818.0105.97.72×824.4163.4
Incident facts (12 fields)2239.4330.16.78×2240.4414.4
Incident facts (28 fields)5113.1496.910.29×5118.6511.1
Long context 150 (12 fields)2433.2621.13.92×2436.9625.6
Long context 450 (12 fields)2951.11060.82.78×2958.81086.4
255 categories (1 field)611.3474.31.29×620.2488.1

Warm prefix

All latencies are end-to-end milliseconds. Speedup compares medians. p95 is based on only five samples per cell.

FixtureJSON p50Auto p50SpeedupJSON p95Auto p95
Spanish summary intent (1 field)343.499.03.47×363.8111.9
English medication intent (1 field)356.7103.53.45×361.4110.5
Negated intent (1 field)320.8105.03.06×323.8107.5
Spanish facts (4 fields)878.2110.57.95×888.4164.9
Explicit negatives (4 fields)899.4185.24.86×903.3191.1
Missing information (4 fields)919.8127.97.19×926.4203.0
Shared-prefix category names (1 field)400.4106.63.76×408.0116.9
Incident facts (4 fields)817.5113.27.22×822.2195.5
Incident facts (12 fields)2239.8402.05.57×2252.2411.9
Incident facts (28 fields)5112.8346.314.77×5118.4348.2
Long context 150 (12 fields)2264.8261.08.68×2268.5284.7
Long context 450 (12 fields)2236.8314.27.12×2265.9319.3
255 categories (1 field)450.9295.41.53×460.4305.4

Methodology and limits

  • Same model weights, FP8 quantization, GPU, and engine configuration for both methods. Thinking disabled; compact grammar-constrained JSON baseline, not pretty-printed unconstrained generation.
  • Method order randomized within each repetition. Fresh-prefix trials use unique cache salts; warm-prefix trials are primed separately for each method. Weights/kernels remain warm in both conditions. No global cache flush.
  • Single benchmark client. The live tests also exercised four concurrent requests for independence, but this report is not a throughput or saturation benchmark.
  • Fixtures cover intent, negation, missing information, category strings with shared prefixes, field-count scaling, long administrative context, and 255 choices. The full definitions and gold answers are stored in the raw report.
  • Cache alignment inserts newline padding between context and the selected field definition. This changes token positions; its correctness was evaluated on the same fixtures. The deployment-specific 1,568-token cache block must be verified before using this on another server.
  • Scores are single-token surrogate-label likelihoods. They are neither exact full-sequence probabilities for the original category strings nor calibrated probabilities of correctness. Option ordering can affect decisions.
  • 129–255 choices need two selected-token score calls due to vLLM’s 128-ID limit, reducing their speed benefit.
  • Raw prompt usage includes all logical input tokens, including cached tokens and alignment padding; it does not measure unique GPU computation.

Verified cache reuse

A separate fresh-salt 28-field probe returned every field correctly in 507.43 ms. vLLM’s model-level counters increased by 45,080 queried prompt tokens and 42,336 cache-hit tokens. The latter is exactly 27 × 1,568, confirming that the remaining fields reused the prefix populated by the first. The unique uncached portion was 2,744 tokens. Counters are global to the model; the probe ran between benchmark suites.

Artifacts and reproduction

python -m jevfire.benchmark \
  --methods json_schema,auto --repeats 5 --output results/parallel-decoding-auto.json