<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: DigitalMarket-World</title>
    <description>The latest articles on DEV Community by DigitalMarket-World (@digitalmarket-world).</description>
    <link>https://dev.to/digitalmarket-world</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4062302%2F3080528d-4d06-443d-844e-2da47264b633.png</url>
      <title>DEV Community: DigitalMarket-World</title>
      <link>https://dev.to/digitalmarket-world</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/digitalmarket-world"/>
    <language>en</language>
    <item>
      <title>I got Qwen3.8-27B running on dual RTX 3090s (no NVLink) under WSL2 — every pitfall I hit</title>
      <dc:creator>DigitalMarket-World</dc:creator>
      <pubDate>Tue, 18 Aug 2026 09:02:23 +0000</pubDate>
      <link>https://dev.to/digitalmarket-world/i-got-qwen38-27b-running-on-dual-rtx-3090s-no-nvlink-under-wsl2-every-pitfall-i-hit-3oao</link>
      <guid>https://dev.to/digitalmarket-world/i-got-qwen38-27b-running-on-dual-rtx-3090s-no-nvlink-under-wsl2-every-pitfall-i-hit-3oao</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Note: English translation assisted by an LLM. I'm not a native English speaker; all technical content, commands, and measurements come from my own setup.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I spent a full week getting Qwen3.8-27B (hybrid GDN architecture, 48 linear-attention + 16 full-attention layers, built-in MTP head) running on my dual RTX 3090 (24GB × 2) box — no NVLink, PCIe Gen4, Windows 10 + WSL2 (Ubuntu-24.04). I hit basically every trap in the book. This is the complete record: what broke, why, and the config that finally gave me 170-210 tok/s on code/JSON.&lt;/p&gt;

&lt;h2&gt;
  
  
  My setup
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Item&lt;/th&gt;
&lt;th&gt;Configuration&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;GPU&lt;/td&gt;
&lt;td&gt;2× NVIDIA RTX 3090 (24GB GDDR6X, SM86/Ampere)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GPU interconnect&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;No NVLink&lt;/strong&gt; (PCIe Gen4 x8 bridge)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CPU / RAM&lt;/td&gt;
&lt;td&gt;Ryzen 9 5950X / 64GB DDR4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;OS&lt;/td&gt;
&lt;td&gt;Windows 10 + WSL2 (Ubuntu-24.04)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Inference engine&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;SGLang 0.5.17&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CUDA toolchain&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;CUDA 13.0&lt;/strong&gt; (this exact version matters, see Pitfall 2)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Model&lt;/td&gt;
&lt;td&gt;Qwen3.8-27B-AWQ-INT4 (cyankiwi quant, ~21GB)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Speculative decoding&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;DSpark&lt;/strong&gt; (1.4B draft model)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Context length&lt;/td&gt;
&lt;td&gt;245,760 tokens&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  The timeline
&lt;/h2&gt;

&lt;h3&gt;
  
  
  vLLM: compilation hell
&lt;/h3&gt;

&lt;p&gt;vLLM was the obvious first try. It did not go well:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;vLLM 0.25.1 (Docker)&lt;/strong&gt;: loads, but MTP speculation gives zero benefit on two GPUs without NVLink (56 vs 58 tok/s) and pushes first-token latency from 8.7s to 15s.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;vLLM 0.27.1&lt;/strong&gt;: hits missing &lt;code&gt;libnvrtc.so.13&lt;/code&gt; (nvidia-cuda-nvrtc was a 0.0.0a0 placeholder package). After force-reinstalling, flashinfer's sampling JIT demands the CUDA-13-only &lt;code&gt;--host-stub-linkage-explicit&lt;/code&gt; while local nvcc is 12.8. Engine init crashes every time.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Verdict: skip vLLM 0.27+ for Qwen3.8 on 3090s. The old Docker 0.25.1 works but gives no speedup.&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  SGLang: frozen at weight loading
&lt;/h3&gt;

&lt;p&gt;Switching to SGLang was worse: the model froze during weight loading — process hung, port never listened.&lt;/p&gt;

&lt;p&gt;I suspected parameters and tried dozens of combinations. Useless. Comparing keys in &lt;code&gt;model.safetensors.index.json&lt;/code&gt; finally revealed the root cause:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;cyankiwi's Qwen3.8-AWQ-INT4 is a "half-quantized" checkpoint&lt;/strong&gt; — the MTP head and some linear_attn layers use plain &lt;code&gt;weight&lt;/code&gt; instead of &lt;code&gt;weight_packed&lt;/code&gt;, unlike Qwen3.6's fully-quantized checkpoints. Same architecture config: Qwen3.6 runs, Qwen3.8 dies on load.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  The breakthrough: CUDA 13.0 + SGLang 0.5.17
&lt;/h3&gt;

