Начало работыТаблица лидеровDecode calculatorМоделиReportsОборудованиеБенчмаркиМаркетплейсАрендаProДокументация API
Язык
Actual Computer — Every computer, one endpoint
Back to Qwen3.8-27B-GPTQ-4bit
Community field report

MTP vs DFlash: vLLM and SGLang on dual RTX 3090s

Four-way Qwen3.8-27B GPTQ-4bit comparison: vLLM and SGLang with native MTP versus DFlash2. DFlash wins decode throughput; SGLang wins low-concurrency TTFT.

MTP vs DFlash: vLLM and SGLang on Qwen3.8-27B GPTQ-4bit with dual RTX 3090s

Executive summary

This report compares four speculative-decoding configurations on the same Qwen3.8-27B GPTQ-4bit target and dual-RTX-3090 host: vLLM with DFlash, SGLang with DFlash, vLLM with native MTP, and SGLang with native MTP.

For the matched single-request workload, DFlash delivered the highest decode throughput on both engines. vLLM DFlash reached 109.36 tok/s; SGLang DFlash reached 97.54 tok/s. Native MTP reached 92.78 tok/s on vLLM and 86.98 tok/s on SGLang.

  • On vLLM, DFlash was 17.87% faster than MTP.
  • On SGLang, DFlash was 12.14% faster than MTP.
  • Within DFlash, vLLM was 12.12% faster than SGLang.
  • Within MTP, vLLM was 6.67% faster than SGLang.
  • SGLang delivered the lowest TTFT: 67.40 ms with DFlash and 69.30 ms with MTP.

Recommendation: use vLLM plus DFlash for maximum single-stream decode and higher offered concurrency. Use SGLang plus DFlash when low-concurrency TTFT is the priority and the workload can remain within SGLang's active-request cache limit. MTP is operational on both engines, but it did not beat DFlash in this workload.

Test setup

FieldValue
Target modelbtbtyler09/Qwen3.8-27B-GPTQ-4bit
Target quantizationGPTQ, 4-bit
DFlash draftz-lab/Qwen3.8-27B-DFlash2
MTP draftNative MTP weights embedded in the target checkpoint
GPUs2 × NVIDIA GeForce RTX 3090, 24 GiB each
Tensor parallelism2
CPUAMD Ryzen 9 9950X
Host interconnectPCIe/PHB; no NVLink path
Context limit8,192 tokens
Prompt1,044 tokens
Output512 tokens per request
Concurrency1 for the four-way comparison
Warmups2
Measured iterations5
SamplingTemperature 0
StreamingEnabled
Measurementlocalmaxxing-cli remote endpoint mode
Decode metricClient-observed inter-token throughput
TTFT metricClient-observed first streamed token

DFlash used four speculative draft tokens, selected by a prior vLLM sweep. MTP used two speculative tokens, matching the checkpoint's validated native-MTP configuration. The external request and measurement path are matched; the speculative methods necessarily perform different internal work.

Four-way single-request results

All values are arithmetic means over five measured iterations.

EngineMethodDraft tokensMean decodeMean TTFTMean total throughputResult
vLLMDFlash4109.36 tok/s90.51 ms326.64 tok/sFastest decode
SGLangDFlash497.54 tok/s67.40 ms293.20 tok/sLowest TTFT
vLLMMTP292.78 tok/s86.27 ms278.14 tok/sFastest MTP
SGLangMTP286.98 tok/s69.30 ms261.70 tok/sLowest MTP TTFT

Decode ranking

  1. vLLM + DFlash: 109.36 tok/s
  2. SGLang + DFlash: 97.54 tok/s
  3. vLLM + MTP: 92.78 tok/s
  4. SGLang + MTP: 86.98 tok/s

DFlash wins within each engine. The engine gap is smaller with MTP: vLLM leads SGLang by 6.67% with MTP, versus 12.12% with DFlash.

Method comparison within each engine

