← Back to the full write-up on hijoseromero.com

The Thinking Dial

One model, one file, Qwen 3.8-27B at 4-bit (Unsloth UD-Q4_K_XL, 17.9 GB), four positions of the reasoning dial: OFF (the instruct baseline from the quant video), LOW, MEDIUM, and XHIGH, which is what Qwen ships as the default. Same four one-shot tests, tools off, no retries.

Ground rules, read this first

One variableAll thinking runs are identical, same file, same seed (42), same official thinking samplers from the Qwen 3.8 model card (temperature 1.0, top_p 0.95, top_k 20, presence 0), except the reasoning_effort value, which the Unsloth server only accepts at launch, so each level got its own fresh server.
The baselineThe instruct column is the same physical file run with thinking disabled (enable_thinking: false) at the card's instruct samplers, from the quant-ladder video, same prompts, same protocol. Its outputs contained 0 thinking tokens, verified.
No truncationOutput budget 120,000 tokens inside a 131,072-token context, roughly double the longest thinking binge ever observed, so no answer was cut off by our limits. (The default level came close to needing it: one test produced 53,491 tokens.)
Tools + attemptsTools disabled. One prompt, one shot, no retries. Machine idle during the whole run. MTP/speculative decoding is part of the stock Unsloth build and identical across every run.
The rig (a floor, not a ceiling)GMKtec EVO-X2 mini PC: Ryzen AI Max+ 395 (Strix Halo), 128 GB unified LPDDR5X-8000 on a 256-bit bus (256 GB/s spec, ~215 GB/s measured), running CachyOS Linux as a normal desktop, not a dedicated inference box. Everything ran on Unsloth's stock llama.cpp build with default flags: no bandwidth tuning, no custom batch/ubatch sizing, no dedicated-GPU offload games. The tok/s you see is what this setup produces out of the box; a tuned llama.cpp configuration on the same silicon can go faster. These numbers are honest, not maximal.

Overview

Instruct (OFF)LOWMEDIUMXHIGH (default)
Model file on diskthe SAME Qwen3.8-27B-UD-Q4_K_XL.gguf, 17.9 GB, for all four columns
Parameter that sets this mode enable_thinking: false reasoning_effort: "low" reasoning_effort: "medium" reasoning_effort: "xhigh"
Qwen's own description (card) direct response, no thinking "efficient reasoning optimizing for speed and cost" "balancing accuracy and speed" "for complex tasks demanding thorough analysis"
Whole exam24m 23s29m 03s21m 57s156m 13s
Of which spent thinking*0m (off)13m 55s7m 43s123m 38s
Total input tokens (4 prompts)1,8061,9181,7981,966
Total output tokens29,62133,66825,676160,571
Thinking share of output0% (verified off)30-59%1-53%73-81%
Generation speed20.2 tok/s19.7 tok/s19.9 tok/s17.2 tok/s
Load time14.0 s9.0 s9.0 s9.0 s
Peak memory in use during run39 GB40 GB38 GB44 GB
Signed the SVG“Qwen” ✓“Claude”“Gemini”“Claude”

Peak memory = total system RAM at the highest point of that run (sampled every 5s). This rig has unified memory, CPU and GPU share one 128 GB pool, so there is no separate VRAM number; the ~9 GB OS baseline is included, which is why it runs higher than the file size. XHIGH peaks highest because its giant thinking transcripts inflate the context cache. The input tokens also differ slightly per column despite identical test prompts, explained in the highlighted section below.

What the dial actually is: three sentences the model injects into itself

These preambles are NOT sent by the benchmark. Every request contained only the test prompt plus the reasoning_effort value. The sentences below are added by the chat template embedded inside the model file itself, server-side, before the model runs, quoted verbatim from the template:

XHIGH injects: "Reasoning effort is set to xhigh. Please think carefully through the task, validate key assumptions, consider plausible alternatives, and prioritize correctness, consistency, and clarity in the final answer."

LOW injects: "Reasoning effort is set to low. Keep your thinking brief and focused, moving directly to the conclusion without unnecessary elaboration."