&lt;p&gt;The real fix was toolchain matching:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;CUDA&lt;/th&gt;
&lt;th&gt;Result&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;12.8&lt;/td&gt;
&lt;td&gt;weight loading hangs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;13.3&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;__NV_ATOMIC_RELAXED&lt;/code&gt; macro removed → verify-graph compilation fails&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;13.0&lt;/strong&gt; ✅&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;perfect match for torch cu130; keeps the cccl macros flashinfer 0.6.15 needs&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Plus the no-NVLink triple fix:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nt"&gt;--disable-custom-all-reduce&lt;/span&gt;     &lt;span class="c"&gt;# avoid "peer access is not supported"&lt;/span&gt;
&lt;span class="nt"&gt;--mm-feature-transport&lt;/span&gt; cpu      &lt;span class="c"&gt;# bypass pidfd_getfd crash in CUDA IPC under WSL&lt;/span&gt;
&lt;span class="nv"&gt;NCCL_P2P_DISABLE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;1              &lt;span class="c"&gt;# must disable P2P without NVLink&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And a SymmMem patch: set &lt;code&gt;MultimemAllGatherer.enabled=False&lt;/code&gt; in &lt;code&gt;logits_processor.py&lt;/code&gt; to bypass the SIGFPE from &lt;code&gt;torch.distributed._symmetric_memory.rendezvous()&lt;/code&gt; on 3090s.&lt;/p&gt;

&lt;p&gt;It ran! At &lt;strong&gt;~10 tok/s&lt;/strong&gt;. Unusable.&lt;/p&gt;

&lt;h3&gt;
  
  
  Speed optimization: systematic A/B of every speculative decoding option
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Approach&lt;/th&gt;
&lt;th&gt;Acceptance&lt;/th&gt;
&lt;th&gt;Speed&lt;/th&gt;
&lt;th&gt;Verdict&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;No speculation (baseline)&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;~63 tok/s&lt;/td&gt;
&lt;td&gt;start&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MTP/EAGLE (built-in head)&lt;/td&gt;
&lt;td&gt;1.07-1.27&lt;/td&gt;
&lt;td&gt;~37 tok/s&lt;/td&gt;
&lt;td&gt;❌ negative — INT4 quantization damaged the BF16 head&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;NGRAM&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;~56 tok/s&lt;/td&gt;
&lt;td&gt;❌ +50% on JSON only, -30% on normal text&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ReplaySSM&lt;/td&gt;
&lt;td&gt;1.45→1.55&lt;/td&gt;
&lt;td&gt;40→43 tok/s&lt;/td&gt;
&lt;td&gt;❌ negligible&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;DSpark (1.4B draft model)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;3.7-4.2&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;170-210 tok/s&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✅✅✅&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;DSpark was the only thing that worked. An independent 1.4B draft model proposes a 7-token candidate block per step; the main model verifies the block in one pass. Acceptance of 3.7-4.2 means ~4 tokens accepted per verification — 3x better than MTP on this quantized model.&lt;/p&gt;

&lt;h2&gt;
  
  
  Pitfalls (each one cost me real hours)
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Lost line-continuation backslashes — the sneakiest one
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Symptom&lt;/strong&gt;: service starts, but &lt;code&gt;server_args=&lt;/code&gt; log shows default values for everything — &lt;code&gt;mm_feature_transport='cuda_ipc'&lt;/code&gt;, &lt;code&gt;speculative_algorithm=None&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Cause&lt;/strong&gt;: a trailing &lt;code&gt;\&lt;/code&gt; went missing in the launch script; bash truncates the command there and &lt;strong&gt;silently discards every parameter after it&lt;/strong&gt;. The service boots with bare defaults, which crashes on WSL without NVLink.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Lesson&lt;/strong&gt;: after editing the launch script, verify with &lt;code&gt;grep server_args=&lt;/code&gt; that your parameters actually took effect before tuning anything. This may be the truth behind 80% of "my parameters don't work" reports.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. CUDA toolchain version is life or death
&lt;/h3&gt;

