gpt-oss 21B (3.6B active)
on M6 32GB · LM Studio · 32,768 ctx
Oct 13, 2026
Summary
Source: https://github.com/HDZucht/Mac-Mini-M6-LLM-benchmarks
Raw measured rows: https://github.com/HDZucht/Mac-Mini-M6-LLM-benchmarks/blob/3990a8e0fa5f2762911689439ce12e1c28d4c989/data/speed_2026-10-03.jsonl
Hardware/method/model labels: https://github.com/HDZucht/Mac-Mini-M6-LLM-benchmarks/blob/cb99870e05aa9f5783c5c6987ddd9154834123ab/README.md
Loaded context metadata: https://github.com/HDZucht/Mac-Mini-M6-LLM-benchmarks/blob/main/data/loaded_context_2026-10-03.jsonl
Harness: https://github.com/HDZucht/Mac-Mini-M6-LLM-benchmarks/blob/main/bench_speed.py
Original author: HDZucht / Hans-Dieter Zucht, with repository-credited automated measurements by Argus. Campaign dated October 3–4, 2026; these exact records are in the October 3 raw file. No local reproduction was performed.
Headline: 45.2 tokens/s is the median of three English-prose runs (Ruhr economy). It is client-observed streaming decode throughput, not a pooled rate, overall mean, peak, native kernel result or prompt-processing rate. Five workload medians and all 15 runs are preserved separately below.
Hardware: Apple Mac mini M6 (Mac18,5), 12 CPU cores (2 Super, 4 Performance, 6 Efficiency), 12 GPU cores, 32 GB unified memory, macOS 27.0.1. One machine, one model loaded alone. Model storage: ORICO 2 TB external NVMe in an ASMedia ASM246x enclosure, source-reported 40 Gb/s PCIe 4.0 x4. Apple automatic fan control. Per-run temperature, clock, power, swap, exact GPU offload and peak resident memory were not logged.
Exact measured API alias: openai/gpt-oss-20b. Display model: OpenAI GPT-OSS 20B. GPT-OSS 20B is clear at model-family level. Parameter count 20 is the nominal name, not an exact tensor count. Backend and quantization remain unknown.
Source Format-column label: blank/unreported. Exact measured quantization: unknown. Measured weight format: unknown; source label is not a confirmed weight container. Application: LM Studio. Backend: unreported for this alias. Exact app/backend versions are unknown. Do not turn QAT, MLX or Splash labels into an assumed Q4 quantization.
The current exact LM Studio alias links both a GGUF collection and an MLX MXFP4-Q8 package. Both pages were verified; this explicitly leaves the historical backend/format/quant selection unresolved. Native model-family MXFP4 information is not proof of the measured representation.
Current alias corroboration (not original run metadata): https://www.lmstudio.ai/models/openai/gpt-oss-20b
Verified public related package/collection: https://huggingface.co/lmstudio-community/gpt-oss-20b-GGUF
Verified public related package/collection: https://huggingface.co/mlx-community/gpt-oss-20b-MXFP4-Q8
Measured Hugging Face repository, filename, revision and hash are unrecorded. Public related-package links above prove availability only.
Loaded context for this exact alias is 32,768 tokens. Requested load context was 32,768. Loaded capacity is not actual prompt length or a filled-context test. Actual input token counts are absent. Native prefill throughput/duration are unknown; keep PP and new-input-token fields blank.
Method: one stream, max_tokens 600, temperature 0.7, reasoning_effort="none", three runs per prompt. A short Hallo warm-up precedes the measured prompts. The script includes emitted content and reasoning chunks; requested reasoning-off does not establish that reasoning was disabled in every backend/model.
The harness computes (tokens - 1) / (stream_end - first_nonempty_content_time). It uses API completion_tokens when available and nonzero; otherwise it falls back to the number of nonempty streamed chunks. Raw records contain tokens, chunks, TTFT and generated text, but not the original usage object, finish_reason or total duration. Treat tokens as recorded output counts, with this usage/chunk fallback caveat. Chunk counts need not equal tokenizer token counts. Rates are the saved rounded client rates, not recalculated from TTFT. TTFT is end-to-end client latency, not native prefill duration.
Prompts repeat identically across three repetitions; no nonce or explicit cache clear appears in the harness. Prefix-cache state/cached-token counts are unknown. These are not verified cold-prefill runs. A record of 600 equals the requested cap numerically, but finish_reason is not available. KV dtype, batching, microbatching, thread counts and exact GPU allocation are unreported.
All 15 runs follow, in source repetition order. Fields: decode tokens/s; recorded output count; nonempty chunks; client TTFT seconds.
German prose, Rhine geology (wissen_de), median 44.7 tokens/s:
Run 0: 44.1 tokens/s; 599 output count; 587 chunks; TTFT 0.55 s.
Run 1: 44.7 tokens/s; 599 output count; 589 chunks; TTFT 0.52 s.
Run 2: 44.9 tokens/s; 599 output count; 586 chunks; TTFT 0.55 s.
German prose, bead-based immunoassay (beads_de), median 45.3 tokens/s:
Run 0: 45.3 tokens/s; 599 output count; 589 chunks; TTFT 0.6 s.
Run 1: 45.3 tokens/s; 599 output count; 585 chunks; TTFT 0.61 s.
Run 2: 44.5 tokens/s; 599 output count; 588 chunks; TTFT 0.51 s.
English prose, Ruhr economy (prosa_en), median 45.2 tokens/s:
Run 0: 45.2 tokens/s; 411 output count; 397 chunks; TTFT 0.42 s.
Run 1: 45.4 tokens/s; 459 output count; 445 chunks; TTFT 0.5 s.
Run 2: 44.8 tokens/s; 456 output count; 440 chunks; TTFT 0.53 s.
Python ISO-8601 duration parser (code_py), median 44.9 tokens/s:
Run 0: 45 tokens/s; 481 output count; 458 chunks; TTFT 0.55 s.
Run 1: 44.9 tokens/s; 588 output count; 562 chunks; TTFT 0.58 s.
Run 2: 44.3 tokens/s; 599 output count; 575 chunks; TTFT 0.58 s.
JSON antigen/disease extraction (json_extr), median 53.3 tokens/s:
Run 0: 58.3 tokens/s; 107 output count; 95 chunks; TTFT 0.91 s.
Run 1: 53.3 tokens/s; 127 output count; 113 chunks; TTFT 0.78 s.
Run 2: 52.5 tokens/s; 132 output count; 122 chunks; TTFT 0.8 s.
Quality scope: The README reports the JSON task passed 3 of 3 automatic checks for this model. Prose/code quality was not generally graded. Throughput is not a quality score.