MEDIUM injects nothing at all. The template has no medium branch: thinking on, zero coaching, which goes a long way toward explaining its one-sentence Blockfall thought.

So the reasoning dial is not a compute budget or a special decoding mode. It is prompt engineering baked into the model file: a few injected words are the entire difference between the 22-minute exam and the 156-minute one. This is also why input tokens differ slightly per column (each preamble has its own length; the instruct column sits a few tokens above medium because disabling thinking pre-fills an empty think block each turn). Receipts: the extracted template.

One caveat straight from Qwen's card, quoted because it cuts against this page's speed story: "In multi-turn agentic tasks, lower reasoning effort does not always reduce overall task completion time. Although it may produce faster per-turn responses, it can also lead to insufficient analysis, more failures, and repeated retries, which may increase total latency and token consumption." These one-shot tests measure single-turn behavior; agent workloads can flip the economics.

About that signature row: the drawing test asks each model to sign the artwork with its own model name. Four runs of the same 17.9 GB file produced three different identities, and only the no-thinking run signed "Qwen". The other signatures point to Claude- and Gemini-generated text in the training data, which is common in how open models are trained; it just rarely shows up this visibly.

What is the reasoning dial? (explain it like I'm five)

Thinking mode makes the model write out its reasoning in a hidden scratchpad before answering, and reasoning_effort sets how much scratchpad it is allowed to fill. More thinking costs real time because every thinking token is generated at the same speed as answer tokens: at ~18 tok/s, a 120,000-character think-first session is most of an hour before the first line of your actual answer exists. The question this page answers: what does each dial position buy, and what does it cost?

The finding: the dial position that does not exist

Unsloth's docs and the Studio dropdown both show a fourth level, "none". I ran it as the fourth rung of this ladder. Every request failed with HTTP 500, and the model's own chat template says why:

Jinja Exception: Unexpected reasoning effort none.
Supported types are xhigh (default), medium, and low.

The template accepts exactly three levels. The "None" toggle in the app must flip the separate enable_thinking: false switch instead, which is the instruct baseline you see on this page. So the off switch is real, it is just not a reasoning_effort value, and the docs listing it as one is an Unsloth docs bug as of tonight.

And one more twist found while reading the template itself: it silently accepts a fourth spelling, "high", and quietly rewrites it to xhigh (if resolved_reasoning_effort == 'high' set resolved_reasoning_effort = 'xhigh'). So the error message says three levels exist, and the template's own code honors a fourth word. Receipts below.

*Thinking time and answer time are derived: the server reports total time per request, and since thinking tokens and answer tokens generate at the same decode rate, the total splits proportionally to each run's measured thinking share (prompt processing takes only a couple of seconds and is included in the answer side). Total time is measured directly.

Sources and receipts

Claim on this pageDirect source
Thinking is Qwen 3.8's default mode; how to disable it; official sampler settings for both modes Official Qwen 3.8-27B model card
enable_thinking / reasoning_effort behavior, the GROUND TRUTH: the chat template embedded in the model file, extracted verbatim from the GGUF on this machine (includes the enable_thinking is undefined or true branch, the xhigh default, and the hidden high → xhigh alias) chat-template-extracted-from-gguf.txt
The exact file every column ran Qwen3.8-27B-UD-Q4_K_XL.gguf on Hugging Face
Unsloth's reasoning_effort documentation (the page that lists "none", the docs bug this run exposed) unsloth.ai/docs/models/qwen3.8
The "none" rejection: full server traceback + reproduction notes q4-effort-none/EVIDENCE.md
Community testing of the effort levels (only low/medium/xhigh work; per-request behavior on other servers) HF discussion #113, "This model cannot stop thinking"
The instruct baseline's raw data (from the quant-ladder video, same protocol) q4-instruct-baseline/results.json
Every number in every table above: the raw per-run metrics low · medium · xhigh
LADDER

These are affiliate links. If you buy through them I may earn a small commission at no extra cost to you. As an Amazon Associate I earn from qualifying purchases.