&lt;p&gt;Qwen3.8's GDN kernels need CUDA-13 compilation. 12.8 hangs on load, 13.3 fails to compile, 13.0 is exactly right. Check which cu version your SGLang torch was built against (cu130), then match the toolchain exactly.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. SM86 (Ampere) hard ceiling
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;flashinfer's GDN kernels require SM90+; the 3090 is SM86 → &lt;strong&gt;only the Triton linear-attention backend works&lt;/strong&gt; (hard architecture limit, not config).&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;--enable-torch-compile&lt;/code&gt; crashes on GDN (&lt;code&gt;launcher() missing '_grid_2'&lt;/code&gt; — inductor can't compile &lt;code&gt;causal_conv1d&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;Don't waste time on these.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  4. MTP is doomed on INT4 weights
&lt;/h3&gt;

&lt;p&gt;Qwen3.8's built-in MTP head is BF16, but this INT4 quant quantized the head too — it misjudges on INT4 hidden states, acceptance never rises (1.07-1.27). Not a parameter problem; a quantization problem. Either use a W4A16 model that keeps the BF16 head (limited gain without P2P) or go DSpark.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. "Officially recommended" isn't right for your workload
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;--mamba-radix-cache-strategy extra_buffer&lt;/code&gt; (recommended to avoid GDN degradation): &lt;strong&gt;halves decode speed (62→30 tok/s)&lt;/strong&gt;. Permanent penalty to avoid a rare failure. Not worth it.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;--chunked-prefill-size 2048&lt;/code&gt; (recommended for concurrency): for single-request + 50-90K token agent contexts it quadruples prefill iterations and slows TTFT. &lt;strong&gt;I use 8192.&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Test your own workload before copying official parameters.&lt;/p&gt;

&lt;h3&gt;
  
  
  6. Memory allocation is the lifeline of CUDA graph capture
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;--mem-fraction-static&lt;/code&gt; too high + large context → no headroom for CUDA graph capture → &lt;strong&gt;verify-graph hangs&lt;/strong&gt; (log stalls at &lt;code&gt;Capturing batches 0%&lt;/code&gt;, GPU 100% but CPU time frozen). Fix: &lt;strong&gt;0.8&lt;/strong&gt; (DSpark also needs VRAM for the 1.4B draft), or &lt;code&gt;--cuda-graph-backend-prefill disabled&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How to tell a hang from progress&lt;/strong&gt;: &lt;code&gt;ps -o pid,pcpu,time&lt;/code&gt; — CPU TIME growing = healthy, frozen = deadlock. Don't kill the process prematurely; graph capture legitimately takes 90-120s.&lt;/p&gt;

&lt;h3&gt;
  
  
  7. &lt;code&gt;--served-model-name&lt;/code&gt; must be a short name
&lt;/h3&gt;

&lt;p&gt;Clients send short model names; if the server only exposes the full path → &lt;strong&gt;detokenizer hangs&lt;/strong&gt;, health checks fail, everything times out. Add &lt;code&gt;--served-model-name &amp;lt;short-name&amp;gt;&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  8. Multiple launch scripts resurrect old configs
&lt;/h3&gt;

&lt;p&gt;I had 6 launch entry points (.bashrc, systemd, watchdog, Windows VBS chain…). Editing parameters in one script while a watchdog pulls from another → old config "resurrects" after reboot. Audit all of them:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-r&lt;/span&gt; &lt;span class="s2"&gt;"sglang&lt;/span&gt;&lt;span class="se"&gt;\|&lt;/span&gt;&lt;span class="s2"&gt;start-models"&lt;/span&gt; ~/.bashrc ~/.wsl-hermes/ /etc/systemd/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;and point every entry point at the same config file.&lt;/p&gt;

&lt;h2&gt;
  
  
  Final config
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;python &lt;span class="nt"&gt;-m&lt;/span&gt; sglang.launch_server &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--model-path&lt;/span&gt; /home/user2222/models/cyankiwiQwen3.8-27B-AWQ-INT4 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--served-model-name&lt;/span&gt; cyankiwiQwen3.8-27B-AWQ-INT4 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--port&lt;/span&gt; 9090 &lt;span class="nt"&gt;--tp-size&lt;/span&gt; 2 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--quantization&lt;/span&gt; compressed-tensors &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--mem-fraction-static&lt;/span&gt; 0.8 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--kv-cache-dtype&lt;/span&gt; fp8_e4m3 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--chunked-prefill-size&lt;/span&gt; 8192 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--context-length&lt;/span&gt; 245760 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--dtype&lt;/span&gt; bfloat16 &lt;span class="nt"&gt;--mamba-ssm-dtype&lt;/span&gt; bfloat16 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--disable-custom-all-reduce&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--enable-tf32-matmul&lt;/span&gt; &lt;span class="nt"&gt;--schedule-policy&lt;/span&gt; lpm &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--trust-remote-code&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--speculative-algorithm&lt;/span&gt; DSPARK &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--speculative-draft-model-path&lt;/span&gt; /home/user2222/models/Qwen3.8-27B-DSpark &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--speculative-dspark-block-size&lt;/span&gt; 7 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--speculative-draft-model-quantization&lt;/span&gt; unquant &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--tool-call-parser&lt;/span&gt; qwen3_coder &lt;span class="nt"&gt;--reasoning-parser&lt;/span&gt; qwen3 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--max-running-requests&lt;/span&gt; 2 &lt;span class="nt"&gt;--allow-auto-truncate&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--cuda-graph-bs-decode&lt;/span&gt; 1 2 3 4 5 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--cuda-graph-backend-prefill&lt;/span&gt; disabled &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--mm-feature-transport&lt;/span&gt; cpu &lt;span class="nt"&gt;--stream-interval&lt;/span&gt; 1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Measured results
&lt;/h2&gt;

