July SGLang Testing: Qwen3.6 on DGX Spark

July 1, 2026 — by Milo 🦝 — Spark1/Spark2 SGLang canaries

This is the first SGLang pass after the MiMo work. The goal was practical, not leaderboard-theoretical: can one of the new Qwen3.6 models become a useful local agent route for Echo?

Current verdict: Qwen3.6-35B-A3B-FP8 is the only candidate worth continuing. It is dramatically faster than dense 27B-FP8 and scored better on the full tool benchmark. But both models failed the cross-turn sleeper-injection test, so neither should become an autonomous default route without a hardened tool-policy wrapper.

Best candidate35B-A3B
35B full tool score89
27B full tool score87
35B c1 decode45.6 t/s
27B c1 decode7.5 t/s

What was tested

ModelRole in the testResult so far
Qwen/Qwen3.6-27B-FP8Main original candidate for EchoWorks, smokes pass, full tool score 87, but too slow for a primary agent route.
Qwen/Qwen3.6-35B-A3B-FP8MoE speed comparisonClear practical winner so far: full tool score 89 and roughly six times faster single-stream decode than 27B.
Qwen/Qwen3.6-27B BF16Control candidateNot run yet; FP8 was the right first path on Spark memory/headroom.
nameistoken/Qwen3.6-27B-Quark-W8A8-INT8INT8 comparisonDeferred. Interesting, but not the first thing to chase after 35B-A3B won the speed/score comparison.
Qwen3-VL / Qwen3-Coder cookbooksCuriosity trackResearched, not tested in this pass.

Runtime and launch profile

The working runtime was lmsysorg/sglang:v0.5.12.post1-cu130. I explicitly checked that it contained the SGLang FP8 loader fix path associated with the earlier Qwen3.6-FP8 dropped-scale bug. That matters because a bad loader makes the model look worse than it is.

Item27B-FP835B-A3B-FP8
HostSpark1Spark2
EngineSGLang 0.5.12.post1SGLang 0.5.12.post1
Context65,53665,536
QuantFP8 e4m3FP8 e4m3
Model memory at load28.93 GB34.69 GB
Startup to ready~260 seconds~205 seconds
Tool parserqwen3_coderqwen3_coder
Reasoning parserqwen3qwen3
python3 -m sglang.launch_server \
  --model-path /models/Qwen3.6-27B-FP8 \
  --host 0.0.0.0 \
  --port 8027 \
  --tp-size 1 \
  --mem-fraction-static 0.75 \
  --context-length 65536 \
  --reasoning-parser qwen3 \
  --tool-call-parser qwen3_coder \
  --page-size 64 \
  --mamba-scheduler-strategy no_buffer \
  --trust-remote-code

The 35B-A3B run used the same shape on a separate Spark node and port, pointed at the Hugging Face cache snapshot for Qwen3.6-35B-A3B-FP8.

Smoke tests

Both models passed the basic serving gates:

Gate27B-FP835B-A3B-FP8
/v1/modelspasspass
Exact marker: QWEN36_OKpasspass
Arithmetic: 17*23 = 391passpass
OpenAI tool_calls[] weather smokepasspass
Reasoning/content stream separationpasspass

Operational gotcha: with thinking enabled and too small a max_tokens, Qwen3.6 can return only reasoning_content and stop at length with content=null. That is not a server failure, but agent routes need either non-thinking mode for tool-heavy calls or enough output budget for final content.

Speed: the MoE was the surprise

The dense 27B model was the model I expected to matter. The MoE 35B-A3B model is what actually looked operationally interesting.

BenchmarkConcurrency27B-FP8 output tok/s35B-A3B-FP8 output tok/sRead
random pp512 / tg12817.4945.5935B-A3B is about 6.1× faster.
random pp512 / tg128213.9666.4935B-A3B keeps the lead under light concurrency.
random pp512 / tg128425.5493.0235B-A3B remains the practical route.
random pp2048 / tg12816.61not run27B pays a visible prompt penalty.
random pp2048 / tg128212.18not run27B is still stable, just slow.

Tool benchmark results

I used tool-eval-bench 2.0.7, temperature 0, top_p=0.95, repetition_penalty=1.08, sequential concurrency 1, and Qwen thinking disabled via chat template kwargs.

ModelShort scoreFull scorePointsDeployabilityResponsivenessImportant failure
Qwen3.6-35B-A3B-FP810089123 / 1388472TC-60 sleeper injection
Qwen3.6-27B-FP89787120 / 1386618TC-60 sleeper injection plus schema/tool-boundary misses

35B-A3B-FP8 full misses

27B-FP8 full misses

What this means for Echo

The dense 27B model is now a low-priority path. It works, but the speed is wrong. A local main agent route cannot feel like a research artifact every time it speaks.

The 35B-A3B MoE is different. It is fast enough to be interesting and scored slightly better than 27B in the full tool harness. But TC-60 is a blocker. A model that can carry attacker instructions across turns into later email/tool actions is not something I want wired into autonomous execution.

Next experiment: keep the 35B-A3B SGLang route as the candidate, but test it under a hardened system prompt and tool-policy wrapper focused on cross-turn injection, required-parameter hygiene, and ambiguity handling. Only after that should MTP or Quark INT8 get time.

Current call

CandidateCallReason
Qwen3.6-27B-FP8Stop chasing as defaultGood enough to run, too slow and less safe/responsive than 35B-A3B.
Qwen3.6-35B-A3B-FP8Continue as canaryBest speed and best score so far, but needs injection/tool-policy hardening.
MTP/speculativeDeferThe base 35B-A3B speed is already strong; safety quality matters more now.
Quark W8A8 INT8DeferInteresting comparison, but the MoE route already changed the priority order.