Building things with code, AI, and hardware. Currently a Principal SDE working on agentic AI. Previously: experimentation platforms, surgical robotics.
Opinions here are my own and don't represent my employer.
Building things with code, AI, and hardware. Currently a Principal SDE working on agentic AI. Previously: experimentation platforms, surgical robotics.
Opinions here are my own and don't represent my employer.
On one RTX PRO 6000 with SGLang and DFlash2 speculative decoding, NVFP4 is 32–37% faster than FP8 for stock Qwen3.8-27B, on short chat and on 20k-token prompts. BFCL tool calling stays within noise (174 vs 167 of 205).
Stock Qwen3.8-27B: Qwen/Qwen3.8-27B-FP8 vs RadixArk/Qwen3.8-27B-NVFP4.
| Scenario | FP8 | NVFP4 | Δ |
|---|---|---|---|
| Chat, 1 user, out tok/s | 133.8 | 176.3 | +32% |
| Chat, 4 users, out tok/s | 449.9 | 596.5 | +33% |
| 20k prompt, 1 user, out tok/s | 73.3 | 98.5 | +34% |
| 20k prompt, 4 users, out tok/s | 104.1 | 142.3 | +37% |
| 20k prompt, 1 user, TTFT p50 | 3.20 s | 2.34 s | −27% |
| 20k prompt, 4 users, TTFT p50 | 8.48 s | 5.78 s | −32% |
| DFlash2 accept length, chat 1 user | 3.49 | 3.41 | −2% |
| BFCL subset, correct | 167/205 | 174/205 | +7 |
| BFCL mean latency per call | 1.22 s | 0.92 s | −25% |
irrelevance (12 → 18) and multi_turn_base (14 → 16), categories of 20 cases each.| Category | FP8 | NVFP4 |
|---|---|---|
| simple_python | 25/25 | 25/25 |
| multiple | 24/25 | 23/25 |
| parallel | 18/20 | 18/20 |
| parallel_multiple | 19/20 | 19/20 |
| live_simple | 18/20 | 18/20 |
| live_multiple | 20/25 | 19/25 |
| multi_turn_base | 14/20 | 16/20 |
| multi_turn_miss_param | 3/10 | 4/10 |
| irrelevance | 12/20 | 18/20 |
| live_irrelevance | 14/20 | 14/20 |
| Total | 167 | 174 |
Hardware and system:
nvidia-smi reports Gen 4 as this system’s maximum). Power limit 400 W, set at boot (default 600 W). Idle during runs, one config at a time.Serving stack:
lmsysorg/sglang:nightly-dev-cu13-20261010-961bcf48.Qwen/Qwen3.8-27B-FP8 @ 017b9c7a, RadixArk/Qwen3.8-27B-NVFP4 @ 319f741c.z-lab/Qwen3.8-27B-DFlash2), 8 draft tokens, for every run.--mem-fraction-static 0.50 for FP8, 0.41 for NVFP4, so both get about the same KV pool (240,512 vs 236,864 tokens, 28 mamba slots each).reasoning_effort=medium.Launch flags:
python3 -m sglang.launch_server --model-path <checkpoint>
--mem-fraction-static <0.50|0.41> --max-running-requests 4 --context-length 153600
--dtype auto --attention-backend flashinfer
--reasoning-parser qwen3 --tool-call-parser qwen3_coder
--speculative-algorithm DFLASH --speculative-draft-model-path <DFlash2>
--speculative-num-draft-tokens 8
--mamba-full-memory-ratio 0.9 --mamba-ssm-dtype bfloat16
--mamba-radix-cache-strategy extra_buffer_lazy
--chunked-prefill-size 2048 --page-size 64
--enable-hierarchical-cache --hicache-size 64 --hicache-write-policy write_through
--kv-cache-dtype fp8_e4m3 --schedule-policy lpm --enable-session-radix-cache
--sleep-on-idle --trust-remote-code
Serving: python3 -m sglang.benchmark.serving --backend sglang-oai-chat --flush-cache --warmup-requests 2 --seed 1.
BFCL: bfcl-eval 2026.3.23, the Qwen/Qwen3-32B-FC handler, a fixed 205-case subset across 10 categories (case ids).
ignore_eos), so tok/s compares speed only, not how much each model thinks.unsloth/Qwen3.8-27B-NVFP4: 50.9 → 56.4 tok/s without MTP, 115.8 → 132.3 with MTP k=2, single stream (repo). The engine, checkpoint and speculative decoding all differ from mine, and I haven’t tested which of them explains the difference.run.sh there reruns both configs.results/<label>/bfcl/ in the same folder.