Results from the Linux box. This is a fresh baseline, not a continuation of the M5 Max report (benchmarks.md):
- Quants differ: GGUF Q4_K_M (llama.cpp) vs MLX 4-bit — quality scores shift slightly.
- Runtimes differ: llama.cpp (CUDA) and vLLM vs mlx-lm.
- Different hardware class entirely: 96 GB GDDR7 vs 128 GB unified memory — tok/s is not comparable across machines. Machine-verified quality scores (compile+run evals) do transfer as model rankings.
| host | orcd-office001.mit.edu |
| OS | Rocky Linux 10.2 (kernel 6.12, el10) |
| CPU | AMD Ryzen 9 9950X3D (16c/32t) |
| RAM | 185 GB |
| GPU | RTX 6000 Pro Workstation, 96 GB VRAM (sm_120), driver 615.71.09 |
| storage | /home 3.4 TB (repo, models, HF cache all live here; / is only 70 GB) |
Note: the AMD iGPU (Granite Ridge, 2 CU) is present but unused — all serving is CUDA on the RTX 6000 Pro Workstation.
One-time bring-up on the box: scripts/linux-setup.sh --with-vllm
(dnf packages, CUDA toolkit for nvcc, llama.cpp + MBZUAI-IFM fork built with
-DGGML_CUDA=ON -DCMAKE_CUDA_ARCHITECTURES=120, venv, perplexity corpus,
vLLM from PyPI CUDA wheels).
Then scripts/download-models.sh scripts/models-linux.txt (~200+ GB; verify
repo names in that file first — a wrong name 404s immediately).
Paths (root LV is only 70 GB): repo /home/root/m5-max-model-testing, models
/home/root/models (MODELS_DIR), HF cache /home/root/hf (HF_HOME), builds
/home/root/llama.cpp + /home/root/llama-k2. /home/lincolnb is someone
else's home — leave it.
Same weights, two runtimes, scored separately (the gptoss/gptoss-vllm,
qwen27/qwen27-vllm, qwen35/qwen35-vllm pairs). vLLM serves HF
originals (bf16; MXFP4 for gpt-oss), llama.cpp serves Q4_K_M GGUFs — so this
is a runtime+quant comparison; read it as "which stack should serve this box"
rather than a pure runtime benchmark.
| target | runtime | decode tok/s | C eval | notes |
|---|---|---|---|---|
| gptoss | llama.cpp CUDA | 360.3 | 50/57 | Q4_K_M-class MXFP4 GGUF |
| gptoss-vllm | vLLM CUDA | 283.8 | 44/57 | MXFP4 bf16-original |
| qwen27 | llama.cpp CUDA | 76.4 | 48/57 | Q4_K_M |
| qwen27-vllm | vLLM CUDA | 28.8 | 50/57 | bf16 — surprisingly slow; Mamba hybrid |
| qwen35 | llama.cpp CUDA | 261.9 | 38/57 | Q4_K_M |
| qwen35-vllm | vLLM CUDA | 182.7 | 34/57 | bf16 |
llama.cpp Q4_K_M wins every pair on both speed and (mostly) C eval — on this
box, serve GGUFs with llama.cpp. vLLM needed --max-num-seqs 512 on the
hybrid linear-attention models (CUDA graph capture requires max_num_seqs ≤
available Mamba cache blocks).
Same family as the Mac Ollama-vs-MLX pin: Qwen3.8-27B.
| target | stack | weights |
|---|---|---|
ollama |
Ollama | qwen3.8:27b Q4 GGUF |
qwen27-vllm |
vLLM | Qwen/Qwen3.8-27B HF bf16 |
qwen27-sglang |
SGLang | same HF tree as vLLM |
SGLang lives in .venv-sglang (scripts/linux-sglang-setup.sh) so it does not
fight vLLM's torch pin in .venv. Serve: scripts/serve-sglang.sh. Fill:
SWEEP_ONLY=qwen27-sglang PHASE=all scripts/run-linux-missing.sh.
Ollama vs vLLM is stack+quant. vLLM vs SGLang is the clean same-weights pair.
Raw JSON on the box in /home/root/m5-max-model-testing/results/; a copy is
pulled to docs/results-linux/ in this repo (kept out of docs/results/ so the Mac
baseline is not overwritten). Report HTML regenerated on the box.
decode/prefill = tok/s (2 trials, temp 0); C eval = tasks passed of 57 (3 trials each); quality = 6 prompt-injection robustness checks; ppl = WikiText-2 raw, 50 chunks, llama-perplexity (not comparable to MLX ppl).
| target | dec t/s | pre t/s | C eval | quality | ppl |
|---|---|---|---|---|---|
| gptoss | 360.3 | 332.1 | 50/57 | 4/6 | 121.3 ⚠ |
| coder | 338.3 | 266.4 | 41/57 | 6/6 | 9.05 |
| laguna | 316.7 | 270.9 | 42/57 | 6/6 | 13.06 |
| gptoss-vllm | 283.8 | 276.1 | 44/57 | 4/6 | — |
| qwen36-35b | 265.3 | 247.8 | 44/57 | 6/6 | 6.35 |
| qwen35 | 261.9 | 245.2 | 38/57 | 6/6 | 6.20 |
| coder-next | 242.3 | 226.5 | 50/57 | 6/6 | 7.06 |
| glm-flash | 231.1 | 196.3 | 36/57 | 6/6 | 16.08 |
| gemma | 222.0 | 190.2 | 48/57 | 6/6 | 14931 ⚠ |
| qwen35-vllm | 182.7 | 181.7 | 34/57 | 6/6 | — |
| k2horizon | 175.1 | 141.0 | 39/57 | 5/6 | 7.89 |
| laguna-s | 165.9 | 148.3 | 55/57 | 6/6 | 8.51 |
| qwen35-122b | 128.8 | 124.3 | 42/57 | 6/6 | 4.87 |
| qwen38flash | 117.5 | 94.6 | 52/57 | 6/6 | 3.60 |
| nemotron3 | 105.1 | 103.3 | 45/57 | 6/6 | 4.08 |
| devstral | 96.2 | 87.0 | 40/57 | 6/6 | 4.82 |
| qwen36-27b | 77.8 | 74.4 | 43/57 | 6/6 | 6.50 |
| qwen35-27b | 77.8 | 74.4 | 40/57 | 6/6 | 6.36 |
| qwen27 | 76.4 | 73.2 | 48/57 | 6/6 | 6.28 |
| deepseek-32b | 70.4 | 61.6 | 29/57 | 0/6 | 6.07 |
| aya | 65.4 | — | 23/57 | 4/6 | 6.12 |
| seed-oss | 64.0 | 56.6 | 2/57 | 1/6 | 8.91 |
| qwen27-vllm | 28.8 | 28.7 | 50/57 | 6/6 | — |
Sweep caveats:
- aya prefill: skipped — llama.cpp hard-caps requests at the model's n_ctx_train (8192) and the prefill prompt is ~11.4k tokens. bench.py now records such cases as skipped instead of aborting the target.
- gemma ppl ⚠: 14931 is a llama-perplexity/gemma4 artifact (BOS/control token handling), not a broken model — C eval 48/57 is healthy.
- gptoss ppl ⚠: 121 is the known MXFP4+harmony effect; matches the Mac.
- seed-oss 2/57: real — the model's answers don't compile/parse, not a harness issue (quality 1/6 agrees).
- fork ctx: qwen38flash/k2horizon serve with
--parallel 8, so ctx was raised to 131072 (16k per slot) to fit the 11.4k-token prefill prompt.
No known GGUF/HF release (MLX-only quants), dropped on Linux: ornith, laguna-mlx, laguna21, katcoder, katcoder-reap. Also dropped:
- deepseek-v4 — llama.cpp GGUF doesn't fit (smallest UD-IQ1_M is 87 GB with
no KV headroom). Colibrì is the path: official fp4/fp8 checkpoint
(~167 GB on disk), dense ~6 GB resident, experts streamed. Engine is built
at
/home/root/colibri;scripts/linux-colibri-setup.shdownloadsdeepseek-ai/DeepSeek-V4-Flash-0731. Serve withscripts/serve-colibri.shwhen the GPU is free. Expect a few tok/s, not llama.cpp-class decode — this is "does it run", not the interactive stack. - ling — llama.cpp has no
bailingmoe2.5arch; Colibrì has no Ling engine either. Still dropped.
Substitutions: laguna benches the official poolside XS-2.1 GGUF (Mac used an XS.2 blob); qwen38flash uses UD-Q2_K_XL (no Q4_K_M exists for that 177B MoE; Mac used MLX 4-bit).
- 96 GB VRAM budget: every mapped target fits (largest is qwen35-122b Q4_K_M at ~70 GB), but serve one at a time — the sweep already does.
- Fork targets: qwen38flash / k2horizon / laguna need the MBZUAI-IFM fork
(
/home/root/llama-k2, branchmodel/K2Horizon); setLLAMA_K2_SERVER_BINif it's elsewhere. laguna additionally needs--chat-template-file(setup script fetches it to$MODELS_DIR/laguna-template.jinja). - HF throttling: same as Mac — use
HF_TOKENfor the big downloads. - Don't let anything write to /root or ~/.cache: the root LV is 70 GB.
HF_HOME=/home/root/hfis set in /root/.bashrc by the setup script.