EngineDFlashMTPDFlash advantageTTFT comparison
vLLM109.36 tok/s92.78 tok/s+17.87%MTP is 4.68% lower: 86.27 vs 90.51 ms
SGLang97.54 tok/s86.98 tok/s+12.14%DFlash is 2.74% lower: 67.40 vs 69.30 ms

MTP modestly improved vLLM TTFT, but the 4.24 ms reduction did not offset its 16.58 tok/s decode loss. On SGLang, DFlash won both decode throughput and TTFT.

Engine comparison within each method

MethodvLLM decodeSGLang decodeDecode winnervLLM TTFTSGLang TTFTTTFT winner
DFlash109.36 tok/s97.54 tok/svLLM, +12.12%90.51 ms67.40 msSGLang, 25.53% lower
MTP92.78 tok/s86.98 tok/svLLM, +6.67%86.27 ms69.30 msSGLang, 19.67% lower

The same engine tradeoff appears under both methods: vLLM maximizes decode throughput, while SGLang returns the first streamed token sooner.

Measurement stability

EngineMethodSamplesDecode min / P50 / mean / maxDecode stddevTTFT min / P50 / mean / maxTTFT stddev
vLLMDFlash5109.30 / 109.40 / 109.36 / 109.40 tok/s0.0589.99 / 90.61 / 90.51 / 90.75 ms0.31 ms
SGLangDFlash597.40 / 97.50 / 97.54 / 97.80 tok/s0.1567.18 / 67.26 / 67.40 / 68.02 ms0.35 ms
vLLMMTP592.70 / 92.80 / 92.78 / 92.80 tok/s0.0485.40 / 86.44 / 86.27 / 86.72 ms0.54 ms
SGLangMTP586.90 / 86.90 / 86.98 / 87.10 tok/s0.1168.45 / 69.23 / 69.30 / 70.10 ms0.63 ms

All four single-request results were stable. Decode standard deviation stayed at or below 0.15 tok/s, so the ranking is much larger than run-to-run variation.

Speculative acceptance evidence

EngineMethodObserved behavior
vLLMDFlashMean acceptance lengths of approximately 2.66–2.93 in sampled high-concurrency windows; average draft acceptance approximately 41–48%
SGLangDFlashSampled acceptance lengths approximately 1.98–3.25; sampled acceptance rates approximately 33–75%
vLLMMTPMean acceptance length approximately 2.20–2.26; average draft acceptance approximately 60–63%
SGLangMTPSampled acceptance lengths approximately 1.85–2.50; sampled acceptance rates approximately 42–75%

These engine logs use different aggregation windows and rate definitions. They prove that each speculative path was active, but they are not a precise cross-engine acceptance benchmark.

MTP's higher reported acceptance percentage does not imply higher end-to-end speed. DFlash still wins because acceptance is only one term in the cost equation: draft-model execution, target verification, graph capture, memory movement, and tensor-parallel communication also contribute.

SGLang MTP correctness issue found during testing

The first SGLang MTP attempt was rejected from the comparison. Although the server command explicitly selected an unquantized MTP draft, Qwen3.5's MTP quantization resolver inherited GPTQ from the target. Seven MTP projection tensors were skipped during load, acceptance stayed at zero, and decode fell to approximately 42.3 tok/s.

The resolver was fixed to honor:

text
--speculative-draft-model-quantization unquant

After the fix:

  • Embedded BF16 MTP tensors loaded without missing-parameter warnings.
  • Decode and target-verification CUDA graphs were active.
  • Acceptance recovered to approximately 1.85–2.50 tokens in sampled windows.
  • SGLang MTP reached the valid 86.98 tok/s result reported above.
  • The focused SGLang unit suite completed with 27 passing tests.

The invalid 42.3 tok/s attempt is not included in any comparison or ranking.

DFlash concurrency context

Only concurrency one was measured for MTP in this comparison. The existing DFlash sweep additionally measured concurrency 2, 4, 8, and 16:

