Files
hack/tools/scripts/llm-key-hunter/results/_cache/content/alexhiesch_apple-silicon-llm-bench.json
OpenCode 68a9071cf1 feat: reconcile local master with origin (exa/hot-platform hunters, leaks ledger, latest results)
Local branch had diverged from origin/master (sibling commits on the same base). Rewrote local history linearly on top of origin/master, folding in all local content: exa/hot-platform discovery hunters, leaks ledger, nightly sweep orchestrator, updated .gitignore and skill docs, plus the latest hunt output and vault state. Remote-only files (vault keys, channel scripts) were restored rather than dropped, so the resulting tree is a full union of both sides.
2026-08-07 12:53:47 +08:00

1 line
137 KiB
JSON
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
{"repo": "alexhiesch/apple-silicon-llm-bench", "files": {"config.yaml": {"b3a81b2c4fd659cec4d98328e735b302b591001b": {"t": 1786068510.1957335, "n": 118589, "h": "779242313bc6b038", "c": "# ─────────────────────────────────────────────────────────────────────────────\n# llm-bench — configuration file\n#\n# Edit this file to define which models, backends and quantizations to test.\n# The benchmark reads this file at startup; no code changes required.\n# ─────────────────────────────────────────────────────────────────────────────\n\n# Human-readable description of the machine running the benchmark.\nhardware:\n name: \"Apple M3 Max\"\n memory_gb: 64\n platform: \"darwin-arm64\"\n\n# ── Global settings ───────────────────────────────────────────────────────────\nsettings:\n runs: 3 # benchmark iterations per test (excluding warmup)\n warmup: 1 # warmup iterations before timed runs (captures cold TTFT)\n max_tokens: 512 # maximum tokens to generate per request\n temperature: 0.0 # deterministic output\n server_timeout: 600 # seconds to wait for server to become ready\n cooldown: 8 # seconds between tests (let DRAM settle)\n bench_port: 8090 # port used for backends we start ourselves\n\n# ── Prompts to run ────────────────────────────────────────────────────────────\n# Built-in names: short, long, code, context-4k, context-8k, context-16k, context-32k\n# Use \"all\" to run short + long + code. Use \"context\" for all context tiers.\nprompts:\n - short\n - long\n - code\n\n# ── Optional: define your own prompts ─────────────────────────────────────────\n# custom_prompts:\n# haiku:\n# messages:\n# - role: user\n# content: \"Write a haiku about neural networks.\"\n# sys-user:\n# messages:\n# - role: system\n# content: \"You are a helpful assistant.\"\n# - role: user\n# content: \"Explain backpropagation in two sentences.\"\n\n# ── Test matrix ───────────────────────────────────────────────────────────────\n# Each test is one (model × backend × quant × kv_cache) combination.\n#\n# Required fields:\n# id – unique slug used in CLI (--test), CSV output and reports\n# name – human-readable label shown in results table\n# backend – one of: ollama | mlx-lm | mlx-vlm | llama-server |\n# vllm-mlx | omlx | lm-studio | docker-model-runner\n# model_id – Ollama tag / HF repo ID / GGUF file path depending on backend\n# fmt – weight format label shown in report (e.g. MLX, GGUF, NVFP4, INT4)\n# quant – quantization label (e.g. 4bit, 8bit, Q4_K_M, nvfp4, int4)\n# kv_cache – KV cache variant label (default | kv8 | kv4 | kv2 | none | ...)\n#\n# Optional fields:\n# group – grouping label for the report table (default: \"default\")\n# enabled – set false to skip without deleting the entry (default: true)\n# extra_args – list of extra CLI arguments passed to the backend server\n# prereq – manual override for the readiness check string shown in --list\n# (leave empty \"\" to rely on auto-detection)\n# no_think – override the global --no-think flag for this specific test\n#\n# Backend-specific notes:\n# ollama – model_id is an Ollama tag; server is managed by Ollama itself\n# mlx-lm – model_id is an HF repo ID (mlx-community/…); uses mlx_lm.server\n# mlx-vlm – same as mlx-lm but uses mlx_vlm.server (better KV control)\n# llama-server – model_id is an absolute path to a GGUF file\n# vllm-mlx – model_id is an HF repo ID; needs vllm-mlx venv installed\n# omlx – model_id is the short model name as stored in ~/.omlx/models/\n# lm-studio – model_id is the model key as shown in LM Studio; server must\n# be started separately (or the benchmark starts it via lms CLI)\n# docker-model-runner – model_id is the full Docker image tag (docker.io/ai/…)\n# ─────────────────────────────────────────────────────────────────────────────\n\ntests:\n\n # ── Group A: Qwen3.5-35B-A3B (MoE) — apples-to-apples across backends ─────\n\n # ── A / Q4 — ~4-bit weight quantization ─────────────────────────────────────\n - id: A_Q4_1\n model: \"Qwen3.5\"\n group: \"A — Qwen3.5-35B-A3B (MoE)\"\n backend: mlx-lm\n model_id: \"mlx-community/Qwen3.5-35B-A3B-4bit\"\n fmt: MLX\n quant: 4bit\n kv_cache: default\n\n - id: A_Q4_2\n model: \"Qwen3.5\"\n group: \"A — Qwen3.5-35B-A3B (MoE)\"\n backend: mlx-vlm\n model_id: \"mlx-community/Qwen3.5-35B-A3B-4bit\"\n fmt: MLX\n quant: 4bit\n kv_cache: default\n extra_args: [\"--max-kv-size\", \"32768\"]\n\n - id: A_Q4_3\n model: \"Qwen3.5\"\n group: \"A — Qwen3.5-35B-A3B (MoE)\"\n backend: mlx-vlm\n model_id: \"mlx-community/Qwen3.5-35B-A3B-4bit\"\n fmt: MLX\n quant: 4bit\n kv_cache: kv4\n extra_args: [\"--max-kv-size\", \"32768\", \"--kv-bits\", \"4\"]\n\n - id: A_Q4_4\n model: \"Qwen3.5\"\n group: \"A — Qwen3.5-35B-A3B (MoE)\"\n backend: mlx-vlm\n model_id: \"mlx-community/Qwen3.5-35B-A3B-4bit\"\n fmt: MLX\n quant: 4bit\n kv_cache: kv2\n extra_args: [\"--max-kv-size\", \"32768\", \"--kv-bits\", \"2\"]\n\n - id: A_Q4_5\n model: \"Qwen3.5\"\n group: \"A — Qwen3.5-35B-A3B (MoE)\"\n backend: ollama\n model_id: \"qwen3.5:35b-a3b-q4_K_M\"\n fmt: GGUF\n quant: Q4_K_M\n kv_cache: default\n\n - id: A_Q4_6\n model: \"Qwen3.5\"\n group: \"A — Qwen3.5-35B-A3B (MoE)\"\n backend: ollama\n model_id: \"qwen3.5:35b-a3b-nvfp4\"\n fmt: NVFP4\n quant: nvfp4\n kv_cache: default\n\n - id: A_Q4_7\n model: \"Qwen3.5\"\n group: \"A — Qwen3.5-35B-A3B (MoE)\"\n backend: ollama\n model_id: \"qwen3.5:35b-a3b-int4\"\n fmt: INT4\n quant: int4\n kv_cache: default\n\n - id: A_Q4_8\n model: \"Qwen3.5\"\n group: \"A — Qwen3.5-35B-A3B (MoE)\"\n backend: llama-server\n # KNOWN ISSUE: Ollama stores Qwen3.5-MoE in a GGUF dialect that llama-server\n # rejects with: \"key qwen35moe.rope.dimension_sections has wrong array length;\n # expected 4, got 3\". The blob is a valid GGUF file but uses a newer spec that\n # the current llama.cpp parser doesn't accept for this MoE architecture.\n # FIX: Download the GGUF directly from HuggingFace instead of using the Ollama blob:\n # huggingface-cli download bartowski/Qwen3.5-35B-A3B-GGUF \\\n # --include \"Qwen3.5-35B-A3B-Q4_K_M.gguf\" --local-dir ~/.cache/llmfit/models/\n # Then set model_id to the absolute path below.\n model_id: \"ollama:qwen3.5:35b-a3b-q4_K_M\" # auto-resolve from Ollama blob (blocked, see above)\n # model_id: \"~/.cache/llmfit/models/Qwen3.5-35B-A3B-Q4_K_M.gguf\" # use this after download\n fmt: GGUF\n quant: Q4_K_M\n kv_cache: default\n enabled: false # blocked: Ollama GGUF dialect incompatible with current llama-server\n\n - id: A_Q4_9\n model: \"Qwen3.5\"\n group: \"A — Qwen3.5-35B-A3B (MoE)\"\n backend: docker-model-runner\n model_id: \"docker.io/ai/qwen3.5:35B-A3B-Q4_K_M\"\n fmt: GGUF\n quant: Q4_K_M\n kv_cache: default\n\n # ── A / Q8 — 8-bit weight quantization ──────────────────────────────────────\n - id: A_Q8_1\n model: \"Qwen3.5\"\n group: \"A — Qwen3.5-35B-A3B (MoE)\"\n backend: mlx-lm\n model_id: \"mlx-community/Qwen3.5-35B-A3B-8bit\"\n fmt: MLX\n quant: 8bit\n kv_cache: default\n\n - id: A_Q8_2\n model: \"Qwen3.5\"\n group: \"A — Qwen3.5-35B-A3B (MoE)\"\n backend: mlx-vlm\n model_id: \"mlx-community/Qwen3.5-35B-A3B-8bit\"\n fmt: MLX\n quant: 8bit\n kv_cache: default\n extra_args: [\"--max-kv-size\", \"32768\"]\n\n - id: A_Q8_3\n model: \"Qwen3.5\"\n group: \"A — Qwen3.5-35B-A3B (MoE)\"\n backend: llama-server\n # Same GGUF dialect incompatibility as A_Q4_8 (same model family, same Ollama storage format).\n # Download directly from HuggingFace and point to the local file to use this test.\n model_id: \"ollama:qwen3.5:35b-a3b-q8_0\"\n fmt: GGUF\n quant: Q8_0\n kv_cache: default\n enabled: false # blocked: Ollama GGUF dialect incompatible + q8_0 not pulled yet\n\n # llama-server — Unsloth GGUF quants (direct HF download bypasses Ollama dialect issue)\n # Download→bench→purge via run_llamacpp_all.py\n - id: A_LC_Q4KM\n model: \"Qwen3.5\"\n group: \"A — Qwen3.5-35B-A3B (MoE)\"\n backend: llama-server\n model_id: \"~/.cache/llmfit/models/Qwen3.5-35B-A3B-Q4_K_M.gguf\"\n fmt: GGUF\n quant: Q4_K_M\n kv_cache: default\n\n - id: A_LC_UDQ4\n model: \"Qwen3.5\"\n group: \"A — Qwen3.5-35B-A3B (MoE)\"\n backend: llama-server\n model_id: \"~/.cache/llmfit/models/Qwen3.5-35B-A3B-UD-Q4_K_XL.gguf\"\n fmt: GGUF\n quant: UD-Q4_K_XL\n kv_cache: default\n\n - id: A_LC_UDQ2\n model: \"Qwen3.5\"\n group: \"A — Qwen3.5-35B-A3B (MoE)\"\n backend: llama-server\n model_id: \"~/.cache/llmfit/models/Qwen3.5-35B-A3B-UD-Q2_K_XL.gguf\"\n fmt: GGUF\n quant: UD-Q2_K_XL\n kv_cache: default\n\n # ── Group B: Qwen3-Coder-Next (Dense, GQA) ───────────────────────────────────\n - id: B_Q4_1\n model: \"Coder\"\n group: \"B — Qwen3-Coder-Next (Dense)\"\n backend: mlx-lm\n model_id: \"mlx-community/Qwen3-Coder-Next-4bit\"\n fmt: MLX\n quant: 4bit\n kv_cache: default\n\n - id: B_Q4_2\n model: \"Coder\"\n group: \"B — Qwen3-Coder-Next (Dense)\"\n backend: mlx-lm\n model_id: \"mlx-community/Qwen3-Coder-Next-4bit\"\n fmt: MLX\n quant: 4bit\n kv_cache: cache32k\n extra_args: [\"--prompt-cache-bytes\", \"33554432\"]\n\n - id: B_Q4_3\n model: \"Coder\"\n group: \"B — Qwen3-Coder-Next (Dense)\"\n backend: mlx-vlm\n model_id: \"mlx-community/Qwen3-Coder-Next-4bit\"\n fmt: MLX\n quant: 4bit\n kv_cache: default\n extra_args: [\"--max-kv-size\", \"32768\"]\n # KNOWN ISSUE: mlx-vlm doesn't support the qwen3_next architecture yet.\n # Error: \"Model type qwen3_next not supported. No module named 'mlx_vlm.models.qwen3_next'\"\n # Re-enable once mlx-vlm adds qwen3_next support (track: https://github.com/Blaizzy/mlx-vlm)\n enabled: false\n\n - id: B_Q4_4\n model: \"Coder\"\n group: \"B — Qwen3-Coder-Next (Dense)\"\n backend: llama-server\n # Provide absolute path to your GGUF file:\n model_id: \"~/.cache/llmfit/models/Qwen3-Coder-Next-Q4_K_M.gguf\"\n fmt: GGUF\n quant: Q4_K_M\n kv_cache: default\n\n - id: B_Q4_5\n model: \"Coder\"\n group: \"B — Qwen3-Coder-Next (Dense)\"\n backend: llama-server\n model_id: \"~/.cache/llmfit/models/Qwen3-Coder-Next-Q4_K_M.gguf\"\n fmt: GGUF\n quant: Q4_K_M\n kv_cache: kv-q8\n extra_args: [\"-ctk\", \"q8_0\", \"-ctv\", \"q8_0\"]\n\n # ── Context scaling: Group A — Qwen3.5-35B-A3B ───────────────────────────────\n # Memory budget: ~22GB weights + KV\n # MoE architecture has very few GQA KV heads → KV ≈ 190 KB/token\n # 128k KV ≈ 24 GB → total ~46 GB → fits on 64 GB without KV quant\n # 256k would need KV-q4 (4-bit KV via mlx-vlm --kv-bits 4)\n\n - id: A_CTX_1\n model: \"Qwen3.5\"\n group: \"A — Qwen3.5-35B-A3B (MoE)\"\n backend: mlx-lm\n model_id: \"mlx-community/Qwen3.5-35B-A3B-4bit\"\n fmt: MLX\n quant: 4bit\n kv_cache: default\n prompts: [context-32k, context-64k, context-128k]\n\n - id: A_CTX_2\n model: \"Qwen3.5\"\n group: \"A — Qwen3.5-35B-A3B (MoE)\"\n backend: mlx-vlm\n model_id: \"mlx-community/Qwen3.5-35B-A3B-4bit\"\n fmt: MLX\n quant: 4bit\n kv_cache: kv4\n # KV-q4 reduces KV memory 4× — useful only if you need >128k on 64 GB.\n # BENCHMARKED RESULT (2026-04-02): KV quantization via mlx-vlm is\n # counterproductive for performance: prefill drops from 231k t/s (mlx-lm)\n # to 550 t/s, TTFT at 128k = 238 seconds vs 567 ms for mlx-lm default.\n # mlx-vlm does not have optimized Metal shaders for quantized KV prefill.\n # Recommendation: use mlx-lm (A_CTX_1) instead — it fits 128k natively.\n extra_args: [\"--max-kv-size\", \"131072\", \"--kv-bits\", \"4\"]\n prompts: [context-32k, context-64k, context-128k]\n\n # ── Context scaling: Group B — Qwen3-Coder-Next ──────────────────────────────\n # Memory budget: ~15 GB weights\n # Dense GQA model with ~8 KV heads → KV ≈ 300–400 KB/token\n # 128k KV ≈ 38 GB → total ~53 GB → theoretically fits, but OOM in practice\n # BENCHMARKED (2026-04-02): context-128k crashes with connection refused — mlx-lm\n # exhausts unified memory before completing the prefill. Capped at 64k.\n\n - id: B_CTX_1\n model: \"Coder\"\n group: \"B — Qwen3-Coder-Next (Dense)\"\n backend: mlx-lm\n model_id: \"mlx-community/Qwen3-Coder-Next-4bit\"\n fmt: MLX\n quant: 4bit\n kv_cache: default\n prompts: [context-32k, context-64k]\n\n # ── Group C: Gemma 3 27B-IT ───────────────────────────────────────────────────\n # Why: sliding window attention (SWA) makes KV cache nearly constant across\n # context lengths — global attention only every 6th layer. At 128k tokens the\n # effective KV footprint is ~6 GB vs ~24 GB for a full-attention model of equal\n # size. This is the architectural answer to the KV memory problem.\n # Model: mlx-community/gemma-3-27b-it-4bit (~14 GB download)\n # Native context: 131072 tokens\n # Intelligence: matches GPT-4o on most coding / instruction-following benchmarks\n\n - id: C_Q4_1\n model: \"Gemma3-27B\"\n group: \"C — Gemma 3 27B-IT\"\n backend: mlx-lm\n model_id: \"mlx-community/gemma-3-27b-it-4bit\"\n fmt: MLX\n quant: 4bit\n kv_cache: default\n\n - id: C_CTX_1\n model: \"Gemma3-27B\"\n group: \"C — Gemma 3 27B-IT\"\n backend: mlx-lm\n model_id: \"mlx-community/gemma-3-27b-it-4bit\"\n fmt: MLX\n quant: 4bit\n kv_cache: default\n # KNOWN ISSUE (2026-04-02): all context tiers timed out (>600s per request).\n # Short/code baseline (C_Q4_1) works fine. Likely cause: mlx-lm's Gemma 3\n # implementation falls back to a slow sequential path for long prompts due to\n # the mixed SWA/global attention architecture. Track mlx-lm updates.\n enabled: false\n prompts: [context-32k, context-64k, context-128k]\n\n # ── Group D: Qwen3-32B (Dense, non-MoE) ──────────────────────────────────────\n # Why: direct comparison — same Qwen3 family but dense 32B vs MoE 35B-A3B.\n # Dense models are typically slower (more active params per token) but may have\n # better recall / coherence at long context vs sparse MoE activation.\n # Model: mlx-community/Qwen3-32B-4bit (~16 GB download)\n # Native context: 131072 tokens\n\n - id: D_Q4_1\n model: \"Qwen3-32B\"\n group: \"D — Qwen3-32B (Dense)\"\n backend: mlx-lm\n model_id: \"mlx-community/Qwen3-32B-4bit\"\n fmt: MLX\n quant: 4bit\n kv_cache: default\n\n - id: D_CTX_1\n model: \"Qwen3-32B\"\n group: \"D — Qwen3-32B (Dense)\"\n backend: mlx-lm\n model_id: \"mlx-community/Qwen3-32B-4bit\"\n fmt: MLX\n quant: 4bit\n kv_cache: default\n # BENCHMARKED RESULT (2026-04-02):\n # context-32k: dec=10.4 t/s pre=38955 t/s TTFT=838ms (all runs OK)\n # context-64k+: OOM crash (connection refused) — KV exceeds available RAM\n # Dense 32B decode is 7× slower than MoE 35B-A3B at same context (10 vs 74 t/s)\n # because all 32B params are activated per token. Practical context ceiling: 32k.\n # 64k/128k capped: would require ~38 GB (64k) / ~76 GB (128k) KV on top of ~16 GB weights.\n prompts: [context-32k]\n\n # llama-server — Unsloth GGUF quants (download→bench→purge via run_llamacpp_all.py)\n - id: D_LC_Q4KM\n model: \"Qwen3-32B\"\n group: \"D — Qwen3-32B (Dense)\"\n backend: llama-server\n model_id: \"~/.cache/llmfit/models/Qwen3-32B-Q4_K_M.gguf\"\n fmt: GGUF\n quant: Q4_K_M\n kv_cache: default\n\n - id: D_LC_UDQ4\n model: \"Qwen3-32B\"\n group: \"D — Qwen3-32B (Dense)\"\n backend: llama-server\n model_id: \"~/.cache/llmfit/models/Qwen3-32B-UD-Q4_K_XL.gguf\"\n fmt: GGUF\n quant: UD-Q4_K_XL\n kv_cache: default\n\n - id: D_LC_UDQ2\n model: \"Qwen3-32B\"\n group: \"D — Qwen3-32B (Dense)\"\n backend: llama-server\n model_id: \"~/.cache/llmfit/models/Qwen3-32B-UD-Q2_K_XL.gguf\"\n fmt: GGUF\n quant: UD-Q2_K_XL\n kv_cache: default\n\n # ── Group E: Llama 3.3 70B ────────────────────────────────────────────────────\n # BENCHMARKED (2026-04-02):\n # Baseline decode: 8.5–8.9 t/s (short+code) — memory-bandwidth limited.\n # At 4bit × 70B params: each token reads ~35 GB weights from DRAM.\n # M3 Max ~400 GB/s bandwidth → theoretical max ~11 t/s → measured 8.5 t/s.\n # Context tests: OOM crash at 32k (37 GB model + KV exceeds 64 GB).\n # Verdict: not viable for Claude Code replacement on 64 GB. The model is\n # intelligent but too large to run at practical context + decode speed.\n # Use case: single-shot quality evaluation only (short prompts, no long ctx).\n # Model: mlx-community/Llama-3.3-70B-Instruct-4bit (downloaded 2026-04-02)\n # Native context: 131072 tokens\n\n - id: E_Q4_1\n model: \"Llama3.3-70B\"\n group: \"E — Llama 3.3 70B\"\n backend: mlx-lm\n model_id: \"mlx-community/Llama-3.3-70B-Instruct-4bit\"\n fmt: MLX\n quant: 4bit\n kv_cache: default\n\n - id: E_CTX_1\n model: \"Llama3.3-70B\"\n group: \"E — Llama 3.3 70B\"\n backend: mlx-lm\n model_id: \"mlx-community/Llama-3.3-70B-Instruct-4bit\"\n fmt: MLX\n quant: 4bit\n kv_cache: default\n # KNOWN ISSUE (2026-04-02): OOM crash at context-32k — model weights alone consume\n # ~37 GB; at 32k context, FP16 KV ≈ 6–7 GB additional → exceeds 64 GB budget.\n # Verdict: Llama 3.3 70B cannot run at any context depth on 64 GB unified memory.\n # Use E_Q4_1 (baseline short/code) for quality comparison only.\n enabled: false\n prompts: [context-32k, context-64k]\n\n - id: E_CTX_2\n model: \"Llama3.3-70B\"\n group: \"E — Llama 3.3 70B\"\n backend: mlx-vlm\n model_id: \"mlx-community/Llama-3.3-70B-Instruct-4bit\"\n fmt: MLX\n quant: 4bit\n kv_cache: kv4\n # KV-q4 cuts KV footprint 4×: 128k KV ≈ 10.7 GB → total ~48 GB → fits\n # KNOWN ISSUE: verify mlx-vlm supports llama3 architecture before enabling\n extra_args: [\"--max-kv-size\", \"131072\", \"--kv-bits\", \"4\"]\n prompts: [context-128k]\n enabled: false # enable once mlx-vlm llama3 architecture support confirmed\n\n # ── Group F: TurboQuant KV cache compression ──────────────────────────────────\n # TurboQuant (Google, ICLR 2026): PolarQuant-based KV compression via random\n # QR rotation + Lloyd-Max scalar quantizer. Data-oblivious, training-free.\n # V2 implementation uses mx.quantized_matmul (Metal-accelerated) → -2% speed.\n # 4-bit: 4.6x compression; 3-bit: 5.5x compression; 3.5-bit: 4.6x, <0.3% ppl loss.\n # Install: git clone https://github.com/sharpner/turboquant-mlx /tmp/turboquant-mlx\n # /opt/homebrew/Cellar/mlx-lm/0.31.1/libexec/bin/pip install -e /tmp/turboquant-mlx\n # Or use run_turboquant_omlx.py which handles the install automatically.\n\n - id: F_TQ4_1\n model: \"Qwen3.5\"\n group: \"F — TurboQuant\"\n backend: mlx-lm-turboquant\n model_id: \"mlx-community/Qwen3.5-35B-A3B-4bit\"\n fmt: MLX\n quant: 4bit\n kv_cache: tq4bit\n extra_args: [\"--tq-bits\", \"4\"]\n\n - id: F_TQ35_1\n model: \"Qwen3.5\"\n group: \"F — TurboQuant\"\n backend: mlx-lm-turboquant\n model_id: \"mlx-community/Qwen3.5-35B-A3B-4bit\"\n fmt: MLX\n quant: 4bit\n kv_cache: tq3.5bit\n extra_args: [\"--tq-bits\", \"3.5\"]\n\n - id: F_CTX_1\n model: \"Qwen3.5\"\n group: \"F — TurboQuant\"\n backend: mlx-lm-turboquant\n model_id: \"mlx-community/Qwen3.5-35B-A3B-4bit\"\n fmt: MLX\n quant: 4bit\n kv_cache: tq4bit\n extra_args: [\"--tq-bits\", \"4\"]\n prompts: [context-32k, context-64k, context-128k]\n\n - id: F_CTX_2\n model: \"Qwen3.5\"\n group: \"F — TurboQuant\"\n backend: mlx-lm-turboquant\n model_id: \"mlx-community/Qwen3.5-35B-A3B-4bit\"\n fmt: MLX\n quant: 4bit\n kv_cache: tq3bit\n extra_args: [\"--tq-bits\", \"3\"]\n prompts: [context-32k, context-64k, context-128k]\n\n # ── Group G: oMLX — SSD-tiered paged KV cache ─────────────────────────────────\n # oMLX (v0.3.0) persists KV cache in two tiers: hot blocks in RAM (~8GB),\n # cold blocks on NVMe SSD. Across requests, unchanged prefix blocks are reused\n # without re-prefill. Claims 10x faster effective prefill at 8K context vs\n # cold-start baselines, and \"virtually unlimited context\" via SSD spill.\n # Models: already in ~/.omlx/models/ (Qwen3.5-35B-A3B-4bit, Qwen3-Coder-Next-4bit)\n # cold_ttft_ms (warmup run) vs steady TTFT reveals cache warmup benefit.\n\n - id: G_1\n model: \"Qwen3.5\"\n group: \"G — oMLX (SSD KV Cache)\"\n backend: omlx\n model_id: \"Qwen3.5-35B-A3B-4bit\"\n fmt: MLX\n quant: 4bit\n kv_cache: ssd-paged\n\n - id: G_CTX_1\n model: \"Qwen3.5\"\n group: \"G — oMLX (SSD KV Cache)\"\n backend: omlx\n model_id: \"Qwen3.5-35B-A3B-4bit\"\n fmt: MLX\n quant: 4bit\n kv_cache: ssd-paged\n # BENCHMARKED (2026-04-02): oMLX hard-caps at 32768 tokens per request.\n # HTTP 400: \"Prompt too long: N tokens exceeds max context window of 32768 tokens\"\n # The SSD tier provides cross-request KV reuse (prefix cache), NOT extended per-request context.\n # 64k/128k are structurally impossible in current oMLX release.\n prompts: [context-32k]\n\n - id: G_2\n model: \"Coder\"\n group: \"G — oMLX (SSD KV Cache)\"\n backend: omlx\n model_id: \"Qwen3-Coder-Next-4bit\"\n fmt: MLX\n quant: 4bit\n kv_cache: ssd-paged\n\n - id: G_CTX_2\n model: \"Coder\"\n group: \"G — oMLX (SSD KV Cache)\"\n backend: omlx\n model_id: \"Qwen3-Coder-Next-4bit\"\n fmt: MLX\n quant: 4bit\n kv_cache: ssd-paged\n # Same 32768-token hard cap as G_CTX_1 — see note above.\n prompts: [context-32k]\n\n # ── Group H: llama-server cache-reuse (KV prefix sharing for agentic patterns) ─\n # --cache-reuse 256: enables KV shifting — when the server detects a shared\n # prefix (≥256 tokens), it reuses existing KV entries instead of recomputing.\n # Directly models Claude Code's pattern: same system prompt prepended every turn.\n # Compare with B_Q4_5 (kv-q8 without cache reuse) to isolate the reuse benefit.\n # -c 131072 allocates full 128k context window upfront.\n\n - id: H_CR_1\n model: \"Coder\"\n group: \"H — llama cache-reuse\"\n backend: llama-server\n model_id: \"~/.cache/llmfit/models/Qwen3-Coder-Next-Q4_K_M.gguf\"\n fmt: GGUF\n quant: Q4_K_M\n kv_cache: kv-q8+reuse\n extra_args: [\"-ctk\", \"q8_0\", \"-ctv\", \"q8_0\", \"--cache-reuse\", \"256\",\n \"-c\", \"131072\"]\n\n - id: H_CTX_1\n model: \"Coder\"\n group: \"H — llama cache-reuse\"\n backend: llama-server\n model_id: \"~/.cache/llmfit/models/Qwen3-Coder-Next-Q4_K_M.gguf\"\n fmt: GGUF\n quant: Q4_K_M\n kv_cache: kv-q8+reuse\n extra_args: [\"-ctk\", \"q8_0\", \"-ctv\", \"q8_0\", \"--cache-reuse\", \"256\",\n \"-c\", \"131072\"]\n prompts: [context-32k, context-64k]\n\n # ── Ollama 0.19 context tests (prefix cache warmup) ────────────────────────────\n # Ollama 0.19 added cross-conversation prefix caching (MLX-based).\n # cold_ttft_ms (warmup run) vs steady TTFT reveals cache warmup benefit.\n # Using NVFP4 (fastest TTFT in prior benchmarks: 63ms).\n\n - id: A_OLL_CTX\n model: \"Qwen3.5\"\n group: \"A — Qwen3.5-35B-A3B (MoE)\"\n backend: ollama\n model_id: \"qwen3.5:35b-a3b-nvfp4\"\n fmt: NVFP4\n quant: nvfp4\n kv_cache: default\n # cold_ttft_ms vs run TTFT shows Ollama 0.19 prefix cache warmup benefit.\n prompts: [context-32k, context-64k]\n\n # ── Ollama 0.19 INT4 context (fastest format in document: 134 t/s decode) ─────\n # INT4 is the highest-throughput format in Ollama 0.19. Compare directly with\n # A_OLL_CTX (NVFP4) to measure format quality/speed tradeoff at long context.\n\n - id: A_OLL_CTX_INT4\n model: \"Qwen3.5\"\n group: \"A — Qwen3.5-35B-A3B (MoE)\"\n backend: ollama\n model_id: \"qwen3.5:35b-a3b-int4\"\n fmt: INT4\n quant: int4\n kv_cache: default\n prompts: [context-32k, context-64k]\n\n # ── Group I: vllm-mlx ─────────────────────────────────────────────────────────\n # vllm-mlx: pure-MLX vLLM port — continuous batching, content-based prefix\n # caching. Document claims 21–87% higher throughput than llama.cpp, 4.3x\n # aggregate at 16 concurrent requests (not measured here — single-request mode).\n # Install: see VLLM_MLX_VENV in benchmark.py\n # model_id: HF repo ID (same as mlx-lm)\n\n - id: I_Q4_1\n model: \"Qwen3.5\"\n group: \"I — vllm-mlx\"\n backend: vllm-mlx\n model_id: \"mlx-community/Qwen3.5-35B-A3B-4bit\"\n fmt: MLX\n quant: 4bit\n kv_cache: default\n\n - id: I_Q4_2\n model: \"Coder\"\n group: \"I — vllm-mlx\"\n backend: vllm-mlx\n model_id: \"mlx-community/Qwen3-Coder-Next-4bit\"\n fmt: MLX\n quant: 4bit\n kv_cache: default\n\n - id: I_CTX_1\n model: \"Qwen3.5\"\n group: \"I — vllm-mlx\"\n backend: vllm-mlx\n model_id: \"mlx-community/Qwen3.5-35B-A3B-4bit\"\n fmt: MLX\n quant: 4bit\n kv_cache: default\n prompts: [context-32k, context-64k, context-128k]\n\n # ── Group J: LM Studio ────────────────────────────────────────────────────────\n # LM Studio: GUI wrapper around llama.cpp (GGUF) or mlx-lm backends.\n # Document: Ollama 0.18 was ~37% slower than LM Studio with same GGUF model.\n # Using models already loaded in LM Studio (see: lms ls).\n # The model IDs must match exactly what `lms ls` shows.\n # Note: LM Studio loads models on request; first run captures cold load time.\n\n - id: J_Q4_1\n model: \"Qwen3.5\"\n group: \"J — LM Studio\"\n backend: lm-studio\n model_id: \"qwen3.5-35b-a3b\"\n fmt: MLX\n quant: 4bit\n kv_cache: default\n\n - id: J_Q4_2\n model: \"Coder\"\n group: \"J — LM Studio\"\n backend: lm-studio\n model_id: \"qwen3-coder-next\"\n # KNOWN ISSUE: LM Studio's modelLoadingGuardrails (mode: \"high\") blocks this model\n # (44.86 GB) even when 54+ GB free — guardrail includes safety margin + KV estimate.\n # Workaround: set modelLoadingGuardrails.mode=\"off\" in ~/.lmstudio/settings.json,\n # restart lms server, run test, restore settings. Model loads in ~12s once allowed.\n # prereq override so --list shows the guardrail note instead of generic \"start LM Studio\"\n prereq: \"\"\n fmt: MLX\n quant: 4bit\n kv_cache: default\n\n # ══════════════════════════════════════════════════════════════════════════════\n # Group K — Gemma 4 26B A4B (MoE) — Google 2026-04-03\n # Architecture: Gemma4ForConditionalGeneration (MoE, 4B active / 26B total)\n # KV: 8 heads × head_dim=256 × 30 layers ≈ 240 KB/token (FP16)\n # Memory budget: ~13 GB weights (4bit) + KV\n # ctx-32k: ~8 GB KV → ~21 GB total ✓\n # ctx-64k: ~15 GB KV → ~28 GB total ✓\n # ctx-128k: ~30 GB KV → ~43 GB total ✓\n # ctx-256k: ~61 GB KV → ~74 GB total ✗ OOM\n # NOTE: Gemma 4 is a VLM (Gemma4ForConditionalGeneration) — use mlx-vlm backend.\n # mlx-lm 0.31.1 has no gemma4 module; mlx-vlm 0.4.3+ supports gemma4.\n # TurboQuant (K_TQ*) disabled — patches mlx_lm.models.cache, incompatible with VLM.\n # Ollama tags available: gemma4:26b (Q4_K_M ~18 GB)\n # mlx-community models: gemma-4-26b-a4b-it-4bit, -mxfp4, -nvfp4\n # ══════════════════════════════════════════════════════════════════════════════\n\n - id: K_Q4_1\n model: \"Gemma4-26B-A4B\"\n group: \"K — Gemma4 26B A4B (MoE)\"\n backend: mlx-vlm\n model_id: \"mlx-community/gemma-4-26b-a4b-it-4bit\"\n fmt: MLX\n quant: 4bit\n kv_cache: default\n extra_args: [\"--max-kv-size\", \"32768\"]\n\n - id: K_Q4_2\n model: \"Gemma4-26B-A4B\"\n group: \"K — Gemma4 26B A4B (MoE)\"\n backend: mlx-vlm\n model_id: \"mlx-community/gemma-4-26b-a4b-it-4bit\"\n fmt: MLX\n quant: 4bit\n kv_cache: kv4\n extra_args: [\"--max-kv-size\", \"32768\", \"--kv-bits\", \"4\"]\n\n - id: K_Q4_3\n model: \"Gemma4-26B-A4B\"\n group: \"K — Gemma4 26B A4B (MoE)\"\n backend: mlx-vlm\n model_id: \"mlx-community/gemma-4-26b-a4b-it-4bit\"\n fmt: MLX\n quant: 4bit\n kv_cache: kv2\n extra_args: [\"--max-kv-size\", \"32768\", \"--kv-bits\", \"2\"]\n enabled: false # verify gemma4 kv2 path in mlx-vlm before enabling\n\n - id: K_Q4_4\n model: \"Gemma4-26B-A4B\"\n group: \"K — Gemma4 26B A4B (MoE)\"\n backend: ollama\n model_id: \"gemma4:26b\"\n fmt: GGUF\n quant: Q4_K_M\n kv_cache: default\n # Enabled 2026-04-03: Ollama 0.20.0 supports gemma4 once service actually\n # runs 0.20.0 binary (required updating /opt/homebrew/opt/ollama symlink).\n\n - id: K_MXFP4_1\n model: \"Gemma4-26B-A4B\"\n group: \"K — Gemma4 26B A4B (MoE)\"\n backend: mlx-vlm\n model_id: \"mlx-community/gemma-4-26b-a4b-it-mxfp4\"\n fmt: MXFP4\n quant: mxfp4\n kv_cache: default\n # mxfp4 = MX Microscaling FP4 — new MLX-native quantization (2026). Same weight\n # size as 4bit but uses block-floating-point encoding for higher fidelity.\n extra_args: [\"--max-kv-size\", \"32768\"]\n\n - id: K_NVFP4_1\n model: \"Gemma4-26B-A4B\"\n group: \"K — Gemma4 26B A4B (MoE)\"\n backend: mlx-vlm\n model_id: \"mlx-community/gemma-4-26b-a4b-it-nvfp4\"\n fmt: NVFP4\n quant: nvfp4\n kv_cache: default\n extra_args: [\"--max-kv-size\", \"32768\"]\n\n - id: K_CTX_1\n model: \"Gemma4-26B-A4B\"\n group: \"K — Gemma4 26B A4B (MoE)\"\n backend: mlx-vlm\n model_id: \"mlx-community/gemma-4-26b-a4b-it-4bit\"\n fmt: MLX\n quant: 4bit\n kv_cache: default\n # ctx-256k capped: ~61 GB KV + ~13 GB weights = ~74 GB > 64 GB unified memory\n extra_args: [\"--max-kv-size\", \"131072\"]\n prompts: [context-32k, context-64k, context-128k]\n\n - id: K_CTX_2\n model: \"Gemma4-26B-A4B\"\n group: \"K — Gemma4 26B A4B (MoE)\"\n backend: mlx-vlm\n model_id: \"mlx-community/gemma-4-26b-a4b-it-4bit\"\n fmt: MLX\n quant: 4bit\n kv_cache: kv4\n # kv4 halves KV: ctx-128k ≈ 15 GB KV + 13 GB weights = ~28 GB — good margin.\n # Expect very high TTFT (same slow mlx-vlm quantized-KV prefill path as A_CTX_2).\n extra_args: [\"--max-kv-size\", \"131072\", \"--kv-bits\", \"4\"]\n prompts: [context-32k, context-64k, context-128k]\n\n - id: K_OLL_CTX_1\n model: \"Gemma4-26B-A4B\"\n group: \"K — Gemma4 26B A4B (MoE)\"\n backend: ollama\n model_id: \"gemma4:26b\"\n fmt: GGUF\n quant: Q4_K_M\n kv_cache: default\n # cold_ttft_ms (warmup) vs steady TTFT reveals Ollama prefix cache benefit.\n # Enabled 2026-04-03: Ollama 0.20.0 supports gemma4 (see K_Q4_4).\n prompts: [context-32k, context-64k, context-128k]\n\n # TurboQuant — disabled: mlx-lm 0.31.1 has no gemma4 module.\n # TurboQuant patches mlx_lm.models.cache — only applicable to mlx-lm architectures.\n # Re-enable once mlx-lm ships gemma4 support.\n - id: K_TQ4_1\n model: \"Gemma4-26B-A4B\"\n group: \"K — Gemma4 26B A4B (MoE)\"\n backend: mlx-lm-turboquant\n model_id: \"mlx-community/gemma-4-26b-a4b-it-4bit\"\n fmt: MLX\n quant: 4bit\n kv_cache: tq4bit\n extra_args: [\"--tq-bits\", \"4\"]\n enabled: false # mlx-lm lacks gemma4 support\n\n - id: K_TQ35_1\n model: \"Gemma4-26B-A4B\"\n group: \"K — Gemma4 26B A4B (MoE)\"\n backend: mlx-lm-turboquant\n model_id: \"mlx-community/gemma-4-26b-a4b-it-4bit\"\n fmt: MLX\n quant: 4bit\n kv_cache: tq3.5bit\n extra_args: [\"--tq-bits\", \"3.5\"]\n enabled: false\n\n - id: K_TQ3_1\n model: \"Gemma4-26B-A4B\"\n group: \"K — Gemma4 26B A4B (MoE)\"\n backend: mlx-lm-turboquant\n model_id: \"mlx-community/gemma-4-26b-a4b-it-4bit\"\n fmt: MLX\n quant: 4bit\n kv_cache: tq3bit\n extra_args: [\"--tq-bits\", \"3\"]\n enabled: false\n\n # llama-server — Unsloth GGUF quants (download→bench→purge via run_llamacpp_all.py)\n - id: K_LC_Q4KM\n model: \"Gemma4-26B-A4B\"\n group: \"K — Gemma4 26B A4B (MoE)\"\n backend: llama-server\n model_id: \"~/.cache/llmfit/models/gemma-4-26B-A4B-it-UD-Q4_K_M.gguf\"\n fmt: GGUF\n quant: UD-Q4_K_M\n kv_cache: default\n\n - id: K_LC_UDQ4\n model: \"Gemma4-26B-A4B\"\n group: \"K — Gemma4 26B A4B (MoE)\"\n backend: llama-server\n model_id: \"~/.cache/llmfit/models/gemma-4-26B-A4B-it-UD-Q4_K_XL.gguf\"\n fmt: GGUF\n quant: UD-Q4_K_XL\n kv_cache: default\n\n - id: K_LC_UDQ2\n model: \"Gemma4-26B-A4B\"\n group: \"K — Gemma4 26B A4B (MoE)\"\n backend: llama-server\n model_id: \"~/.cache/llmfit/models/gemma-4-26B-A4B-it-UD-Q2_K_XL.gguf\"\n fmt: GGUF\n quant: UD-Q2_K_XL\n kv_cache: default\n\n # ══════════════════════════════════════════════════════════════════════════════\n # Group L — Gemma 4 31B Dense\n # Architecture: Dense Gemma4 (full attention, not MoE)\n # Memory budget: ~17 GB weights (4bit) + KV\n # NOTE: VLM architecture — use mlx-vlm backend; mlx-lm not supported.\n # Model: mlx-community/gemma-4-31b-it-4bit\n # Ollama tags available: gemma4:31b (Q4_K_M ~20 GB)\n # ══════════════════════════════════════════════════════════════════════════════\n\n - id: L_Q4_1\n model: \"Gemma4-31B\"\n group: \"L — Gemma4 31B Dense\"\n backend: mlx-vlm\n model_id: \"mlx-community/gemma-4-31b-it-4bit\"\n fmt: MLX\n quant: 4bit\n kv_cache: default\n extra_args: [\"--max-kv-size\", \"32768\"]\n\n - id: L_Q4_2\n model: \"Gemma4-31B\"\n group: \"L — Gemma4 31B Dense\"\n backend: mlx-vlm\n model_id: \"mlx-community/gemma-4-31b-it-4bit\"\n fmt: MLX\n quant: 4bit\n kv_cache: kv4\n extra_args: [\"--max-kv-size\", \"32768\", \"--kv-bits\", \"4\"]\n\n - id: L_Q4_3\n model: \"Gemma4-31B\"\n group: \"L — Gemma4 31B Dense\"\n backend: ollama\n model_id: \"gemma4:31b\"\n fmt: GGUF\n quant: Q4_K_M\n kv_cache: default\n # Enabled 2026-04-03: Ollama 0.20.0 supports gemma4 (see K_Q4_4).\n\n - id: L_MXFP4_1\n model: \"Gemma4-31B\"\n group: \"L — Gemma4 31B Dense\"\n backend: mlx-vlm\n model_id: \"mlx-community/gemma-4-31b-it-mxfp4\"\n fmt: MXFP4\n quant: mxfp4\n kv_cache: default\n extra_args: [\"--max-kv-size\", \"32768\"]\n server_timeout: 1200 # 31B mxfp4 needs >600s to load on M3 Max\n\n - id: L_NVFP4_1\n model: \"Gemma4-31B\"\n group: \"L — Gemma4 31B Dense\"\n backend: mlx-vlm\n model_id: \"mlx-community/gemma-4-31b-it-nvfp4\"\n fmt: NVFP4\n quant: nvfp4\n kv_cache: default\n extra_args: [\"--max-kv-size\", \"32768\"]\n\n - id: L_CTX_1\n model: \"Gemma4-31B\"\n group: \"L — Gemma4 31B Dense\"\n backend: mlx-vlm\n model_id: \"mlx-community/gemma-4-31b-it-4bit\"\n fmt: MLX\n quant: 4bit\n kv_cache: default\n extra_args: [\"--max-kv-size\", \"131072\"]\n prompts: [context-32k, context-64k, context-128k]\n\n - id: L_CTX_2\n model: \"Gemma4-31B\"\n group: \"L — Gemma4 31B Dense\"\n backend: mlx-vlm\n model_id: \"mlx-community/gemma-4-31b-it-4bit\"\n fmt: MLX\n quant: 4bit\n kv_cache: kv4\n extra_args: [\"--max-kv-size\", \"131072\", \"--kv-bits\", \"4\"]\n prompts: [context-32k, context-64k, context-128k]\n\n - id: L_OLL_CTX_1\n model: \"Gemma4-31B\"\n group: \"L — Gemma4 31B Dense\"\n backend: ollama\n model_id: \"gemma4:31b\"\n fmt: GGUF\n quant: Q4_K_M\n kv_cache: default\n # Enabled 2026-04-03: Ollama 0.20.0 supports gemma4 (see K_Q4_4).\n prompts: [context-32k, context-64k, context-128k]\n\n # llama-server — Unsloth GGUF quants (download→bench→purge via run_llamacpp_all.py)\n - id: L_LC_Q4KM\n model: \"Gemma4-31B\"\n group: \"L — Gemma4 31B Dense\"\n backend: llama-server\n model_id: \"~/.cache/llmfit/models/gemma-4-31B-it-Q4_K_M.gguf\"\n fmt: GGUF\n quant: Q4_K_M\n kv_cache: default\n\n - id: L_LC_UDQ4\n model: \"Gemma4-31B\"\n group: \"L — Gemma4 31B Dense\"\n backend: llama-server\n model_id: \"~/.cache/llmfit/models/gemma-4-31B-it-UD-Q4_K_XL.gguf\"\n fmt: GGUF\n quant: UD-Q4_K_XL\n kv_cache: default\n\n - id: L_LC_UDQ2\n model: \"Gemma4-31B\"\n group: \"L — Gemma4 31B Dense\"\n backend: llama-server\n model_id: \"~/.cache/llmfit/models/gemma-4-31B-it-UD-Q2_K_XL.gguf\"\n fmt: GGUF\n quant: UD-Q2_K_XL\n kv_cache: default\n\n # ══════════════════════════════════════════════════════════════════════════════\n # Group M — Gemma 4 E4B (Efficient 4B) — Google 2026-04\n # Small, fast model from the Gemma 4 family. ~2 GB weights at 4bit.\n # mlx-community models: gemma-4-e4b-it-4bit, -mxfp4, -nvfp4\n # Ollama tag: gemma4:4b (check availability)\n # ctx-256k fits easily: even 256k KV << 64 GB unified memory for 4B model\n # VLM architecture (Gemma4ForConditionalGeneration) — use mlx-vlm backend\n # ══════════════════════════════════════════════════════════════════════════════\n\n - id: M_Q4_1\n model: \"Gemma4-E4B\"\n group: \"M — Gemma4 E4B (4B Efficient)\"\n backend: mlx-vlm\n model_id: \"mlx-community/gemma-4-e4b-it-4bit\"\n fmt: MLX\n quant: 4bit\n kv_cache: default\n extra_args: [\"--max-kv-size\", \"32768\"]\n\n - id: M_Q4_2\n model: \"Gemma4-E4B\"\n group: \"M — Gemma4 E4B (4B Efficient)\"\n backend: mlx-vlm\n model_id: \"mlx-community/gemma-4-e4b-it-4bit\"\n fmt: MLX\n quant: 4bit\n kv_cache: kv4\n extra_args: [\"--max-kv-size\", \"32768\", \"--kv-bits\", \"4\"]\n\n - id: M_MXFP4_1\n model: \"Gemma4-E4B\"\n group: \"M — Gemma4 E4B (4B Efficient)\"\n backend: mlx-vlm\n model_id: \"mlx-community/gemma-4-e4b-it-mxfp4\"\n fmt: MXFP4\n quant: mxfp4\n kv_cache: default\n extra_args: [\"--max-kv-size\", \"32768\"]\n\n - id: M_NVFP4_1\n model: \"Gemma4-E4B\"\n group: \"M — Gemma4 E4B (4B Efficient)\"\n backend: mlx-vlm\n model_id: \"mlx-community/gemma-4-e4b-it-nvfp4\"\n fmt: NVFP4\n quant: nvfp4\n kv_cache: default\n extra_args: [\"--max-kv-size\", \"32768\"]\n\n - id: M_Q4_3\n model: \"Gemma4-E4B\"\n group: \"M — Gemma4 E4B (4B Efficient)\"\n backend: ollama\n model_id: \"gemma4:e4b\"\n fmt: GGUF\n quant: Q4_K_M\n kv_cache: default\n\n - id: M_CTX_1\n model: \"Gemma4-E4B\"\n group: \"M — Gemma4 E4B (4B Efficient)\"\n backend: mlx-vlm\n model_id: \"mlx-community/gemma-4-e4b-it-4bit\"\n fmt: MLX\n quant: 4bit\n kv_cache: default\n extra_args: [\"--max-kv-size\", \"131072\"]\n prompts: [context-32k, context-64k, context-128k]\n enabled: true # mlx-vlm 0.4.4 fixes per_layer_projection bug — re-enabled and benchmarked 2026-04-05\n # with sequences >2048 tokens. All E4B context runs crash the server.\n # Root: project_per_layer_inputs in gemma4/language.py line 449.\n\n - id: M_OLL_CTX_1\n model: \"Gemma4-E4B\"\n group: \"M — Gemma4 E4B (4B Efficient)\"\n backend: ollama\n model_id: \"gemma4:e4b\"\n fmt: GGUF\n quant: Q4_K_M\n kv_cache: default\n prompts: [context-32k, context-64k, context-128k]\n\n # llama-server — Unsloth GGUF quants (download→bench→purge via run_llamacpp_all.py)\n - id: M_LC_Q4KM\n model: \"Gemma4-E4B\"\n group: \"M — Gemma4 E4B (4B Efficient)\"\n backend: llama-server\n model_id: \"~/.cache/llmfit/models/gemma-4-E4B-it-Q4_K_M.gguf\"\n fmt: GGUF\n quant: Q4_K_M\n kv_cache: default\n\n - id: M_LC_UDQ4\n model: \"Gemma4-E4B\"\n group: \"M — Gemma4 E4B (4B Efficient)\"\n backend: llama-server\n model_id: \"~/.cache/llmfit/models/gemma-4-E4B-it-UD-Q4_K_XL.gguf\"\n fmt: GGUF\n quant: UD-Q4_K_XL\n kv_cache: default\n\n - id: M_LC_UDQ2\n model: \"Gemma4-E4B\"\n group: \"M — Gemma4 E4B (4B Efficient)\"\n backend: llama-server\n model_id: \"~/.cache/llmfit/models/gemma-4-E4B-it-UD-Q2_K_XL.gguf\"\n fmt: GGUF\n quant: UD-Q2_K_XL\n kv_cache: default\n\n - id: M_LC_UDQ6\n model: \"Gemma4-E4B\"\n group: \"M — Gemma4 E4B (4B Efficient)\"\n backend: llama-server\n model_id: \"~/.cache/llmfit/models/gemma-4-E4B-it-UD-Q6_K_XL.gguf\"\n fmt: GGUF\n quant: UD-Q6_K_XL\n kv_cache: default\n\n # ══════════════════════════════════════════════════════════════════════════════\n # Group N — Gemma 4 E2B (Efficient 2B) — Google 2026-04\n # Smallest Gemma 4 model. ~1 GB weights at 4bit.\n # mlx-community models: gemma-4-e2b-it-4bit, -nvfp4 (no mxfp4 available)\n # Ollama tag: gemma4:2b (check availability)\n # VLM architecture (Gemma4ForConditionalGeneration) — use mlx-vlm backend\n # ══════════════════════════════════════════════════════════════════════════════\n\n - id: N_Q4_1\n model: \"Gemma4-E2B\"\n group: \"N — Gemma4 E2B (2B Efficient)\"\n backend: mlx-vlm\n model_id: \"mlx-community/gemma-4-e2b-it-4bit\"\n fmt: MLX\n quant: 4bit\n kv_cache: default\n extra_args: [\"--max-kv-size\", \"32768\"]\n\n - id: N_Q4_2\n model: \"Gemma4-E2B\"\n group: \"N — Gemma4 E2B (2B Efficient)\"\n backend: mlx-vlm\n model_id: \"mlx-community/gemma-4-e2b-it-4bit\"\n fmt: MLX\n quant: 4bit\n kv_cache: kv4\n extra_args: [\"--max-kv-size\", \"32768\", \"--kv-bits\", \"4\"]\n\n - id: N_NVFP4_1\n model: \"Gemma4-E2B\"\n group: \"N — Gemma4 E2B (2B Efficient)\"\n backend: mlx-vlm\n model_id: \"mlx-community/gemma-4-e2b-it-nvfp4\"\n fmt: NVFP4\n quant: nvfp4\n kv_cache: default\n extra_args: [\"--max-kv-size\", \"32768\"]\n enabled: false # 2026-04-04: mlx-community/gemma-4-e2b-it-nvfp4 has no weight files (1 metadata file only)\n\n - id: N_Q4_3\n model: \"Gemma4-E2B\"\n group: \"N — Gemma4 E2B (2B Efficient)\"\n backend: ollama\n model_id: \"gemma4:e2b\"\n fmt: GGUF\n quant: Q4_K_M\n kv_cache: default\n\n - id: N_CTX_1\n model: \"Gemma4-E2B\"\n group: \"N — Gemma4 E2B (2B Efficient)\"\n backend: mlx-vlm\n model_id: \"mlx-community/gemma-4-e2b-it-4bit\"\n fmt: MLX\n quant: 4bit\n kv_cache: default\n extra_args: [\"--max-kv-size\", \"131072\"]\n prompts: [context-32k, context-64k, context-128k]\n enabled: true # mlx-vlm 0.4.4 fixes per_layer_projection bug — re-enabled and benchmarked 2026-04-05\n\n - id: N_OLL_CTX_1\n model: \"Gemma4-E2B\"\n group: \"N — Gemma4 E2B (2B Efficient)\"\n backend: ollama\n model_id: \"gemma4:e2b\"\n fmt: GGUF\n quant: Q4_K_M\n kv_cache: default\n prompts: [context-32k, context-64k, context-128k]\n\n # llama-server — Unsloth GGUF quants (download→bench→purge via run_llamacpp_all.py)\n - id: N_LC_Q4KM\n model: \"Gemma4-E2B\"\n group: \"N — Gemma4 E2B (2B Efficient)\"\n backend: llama-server\n model_id: \"~/.cache/llmfit/models/gemma-4-E2B-it-Q4_K_M.gguf\"\n fmt: GGUF\n quant: Q4_K_M\n kv_cache: default\n\n - id: N_LC_UDQ4\n model: \"Gemma4-E2B\"\n group: \"N — Gemma4 E2B (2B Efficient)\"\n backend: llama-server\n model_id: \"~/.cache/llmfit/models/gemma-4-E2B-it-UD-Q4_K_XL.gguf\"\n fmt: GGUF\n quant: UD-Q4_K_XL\n kv_cache: default\n\n - id: N_LC_UDQ2\n model: \"Gemma4-E2B\"\n group: \"N — Gemma4 E2B (2B Efficient)\"\n backend: llama-server\n model_id: \"~/.cache/llmfit/models/gemma-4-E2B-it-UD-Q2_K_XL.gguf\"\n fmt: GGUF\n quant: UD-Q2_K_XL\n kv_cache: default\n\n - id: N_LC_UDQ6\n model: \"Gemma4-E2B\"\n group: \"N — Gemma4 E2B (2B Efficient)\"\n backend: llama-server\n model_id: \"~/.cache/llmfit/models/gemma-4-E2B-it-UD-Q6_K_XL.gguf\"\n fmt: GGUF\n quant: UD-Q6_K_XL\n kv_cache: default\n\n # ══════════════════════════════════════════════════════════════════════════════\n # Group O — Qwen3.6-35B-A3B (MoE, Gated Delta Networks) — Qwen 2026-04-16\n # Architecture: same MoE 35B-A3B shell as Qwen3.5 (3B active / 35B total)\n # but with Gated Delta Networks — improved agentic coding, repo-level\n # reasoning, thinking preservation across conversation history.\n # Native context: 262144 tokens\n # Memory budget: identical to Group A (~22 GB weights 4bit + KV)\n # HuggingFace: Qwen/Qwen3.6-35B-A3B\n # NOTE: released 2026-04-16 — mlx-community quantizations and Ollama tags\n # may not be available yet. Check before running:\n # huggingface-cli search mlx-community/Qwen3.6\n # ollama list | grep qwen3.6\n # ══════════════════════════════════════════════════════════════════════════════\n\n - id: O_Q4_1\n model: \"Qwen3.6-35B\"\n group: \"O — Qwen3.6-35B-A3B (MoE)\"\n backend: mlx-lm\n model_id: \"mlx-community/Qwen3.6-35B-A3B-4bit\"\n fmt: MLX\n quant: 4bit\n kv_cache: default\n\n - id: O_Q4_2\n model: \"Qwen3.6-35B\"\n group: \"O — Qwen3.6-35B-A3B (MoE)\"\n backend: ollama\n model_id: \"qwen3.6:35b-a3b-q4_K_M\"\n fmt: GGUF\n quant: Q4_K_M\n kv_cache: default\n\n - id: O_Q4_3\n model: \"Qwen3.6-35B\"\n group: \"O — Qwen3.6-35B-A3B (MoE)\"\n backend: ollama\n model_id: \"qwen3.6:35b-a3b-nvfp4\"\n fmt: NVFP4\n quant: nvfp4\n kv_cache: default\n\n - id: O_Q4_4\n model: \"Qwen3.6-35B\"\n group: \"O — Qwen3.6-35B-A3B (MoE)\"\n backend: ollama\n model_id: \"qwen3.6:35b-a3b-int4\"\n fmt: INT4\n quant: int4\n kv_cache: default\n\n - id: O_Q8_1\n model: \"Qwen3.6-35B\"\n group: \"O — Qwen3.6-35B-A3B (MoE)\"\n backend: mlx-lm\n model_id: \"mlx-community/Qwen3.6-35B-A3B-8bit\"\n fmt: MLX\n quant: 8bit\n kv_cache: default\n\n - id: O_CTX_1\n model: \"Qwen3.6-35B\"\n group: \"O — Qwen3.6-35B-A3B (MoE)\"\n backend: mlx-lm\n model_id: \"mlx-community/Qwen3.6-35B-A3B-4bit\"\n fmt: MLX\n quant: 4bit\n kv_cache: default\n prompts: [context-32k, context-64k, context-128k]\n\n - id: O_OLL_CTX\n model: \"Qwen3.6-35B\"\n group: \"O — Qwen3.6-35B-A3B (MoE)\"\n backend: ollama\n model_id: \"qwen3.6:35b-a3b-nvfp4\"\n fmt: NVFP4\n quant: nvfp4\n kv_cache: default\n prompts: [context-32k, context-64k]\n\n # llama-server — Unsloth GGUF quants (download→bench→purge via run_llamacpp_all.py)\n - id: O_LC_Q4KM\n model: \"Qwen3.6-35B\"\n group: \"O — Qwen3.6-35B-A3B (MoE)\"\n backend: llama-server\n model_id: \"~/.cache/llmfit/models/Qwen3.6-35B-A3B-UD-Q4_K_M.gguf\"\n fmt: GGUF\n quant: UD-Q4_K_M\n kv_cache: default\n\n - id: O_LC_UDQ4\n model: \"Qwen3.6-35B\"\n group: \"O — Qwen3.6-35B-A3B (MoE)\"\n backend: llama-server\n model_id: \"~/.cache/llmfit/models/Qwen3.6-35B-A3B-UD-Q4_K_XL.gguf\"\n fmt: GGUF\n quant: UD-Q4_K_XL\n kv_cache: default\n\n - id: O_LC_UDQ2\n model: \"Qwen3.6-35B\"\n group: \"O — Qwen3.6-35B-A3B (MoE)\"\n backend: llama-server\n model_id: \"~/.cache/llmfit/models/Qwen3.6-35B-A3B-UD-Q2_K_XL.gguf\"\n fmt: GGUF\n quant: UD-Q2_K_XL\n kv_cache: default\n\n # ══════════════════════════════════════════════════════════════════════════════\n # Group P — Qwen3.6-27B (Dense, VLM, Gated DeltaNet) — Qwen 2026-04-22\n # Architecture: Qwen3_5ForConditionalGeneration (Dense 27B, VLM)\n # Hybrid attention: 16× (3× Gated DeltaNet + 1× Gated Attention per block)\n # 64 layers total; only 16 full-attention layers need per-token KV cache.\n # DeltaNet layers use fixed-size state → KV cost is ~¼ of a standard 27B model.\n # Native context: 262,144 tokens (extensible to ~1M with YaRN)\n # Memory budget: ~16 GB weights (4bit)\n # KV: ~64 KB/token (16 full-attn layers × 4 KV heads × 256 head_dim)\n # ctx-32k: ~2 GB KV → ~18 GB total ✓\n # ctx-64k: ~4 GB KV → ~20 GB total ✓\n # ctx-128k: ~8 GB KV → ~24 GB total ✓\n # ctx-256k: ~16 GB KV → ~32 GB total ✓\n # NOTE: VLM architecture (Qwen3_5ForConditionalGeneration) but mlx-lm also\n # supports qwen3_5 model type (text-only mode). Both mlx-lm and mlx-vlm work.\n # TurboQuant (mlx-lm-turboquant) also works via mlx-lm text path.\n # HuggingFace: Qwen/Qwen3.6-27B\n # mlx-community models: Qwen3.6-27B-4bit, -8bit, -mxfp4, -nvfp4\n # Ollama tags: qwen3.6:27b (Q4_K_M), :27b-nvfp4, :27b-q8_0\n # ══════════════════════════════════════════════════════════════════════════════\n\n - id: P_Q4_0\n model: \"Qwen3.6-27B\"\n group: \"P — Qwen3.6-27B (Dense, VLM)\"\n backend: mlx-lm\n model_id: \"mlx-community/Qwen3.6-27B-4bit\"\n fmt: MLX\n quant: 4bit\n kv_cache: default\n\n - id: P_Q4_1\n model: \"Qwen3.6-27B\"\n group: \"P — Qwen3.6-27B (Dense, VLM)\"\n backend: mlx-vlm\n model_id: \"mlx-community/Qwen3.6-27B-4bit\"\n fmt: MLX\n quant: 4bit\n kv_cache: default\n extra_args: [\"--max-kv-size\", \"32768\"]\n enabled: false # mlx-vlm returns HTTP 500 for qwen3_5 architecture\n\n - id: P_Q4_2\n model: \"Qwen3.6-27B\"\n group: \"P — Qwen3.6-27B (Dense, VLM)\"\n backend: mlx-vlm\n model_id: \"mlx-community/Qwen3.6-27B-4bit\"\n fmt: MLX\n quant: 4bit\n kv_cache: kv4\n extra_args: [\"--max-kv-size\", \"32768\", \"--kv-bits\", \"4\"]\n enabled: false # mlx-vlm returns HTTP 500 for qwen3_5 architecture\n\n - id: P_Q4_3\n model: \"Qwen3.6-27B\"\n group: \"P — Qwen3.6-27B (Dense, VLM)\"\n backend: mlx-vlm\n model_id: \"mlx-community/Qwen3.6-27B-4bit\"\n fmt: MLX\n quant: 4bit\n kv_cache: kv2\n extra_args: [\"--max-kv-size\", \"32768\", \"--kv-bits\", \"2\"]\n enabled: false # verify kv2 path in mlx-vlm for qwen3_5 before enabling\n\n - id: P_Q4_4\n model: \"Qwen3.6-27B\"\n group: \"P — Qwen3.6-27B (Dense, VLM)\"\n backend: ollama\n model_id: \"qwen3.6:27b-q4_K_M\"\n fmt: GGUF\n quant: Q4_K_M\n kv_cache: default\n\n - id: P_Q4_5\n model: \"Qwen3.6-27B\"\n group: \"P — Qwen3.6-27B (Dense, VLM)\"\n backend: ollama\n model_id: \"qwen3.6:27b-nvfp4\"\n fmt: NVFP4\n quant: nvfp4\n kv_cache: default\n\n - id: P_Q8_0\n model: \"Qwen3.6-27B\"\n group: \"P — Qwen3.6-27B (Dense, VLM)\"\n backend: mlx-lm\n model_id: \"mlx-community/Qwen3.6-27B-8bit\"\n fmt: MLX\n quant: 8bit\n kv_cache: default\n # ~30 GB weights; feasible on 64 GB for short context but tight for long ctx\n\n - id: P_Q8_1\n model: \"Qwen3.6-27B\"\n group: \"P — Qwen3.6-27B (Dense, VLM)\"\n backend: mlx-vlm\n model_id: \"mlx-community/Qwen3.6-27B-8bit\"\n fmt: MLX\n quant: 8bit\n kv_cache: default\n extra_args: [\"--max-kv-size\", \"32768\"]\n enabled: false # mlx-vlm returns HTTP 500 for qwen3_5 architecture\n # ~30 GB weights; feasible on 64 GB for short context but tight for long ctx\n\n - id: P_MXFP4_0\n model: \"Qwen3.6-27B\"\n group: \"P — Qwen3.6-27B (Dense, VLM)\"\n backend: mlx-lm\n model_id: \"mlx-community/Qwen3.6-27B-mxfp4\"\n fmt: MXFP4\n quant: mxfp4\n kv_cache: default\n\n - id: P_MXFP4_1\n model: \"Qwen3.6-27B\"\n group: \"P — Qwen3.6-27B (Dense, VLM)\"\n backend: mlx-vlm\n model_id: \"mlx-community/Qwen3.6-27B-mxfp4\"\n fmt: MXFP4\n quant: mxfp4\n kv_cache: default\n extra_args: [\"--max-kv-size\", \"32768\"]\n enabled: false # mlx-vlm returns HTTP 500 for qwen3_5 architecture\n\n - id: P_NVFP4_0\n model: \"Qwen3.6-27B\"\n group: \"P — Qwen3.6-27B (Dense, VLM)\"\n backend: mlx-lm\n model_id: \"mlx-community/Qwen3.6-27B-nvfp4\"\n fmt: NVFP4\n quant: nvfp4\n kv_cache: default\n\n - id: P_NVFP4_1\n model: \"Qwen3.6-27B\"\n group: \"P — Qwen3.6-27B (Dense, VLM)\"\n backend: mlx-vlm\n model_id: \"mlx-community/Qwen3.6-27B-nvfp4\"\n fmt: NVFP4\n quant: nvfp4\n kv_cache: default\n extra_args: [\"--max-kv-size\", \"32768\"]\n enabled: false # mlx-vlm returns HTTP 500 for qwen3_5 architecture\n\n - id: P_VLLM_1\n model: \"Qwen3.6-27B\"\n group: \"P — Qwen3.6-27B (Dense, VLM)\"\n backend: vllm-mlx\n model_id: \"mlx-community/Qwen3.6-27B-4bit\"\n fmt: MLX\n quant: 4bit\n kv_cache: default\n\n - id: P_CTX_0\n model: \"Qwen3.6-27B\"\n group: \"P — Qwen3.6-27B (Dense, VLM)\"\n backend: mlx-lm\n model_id: \"mlx-community/Qwen3.6-27B-4bit\"\n fmt: MLX\n quant: 4bit\n kv_cache: default\n # BENCHMARKED (2026-04-23): 32k/64k work fine. 128k crashes (connection refused).\n # Despite low theoretical KV cost (~8 GB at 128k), mlx-lm may allocate more due to\n # DeltaNet state buffers. Capped at 64k for now.\n prompts: [context-32k, context-64k]\n\n - id: P_CTX_1\n model: \"Qwen3.6-27B\"\n group: \"P — Qwen3.6-27B (Dense, VLM)\"\n backend: mlx-vlm\n model_id: \"mlx-community/Qwen3.6-27B-4bit\"\n fmt: MLX\n quant: 4bit\n kv_cache: default\n # Hybrid DeltaNet/attention → very low KV cost. 128k should fit easily.\n extra_args: [\"--max-kv-size\", \"131072\"]\n prompts: [context-32k, context-64k, context-128k]\n enabled: false # mlx-vlm returns HTTP 500 for qwen3_5 architecture\n\n - id: P_CTX_2\n model: \"Qwen3.6-27B\"\n group: \"P — Qwen3.6-27B (Dense, VLM)\"\n backend: mlx-vlm\n model_id: \"mlx-community/Qwen3.6-27B-4bit\"\n fmt: MLX\n quant: 4bit\n kv_cache: kv4\n # kv4 halves KV: ctx-256k ≈ 8 GB KV + 16 GB weights = ~24 GB — good margin.\n # Expect high TTFT (slow mlx-vlm quantized-KV prefill path, see A_CTX_2).\n extra_args: [\"--max-kv-size\", \"262144\", \"--kv-bits\", \"4\"]\n prompts: [context-32k, context-64k, context-128k]\n enabled: false # mlx-vlm returns HTTP 500 for qwen3_5 architecture\n\n - id: P_OLL_CTX\n model: \"Qwen3.6-27B\"\n group: \"P — Qwen3.6-27B (Dense, VLM)\"\n backend: ollama\n model_id: \"qwen3.6:27b-q4_K_M\"\n fmt: GGUF\n quant: Q4_K_M\n kv_cache: default\n prompts: [context-32k, context-64k, context-128k]\n\n - id: P_TQ4_1\n model: \"Qwen3.6-27B\"\n group: \"P — Qwen3.6-27B (Dense, VLM)\"\n backend: mlx-lm-turboquant\n model_id: \"mlx-community/Qwen3.6-27B-4bit\"\n fmt: MLX\n quant: 4bit\n kv_cache: tq4bit\n extra_args: [\"--tq-bits\", \"4\"]\n\n - id: P_TQ35_1\n model: \"Qwen3.6-27B\"\n group: \"P — Qwen3.6-27B (Dense, VLM)\"\n backend: mlx-lm-turboquant\n model_id: \"mlx-community/Qwen3.6-27B-4bit\"\n fmt: MLX\n quant: 4bit\n kv_cache: tq3.5bit\n extra_args: [\"--tq-bits\", \"3.5\"]\n\n # llama-server (llama.cpp) — Unsloth Dynamic GGUF quants\n # Downloaded one-at-a-time and purged after run to save disk space.\n # Use run_llamacpp_qwen36.py to orchestrate download→bench→delete cycle.\n\n - id: P_LC_Q4KM\n model: \"Qwen3.6-27B\"\n group: \"P — Qwen3.6-27B (Dense, VLM)\"\n backend: llama-server\n model_id: \"~/.cache/llmfit/models/Qwen3.6-27B-Q4_K_M.gguf\"\n fmt: GGUF\n quant: Q4_K_M\n kv_cache: default\n\n - id: P_LC_UDQ4\n model: \"Qwen3.6-27B\"\n group: \"P — Qwen3.6-27B (Dense, VLM)\"\n backend: llama-server\n model_id: \"~/.cache/llmfit/models/Qwen3.6-27B-UD-Q4_K_XL.gguf\"\n fmt: GGUF\n quant: UD-Q4_K_XL\n kv_cache: default\n\n - id: P_LC_UDQ6\n model: \"Qwen3.6-27B\"\n group: \"P — Qwen3.6-27B (Dense, VLM)\"\n backend: llama-server\n model_id: \"~/.cache/llmfit/models/Qwen3.6-27B-UD-Q6_K_XL.gguf\"\n fmt: GGUF\n quant: UD-Q6_K_XL\n kv_cache: default\n\n - id: P_LC_UDQ2\n model: \"Qwen3.6-27B\"\n group: \"P — Qwen3.6-27B (Dense, VLM)\"\n backend: llama-server\n model_id: \"~/.cache/llmfit/models/Qwen3.6-27B-UD-Q2_K_XL.gguf\"\n fmt: GGUF\n quant: UD-Q2_K_XL\n kv_cache: default\n\n # ══════════════════════════════════════════════════════════════════════════════\n # Group Q — MTP Speculative Decoding (BLOCKED — mlx-lm 0.31.3 limitations)\n #\n # Three approaches investigated, all blocked:\n #\n # 1. Google's official MTP drafter (gemma4_assistant model_type):\n # - Uses a centroid-based output head (num_centroids: 2048) that hooks\n # into backbone hidden states (pre_projection 5632→1024, post 1024→2816)\n # - NOT a standalone autoregressive model — designed to inject into backbone\n # forward pass, not work as an independent draft model\n # - mlx-lm 0.31.3 has no gemma4_assistant module (raises ValueError on load)\n #\n # 2. Naive speculative (E2B as draft for 26B):\n # - E2B is Gemma4ForConditionalGeneration (VLM) with num_kv_shared_layers=20\n # - mlx-lm gemma4.py loads 26B (num_kv_shared_layers=0) fine, but fails\n # for E2B: 20 layers × 7 KV weight tensors = 140 \"extra parameters\"\n # because gemma4_text.py doesn't match the quantized VLM weight layout\n # - Additionally: 26B is MoE (30 layers), E2B is dense (35 layers) →\n # architecturally incompatible for mlx-lm speculative decoding\n #\n # 3. E2B draft for E4B (both dense):\n # - Same num_kv_shared_layers bug affects E4B (num_kv_shared_layers=18)\n # - Both would need fixes in mlx-lm before this works\n #\n # Resolution: needs mlx-lm update (either gemma4_assistant support or fix\n # for num_kv_shared_layers weight loading in quantized Gemma4 VLMs).\n # Re-enable when mlx-lm 0.31.4+ ships with a fix.\n # ══════════════════════════════════════════════════════════════════════════════\n\n # ── llama.cpp speculative decoding (viable alternative to mlx-lm MTP) ───────\n # Gemma4-26B as main model, Gemma4-E2B as draft model.\n # Both share the same Gemma4 tokenizer (262144-token vocab) — required for\n # llama.cpp speculative decoding. Draft is offloaded fully (-ngld 99).\n # GGUFs downloaded via run_llamacpp_all.py (groups N + K).\n\n - id: Q_LC_SPEC1\n model: \"Gemma4-26B-A4B\"\n group: \"Q — Speculative Decoding (llama.cpp)\"\n backend: llama-server\n model_id: \"~/.cache/llmfit/models/gemma-4-26B-A4B-it-UD-Q4_K_M.gguf\"\n fmt: GGUF\n quant: UD-Q4_K_M\n kv_cache: spec-e2b\n extra_args: [\"-md\", \"/Users/HIESCHA/.cache/llmfit/models/gemma-4-E2B-it-Q4_K_M.gguf\", \"-ngld\", \"99\"]\n\n - id: Q_LC_SPEC2\n model: \"Gemma4-26B-A4B\"\n group: \"Q — Speculative Decoding (llama.cpp)\"\n backend: llama-server\n model_id: \"~/.cache/llmfit/models/gemma-4-26B-A4B-it-UD-Q2_K_XL.gguf\"\n fmt: GGUF\n quant: UD-Q2_K_XL\n kv_cache: spec-e2b\n extra_args: [\"-md\", \"/Users/HIESCHA/.cache/llmfit/models/gemma-4-E2B-it-Q4_K_M.gguf\", \"-ngld\", \"99\"]\n\n # ── dflash block diffusion speculative decoding (MLX native) ───────────────\n # Uses z-lab's 0.4B diffusion drafters — generates ~16 tokens per draft step.\n # Comparison: Q_LC_SPEC* uses llama.cpp + 2B E2B draft (classical spec decode)\n\n - id: Q_DF_K1\n model: \"Gemma4-26B-A4B\"\n group: \"Q — Speculative Decoding (DFlash)\"\n backend: dflash\n model_id: \"mlx-community/gemma-4-26b-a4b-it-4bit\"\n fmt: MLX\n quant: 4bit\n kv_cache: dflash-0.4B\n extra_args: [\"--draft-model\", \"z-lab/gemma-4-26B-A4B-it-DFlash\"]\n\n # Q_DF_P1 removed: dflash drafter for Qwen3.6-27B shows no speedup over baseline\n # (~24 t/s vs 25 t/s baseline). Acceptance rate too low for block-diffusion to help.\n\n # ══════════════════════════════════════════════════════════════════════════════\n # Group R — MTP Speculative Decoding (self-draft via trained MTP heads)\n # Qwen3.6 models ship with MTP heads; no separate draft model needed.\n # Requires llama.cpp from am17an/llama.cpp:mtp-clean branch.\n # Expected speedup: 1.5-2x over baseline.\n # ══════════════════════════════════════════════════════════════════════════════\n\n - id: R_MTP_P1\n model: \"Qwen3.6-27B\"\n group: \"R — MTP Speculative Decoding\"\n backend: llama-server\n model_id: \"~/.cache/llmfit/models/Qwen3.6-27B-MTP-UD-Q4_K_XL.gguf\"\n server_binary: \"~/Projects/Work/llm-bench/vendor/llama-mtp/build/bin/llama-server\"\n fmt: GGUF\n quant: UD-Q4_K_XL\n kv_cache: mtp-2\n extra_args: [\"--spec-type\", \"draft-mtp\", \"--spec-draft-n-max\", \"2\", \"-fa\", \"on\", \"-np\", \"1\", \"-c\", \"8192\"]\n\n - id: R_MTP_O1\n model: \"Qwen3.6-35B-A3B\"\n group: \"R — MTP Speculative Decoding\"\n backend: llama-server\n model_id: \"~/.cache/llmfit/models/Qwen3.6-35B-A3B-MTP-UD-Q4_K_XL.gguf\"\n server_binary: \"~/Projects/Work/llm-bench/vendor/llama-mtp/build/bin/llama-server\"\n fmt: GGUF\n quant: UD-Q4_K_XL\n kv_cache: mtp-2\n extra_args: [\"--spec-type\", \"draft-mtp\", \"--spec-draft-n-max\", \"2\", \"-fa\", \"on\", \"-np\", \"1\", \"-c\", \"8192\"]\n # Re-enabled: using unsloth/Qwen3.6-35B-A3B-MTP-GGUF (MTP heads included)\n\n - id: R_MTP_P2\n model: \"Qwen3.6-27B\"\n group: \"R — MTP Speculative Decoding\"\n backend: llama-server\n model_id: \"~/.cache/llmfit/models/Qwen3.6-27B-MTP-IQ4_NL.gguf\"\n server_binary: \"~/Projects/Work/llm-bench/vendor/llama-mtp/build/bin/llama-server\"\n fmt: GGUF\n quant: IQ4_NL\n kv_cache: mtp-2\n extra_args: [\"--spec-type\", \"draft-mtp\", \"--spec-draft-n-max\", \"2\", \"-fa\", \"on\", \"-np\", \"1\", \"-c\", \"8192\"]\n\n # ══════════════════════════════════════════════════════════════════════════════\n # Group R — Thinking Mode (Qwen3.6 /think enabled, measures think+visible tps)\n # Uses llama-server with --reasoning on (separates thinking into reasoning_content)\n # ══════════════════════════════════════════════════════════════════════════════\n\n - id: R_THINK_O1\n model: \"Qwen3.6-35B-A3B\"\n group: \"R — Thinking Mode\"\n backend: llama-server\n model_id: \"~/.cache/llmfit/models/Qwen3.6-35B-A3B-MTP-UD-Q4_K_XL.gguf\"\n server_binary: \"~/Projects/Work/llm-bench/vendor/llama-mtp/build/bin/llama-server\"\n fmt: GGUF\n quant: UD-Q4_K_XL\n kv_cache: think\n no_think: false\n extra_args: [\"--spec-type\", \"draft-mtp\", \"--spec-draft-n-max\", \"2\", \"-fa\", \"on\", \"-np\", \"1\", \"-c\", \"8192\", \"--reasoning-format\", \"deepseek\"]\n\n - id: R_THINK_P1\n model: \"Qwen3.6-27B\"\n group: \"R — Thinking Mode\"\n backend: llama-server\n model_id: \"~/.cache/llmfit/models/Qwen3.6-27B-MTP-UD-Q4_K_XL.gguf\"\n server_binary: \"~/Projects/Work/llm-bench/vendor/llama-mtp/build/bin/llama-server\"\n fmt: GGUF\n quant: UD-Q4_K_XL\n kv_cache: think\n no_think: false\n extra_args: [\"--spec-type\", \"draft-mtp\", \"--spec-draft-n-max\", \"2\", \"-fa\", \"on\", \"-np\", \"1\", \"-c\", \"8192\", \"--reasoning-format\", \"deepseek\"]\n\n # ══════════════════════════════════════════════════════════════════════════════\n # Group T — Qwen3.6 backend comparisons (vllm-mlx, MXFP4_MOE)\n # Note: vllm-mlx --enable-mtp requires MTP heads in MLX weights, which no\n # current MLX quantization of Qwen3.6 includes. These run without MTP as\n # baseline comparison of vllm-mlx vs llama.cpp for the same models.\n # ══════════════════════════════════════════════════════════════════════════════\n\n - id: T_VM_O1\n model: \"Qwen3.6-35B-A3B\"\n group: \"T — Qwen3.6 Backend Comparison\"\n backend: vllm-mlx\n model_id: \"mlx-community/Qwen3.6-35B-A3B-4bit\"\n fmt: MLX\n quant: 4bit\n kv_cache: default\n\n - id: T_VM_P1\n model: \"Qwen3.6-27B\"\n group: \"T — Qwen3.6 Backend Comparison\"\n backend: vllm-mlx\n model_id: \"mlx-community/Qwen3.6-27B-4bit\"\n fmt: MLX\n quant: 4bit\n kv_cache: default\n\n - id: T_MX_O1\n model: \"Qwen3.6-35B-A3B\"\n group: \"T — Qwen3.6 Backend Comparison\"\n backend: llama-server\n model_id: \"~/.cache/llmfit/models/Qwen3.6-35B-A3B-MXFP4_MOE.gguf\"\n fmt: GGUF\n quant: MXFP4_MOE\n kv_cache: default\n extra_args: [\"-fa\", \"on\"]\n\n - id: T_OX_O1\n model: \"Qwen3.6-35B-A3B\"\n group: \"T — Qwen3.6 Backend Comparison\"\n backend: omlx\n model_id: \"Qwen3.6-35B-A3B-4bit\"\n fmt: MLX\n quant: 4bit\n kv_cache: ssd-paged\n\n - id: T_OX_P1\n model: \"Qwen3.6-27B\"\n group: \"T — Qwen3.6 Backend Comparison\"\n backend: omlx\n model_id: \"Qwen3.6-27B-4bit\"\n fmt: MLX\n quant: 4bit\n kv_cache: ssd-paged\n\n # ══════════════════════════════════════════════════════════════════════════════\n # Group S — Unsloth Studio (llama.cpp b9134 wrapper with E2B speculative decoding)\n # Uses OpenAI-compat API with auth. Auto-downloads models.\n # ══════════════════════════════════════════════════════════════════════════════\n\n - id: S_US_P1\n model: \"Qwen3.6-27B\"\n group: \"S — Unsloth Studio\"\n backend: unsloth-studio\n model_id: \"unsloth/Qwen3.6-27B-GGUF:UD-Q4_K_XL\"\n fmt: GGUF\n quant: UD-Q4_K_XL\n kv_cache: e2b-spec\n api_key: \"sk-unsloth-123a4291dfc96ee67d435ccadce4abe4\"\n extra_args: [\"--max-seq-length\", \"8192\"]\n\n - id: S_US_P2\n model: \"Qwen3.6-27B\"\n group: \"S — Unsloth Studio\"\n backend: unsloth-studio\n model_id: \"unsloth/Qwen3.6-27B-GGUF:UD-Q2_K_XL\"\n fmt: GGUF\n quant: UD-Q2_K_XL\n kv_cache: e2b-spec\n api_key: \"sk-unsloth-123a4291dfc96ee67d435ccadce4abe4\"\n extra_args: [\"--max-seq-length\", \"8192\"]\n\n - id: S_US_O1\n model: \"Qwen3.6-35B-A3B\"\n group: \"S — Unsloth Studio\"\n backend: unsloth-studio\n model_id: \"unsloth/Qwen3.6-35B-A3B-GGUF:UD-Q4_K_XL\"\n fmt: GGUF\n quant: UD-Q4_K_XL\n kv_cache: e2b-spec\n api_key: \"sk-unsloth-123a4291dfc96ee67d435ccadce4abe4\"\n extra_args: [\"--max-seq-length\", \"8192\"]\n\n # ══════════════════════════════════════════════════════════════════════════════\n # Group U — Gemma 4 12B (Dense, Unified/Encoder-Free) — Google 2026-06-03\n # Architecture: Dense 12B, unified encoder-free design (no separate vision/audio\n # encoders — raw patches/waveforms projected into LLM embedding space via\n # lightweight linear layers). Hybrid attention: sliding window (1024) + global.\n # Parameters: 11.95B, 48 layers\n # Native context: 256,144 tokens\n # Memory budget: ~6 GB weights (4bit), ~12 GB (8bit)\n # KV: sliding window keeps effective KV cost low for most layers\n # ctx-128k fits easily on 64 GB at 4bit\n # Thinking: supports enable_thinking=True (\"ultrathink\" mode)\n # NOTE: VLM architecture — use mlx-vlm backend (same as other Gemma 4 models).\n # HuggingFace: google/gemma-4-12B-it\n # mlx-community models: gemma-4-12B-it-4bit, -8bit, -mxfp4, -nvfp4\n # Ollama tags: gemma4:12b\n # GGUF: unsloth/gemma-4-12b-it-GGUF (Q4_K_M ~7 GB, UD-Q4_K_XL ~7.4 GB)\n # ══════════════════════════════════════════════════════════════════════════════\n\n # NOTE (2026-06-04): Gemma 4 12B uses model_type \"gemma4_unified\"\n # (Gemma4UnifiedForConditionalGeneration) — a new architecture not supported by\n # mlx-vlm (which only has gemma4 / Gemma4ForConditionalGeneration).\n # All mlx-vlm tests disabled until mlx-vlm ships gemma4_unified support.\n # Track: https://github.com/Blaizzy/mlx-vlm for updates.\n\n - id: U_Q4_1\n model: \"Gemma4-12B\"\n group: \"U — Gemma4 12B (Dense, Unified)\"\n backend: mlx-vlm\n model_id: \"mlx-community/gemma-4-12B-it-4bit\"\n fmt: MLX\n quant: 4bit\n kv_cache: default\n extra_args: [\"--max-kv-size\", \"32768\"]\n # unblocked: mlx-vlm 0.6.1 supports gemma4_unified\n\n - id: U_Q4_2\n model: \"Gemma4-12B\"\n group: \"U — Gemma4 12B (Dense, Unified)\"\n backend: mlx-vlm\n model_id: \"mlx-community/gemma-4-12B-it-4bit\"\n fmt: MLX\n quant: 4bit\n kv_cache: kv4\n extra_args: [\"--max-kv-size\", \"32768\", \"--kv-bits\", \"4\"]\n # unblocked: mlx-vlm 0.6.1 supports gemma4_unified\n\n - id: U_Q8_1\n model: \"Gemma4-12B\"\n group: \"U — Gemma4 12B (Dense, Unified)\"\n backend: mlx-vlm\n model_id: \"mlx-community/gemma-4-12B-it-8bit\"\n fmt: MLX\n quant: 8bit\n kv_cache: default\n extra_args: [\"--max-kv-size\", \"32768\"]\n # unblocked: mlx-vlm 0.6.1 supports gemma4_unified\n\n - id: U_MXFP4_1\n model: \"Gemma4-12B\"\n group: \"U — Gemma4 12B (Dense, Unified)\"\n backend: mlx-vlm\n model_id: \"mlx-community/gemma-4-12B-it-mxfp4\"\n fmt: MXFP4\n quant: mxfp4\n kv_cache: default\n extra_args: [\"--max-kv-size\", \"32768\"]\n # unblocked: mlx-vlm 0.6.1 supports gemma4_unified\n\n - id: U_NVFP4_1\n model: \"Gemma4-12B\"\n group: \"U — Gemma4 12B (Dense, Unified)\"\n backend: mlx-vlm\n model_id: \"mlx-community/gemma-4-12B-it-nvfp4\"\n fmt: NVFP4\n quant: nvfp4\n kv_cache: default\n extra_args: [\"--max-kv-size\", \"32768\"]\n # unblocked: mlx-vlm 0.6.1 supports gemma4_unified\n\n - id: U_Q4_3\n model: \"Gemma4-12B\"\n group: \"U — Gemma4 12B (Dense, Unified)\"\n backend: ollama\n model_id: \"gemma4:12b\"\n fmt: GGUF\n quant: Q4_K_M\n kv_cache: default\n # unblocked: Ollama 0.30.x supports gemma4:12b\n\n - id: U_CTX_1\n model: \"Gemma4-12B\"\n group: \"U — Gemma4 12B (Dense, Unified)\"\n backend: mlx-vlm\n model_id: \"mlx-community/gemma-4-12B-it-4bit\"\n fmt: MLX\n quant: 4bit\n kv_cache: default\n extra_args: [\"--max-kv-size\", \"131072\"]\n prompts: [context-32k, context-64k, context-128k]\n # unblocked: mlx-vlm 0.6.1 supports gemma4_unified\n\n - id: U_CTX_2\n model: \"Gemma4-12B\"\n group: \"U — Gemma4 12B (Dense, Unified)\"\n backend: mlx-vlm\n model_id: \"mlx-community/gemma-4-12B-it-4bit\"\n fmt: MLX\n quant: 4bit\n kv_cache: kv4\n extra_args: [\"--max-kv-size\", \"131072\", \"--kv-bits\", \"4\"]\n prompts: [context-32k, context-64k, context-128k]\n # unblocked: mlx-vlm 0.6.1 supports gemma4_unified\n\n - id: U_OLL_CTX_1\n model: \"Gemma4-12B\"\n group: \"U — Gemma4 12B (Dense, Unified)\"\n backend: ollama\n model_id: \"gemma4:12b\"\n fmt: GGUF\n quant: Q4_K_M\n kv_cache: default\n prompts: [context-32k, context-64k, context-128k]\n # unblocked: Ollama 0.30.x supports gemma4:12b\n\n # llama-server — Unsloth GGUF quants (download→bench→purge via run_llamacpp_all.py)\n - id: U_LC_Q4KM\n model: \"Gemma4-12B\"\n group: \"U — Gemma4 12B (Dense, Unified)\"\n backend: llama-server\n model_id: \"~/.cache/llmfit/models/gemma-4-12b-it-Q4_K_M.gguf\"\n fmt: GGUF\n quant: Q4_K_M\n kv_cache: default\n\n - id: U_LC_UDQ4\n model: \"Gemma4-12B\"\n group: \"U — Gemma4 12B (Dense, Unified)\"\n backend: llama-server\n model_id: \"~/.cache/llmfit/models/gemma-4-12b-it-UD-Q4_K_XL.gguf\"\n fmt: GGUF\n quant: UD-Q4_K_XL\n kv_cache: default\n\n - id: U_LC_UDQ2\n model: \"Gemma4-12B\"\n group: \"U — Gemma4 12B (Dense, Unified)\"\n backend: llama-server\n model_id: \"~/.cache/llmfit/models/gemma-4-12b-it-UD-Q2_K_XL.gguf\"\n fmt: GGUF\n quant: UD-Q2_K_XL\n kv_cache: default\n\n - id: U_LC_UDQ6\n model: \"Gemma4-12B\"\n group: \"U — Gemma4 12B (Dense, Unified)\"\n backend: llama-server\n model_id: \"~/.cache/llmfit/models/gemma-4-12b-it-UD-Q6_K_XL.gguf\"\n fmt: GGUF\n quant: UD-Q6_K_XL\n kv_cache: default\n\n # ── vllm-mlx ─────────────────────────────────────────────────────────────────\n - id: U_VM_1\n model: \"Gemma4-12B\"\n group: \"U — Gemma4 12B (Dense, Unified)\"\n backend: vllm-mlx\n model_id: \"mlx-community/gemma-4-12B-it-4bit\"\n fmt: MLX\n quant: 4bit\n kv_cache: default\n # unblocked: vllm-mlx should support gemma4_unified via mlx-vlm 0.6.1\n\n # ── oMLX (SSD-tiered paged KV cache) ───────────────────────────────────────\n - id: U_OX_1\n model: \"Gemma4-12B\"\n group: \"U — Gemma4 12B (Dense, Unified)\"\n backend: omlx\n model_id: \"gemma-4-12B-it-4bit\"\n fmt: MLX\n quant: 4bit\n kv_cache: ssd-paged\n # unblocked: oMLX 0.4.1 supports gemma4_unified\n\n - id: U_OX_CTX_1\n model: \"Gemma4-12B\"\n group: \"U — Gemma4 12B (Dense, Unified)\"\n backend: omlx\n model_id: \"gemma-4-12B-it-4bit\"\n fmt: MLX\n quant: 4bit\n kv_cache: ssd-paged\n # unblocked: oMLX 0.4.1 supports gemma4_unified\n # oMLX hard-caps at 32768 tokens per request (same as other oMLX tests)\n prompts: [context-32k]\n\n # ── Docker Model Runner ─────────────────────────────────────────────────────\n - id: U_DMR_1\n model: \"Gemma4-12B\"\n group: \"U — Gemma4 12B (Dense, Unified)\"\n backend: docker-model-runner\n model_id: \"docker.io/ai/gemma4:12B-Q4_K_M\"\n fmt: GGUF\n quant: Q4_K_M\n kv_cache: default\n\n # ── LM Studio ──────────────────────────────────────────────────────────────\n - id: U_LMS_1\n model: \"Gemma4-12B\"\n group: \"U — Gemma4 12B (Dense, Unified)\"\n backend: lm-studio\n model_id: \"gemma-4-12b-it\"\n fmt: MLX\n quant: 4bit\n kv_cache: default\n\n # ── Speculative Decoding (llama.cpp: E2B as draft for 12B) ─────────────────\n # Both Gemma4-12B and E2B share the same 262144-token vocab → compatible.\n # E2B (~2.6 GB GGUF) as lightweight draft model for 12B main model.\n - id: U_SPEC_1\n model: \"Gemma4-12B\"\n group: \"U — Gemma4 12B (Speculative)\"\n backend: llama-server\n model_id: \"~/.cache/llmfit/models/gemma-4-12b-it-UD-Q4_K_XL.gguf\"\n fmt: GGUF\n quant: UD-Q4_K_XL\n kv_cache: spec-e2b\n extra_args: [\"-md\", \"/Users/HIESCHA/.cache/llmfit/models/gemma-4-E2B-it-Q4_K_M.gguf\", \"-ngld\", \"99\"]\n\n - id: U_SPEC_2\n model: \"Gemma4-12B\"\n group: \"U — Gemma4 12B (Speculative)\"\n backend: llama-server\n model_id: \"~/.cache/llmfit/models/gemma-4-12b-it-Q4_K_M.gguf\"\n fmt: GGUF\n quant: Q4_K_M\n kv_cache: spec-e2b\n extra_args: [\"-md\", \"/Users/HIESCHA/.cache/llmfit/models/gemma-4-E2B-it-Q4_K_M.gguf\", \"-ngld\", \"99\"]\n\n # ── DFlash block diffusion speculative decoding (MLX native) ────────────────\n # Uses z-lab's diffusion drafters — generates ~16 tokens per draft step.\n # NOTE: drafter (z-lab/gemma-4-12B-it-DFlash) may not exist yet — disable if unavailable.\n - id: U_DF_1\n model: \"Gemma4-12B\"\n group: \"U — Gemma4 12B (Speculative)\"\n backend: dflash\n model_id: \"mlx-community/gemma-4-12B-it-4bit\"\n fmt: MLX\n quant: 4bit\n kv_cache: dflash-0.4B\n extra_args: [\"--draft-model\", \"z-lab/gemma-4-12B-it-DFlash\"]\n enabled: false # enable once z-lab publishes DFlash drafter for 12B\n\n # ── MTP Speculative Decoding (self-draft via trained MTP heads) ─────────────\n # Blog says Gemma 4 12B ships with MTP drafters for reduced latency.\n # Requires llama.cpp MTP branch (vendor/llama-mtp).\n # GGUF: barozp/gemma4-12b-it-mtp-GGUF (community) — verify quality before trusting.\n - id: U_MTP_1\n model: \"Gemma4-12B\"\n group: \"U — Gemma4 12B (MTP)\"\n backend: llama-server\n model_id: \"~/.cache/llmfit/models/gemma-4-12b-it-MTP-Q4_K_M.gguf\"\n server_binary: \"~/Projects/Work/llm-bench/vendor/llama-mtp/build/bin/llama-server\"\n fmt: GGUF\n quant: Q4_K_M\n kv_cache: mtp-2\n extra_args: [\"--spec-type\", \"draft-mtp\", \"--spec-draft-n-max\", \"2\", \"-fa\", \"on\", \"-np\", \"1\", \"-c\", \"8192\"]\n enabled: false # enable once MTP GGUF verified (barozp/gemma4-12b-it-mtp-GGUF or unsloth official)\n\n - id: U_MTP_2\n model: \"Gemma4-12B\"\n group: \"U — Gemma4 12B (MTP)\"\n backend: llama-server\n model_id: \"~/.cache/llmfit/models/gemma-4-12b-it-MTP-UD-Q4_K_XL.gguf\"\n server_binary: \"~/Projects/Work/llm-bench/vendor/llama-mtp/build/bin/llama-server\"\n fmt: GGUF\n quant: UD-Q4_K_XL\n kv_cache: mtp-2\n extra_args: [\"--spec-type\", \"draft-mtp\", \"--spec-draft-n-max\", \"2\", \"-fa\", \"on\", \"-np\", \"1\", \"-c\", \"8192\"]\n enabled: false # enable once MTP GGUF verified\n\n # ── TurboQuant (KV cache compression) ──────────────────────────────────────\n # BLOCKED: mlx-lm has no gemma4 module. TurboQuant patches mlx_lm.models.cache.\n # Re-enable once mlx-lm ships gemma4 support.\n - id: U_TQ4_1\n model: \"Gemma4-12B\"\n group: \"U — Gemma4 12B (Dense, Unified)\"\n backend: mlx-lm-turboquant\n model_id: \"mlx-community/gemma-4-12B-it-4bit\"\n fmt: MLX\n quant: 4bit\n kv_cache: tq4bit\n extra_args: [\"--tq-bits\", \"4\"]\n enabled: false # mlx-lm lacks gemma4 support\n\n - id: U_TQ35_1\n model: \"Gemma4-12B\"\n group: \"U — Gemma4 12B (Dense, Unified)\"\n backend: mlx-lm-turboquant\n model_id: \"mlx-community/gemma-4-12B-it-4bit\"\n fmt: MLX\n quant: 4bit\n kv_cache: tq3.5bit\n extra_args: [\"--tq-bits\", \"3.5\"]\n enabled: false # mlx-lm lacks gemma4 support\n\n # ── Ultrathink (thinking mode enabled) ──────────────────────────────────────\n # Gemma 4 12B supports thinking via enable_thinking=True. Measures think+visible tps.\n # Uses temperature=0.6 (required for thinking mode per Google docs).\n\n - id: U_THINK_1\n model: \"Gemma4-12B\"\n group: \"U — Gemma4 12B (Ultrathink)\"\n backend: mlx-vlm\n model_id: \"mlx-community/gemma-4-12B-it-4bit\"\n fmt: MLX\n quant: 4bit\n kv_cache: ultrathink\n no_think: false\n max_tokens: 2048\n extra_args: [\"--max-kv-size\", \"32768\"]\n # unblocked: mlx-vlm 0.6.1 supports gemma4_unified\n\n - id: U_THINK_2\n model: \"Gemma4-12B\"\n group: \"U — Gemma4 12B (Ultrathink)\"\n backend: mlx-vlm\n model_id: \"mlx-community/gemma-4-12B-it-8bit\"\n fmt: MLX\n quant: 8bit\n kv_cache: ultrathink\n no_think: false\n max_tokens: 2048\n extra_args: [\"--max-kv-size\", \"32768\"]\n # unblocked: mlx-vlm 0.6.1 supports gemma4_unified\n\n - id: U_THINK_3\n model: \"Gemma4-12B\"\n group: \"U — Gemma4 12B (Ultrathink)\"\n backend: ollama\n model_id: \"gemma4:12b\"\n fmt: GGUF\n quant: Q4_K_M\n kv_cache: ultrathink\n no_think: false\n max_tokens: 2048\n # unblocked: Ollama 0.30.x supports gemma4:12b\n\n - id: U_THINK_4\n model: \"Gemma4-12B\"\n group: \"U — Gemma4 12B (Ultrathink)\"\n backend: llama-server\n model_id: \"~/.cache/llmfit/models/gemma-4-12b-it-UD-Q4_K_XL.gguf\"\n fmt: GGUF\n quant: UD-Q4_K_XL\n kv_cache: ultrathink\n no_think: false\n max_tokens: 2048\n extra_args: [\"--reasoning-format\", \"deepseek\"]\n\n # ── Group W — QAT (Quantization-Aware Training) ──────────────────────────────\n # Official Google QAT checkpoints — quantization baked into training, not post-hoc.\n # Compare against same-bitwidth PTQ (U_LC_Q4KM, U_LC_UDQ4) for quality/speed delta.\n\n - id: W_QAT_Q4_1\n model: \"Gemma4-12B\"\n group: \"W — QAT (Gemma4 12B)\"\n backend: llama-server\n model_id: \"~/.cache/llmfit/models/gemma-4-12b-it-qat-q4_0.gguf\"\n fmt: GGUF\n quant: QAT-Q4_0\n kv_cache: default\n\n - id: W_QAT_Q4_2\n model: \"Gemma4-12B\"\n group: \"W — QAT (Gemma4 12B)\"\n backend: ollama\n model_id: \"gemma4-12b-qat\"\n fmt: GGUF\n quant: QAT-Q4_0\n kv_cache: default\n\n - id: W_QAT_UDQ4_1\n model: \"Gemma4-12B\"\n group: \"W — QAT (Gemma4 12B)\"\n backend: llama-server\n model_id: \"~/.cache/llmfit/models/gemma-4-12B-it-qat-UD-Q4_K_XL.gguf\"\n fmt: GGUF\n quant: QAT-UD-Q4_K_XL\n kv_cache: default\n\n # ── MLX QAT models (mlx-community quantizations of Google's QAT checkpoints) ─\n - id: W_QAT_MLX_1\n model: \"Gemma4-12B\"\n group: \"W — QAT (Gemma4 12B)\"\n backend: mlx-vlm\n model_id: \"mlx-community/gemma-4-12B-it-qat-4bit\"\n fmt: MLX\n quant: QAT-4bit\n kv_cache: default\n extra_args: [\"--max-kv-size\", \"32768\"]\n\n - id: W_QAT_NVFP4_1\n model: \"Gemma4-12B\"\n group: \"W — QAT (Gemma4 12B)\"\n backend: mlx-vlm\n model_id: \"mlx-community/gemma-4-12B-it-qat-nvfp4\"\n fmt: NVFP4\n quant: QAT-nvfp4\n kv_cache: default\n extra_args: [\"--max-kv-size\", \"32768\"]\n\n # ══════════════════════════════════════════════════════════════════════════════\n # Group X — QAT (Gemma4 26B A4B) — Google official QAT checkpoints\n # Compare against Group K PTQ baselines (K_LC_Q4KM, K_Q4_1, etc.)\n # ══════════════════════════════════════════════════════════════════════════════\n\n - id: X_QAT_Q4_1\n model: \"Gemma4-26B-A4B\"\n group: \"X — QAT (Gemma4 26B)\"\n backend: llama-server\n model_id: \"~/.cache/llmfit/models/gemma-4-26B-A4B-it-qat-q4_0.gguf\"\n fmt: GGUF\n quant: QAT-Q4_0\n kv_cache: default\n\n - id: X_QAT_UDQ4_1\n model: \"Gemma4-26B-A4B\"\n group: \"X — QAT (Gemma4 26B)\"\n backend: llama-server\n model_id: \"~/.cache/llmfit/models/gemma-4-26B-A4B-it-qat-UD-Q4_K_XL.gguf\"\n fmt: GGUF\n quant: QAT-UD-Q4_K_XL\n kv_cache: default\n\n - id: X_QAT_OLL_1\n model: \"Gemma4-26B-A4B\"\n group: \"X — QAT (Gemma4 26B)\"\n backend: ollama\n model_id: \"gemma4:26b-qat\"\n fmt: GGUF\n quant: QAT-Q4_0\n kv_cache: default\n\n - id: X_QAT_MLX_1\n model: \"Gemma4-26B-A4B\"\n group: \"X — QAT (Gemma4 26B)\"\n backend: mlx-vlm\n model_id: \"mlx-community/gemma-4-26B-A4B-it-qat-mxfp4\"\n fmt: MXFP4\n quant: QAT-mxfp4\n kv_cache: default\n extra_args: [\"--max-kv-size\", \"32768\"]\n\n - id: X_QAT_NVFP4_1\n model: \"Gemma4-26B-A4B\"\n group: \"X — QAT (Gemma4 26B)\"\n backend: mlx-vlm\n model_id: \"mlx-community/gemma-4-26B-A4B-it-qat-nvfp4\"\n fmt: NVFP4\n quant: QAT-nvfp4\n kv_cache: default\n extra_args: [\"--max-kv-size\", \"32768\"]\n\n # ══════════════════════════════════════════════════════════════════════════════\n # Group Y — QAT (Gemma4 31B Dense) — Google official QAT checkpoints\n # Compare against Group L PTQ baselines (L_LC_Q4KM, L_Q4_1, etc.)\n # 31B dense is the largest Gemma4 model; QAT-Q4_0 ~20 GB GGUF.\n # ══════════════════════════════════════════════════════════════════════════════\n\n - id: Y_QAT_Q4_1\n model: \"Gemma4-31B\"\n group: \"Y — QAT (Gemma4 31B)\"\n backend: llama-server\n model_id: \"~/.cache/llmfit/models/gemma-4-31B-it-qat-q4_0.gguf\"\n fmt: GGUF\n quant: QAT-Q4_0\n kv_cache: default\n\n - id: Y_QAT_UDQ4_1\n model: \"Gemma4-31B\"\n group: \"Y — QAT (Gemma4 31B)\"\n backend: llama-server\n model_id: \"~/.cache/llmfit/models/gemma-4-31B-it-qat-UD-Q4_K_XL.gguf\"\n fmt: GGUF\n quant: QAT-UD-Q4_K_XL\n kv_cache: default\n\n - id: Y_QAT_OLL_1\n model: \"Gemma4-31B\"\n group: \"Y — QAT (Gemma4 31B)\"\n backend: ollama\n model_id: \"gemma4:31b-qat\"\n fmt: GGUF\n quant: QAT-Q4_0\n kv_cache: default\n\n - id: Y_QAT_MLX_1\n model: \"Gemma4-31B\"\n group: \"Y — QAT (Gemma4 31B)\"\n backend: mlx-vlm\n model_id: \"mlx-community/gemma-4-31B-it-qat-4bit\"\n fmt: MLX\n quant: QAT-4bit\n kv_cache: default\n extra_args: [\"--max-kv-size\", \"32768\"]\n\n - id: Y_QAT_NVFP4_1\n model: \"Gemma4-31B\"\n group: \"Y — QAT (Gemma4 31B)\"\n backend: mlx-vlm\n model_id: \"mlx-community/gemma-4-31B-it-qat-nvfp4\"\n fmt: NVFP4\n quant: QAT-nvfp4\n kv_cache: default\n extra_args: [\"--max-kv-size\", \"32768\"]\n\n # ══════════════════════════════════════════════════════════════════════════════\n # Group Z — QAT (Gemma4 E4B + E2B) — Google official QAT checkpoints\n # Compare against Groups M/N PTQ baselines\n # ══════════════════════════════════════════════════════════════════════════════\n\n # ── E4B QAT ─────────────────────────────────────────────────────────────────\n - id: Z_E4B_QAT_Q4_1\n model: \"Gemma4-E4B\"\n group: \"Z — QAT (Gemma4 E4B/E2B)\"\n backend: llama-server\n model_id: \"~/.cache/llmfit/models/gemma-4-E4B-it-qat-q4_0.gguf\"\n fmt: GGUF\n quant: QAT-Q4_0\n kv_cache: default\n\n - id: Z_E4B_QAT_UDQ4_1\n model: \"Gemma4-E4B\"\n group: \"Z — QAT (Gemma4 E4B/E2B)\"\n backend: llama-server\n model_id: \"~/.cache/llmfit/models/gemma-4-E4B-it-qat-UD-Q4_K_XL.gguf\"\n fmt: GGUF\n quant: QAT-UD-Q4_K_XL\n kv_cache: default\n\n - id: Z_E4B_QAT_UDQ2_1\n model: \"Gemma4-E4B\"\n group: \"Z — QAT (Gemma4 E4B/E2B)\"\n backend: llama-server\n model_id: \"~/.cache/llmfit/models/gemma-4-E4B-it-qat-UD-Q2_K_XL.gguf\"\n fmt: GGUF\n quant: QAT-UD-Q2_K_XL\n kv_cache: default\n\n - id: Z_E4B_QAT_OLL_1\n model: \"Gemma4-E4B\"\n group: \"Z — QAT (Gemma4 E4B/E2B)\"\n backend: ollama\n model_id: \"gemma4:e4b-qat\"\n fmt: GGUF\n quant: QAT-Q4_0\n kv_cache: default\n\n - id: Z_E4B_QAT_MLX_1\n model: \"Gemma4-E4B\"\n group: \"Z — QAT (Gemma4 E4B/E2B)\"\n backend: mlx-vlm\n model_id: \"mlx-community/gemma-4-E4B-it-qat-4bit\"\n fmt: MLX\n quant: QAT-4bit\n kv_cache: default\n extra_args: [\"--max-kv-size\", \"32768\"]\n\n - id: Z_E4B_QAT_NVFP4_1\n model: \"Gemma4-E4B\"\n group: \"Z — QAT (Gemma4 E4B/E2B)\"\n backend: mlx-vlm\n model_id: \"mlx-community/gemma-4-E4B-it-qat-nvfp4\"\n fmt: NVFP4\n quant: QAT-nvfp4\n kv_cache: default\n extra_args: [\"--max-kv-size\", \"32768\"]\n\n # ── E2B QAT ─────────────────────────────────────────────────────────────────\n - id: Z_E2B_QAT_Q4_1\n model: \"Gemma4-E2B\"\n group: \"Z — QAT (Gemma4 E4B/E2B)\"\n backend: llama-server\n model_id: \"~/.cache/llmfit/models/gemma-4-E2B-it-qat-q4_0.gguf\"\n fmt: GGUF\n quant: QAT-Q4_0\n kv_cache: default\n\n - id: Z_E2B_QAT_UDQ4_1\n model: \"Gemma4-E2B\"\n group: \"Z — QAT (Gemma4 E4B/E2B)\"\n backend: llama-server\n model_id: \"~/.cache/llmfit/models/gemma-4-E2B-it-qat-UD-Q4_K_XL.gguf\"\n fmt: GGUF\n quant: QAT-UD-Q4_K_XL\n kv_cache: default\n\n - id: Z_E2B_QAT_UDQ2_1\n model: \"Gemma4-E2B\"\n group: \"Z — QAT (Gemma4 E4B/E2B)\"\n backend: llama-server\n model_id: \"~/.cache/llmfit/models/gemma-4-E2B-it-qat-UD-Q2_K_XL.gguf\"\n fmt: GGUF\n quant: QAT-UD-Q2_K_XL\n kv_cache: default\n\n - id: Z_E2B_QAT_OLL_1\n model: \"Gemma4-E2B\"\n group: \"Z — QAT (Gemma4 E4B/E2B)\"\n backend: ollama\n model_id: \"gemma4:e2b-qat\"\n fmt: GGUF\n quant: QAT-Q4_0\n kv_cache: default\n\n - id: Z_E2B_QAT_MLX_1\n model: \"Gemma4-E2B\"\n group: \"Z — QAT (Gemma4 E4B/E2B)\"\n backend: mlx-vlm\n model_id: \"mlx-community/gemma-4-E2B-it-qat-4bit\"\n fmt: MLX\n quant: QAT-4bit\n kv_cache: default\n extra_args: [\"--max-kv-size\", \"32768\"]\n\n - id: Z_E2B_QAT_NVFP4_1\n model: \"Gemma4-E2B\"\n group: \"Z — QAT (Gemma4 E4B/E2B)\"\n backend: mlx-vlm\n model_id: \"mlx-community/gemma-4-E2B-it-qat-nvfp4\"\n fmt: NVFP4\n quant: QAT-nvfp4\n kv_cache: default\n extra_args: [\"--max-kv-size\", \"32768\"]\n\n # ── Group V — LiteRT-LM (Google Edge Runtime, Metal GPU) ─────────────────────\n # LiteRT-LM v0.13.1 — serves all imported models via OpenAI-compatible API on\n # port 9379. Use model_id \"name,gpu\" for Metal GPU backend.\n # Models: gemma4-e2b (2.4GB), gemma4-e4b (3.4GB), gemma4-12b (6.1GB)\n\n - id: V_E2B_1\n model: \"Gemma4-E2B\"\n group: \"V — LiteRT-LM\"\n backend: litert-lm\n model_id: \"gemma4-e2b,gpu\"\n fmt: LiteRT\n quant: default\n kv_cache: default\n\n - id: V_E4B_1\n model: \"Gemma4-E4B\"\n group: \"V — LiteRT-LM\"\n backend: litert-lm\n model_id: \"gemma4-e4b,gpu\"\n fmt: LiteRT\n quant: default\n kv_cache: default\n\n - id: V_12B_1\n model: \"Gemma4-12B\"\n group: \"V — LiteRT-LM\"\n backend: litert-lm\n model_id: \"gemma4-12b,gpu\"\n fmt: LiteRT\n quant: default\n kv_cache: default\n\n # ══════════════════════════════════════════════════════════════════════════════\n # Group DG — DiffusionGemma 26B-A4B (Block Diffusion, MoE)\n # Architecture: DiffusionGemmaForBlockDiffusion — 26B MoE (3.8B active / 25.2B total)\n # Uses discrete diffusion with block-autoregressive multi-canvas sampling:\n # generates 256-token blocks in parallel via iterative denoising, NOT\n # standard autoregressive token-by-token generation.\n # Claims: up to 4x faster inference (1000+ tok/s on H100, 700+ on RTX 5090)\n # Native context: 256K tokens (sliding window 1024 + global attention)\n # Memory budget: same as Gemma4 26B A4B (~13 GB weights at 4bit + KV)\n # HuggingFace: google/diffusiongemma-26B-A4B-it (Apache 2.0)\n # mlx-community models: diffusiongemma-26B-A4B-it-4bit, -8bit, -5bit, -6bit,\n # -mxfp4, -mxfp8, -nvfp4, -bf16\n # GGUF: unsloth/diffusiongemma-26B-A4B-it-GGUF (Q4_K_M, Q5_K_M, Q6_K, Q8_0)\n # Backend support:\n # mlx-vlm 0.6.0+ — supports diffusion_gemma model type (block diffusion decoding)\n # Unsloth Studio — OpenAI-compat API with native diffusion decoding (uses llama.cpp internally)\n # vLLM (GPU) — supports diffusion decoding via OpenAI-compat API\n # llama.cpp — DRAFT PR #24423 only, no server mode yet (llama-diffusion-cli only)\n # Ollama — NOT supported (depends on llama.cpp merge)\n # NOTE: llama.cpp GGUF quants exist but standard llama-server cannot run them\n # with diffusion decoding. Only llama-diffusion-cli (from PR #24423) works.\n # Unsloth Studio wraps llama.cpp with its own diffusion path — use DG_US_* configs.\n # ══════════════════════════════════════════════════════════════════════════════\n\n - id: DG_Q4_1\n model: \"DiffusionGemma\"\n group: \"DG — DiffusionGemma 26B-A4B (Block Diffusion)\"\n backend: mlx-vlm\n model_id: \"mlx-community/diffusiongemma-26B-A4B-it-4bit\"\n fmt: MLX\n quant: 4bit\n kv_cache: default\n extra_args: [\"--max-kv-size\", \"32768\"]\n server_timeout: 1200\n temperature: 0.7\n\n - id: DG_Q4_2\n model: \"DiffusionGemma\"\n group: \"DG — DiffusionGemma 26B-A4B (Block Diffusion)\"\n backend: mlx-vlm\n model_id: \"mlx-community/diffusiongemma-26B-A4B-it-4bit\"\n fmt: MLX\n quant: 4bit\n kv_cache: kv4\n extra_args: [\"--max-kv-size\", \"32768\", \"--kv-bits\", \"4\"]\n server_timeout: 1200\n temperature: 0.7\n\n - id: DG_Q8_1\n model: \"DiffusionGemma\"\n group: \"DG — DiffusionGemma 26B-A4B (Block Diffusion)\"\n backend: mlx-vlm\n model_id: \"mlx-community/diffusiongemma-26B-A4B-it-8bit\"\n fmt: MLX\n quant: 8bit\n kv_cache: default\n extra_args: [\"--max-kv-size\", \"32768\"]\n temperature: 0.7\n\n - id: DG_MXFP4_1\n model: \"DiffusionGemma\"\n group: \"DG — DiffusionGemma 26B-A4B (Block Diffusion)\"\n backend: mlx-vlm\n model_id: \"mlx-community/diffusiongemma-26B-A4B-it-mxfp4\"\n fmt: MXFP4\n quant: mxfp4\n kv_cache: default\n extra_args: [\"--max-kv-size\", \"32768\"]\n temperature: 0.7\n enabled: false # mlx-vlm dequantize crash: MXFP4 affine quant incompatible with diffusion soft-embedding\n\n - id: DG_NVFP4_1\n model: \"DiffusionGemma\"\n group: \"DG — DiffusionGemma 26B-A4B (Block Diffusion)\"\n backend: mlx-vlm\n model_id: \"mlx-community/diffusiongemma-26B-A4B-it-nvfp4\"\n fmt: NVFP4\n quant: nvfp4\n kv_cache: default\n extra_args: [\"--max-kv-size\", \"32768\"]\n temperature: 0.7\n enabled: false # Same dequantize crash as MXFP4 — affine quant incompatible with diffusion path\n\n - id: DG_CTX_1\n model: \"DiffusionGemma\"\n group: \"DG — DiffusionGemma 26B-A4B (Block Diffusion)\"\n backend: mlx-vlm\n model_id: \"mlx-community/diffusiongemma-26B-A4B-it-4bit\"\n fmt: MLX\n quant: 4bit\n kv_cache: default\n extra_args: [\"--max-kv-size\", \"131072\"]\n prompts: [context-32k, context-64k, context-128k]\n temperature: 0.7\n enabled: false # OOM crash — 15 GB model + 128k FP16 KV exceeds 64 GB\n\n - id: DG_CTX_2\n model: \"DiffusionGemma\"\n group: \"DG — DiffusionGemma 26B-A4B (Block Diffusion)\"\n backend: mlx-vlm\n model_id: \"mlx-community/diffusiongemma-26B-A4B-it-4bit\"\n fmt: MLX\n quant: 4bit\n kv_cache: kv4\n extra_args: [\"--max-kv-size\", \"131072\", \"--kv-bits\", \"4\"]\n prompts: [context-32k, context-64k, context-128k]\n temperature: 0.7\n enabled: false # OOM crash — even with kv4, large-context DG overflows 64 GB\n\n # ── vllm-mlx (may support diffusion decoding via mlx-vlm integration) ───────\n - id: DG_VM_1\n model: \"DiffusionGemma\"\n group: \"DG — DiffusionGemma 26B-A4B (Block Diffusion)\"\n backend: vllm-mlx\n model_id: \"mlx-community/diffusiongemma-26B-A4B-it-4bit\"\n fmt: MLX\n quant: 4bit\n kv_cache: default\n temperature: 0.7\n enabled: false # vllm-mlx's mlx_lm doesn't support diffusion_gemma model type\n\n # ── oMLX (SSD-tiered paged KV cache) ───────────────────────────────────────\n - id: DG_OX_1\n model: \"DiffusionGemma\"\n group: \"DG — DiffusionGemma 26B-A4B (Block Diffusion)\"\n backend: omlx\n model_id: \"diffusiongemma-26B-A4B-it-4bit\"\n fmt: MLX\n quant: 4bit\n kv_cache: ssd-paged\n temperature: 0.7\n\n # ── llama-diffusion-cli (PR #24423 branch build) via diffusion_server.py ─────\n - id: DG_DIFF_Q4\n model: \"DiffusionGemma\"\n group: \"DG — DiffusionGemma 26B-A4B (Block Diffusion)\"\n backend: diffusion-cli\n model_id: \"hf:unsloth/diffusiongemma-26B-A4B-it-GGUF:diffusiongemma-26B-A4B-it-Q4_K_M.gguf\"\n fmt: GGUF\n quant: Q4_K_M\n kv_cache: default\n temperature: 0.7\n server_timeout: 30\n\n # ── Ollama — NOT supported (standard llama.cpp has no diffusion decoding) ───\n - id: DG_OLL_1\n model: \"DiffusionGemma\"\n group: \"DG — DiffusionGemma 26B-A4B (Block Diffusion)\"\n backend: ollama\n model_id: \"diffusiongemma:26b\"\n fmt: GGUF\n quant: Q4_K_M\n kv_cache: default\n enabled: false # Ollama/llama.cpp cannot do diffusion decoding yet (PR #24423 not merged)\n\n # ── llama-server — BLOCKED (no server mode in diffusion PR) ─────────────────\n # GGUF files exist (unsloth/diffusiongemma-26B-A4B-it-GGUF) but only\n # llama-diffusion-cli can decode them with diffusion; no HTTP server available.\n - id: DG_LC_Q4KM\n model: \"DiffusionGemma\"\n group: \"DG — DiffusionGemma 26B-A4B (Block Diffusion)\"\n backend: llama-server\n model_id: \"~/.cache/llmfit/models/diffusiongemma-26B-A4B-it-Q4_K_M.gguf\"\n fmt: GGUF\n quant: Q4_K_M\n kv_cache: default\n enabled: false # llama-server cannot do diffusion decoding (only llama-diffusion-cli from PR #24423)\n\n - id: DG_LC_Q8\n model: \"DiffusionGemma\"\n group: \"DG — DiffusionGemma 26B-A4B (Block Diffusion)\"\n backend: llama-server\n model_id: \"~/.cache/llmfit/models/diffusiongemma-26B-A4B-it-Q8_0.gguf\"\n fmt: GGUF\n quant: Q8_0\n kv_cache: default\n enabled: false # llama-server cannot do diffusion decoding\n\n # ══════════════════════════════════════════════════════════════════════════════\n # Group NC — North Mini Code 1.0 (Cohere, MoE 30B-A3B, Agentic Coding)\n # Architecture: cohere2_moe — 30B MoE (3B active / 30B total)\n # 128 experts, 8 active per token. Interleaved sliding-window + global\n # attention (3:1 ratio). SwiGLU FFN. Sigmoid-gated router.\n # Context: 128K tokens (trained Stage 1 @ 64K, Stage 2 @ 128K)\n # License: Apache 2.0\n # Purpose: agentic software engineering — SWE-Bench 80.2% pass@10,\n # outperforms Qwen3.5-35B-A3B, Gemma4-26B-A4B on Artificial Analysis\n # Coding Index (33.4). Direct competitor to Group A/O/B.\n # Memory budget: ~18 GB weights (4bit) + KV. Very similar to Qwen3.5 35B-A3B.\n # HuggingFace: CohereLabs/North-Mini-Code-1.0\n # mlx-community: North-Mini-Code-1.0-4bit, -5bit, -6bit, -bf16\n # GGUF: unsloth/North-Mini-Code-1.0-GGUF (UD-Q4_K_M ~19 GB, UD-Q4_K_XL ~19 GB,\n # UD-Q2_K_XL ~10 GB, Q8_0 ~32 GB, MXFP4_MOE ~19 GB)\n # NOTE: model_type is cohere2_moe — mlx-vlm 0.6.2+ supports this.\n # mlx-lm support unclear (cohere2_moe may not be in mlx_lm.models).\n # ══════════════════════════════════════════════════════════════════════════════\n\n - id: NC_Q4_1\n model: \"NorthCode\"\n group: \"NC — North Mini Code (MoE 30B-A3B)\"\n backend: mlx-vlm\n model_id: \"mlx-community/North-Mini-Code-1.0-4bit\"\n fmt: MLX\n quant: 4bit\n kv_cache: default\n extra_args: [\"--max-kv-size\", \"32768\"]\n\n - id: NC_Q4_2\n model: \"NorthCode\"\n group: \"NC — North Mini Code (MoE 30B-A3B)\"\n backend: mlx-vlm\n model_id: \"mlx-community/North-Mini-Code-1.0-4bit\"\n fmt: MLX\n quant: 4bit\n kv_cache: kv4\n extra_args: [\"--max-kv-size\", \"32768\", \"--kv-bits\", \"4\"]\n\n - id: NC_Q4_3\n model: \"NorthCode\"\n group: \"NC — North Mini Code (MoE 30B-A3B)\"\n backend: mlx-lm\n model_id: \"mlx-community/North-Mini-Code-1.0-4bit\"\n fmt: MLX\n quant: 4bit\n kv_cache: default\n enabled: false # mlx-lm 0.31.1 doesn't support cohere2_moe architecture\n\n - id: NC_CTX_1\n model: \"NorthCode\"\n group: \"NC — North Mini Code (MoE 30B-A3B)\"\n backend: mlx-vlm\n model_id: \"mlx-community/North-Mini-Code-1.0-4bit\"\n fmt: MLX\n quant: 4bit\n kv_cache: default\n extra_args: [\"--max-kv-size\", \"131072\"]\n prompts: [context-32k, context-64k, context-128k]\n\n - id: NC_CTX_2\n model: \"NorthCode\"\n group: \"NC — North Mini Code (MoE 30B-A3B)\"\n backend: mlx-vlm\n model_id: \"mlx-community/North-Mini-Code-1.0-4bit\"\n fmt: MLX\n quant: 4bit\n kv_cache: kv4\n extra_args: [\"--max-kv-size\", \"131072\", \"--kv-bits\", \"4\"]\n prompts: [context-32k, context-64k, context-128k]\n\n # ── vllm-mlx ─────────────────────────────────────────────────────────────────\n - id: NC_VM_1\n model: \"NorthCode\"\n group: \"NC — North Mini Code (MoE 30B-A3B)\"\n backend: vllm-mlx\n model_id: \"mlx-community/North-Mini-Code-1.0-4bit\"\n fmt: MLX\n quant: 4bit\n kv_cache: default\n enabled: false # vllm-mlx's mlx_lm doesn't support cohere2_moe architecture\n\n # ── oMLX (SSD-tiered paged KV cache) ───────────────────────────────────────\n - id: NC_OX_1\n model: \"NorthCode\"\n group: \"NC — North Mini Code (MoE 30B-A3B)\"\n backend: omlx\n model_id: \"North-Mini-Code-1.0-4bit\"\n fmt: MLX\n quant: 4bit\n kv_cache: ssd-paged\n\n # ── Ollama (HF GGUF path — BLOCKED: Ollama 0.30.7 only ships MLX runner) ─────\n - id: NC_OLL_1\n model: \"NorthCode\"\n group: \"NC — North Mini Code (MoE 30B-A3B)\"\n backend: ollama\n model_id: \"hf.co/unsloth/North-Mini-Code-1.0-GGUF:Q4_K_M\"\n fmt: GGUF\n quant: Q4_K_M\n kv_cache: default\n enabled: false # Ollama 0.30.7 only has MLX runner; HF GGUF requires llama-server runner\n\n # ── llama-server — Unsloth GGUF quants ─────────────────────────────────────\n - id: NC_LC_Q4KM\n model: \"NorthCode\"\n group: \"NC — North Mini Code (MoE 30B-A3B)\"\n backend: llama-server\n model_id: \"~/.cache/llmfit/models/North-Mini-Code-1.0-UD-Q4_K_M.gguf\"\n fmt: GGUF\n quant: UD-Q4_K_M\n kv_cache: default\n enabled: false # llama.cpp 9590 doesn't support cohere2moe architecture\n\n - id: NC_LC_UDQ4\n model: \"NorthCode\"\n group: \"NC — North Mini Code (MoE 30B-A3B)\"\n backend: llama-server\n model_id: \"~/.cache/llmfit/models/North-Mini-Code-1.0-UD-Q4_K_XL.gguf\"\n fmt: GGUF\n quant: UD-Q4_K_XL\n kv_cache: default\n enabled: false # llama.cpp 9590 doesn't support cohere2moe architecture\n\n - id: NC_LC_UDQ2\n model: \"NorthCode\"\n group: \"NC — North Mini Code (MoE 30B-A3B)\"\n backend: llama-server\n model_id: \"~/.cache/llmfit/models/North-Mini-Code-1.0-UD-Q2_K_XL.gguf\"\n fmt: GGUF\n quant: UD-Q2_K_XL\n kv_cache: default\n enabled: false # llama.cpp 9590 doesn't support cohere2moe architecture\n\n - id: NC_LC_MXFP4\n model: \"NorthCode\"\n group: \"NC — North Mini Code (MoE 30B-A3B)\"\n backend: llama-server\n model_id: \"~/.cache/llmfit/models/North-Mini-Code-1.0-MXFP4_MOE.gguf\"\n fmt: GGUF\n quant: MXFP4_MOE\n kv_cache: default\n extra_args: [\"-fa\", \"on\"]\n enabled: false # llama.cpp 9590 doesn't support cohere2moe architecture\n\n # ══════════════════════════════════════════════════════════════════════════════\n # Group H3 — Holo3.1 35B-A3B (Computer-Use Agent VLM, MoE)\n # Architecture: qwen3_5_moe — 35B MoE (3B active / 256 experts / 8 active)\n # Hidden: 2048, heads: 16, KV-heads: 2, layers: 40, context: 262k\n # Vision: 27-layer ViT (1152-dim) for screenshot/UI grounding\n # Primary use: computer-use agent (desktop/mobile/web automation)\n # Text-only benchmark measures decode speed for response generation latency.\n # Model: pipenetwork/Holo-3.1-35B-A3B-MLX-4bit (community conversion)\n # GGUF: Hcompany/Holo-3.1-35B-A3B-GGUF (official, Q4_K_M = 21.3 GB)\n # License: Apache 2.0\n\n - id: H3_Q4_1\n model: \"Holo3.1\"\n group: \"H3 — Holo3.1 35B-A3B (Computer-Use Agent)\"\n backend: mlx-vlm\n model_id: \"pipenetwork/Holo-3.1-35B-A3B-MLX-4bit\"\n fmt: MLX\n quant: 4bit\n kv_cache: default\n extra_args: [\"--max-kv-size\", \"32768\"]\n\n - id: H3_Q4_2\n model: \"Holo3.1\"\n group: \"H3 — Holo3.1 35B-A3B (Computer-Use Agent)\"\n backend: mlx-vlm\n model_id: \"pipenetwork/Holo-3.1-35B-A3B-MLX-4bit\"\n fmt: MLX\n quant: 4bit\n kv_cache: kv4\n extra_args: [\"--max-kv-size\", \"32768\", \"--kv-bits\", \"4\"]\n\n - id: H3_Q8_1\n model: \"Holo3.1\"\n group: \"H3 — Holo3.1 35B-A3B (Computer-Use Agent)\"\n backend: mlx-vlm\n model_id: \"pipenetwork/Holo-3.1-35B-A3B-MLX-8bit\"\n fmt: MLX\n quant: 8bit\n kv_cache: default\n extra_args: [\"--max-kv-size\", \"32768\"]\n enabled: false # 28 GB model — doesn't fit on disk alongside other models\n\n - id: H3_CTX_1\n model: \"Holo3.1\"\n group: \"H3 — Holo3.1 35B-A3B (Computer-Use Agent)\"\n backend: mlx-vlm\n model_id: \"pipenetwork/Holo-3.1-35B-A3B-MLX-4bit\"\n fmt: MLX\n quant: 4bit\n kv_cache: default\n extra_args: [\"--max-kv-size\", \"131072\"]\n prompts: [context-32k, context-64k, context-128k]\n\n - id: H3_LC_Q4KM\n model: \"Holo3.1\"\n group: \"H3 — Holo3.1 35B-A3B (Computer-Use Agent)\"\n backend: llama-server\n model_id: \"~/.cache/llmfit/models/Holo-3.1-35B-A3B-Q4_K_M.gguf\"\n fmt: GGUF\n quant: Q4_K_M\n kv_cache: default\n\n # ══════════════════════════════════════════════════════════════════════════════\n # Group QW27 — Qwen3.5-27B (Dense 27B, AA Index 37.1)\n # Architecture: qwen3_5 (dense transformer, NOT MoE)\n # Parameters: 27B total, 27B active — same quality tier as Qwen3.6-27B (AA 37.1)\n # but as a dense model should be faster per token on CPU/memory-bound workloads.\n # Context: 128K tokens\n # License: Apache 2.0\n # Purpose: high-quality dense 27B — direct comparison to MoE peers at same size tier.\n # AA Intelligence Index 37.1 (non-reasoning), among top open-weights models <40B.\n # Memory budget: Q4_K_M ~16 GB, MLX 4bit ~16 GB\n # HuggingFace base: Qwen/Qwen3.5-27B-FP8 (instruct weights, same family)\n # mlx-community: Qwen3.5-27B-4bit, -5bit, -6bit, -8bit\n # GGUF: bartowski/Qwen3.5-27B-Instruct-GGUF (Q4_K_M ~16 GB)\n # Ollama: qwen3.5:27b\n # NOTE: qwen3_5 architecture — supported by mlx-lm, llama.cpp, Ollama.\n # ══════════════════════════════════════════════════════════════════════════════\n\n - id: QW27_Q4_1\n model: \"Qwen3.5-27B\"\n group: \"QW27 — Qwen3.5-27B (Dense)\"\n backend: mlx-lm\n model_id: \"mlx-community/Qwen3.5-27B-4bit\"\n fmt: MLX\n quant: 4bit\n kv_cache: default\n\n - id: QW27_Q4_2\n model: \"Qwen3.5-27B\"\n group: \"QW27 — Qwen3.5-27B (Dense)\"\n backend: mlx-lm\n model_id: \"mlx-community/Qwen3.5-27B-8bit\"\n fmt: MLX\n quant: 8bit\n kv_cache: default\n\n - id: QW27_OLL_1\n model: \"Qwen3.5-27B\"\n group: \"QW27 — Qwen3.5-27B (Dense)\"\n backend: ollama\n model_id: \"qwen3.5:27b\"\n fmt: GGUF\n quant: Q4_K_M\n kv_cache: default\n\n - id: QW27_LC_Q4KM\n model: \"Qwen3.5-27B\"\n group: \"QW27 — Qwen3.5-27B (Dense)\"\n backend: llama-server\n model_id: \"~/.cache/huggingface/hub/models--bartowski--Qwen_Qwen3.5-27B-GGUF/snapshots/d7b113c40283f4d99f4eb0ec20d126ad653cc736/Qwen_Qwen3.5-27B-Q4_K_M.gguf\"\n fmt: GGUF\n quant: Q4_K_M\n kv_cache: default\n\n - id: QW27_CTX_1\n model: \"Qwen3.5-27B\"\n group: \"QW27 — Qwen3.5-27B (Dense)\"\n backend: mlx-lm\n model_id: \"mlx-community/Qwen3.5-27B-4bit\"\n fmt: MLX\n quant: 4bit\n kv_cache: default\n prompts: [context-32k, context-64k, context-128k]\n\n # ══════════════════════════════════════════════════════════════════════════════\n # Group QW122 — Qwen3.5-122B-A10B (MoE 122B total / 10B active, AA Index 35.9)\n # Architecture: qwen3_5_moe\n # Parameters: 122B total, 10B active per token. Same MoE family as Qwen3.5-35B-A3B.\n # Context: 128K tokens\n # License: Apache 2.0\n # Purpose: largest feasible MoE on 64 GB at aggressive quantization.\n # AA 35.9 non-reasoning — comparable to Qwen3.5-35B-A3B (30.7) but larger model.\n # MLX 4bit is ~65 GB and will NOT fit. GGUF UD-Q2_K_XL = 42.8 GB fits with headroom.\n # IQ2_M = 40.4 GB also fits and may have better perplexity than Q2_K_XL.\n # Memory budget: UD-Q2_K_XL ~42.8 GB, UD-IQ2_M ~40.4 GB\n # HuggingFace: Qwen/Qwen3.5-122B-A10B\n # GGUF: unsloth/Qwen3.5-122B-A10B-MTP-GGUF (UD-Q2_K_XL 42.8 GB, UD-IQ2_M 40.4 GB)\n # NOTE: mlx-community/Qwen3.5-122B-A10B-4bit is ~65 GB — too large for 64 GB machine.\n # llama.cpp must support qwen3_5_moe — verify at runtime; disable if unsupported.\n # ══════════════════════════════════════════════════════════════════════════════\n\n - id: QW122_UDQ2_1\n model: \"Qwen3.5-122B\"\n group: \"QW122 — Qwen3.5-122B-A10B (MoE, Q2)\"\n backend: llama-server\n model_id: \"~/.cache/huggingface/hub/models--unsloth--Qwen3.5-122B-A10B-MTP-GGUF/snapshots/907becb33103ab66b23da06a2dc74a5fca0583bd/Qwen3.5-122B-A10B-UD-Q2_K_XL.gguf\"\n fmt: GGUF\n quant: UD-Q2_K_XL\n kv_cache: default\n\n - id: QW122_UDQ2_2\n model: \"Qwen3.5-122B\"\n group: \"QW122 — Qwen3.5-122B-A10B (MoE, Q2)\"\n backend: llama-server\n model_id: \"~/.cache/huggingface/hub/models--unsloth--Qwen3.5-122B-A10B-MTP-GGUF/snapshots/907becb33103ab66b23da06a2dc74a5fca0583bd/Qwen3.5-122B-A10B-UD-IQ2_M.gguf\"\n fmt: GGUF\n quant: UD-IQ2_M\n kv_cache: default\n\n # ══════════════════════════════════════════════════════════════════════════════\n # Group MS4 — Mistral Small 4 (119B dense, AA Index 27.8)\n # Architecture: mistral3\n # Parameters: 119B dense — large dense model, NOT MoE.\n # Context: 128K tokens\n # License: Apache 2.0\n # Purpose: largest dense open-weights model feasible at extreme quantization.\n # AA 27.8 (reasoning) — strong reasoning model from Mistral.\n # IQ2_M = 38.9 GB fits; Q3_K_L = 61.7 GB fits tightly; Q4_K_M = 72.3 GB too big.\n # No MLX quants available for this model yet.\n # Memory budget: IQ2_M ~38.9 GB, IQ3_M ~52.2 GB, Q3_K_L ~61.7 GB (tight)\n # GGUF: mradermacher/Mistral-Small-4-119B-2603-i1-GGUF\n # NOTE: mistral3 arch — verify llama.cpp supports it; disable if not.\n # No Ollama tag found. llama-server only.\n # ══════════════════════════════════════════════════════════════════════════════\n\n - id: MS4_IQ2_1\n model: \"MistralSmall4\"\n group: \"MS4 — Mistral Small 4 (119B Dense, IQ2)\"\n backend: llama-server\n model_id: \"~/.cache/huggingface/hub/models--mradermacher--Mistral-Small-4-119B-2603-i1-GGUF/snapshots/1cb5f803eab639379d7b0d593eceb6e6ab690443/Mistral-Small-4-119B-2603.i1-IQ2_M.gguf\"\n fmt: GGUF\n quant: IQ2_M\n kv_cache: default\n extra_args: [\"--chat-template\", \"chatml\", \"-c\", \"4096\", \"-np\", \"1\"]\n\n - id: MS4_IQ3_1\n model: \"MistralSmall4\"\n group: \"MS4 — Mistral Small 4 (119B Dense, IQ3)\"\n backend: llama-server\n model_id: \"~/.cache/huggingface/hub/models--mradermacher--Mistral-Small-4-119B-2603-i1-GGUF/snapshots/1cb5f803eab639379d7b0d593eceb6e6ab690443/Mistral-Small-4-119B-2603.i1-IQ3_M.gguf\"\n fmt: GGUF\n quant: IQ3_M\n kv_cache: default\n extra_args: [\"--chat-template\", \"chatml\", \"-c\", \"4096\", \"-np\", \"1\"]\n\n # ══════════════════════════════════════════════════════════════════════════════\n # Group DST2 — Devstral Small 2 (24B dense, AA Index 22.0)\n # Architecture: mistral3\n # Parameters: 24B dense — Mistral's second-generation coding model\n # Context: 128K tokens (32K sliding window attention)\n # License: Apache 2.0\n # Purpose: coding-focused 24B dense model from Mistral. Direct competitor to\n # Qwen3-Coder-Next and NorthCode on software engineering tasks.\n # AA 22.0 — lower than our other coding models but interesting as a non-Qwen data point.\n # Memory budget: Q4_K_M ~14.3 GB, MLX 4bit ~14 GB\n # HuggingFace: mistralai/Devstral-Small-2-24B-Instruct-2512\n # mlx-community: Devstral-Small-2-24B-Instruct-2512-4bit, -5bit, -6bit, -8bit\n # GGUF: bartowski/mistralai_Devstral-Small-2-24B-Instruct-2512-GGUF (Q4_K_M 14.3 GB)\n # Ollama: devstral:24b\n # NOTE: mistral3 arch — same as Mistral Small 4. Supported by mlx-lm and llama.cpp.\n # ══════════════════════════════════════════════════════════════════════════════\n\n - id: DST2_Q4_1\n model: \"Devstral2\"\n group: \"DST2 — Devstral Small 2 (24B Coding)\"\n backend: mlx-lm\n model_id: \"mlx-community/Devstral-Small-2-24B-Instruct-2512-4bit\"\n fmt: MLX\n quant: 4bit\n kv_cache: default\n\n - id: DST2_Q4_2\n model: \"Devstral2\"\n group: \"DST2 — Devstral Small 2 (24B Coding)\"\n backend: mlx-lm\n model_id: \"mlx-community/Devstral-Small-2-24B-Instruct-2512-8bit\"\n fmt: MLX\n quant: 8bit\n kv_cache: default\n\n - id: DST2_OLL_1\n model: \"Devstral2\"\n group: \"DST2 — Devstral Small 2 (24B Coding)\"\n backend: ollama\n model_id: \"devstral:24b\"\n fmt: GGUF\n quant: Q4_K_M\n kv_cache: default\n\n - id: DST2_LC_Q4KM\n model: \"Devstral2\"\n group: \"DST2 — Devstral Small 2 (24B Coding)\"\n backend: llama-server\n model_id: \"~/.cache/huggingface/hub/models--bartowski--mistralai_Devstral-Small-2-24B-Instruct-2512-GGUF/snapshots/027695770ae1de77c2f6fb19f8e1ba9d65fcd15d/mistralai_Devstral-Small-2-24B-Instruct-2512-Q4_K_M.gguf\"\n fmt: GGUF\n quant: Q4_K_M\n kv_cache: default\n\n # ══════════════════════════════════════════════════════════════════════════════\n # Group LFM25 — LFM2.5-8B-A1B (Liquid, 8B total / 1B active MoE, May 2026)\n # NOTE: Liquid's custom architecture — supported by llama.cpp, mlx-lm, Ollama.\n # ══════════════════════════════════════════════════════════════════════════════\n\n - id: LFM25_Q4_1\n model: \"LFM2.5-8B\"\n group: \"LFM25 — LFM2.5-8B-A1B (MoE, 1B active)\"\n backend: mlx-lm\n model_id: \"LiquidAI/LFM2.5-8B-A1B-MLX-4bit\"\n fmt: MLX\n quant: 4bit\n kv_cache: default\n\n - id: LFM25_Q8_1\n model: \"LFM2.5-8B\"\n group: \"LFM25 — LFM2.5-8B-A1B (MoE, 1B active)\"\n backend: mlx-lm\n model_id: \"LiquidAI/LFM2.5-8B-A1B-MLX-8bit\"\n fmt: MLX\n quant: 8bit\n kv_cache: default\n\n - id: LFM25_OLL_1\n model: \"LFM2.5-8B\"\n group: \"LFM25 — LFM2.5-8B-A1B (MoE, 1B active)\"\n backend: ollama\n model_id: \"lfm2.5:8b\"\n fmt: GGUF\n quant: Q4_K_M\n kv_cache: default\n\n - id: LFM25_LC_Q4KM\n model: \"LFM2.5-8B\"\n group: \"LFM25 — LFM2.5-8B-A1B (MoE, 1B active)\"\n backend: llama-server\n model_id: \"hf:LiquidAI/LFM2.5-8B-A1B-GGUF:LFM2.5-8B-A1B-Q4_K_M.gguf\"\n fmt: GGUF\n quant: Q4_K_M\n kv_cache: default\n\n - id: LFM25_LC_Q8\n model: \"LFM2.5-8B\"\n group: \"LFM25 — LFM2.5-8B-A1B (MoE, 1B active)\"\n backend: llama-server\n model_id: \"hf:LiquidAI/LFM2.5-8B-A1B-GGUF:LFM2.5-8B-A1B-Q8_0.gguf\"\n fmt: GGUF\n quant: Q8_0\n kv_cache: default\n\n # ══════════════════════════════════════════════════════════════════════════════\n # Group LFM2 — LFM2-24B-A2B (Liquid, 24B total / 2B active MoE, Feb 2026)\n # NOTE: Liquid's custom architecture — supported by llama.cpp, mlx-lm, Ollama.\n # ══════════════════════════════════════════════════════════════════════════════\n\n - id: LFM2_Q4_1\n model: \"LFM2-24B\"\n group: \"LFM2 — LFM2-24B-A2B (MoE, 2B active)\"\n backend: mlx-lm\n model_id: \"lmstudio-community/LFM2-24B-A2B-MLX-4bit\"\n fmt: MLX\n quant: 4bit\n kv_cache: default\n\n - id: LFM2_Q8_1\n model: \"LFM2-24B\"\n group: \"LFM2 — LFM2-24B-A2B (MoE, 2B active)\"\n backend: mlx-lm\n model_id: \"lmstudio-community/LFM2-24B-A2B-MLX-8bit\"\n fmt: MLX\n quant: 8bit\n kv_cache: default\n\n - id: LFM2_OLL_1\n model: \"LFM2-24B\"\n group: \"LFM2 — LFM2-24B-A2B (MoE, 2B active)\"\n backend: ollama\n model_id: \"lfm2:24b\"\n fmt: GGUF\n quant: Q4_K_M\n kv_cache: default\n\n - id: LFM2_LC_Q4KM\n model: \"LFM2-24B\"\n group: \"LFM2 — LFM2-24B-A2B (MoE, 2B active)\"\n backend: llama-server\n model_id: \"hf:LiquidAI/LFM2-24B-A2B-GGUF:LFM2-24B-A2B-Q4_K_M.gguf\"\n fmt: GGUF\n quant: Q4_K_M\n kv_cache: default\n\n - id: LFM2_LC_Q8\n model: \"LFM2-24B\"\n group: \"LFM2 — LFM2-24B-A2B (MoE, 2B active)\"\n backend: llama-server\n model_id: \"hf:LiquidAI/LFM2-24B-A2B-GGUF:LFM2-24B-A2B-Q8_0.gguf\"\n fmt: GGUF\n quant: Q8_0\n kv_cache: default\n\n # ══════════════════════════════════════════════════════════════════════════════\n # Group NEM3 — Nemotron-3-Nano-30B-A3B (NVIDIA, 30B total / 3B active MoE)\n # ══════════════════════════════════════════════════════════════════════════════\n\n - id: NEM3_Q4_1\n model: \"Nemotron-Nano-30B\"\n group: \"NEM3 — Nemotron-3-Nano-30B-A3B (MoE, 3B active)\"\n backend: mlx-lm\n model_id: \"lmstudio-community/NVIDIA-Nemotron-3-Nano-30B-A3B-MLX-4bit\"\n fmt: MLX\n quant: 4bit\n kv_cache: default\n\n - id: NEM3_Q8_1\n model: \"Nemotron-Nano-30B\"\n group: \"NEM3 — Nemotron-3-Nano-30B-A3B (MoE, 3B active)\"\n backend: mlx-lm\n model_id: \"lmstudio-community/NVIDIA-Nemotron-3-Nano-30B-A3B-MLX-8bit\"\n fmt: MLX\n quant: 8bit\n kv_cache: default\n\n - id: NEM3_OLL_1\n model: \"Nemotron-Nano-30B\"\n group: \"NEM3 — Nemotron-3-Nano-30B-A3B (MoE, 3B active)\"\n backend: ollama\n model_id: \"nemotron-3-nano:30b\"\n fmt: GGUF\n quant: Q4_K_M\n kv_cache: default\n\n - id: NEM3_LC_Q4KM\n model: \"Nemotron-Nano-30B\"\n group: \"NEM3 — Nemotron-3-Nano-30B-A3B (MoE, 3B active)\"\n backend: llama-server\n model_id: \"hf:unsloth/Nemotron-3-Nano-30B-A3B-GGUF:Nemotron-3-Nano-30B-A3B-Q4_K_M.gguf\"\n fmt: GGUF\n quant: Q4_K_M\n kv_cache: default\n\n # ══════════════════════════════════════════════════════════════════════════════\n # Group NEMC — Nemotron-Cascade-2-30B-A3B (NVIDIA, 30B / 3B active, Mar 2026)\n # ══════════════════════════════════════════════════════════════════════════════\n\n - id: NEMC_Q4_1\n model: \"Nemotron-Cascade2-30B\"\n group: \"NEMC — Nemotron-Cascade-2-30B-A3B (MoE, 3B active)\"\n backend: mlx-lm\n model_id: \"mlx-community/Nemotron-Cascade-2-30B-A3B-4bit\"\n fmt: MLX\n quant: 4bit\n kv_cache: default\n\n - id: NEMC_OLL_1\n model: \"Nemotron-Cascade2-30B\"\n group: \"NEMC — Nemotron-Cascade-2-30B-A3B (MoE, 3B active)\"\n backend: ollama\n model_id: \"nemotron-cascade-2:30b\"\n fmt: GGUF\n quant: Q4_K_M\n kv_cache: default\n\n - id: NEMC_LC_Q4KM\n model: \"Nemotron-Cascade2-30B\"\n group: \"NEMC — Nemotron-Cascade-2-30B-A3B (MoE, 3B active)\"\n backend: llama-server\n model_id: \"hf:bartowski/nvidia_Nemotron-Cascade-2-30B-A3B-GGUF:nvidia_Nemotron-Cascade-2-30B-A3B-Q4_K_M.gguf\"\n fmt: GGUF\n quant: Q4_K_M\n kv_cache: default\n\n # ══════════════════════════════════════════════════════════════════════════════\n # Group GLM — GLM-4.7-Flash (Zhipu AI, 23B MoE / 3B active, Jan 2026)\n # ══════════════════════════════════════════════════════════════════════════════\n\n - id: GLM_Q4_1\n model: \"GLM-4.7-Flash\"\n group: \"GLM — GLM-4.7-Flash (MoE, 3B active)\"\n backend: mlx-lm\n model_id: \"mlx-community/GLM-4.7-Flash-4bit\"\n fmt: MLX\n quant: 4bit\n kv_cache: default\n\n - id: GLM_Q8_1\n model: \"GLM-4.7-Flash\"\n group: \"GLM — GLM-4.7-Flash (MoE, 3B active)\"\n backend: mlx-lm\n model_id: \"lmstudio-community/GLM-4.7-Flash-MLX-8bit\"\n fmt: MLX\n quant: 8bit\n kv_cache: default\n\n - id: GLM_OLL_1\n model: \"GLM-4.7-Flash\"\n group: \"GLM — GLM-4.7-Flash (MoE, 3B active)\"\n backend: ollama\n model_id: \"glm-4.7-flash\"\n fmt: GGUF\n quant: Q4_K_M\n kv_cache: default\n\n - id: GLM_LC_Q4KM\n model: \"GLM-4.7-Flash\"\n group: \"GLM — GLM-4.7-Flash (MoE, 3B active)\"\n backend: llama-server\n model_id: \"hf:unsloth/GLM-4.7-Flash-GGUF:GLM-4.7-Flash-Q4_K_M.gguf\"\n fmt: GGUF\n quant: Q4_K_M\n kv_cache: default\n\n # ══════════════════════════════════════════════════════════════════════════════\n # Group GR41 — Granite 4.1-8B (IBM, 8B dense, Apr 2026)\n # ══════════════════════════════════════════════════════════════════════════════\n\n - id: GR41_Q4_1\n model: \"Granite-4.1-8B\"\n group: \"GR41 — Granite 4.1-8B (Dense)\"\n backend: ollama\n model_id: \"granite4.1:8b\"\n fmt: GGUF\n quant: Q4_K_M\n kv_cache: default\n\n - id: GR41_LC_Q4KM\n model: \"Granite-4.1-8B\"\n group: \"GR41 — Granite 4.1-8B (Dense)\"\n backend: llama-server\n model_id: \"hf:unsloth/granite-4.1-8b-GGUF:granite-4.1-8b-Q4_K_M.gguf\"\n fmt: GGUF\n quant: Q4_K_M\n kv_cache: default\n\n - id: GR41_LC_Q8\n model: \"Granite-4.1-8B\"\n group: \"GR41 — Granite 4.1-8B (Dense)\"\n backend: llama-server\n model_id: \"hf:unsloth/granite-4.1-8b-GGUF:granite-4.1-8b-Q8_0.gguf\"\n fmt: GGUF\n quant: Q8_0\n kv_cache: default\n\n # ══════════════════════════════════════════════════════════════════════════════\n # Group PHIM — Phi-mini-MoE (Microsoft, 7.6B / 2.4B active MoE, Jun 2025)\n # ══════════════════════════════════════════════════════════════════════════════\n\n - id: PHIM_Q4_1\n model: \"Phi-mini-MoE\"\n group: \"PHIM — Phi-mini-MoE (MoE, 2.4B active)\"\n backend: mlx-lm\n model_id: \"mlx-community/Phi-3.5-MoE-instruct-4bit\"\n fmt: MLX\n quant: 4bit\n kv_cache: default\n\n - id: PHIM_LC_Q4KM\n model: \"Phi-mini-MoE\"\n group: \"PHIM — Phi-mini-MoE (MoE, 2.4B active)\"\n backend: llama-server\n model_id: \"hf:gabriellarson/Phi-mini-MoE-instruct-GGUF:Phi-mini-MoE-instruct-Q4_K_M.gguf\"\n fmt: GGUF\n quant: Q4_K_M\n kv_cache: default\n\n - id: PHIM_LC_Q8\n model: \"Phi-mini-MoE\"\n group: \"PHIM — Phi-mini-MoE (MoE, 2.4B active)\"\n backend: llama-server\n model_id: \"hf:gabriellarson/Phi-mini-MoE-instruct-GGUF:Phi-mini-MoE-instruct-Q8_0.gguf\"\n fmt: GGUF\n quant: Q8_0\n kv_cache: default\n\n # ══════════════════════════════════════════════════════════════════════════════\n # Group REKA — Reka Flash 3.1 (Reka AI, 21B dense, Jul 2025, coding-strong)\n # ══════════════════════════════════════════════════════════════════════════════\n\n - id: REKA_LC_Q4KM\n model: \"Reka-Flash-3.1\"\n group: \"REKA — Reka Flash 3.1 (21B Dense)\"\n backend: llama-server\n model_id: \"hf:bartowski/RekaAI_reka-flash-3.1-GGUF:RekaAI_reka-flash-3.1-Q4_K_M.gguf\"\n fmt: GGUF\n quant: Q4_K_M\n kv_cache: default\n\n - id: REKA_LC_Q8\n model: \"Reka-Flash-3.1\"\n group: \"REKA — Reka Flash 3.1 (21B Dense)\"\n backend: llama-server\n model_id: \"hf:bartowski/RekaAI_reka-flash-3.1-GGUF:RekaAI_reka-flash-3.1-Q8_0.gguf\"\n fmt: GGUF\n quant: Q8_0\n kv_cache: default\n\n # ══════════════════════════════════════════════════════════════════════════════\n # Group FAL3 — Falcon3-10B (TII/UAE, 10B dense, Dec 2024)\n # ══════════════════════════════════════════════════════════════════════════════\n\n - id: FAL3_OLL_1\n model: \"Falcon3-10B\"\n group: \"FAL3 — Falcon3-10B (Dense)\"\n backend: ollama\n model_id: \"falcon3:10b\"\n fmt: GGUF\n quant: Q4_K_M\n kv_cache: default\n\n - id: FAL3_LC_Q4KM\n model: \"Falcon3-10B\"\n group: \"FAL3 — Falcon3-10B (Dense)\"\n backend: llama-server\n model_id: \"hf:bartowski/Falcon3-10B-Instruct-GGUF:Falcon3-10B-Instruct-Q4_K_M.gguf\"\n fmt: GGUF\n quant: Q4_K_M\n kv_cache: default\n\n - id: FAL3_LC_Q8\n model: \"Falcon3-10B\"\n group: \"FAL3 — Falcon3-10B (Dense)\"\n backend: llama-server\n model_id: \"hf:bartowski/Falcon3-10B-Instruct-GGUF:Falcon3-10B-Instruct-Q8_0.gguf\"\n fmt: GGUF\n quant: Q8_0\n kv_cache: default\n\n # ══════════════════════════════════════════════════════════════════════════════\n # Group LAG — Laguna-XS.2 (Poolside, 31B dense, Apr 2026, coding)\n # ══════════════════════════════════════════════════════════════════════════════\n\n - id: LAG_Q4_1\n model: \"Laguna-XS.2\"\n group: \"LAG — Laguna-XS.2 (31B Dense, Coding)\"\n backend: mlx-lm\n model_id: \"mlx-community/Laguna-XS.2-4bit\"\n fmt: MLX\n quant: 4bit\n kv_cache: default\n\n - id: LAG_OLL_1\n model: \"Laguna-XS.2\"\n group: \"LAG — Laguna-XS.2 (31B Dense, Coding)\"\n backend: ollama\n model_id: \"laguna-xs.2:q4_K_M\"\n fmt: GGUF\n quant: Q4_K_M\n kv_cache: default\n\n - id: LAG_LC_Q4KM\n model: \"Laguna-XS.2\"\n group: \"LAG — Laguna-XS.2 (31B Dense, Coding)\"\n backend: llama-server\n model_id: \"hf:Lucebox/Laguna-XS.2-GGUF:laguna-xs2-Q4_K_M.gguf\"\n fmt: GGUF\n quant: Q4_K_M\n kv_cache: default\n enabled: false # 'laguna' arch not supported in llama.cpp b9610\n\n # ══════════════════════════════════════════════════════════════════════════════\n # Group NMC — North-Mini-Code-1.0 (Cohere, ~30B MoE 128E/8A, Jun 2026, coding)\n # ══════════════════════════════════════════════════════════════════════════════\n\n - id: NMC_Q4_1\n model: \"North-Mini-Code\"\n group: \"NMC — North-Mini-Code-1.0 (MoE, Coding)\"\n backend: mlx-lm\n model_id: \"mlx-community/North-Mini-Code-1.0-4bit\"\n fmt: MLX\n quant: 4bit\n kv_cache: default\n\n - id: NMC_LC_Q4K\n model: \"North-Mini-Code\"\n group: \"NMC — North-Mini-Code-1.0 (MoE, Coding)\"\n backend: llama-server\n model_id: \"hf:michaelw9999/North-Mini-Code-1.0-GGUF:BLS-Mini-Code-1.0-Q4_K.gguf\"\n fmt: GGUF\n quant: Q4_K\n kv_cache: default\n server_timeout: 1200\n enabled: false # 'cohere2_moe' arch not supported in llama.cpp b9610\n\n # ══════════════════════════════════════════════════════════════════════════════\n # Group GOSS — GPT-OSS-20B (OpenAI, 20B dense, MXFP4 native, Jun 2025)\n # ══════════════════════════════════════════════════════════════════════════════\n\n - id: GOSS_MLX_1\n model: \"GPT-OSS-20B\"\n group: \"GOSS — GPT-OSS-20B (OpenAI, Dense, MXFP4)\"\n backend: mlx-lm\n model_id: \"mlx-community/gpt-oss-20b-MXFP4-Q8\"\n fmt: MLX\n quant: MXFP4-Q8\n kv_cache: default\n\n - id: GOSS_OLL_1\n model: \"GPT-OSS-20B\"\n group: \"GOSS — GPT-OSS-20B (OpenAI, Dense, MXFP4)\"\n backend: ollama\n model_id: \"gpt-oss:20b\"\n fmt: GGUF\n quant: Q4_K_M\n kv_cache: default\n\n - id: GOSS_LC_Q4KM\n model: \"GPT-OSS-20B\"\n group: \"GOSS — GPT-OSS-20B (OpenAI, Dense, MXFP4)\"\n backend: llama-server\n model_id: \"hf:unsloth/gpt-oss-20b-GGUF:gpt-oss-20b-Q4_K_M.gguf\"\n fmt: GGUF\n quant: Q4_K_M\n kv_cache: default\n\n - id: GOSS_LC_Q8\n model: \"GPT-OSS-20B\"\n group: \"GOSS — GPT-OSS-20B (OpenAI, Dense, MXFP4)\"\n backend: llama-server\n model_id: \"hf:unsloth/gpt-oss-20b-GGUF:gpt-oss-20b-Q8_0.gguf\"\n fmt: GGUF\n quant: Q8_0\n kv_cache: default\n\n # ── F baseline re-run (clean AC power, precautionary) ────────────────────────\n # F_TQ4_1 and F_TQ35_1 ran at ~12:27-12:45 when battery was ~22% (above\n # Low Power Mode threshold). Decode speeds (89-93 t/s) match un-throttled\n # baselines so contamination is unlikely. Re-running to confirm cleanly on AC.\n # These duplicate IDs will produce a second CSV entry; HTML report uses median\n # across all runs so duplicates are handled correctly.\n #\n # To re-run only these two tests:\n # python3 benchmark.py --test F_TQ4_1 F_TQ35_1 --skip-unavailable --no-think --report-html\n"}}}}