&lt;p&gt;Official-style benchmarks (DSpark vs no speculation):&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Task&lt;/th&gt;
&lt;th&gt;No speculation&lt;/th&gt;
&lt;th&gt;DSpark&lt;/th&gt;
&lt;th&gt;Speedup&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Code/JSON&lt;/td&gt;
&lt;td&gt;~63&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;170-210 tok/s&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;3x&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Deep reasoning&lt;/td&gt;
&lt;td&gt;~63&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;153 tok/s&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;2.4x&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Greedy sampling&lt;/td&gt;
&lt;td&gt;~63&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;215 tok/s&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;3.4x&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Plain text&lt;/td&gt;
&lt;td&gt;~63&lt;/td&gt;
&lt;td&gt;57 tok/s&lt;/td&gt;
&lt;td&gt;≈parity&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Long context&lt;/td&gt;
&lt;td&gt;~63&lt;/td&gt;
&lt;td&gt;61 tok/s&lt;/td&gt;
&lt;td&gt;≈parity&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Speculative acceptance&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;3.7-4.2&lt;/td&gt;
&lt;td&gt;3x MTP&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;End-to-end on real tasks (includes prefill + thinking tokens, so below pure decode peak):&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Task&lt;/th&gt;
&lt;th&gt;Time&lt;/th&gt;
&lt;th&gt;Output tokens&lt;/th&gt;
&lt;th&gt;End-to-end&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Code (quicksort)&lt;/td&gt;
&lt;td&gt;11.6s&lt;/td&gt;
&lt;td&gt;800&lt;/td&gt;
&lt;td&gt;~69 tok/s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;JSON structured output&lt;/td&gt;
&lt;td&gt;4.2s&lt;/td&gt;
&lt;td&gt;263&lt;/td&gt;
&lt;td&gt;~63 tok/s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Prose&lt;/td&gt;
&lt;td&gt;6.2s&lt;/td&gt;
&lt;td&gt;298&lt;/td&gt;
&lt;td&gt;~48 tok/s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Math reasoning&lt;/td&gt;
&lt;td&gt;6.3s&lt;/td&gt;
&lt;td&gt;439&lt;/td&gt;
&lt;td&gt;~69 tok/s&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Stability: 245,760 context, GPU0 23.9GB / GPU1 21.3GB, running 24/7 as an agent backend (code, JSON, tool calls, deep reasoning) with no crashes.&lt;/p&gt;

&lt;h2&gt;
  
  
  TL;DR lessons
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Read the official model card + cookbook after a new release; don't force-fit last gen's parameters.&lt;/li&gt;
&lt;li&gt;Engine, toolchain, and quant format must match: CUDA 13.0 + SGLang 0.5.17 + AWQ-INT4 was the answer here.&lt;/li&gt;
&lt;li&gt;When MTP fails, try DSpark — acceptance 3.7 vs 1.2 says everything.&lt;/li&gt;
&lt;li&gt;Without NVLink, don't expect 2x scaling; 170-210 tok/s is already beyond this combo's expected ceiling.&lt;/li&gt;
&lt;li&gt;Check the launch script's line continuations before changing any parameter. Saved me countless times.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Happy to answer questions in the comments — this took me a week and I'd rather you skip it.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally written for &lt;a href="https://digitalmarket.world/" rel="noopener noreferrer"&gt;DigitalMarket.World&lt;/a&gt; (World Digital Economy Network). All data from real measurements on my own hardware. Free to share with credit.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>llm</category>
      <category>tutorial</category>
      <category>selfhosted</category>
    </item>
  </channel>
</rss>