ConcurrencyvLLM DFlashSGLang DFlashvLLM mean TTFTSGLang mean TTFT
1109.36 tok/s97.54 tok/s90.51 ms67.40 ms
2176.27 tok/s164.80 tok/s152.99 ms100.19 ms
4266.53 tok/s294.13 tok/s265.78 ms104.27 ms
8360.67 tok/s268.83 tok/s473.80 ms3,401.67 ms
16430.67 tok/s258.67 tok/s902.61 ms10,011.75 ms

SGLang DFlash peaked at concurrency four. Its Mamba state cache admitted five live requests, so offered concurrency 8 and 16 queued in waves. vLLM DFlash continued scaling through concurrency 16. No equivalent MTP concurrency sweep was run, so this section must not be read as a high-concurrency MTP comparison.

Reproduction commands

The common Localmaxxing workload was:

bash
lmx speed-test run <vllm|sglang> \
  --mode remote \
  --base-url <endpoint> \
  --hf-id btbtyler09/Qwen3.8-27B-GPTQ-4bit \
  --served-model <served-alias> \
  --quantization GPTQ-4bit \
  --hardware hardware.json \
  --spec-method <dflash|mtp> \
  --spec-num-tokens <4|2> \
  --prompt-tokens 1044 \
  --max-tokens 512 \
  --concurrency 1 \
  --warmup 2 \
  --iterations 5 \
  --out <payload.json>

DFlash additionally supplied:

text
--spec-draft-model z-lab/Qwen3.8-27B-DFlash2

The corrected SGLang MTP server configuration used:

bash
python -m sglang.launch_server \
  --model-path /models/Qwen3.8-27B-GPTQ-4bit \
  --tp-size 2 \
  --context-length 8192 \
  --mem-fraction-static 0.87 \
  --max-running-requests 4 \
  --disable-custom-all-reduce \
  --attention-backend fa3 \
  --cuda-graph-backend-prefill disabled \
  --speculative-algorithm NEXTN \
  --speculative-num-steps 2 \
  --speculative-eagle-topk 1 \
  --speculative-num-draft-tokens 3 \
  --speculative-draft-model-quantization unquant \
  --mamba-scheduler-strategy extra_buffer

The vLLM MTP server used:

bash
vllm serve /models/Qwen3.8-27B-GPTQ-4bit \
  --tensor-parallel-size 2 \
  --max-model-len 8192 \
  --max-num-seqs 4 \
  --gpu-memory-utilization 0.90 \
  --enable-prefix-caching \
  --speculative-config \
  '{"method":"qwen3_next_mtp","num_speculative_tokens":2}'

vLLM normalized the deprecated qwen3_next_mtp spelling to mtp at startup.

Artifacts and validation

The new MTP payloads are:

  • qwen38-q4-mtp-vllm-k2-c1.json
  • qwen38-q4-mtp-sglang-k2-c1.json

Both passed the Localmaxxing API dry-run validator with specDecoding: true, canonical specMethod: "MTP", and specNumTokens: 2. The DFlash values come from the previously validated and published matched-concurrency sweep. No benchmark payload was submitted as part of this comparison.

Conclusion

DFlash is the performance winner for this Q4 target on dual RTX 3090s. It leads native MTP by 17.87% on vLLM and 12.14% on SGLang under the matched single-request workload.

vLLM is the decode-throughput winner under either speculative method. It reaches 109.36 tok/s with DFlash and 92.78 tok/s with MTP. Its DFlash implementation also scales to 430.67 tok/s at concurrency 16 on this host.

SGLang is the latency winner at low concurrency. Its TTFT is 67.40 ms with DFlash and 69.30 ms with MTP, lower than the corresponding vLLM results. SGLang DFlash is particularly strong at concurrency four, but its five-request Mamba-cache cap causes severe queueing beyond that point.

For this model and hardware, choose vLLM + DFlash for peak decode and load scaling, or SGLang + DFlash for tightly bounded low-concurrency latency. Use MTP when avoiding a separate draft checkpoint is operationally valuable; it works correctly after the SGLang quantization fix, but it is not the fastest option measured here.

Discussion

0 comments

Questions, reproduction notes, and follow-up results.

No comments yet. Start the technical discussion.