From 3457c05a84e2171a09d14ce25f533f9908dd9a76 Mon Sep 17 00:00:00 2001 From: simba Date: Wed, 23 Sep 2026 21:40:24 -0700 Subject: [PATCH 1/6] fix(memory): cap the MLX cache on the full-GPU strategy; add a memory-guarded bench harness The full-GPU branch printed the plan but never set Memory.cacheLimit, so MLX kept its default, the whole GPU working set (26.8 GB on a 32 GB M6). Prefill chunk buffers change shape as the KV offset grows, so they are rarely reused, and the cache grew until macOS swapped. With Qwen3.8-27B-4bit (11.3 GB of weights) the process footprint reached 24 GB and swap grew 2.3 GB by 8.5K tokens. The full-GPU plan now gives the cache half of the RAM left after weights, KV and an 8 GB OS reserve, with a 1 GB floor and the old default as a ceiling. Server.swift applies it. On the M6 at 8.5K / 17K / 35.6K prompt tokens: peak footprint 19 / 19 / 21 GB, swap growth 0 / 0 / 0.5 GB, prefill 106.7 / 101.6 / 90.0 tok/s. scripts/profiling/m6_bench.py: one server per config, warm-up plus N runs with medians, a per-run nonce so the prompt cache can't hit, a planted code-word check, and a memory guard (swap growth / free-memory floor) that kills the server and records MEM_ABORT instead of letting a small-RAM machine thrash. Co-Authored-By: Claude Opus 5.5 --- Sources/SwiftLM/ModelProfiler.swift | 10 +- Sources/SwiftLM/Server.swift | 3 +- scripts/profiling/m6_bench.py | 326 ++++++++++++++++++++++++++++ 3 files changed, 337 insertions(+), 2 deletions(-) create mode 100644 scripts/profiling/m6_bench.py diff --git a/Sources/SwiftLM/ModelProfiler.swift b/Sources/SwiftLM/ModelProfiler.swift index d7e8b4d..e36c23b 100644 --- a/Sources/SwiftLM/ModelProfiler.swift +++ b/Sources/SwiftLM/ModelProfiler.swift @@ -505,7 +505,15 @@ enum ModelProfiler { switch strategy { case .fullGPU: memoryLimit = Int(Double(system.recommendedWorkingSetBytes) * 1.5) - cacheLimit = system.recommendedWorkingSetBytes // default + // MLX's default cache limit is the whole working set. Prefill chunk + // buffers change shape as the KV offset grows, so they are rarely + // reused and the cache just keeps growing. On a 32 GB machine that + // pushed macOS into swap by ~8K tokens. Give the cache half of what + // is left after weights, KV and an 8 GB OS reserve, and never more + // than the old default. + let headroomGB = system.totalRAMGB - (weightGB + draftGB) - kvGB - 8.0 + let budget = Int(max(1.0, headroomGB / 2) * 1e9) + cacheLimit = min(system.recommendedWorkingSetBytes, budget) case .swapAssisted: memoryLimit = 200 * 1024 * 1024 * 1024 // 200 GB sentinel to bypass MLX eval_impl spin loop (let macOS swap handle it) cacheLimit = 2 * 1024 * 1024 // 2MB — let OS manage caching diff --git a/Sources/SwiftLM/Server.swift b/Sources/SwiftLM/Server.swift index da3e190..ef11128 100644 --- a/Sources/SwiftLM/Server.swift +++ b/Sources/SwiftLM/Server.swift @@ -771,7 +771,8 @@ struct MLXServer: AsyncParsableCommand { // Apply memory strategy switch plan.strategy { case .fullGPU: - print("[SwiftLM] \(plan.strategy.emoji) Memory strategy: FULL GPU (\(String(format: "%.1f", plan.weightMemoryGB))GB model, \(String(format: "%.1f", system.availableRAMGB))GB available)") + Memory.cacheLimit = plan.recommendedCacheLimit + print("[SwiftLM] \(plan.strategy.emoji) Memory strategy: FULL GPU (\(String(format: "%.1f", plan.weightMemoryGB))GB model, \(String(format: "%.1f", system.availableRAMGB))GB available, cache limited to \(plan.recommendedCacheLimit / (1024*1024))MB)") case .swapAssisted: if self.streamExperts { // SSD Streaming: expert weights are mmap'd from SSD via the OS page cache. diff --git a/scripts/profiling/m6_bench.py b/scripts/profiling/m6_bench.py new file mode 100644 index 0000000..fe79cb7 --- /dev/null +++ b/scripts/profiling/m6_bench.py @@ -0,0 +1,326 @@ +#!/usr/bin/env python3 +"""Memory-guarded SwiftLM benchmark harness (built for the 32 GB M6 Mac mini). + +For each config it starts one SwiftLM server, then for each context length it +runs a warm-up plus N measured requests and reports medians. It guards memory +on a small-RAM machine: + + * Before each request it records swap usage and free memory as a baseline. + * While a request runs it polls GPU in-use memory (ioreg), swap and free memory + every 0.5 s. + * If swap grows by more than --swap-abort-gb, or free memory drops below + --min-free-pct, it kills the server, records a MEM_ABORT row, and skips the + larger contexts for that config. + +Every prompt starts with a unique nonce, so SwiftLM's prompt cache can't turn a +repeated run into a cache hit. Each prompt also contains a planted code word, +and the answer must reproduce it. + +Example: + python3 scripts/profiling/m6_bench.py --model mlx-community/Qwen3.8-27B-4bit \ + --config "Vanilla=" --config "TurboKV=--turbo-kv" \ + --contexts 512,2048,8192,32768 --out docs/profiling/m6/qwen38_27b +""" +import argparse +import json +import os +import random +import re +import signal +import statistics +import subprocess +import threading +import time +import urllib.request + +SWIFTLM_PATH = ".build/release/SwiftLM" +FILLER = [ + "The harbor master logged {n} vessels before noon and noted calm water.", + "Sensor {n} in the greenhouse reported stable humidity and mild warmth.", + "Ledger entry {n}: shipment of copper wire received, inspected, and shelved.", + "Trail marker {n} points north along the ridge past the old pine grove.", +] + + +# ── system memory probes ───────────────────────────────────────────────────── + +def swap_used_gb(): + out = subprocess.run(["sysctl", "-n", "vm.swapusage"], capture_output=True, text=True).stdout + m = re.search(r"used = ([0-9.]+)M", out) + return float(m.group(1)) / 1024 if m else 0.0 + + +def free_pct(): + out = subprocess.run(["memory_pressure"], capture_output=True, text=True).stdout + m = re.search(r"free percentage: (\d+)%", out) + return int(m.group(1)) if m else -1 + + +def gpu_in_use_gb(): + out = subprocess.run(["ioreg", "-r", "-d", "1", "-w", "0", "-c", "AGXAccelerator"], + capture_output=True, text=True, timeout=5).stdout + m = re.search(r'"In use system memory"=(\d+)', out) + return int(m.group(1)) / 1024**3 if m else 0.0 + + +class MemWatch: + """Polls memory while a request runs. Sets .tripped when a guard fires.""" + + def __init__(self, swap_abort_gb, min_free_pct, on_trip): + self.swap0 = swap_used_gb() + self.swap_abort_gb, self.min_free_pct, self.on_trip = swap_abort_gb, min_free_pct, on_trip + self.peak_gpu = self.peak_swap_delta = 0.0 + self.min_free = 100 + self.tripped = None + self._stop = threading.Event() + self._t = threading.Thread(target=self._run, daemon=True) + + def _run(self): + tick = 0 + while not self._stop.is_set(): + self.peak_gpu = max(self.peak_gpu, gpu_in_use_gb()) + self.peak_swap_delta = max(self.peak_swap_delta, swap_used_gb() - self.swap0) + if tick % 4 == 0: # memory_pressure is slower; sample every 2 s + fp = free_pct() + if fp >= 0: + self.min_free = min(self.min_free, fp) + tick += 1 + if self.tripped is None: + if self.peak_swap_delta > self.swap_abort_gb: + self.tripped = f"swap grew {self.peak_swap_delta:.1f} GB" + elif 0 <= self.min_free < self.min_free_pct: + self.tripped = f"free memory {self.min_free}%" + if self.tripped: + self.on_trip() + self._stop.wait(0.5) + + def __enter__(self): + self._t.start() + return self + + def __exit__(self, *_): + self._stop.set() + self._t.join(timeout=5) + + +# ── server lifecycle ───────────────────────────────────────────────────────── + +def start_server(model, flags, port, ctx_size, log_path): + cmd = [SWIFTLM_PATH, "--model", model, "--port", str(port), "--ctx-size", str(ctx_size)] + flags + log = open(log_path, "w") + proc = subprocess.Popen(cmd, stdout=log, stderr=subprocess.STDOUT) + deadline = time.time() + 900 + while time.time() < deadline: + if proc.poll() is not None: + return None + try: + urllib.request.urlopen(f"http://127.0.0.1:{port}/v1/models", timeout=2) + return proc + except Exception: + time.sleep(1) + proc.kill() + return None + + +def stop_server(proc): + if proc and proc.poll() is None: + proc.send_signal(signal.SIGTERM) + try: + proc.wait(timeout=20) + except subprocess.TimeoutExpired: + proc.kill() + proc.wait() + # Let the Metal heap drain before the next config loads. + deadline = time.time() + 60 + while time.time() < deadline and gpu_in_use_gb() > 2.0: + time.sleep(1) + + +def log_lines_since(log_path, offset): + with open(log_path) as f: + f.seek(offset) + return f.read() + + +# ── one request ────────────────────────────────────────────────────────────── + +def build_prompt(target_tokens, rng): + nonce = f"run-{rng.getrandbits(48):012x}" + code = f"{rng.choice(['PELICAN', 'MARLIN', 'OSPREY', 'HERON'])}-{rng.randint(10, 99)}" + # ~15 tokens per filler line; leave room for the instructions. + n_lines = max(1, (target_tokens - 80) // 15) + lines = [rng.choice(FILLER).format(n=i) for i in range(n_lines)] + lines.insert(rng.randint(0, len(lines)), f"Note: the secret code word is {code}.") + prompt = (f"[{nonce}]\n" + "\n".join(lines) + + "\n\nFirst, state the secret code word from the notes above. " + "Then write a detailed story of at least 300 words about a lighthouse keeper.") + return prompt, code + + +def run_request(port, prompt, max_tokens): + body = json.dumps({"messages": [{"role": "user", "content": prompt}], + "max_tokens": max_tokens, "temperature": 0, "stream": True}).encode() + req = urllib.request.Request(f"http://127.0.0.1:{port}/v1/chat/completions", body, + {"Content-Type": "application/json"}) + t0 = time.time() + t_first, text = None, [] + with urllib.request.urlopen(req, timeout=3600) as r: + for raw in r: + line = raw.decode().strip() + if not line.startswith("data:") or line.endswith("[DONE]"): + continue + d = json.loads(line[5:]) + delta = (d.get("choices") or [{}])[0].get("delta", {}).get("content") + if delta: + t_first = t_first or time.time() + text.append(delta) + return t0, t_first, time.time(), "".join(text) + + +def parse_server_stats(log_text): + pre = re.findall(r"prefill done \| n_tokens=(\d+), t=([0-9.]+)s, ([0-9.]+)t/s", log_text) + done = re.findall(r"slot done: id 0 \| gen_tokens=(\d+)", log_text) + return (pre[-1] if pre else None), (int(done[-1]) if done else None) + + +def is_degenerate(text): + words = text.split() + if len(words) < 20: + return False + grams = [" ".join(words[i:i + 4]) for i in range(len(words) - 3)] + return len(set(grams)) / len(grams) < 0.5 + + +# ── main loop ──────────────────────────────────────────────────────────────── + +def main(): + ap = argparse.ArgumentParser() + ap.add_argument("--model", required=True) + ap.add_argument("--config", action="append", required=True, + help='NAME=FLAGS, e.g. "TurboKV=--turbo-kv" (repeatable)') + ap.add_argument("--contexts", default="512,2048,8192") + ap.add_argument("--runs", type=int, default=3) + ap.add_argument("--long-runs", type=int, default=1, help="runs for contexts >= --long-threshold") + ap.add_argument("--long-threshold", type=int, default=16384) + ap.add_argument("--warmup", type=int, default=1) + ap.add_argument("--gen", type=int, default=128) + ap.add_argument("--port", type=int, default=5431) + ap.add_argument("--swap-abort-gb", type=float, default=2.0) + ap.add_argument("--min-free-pct", type=int, default=10) + ap.add_argument("--seed", type=int, default=7) + ap.add_argument("--out", required=True, help="output path prefix (writes .jsonl and .md)") + args = ap.parse_args() + + contexts = [int(x) for x in args.contexts.split(",")] + ctx_size = max(contexts) + args.gen + 1024 + rng = random.Random(args.seed) + os.makedirs(os.path.dirname(args.out) or ".", exist_ok=True) + raw_path, md_path = args.out + ".jsonl", args.out + ".md" + rows = [] + + for spec in args.config: + name, _, flag_str = spec.partition("=") + flags = flag_str.split() + log_path = f"{args.out}.{re.sub(r'[^A-Za-z0-9]+', '_', name)}.server.log" + print(f"\n=== {name} flags={flags or '(none)'} swap={swap_used_gb():.1f}GB free={free_pct()}%") + proc = start_server(args.model, flags, args.port, ctx_size, log_path) + if not proc: + print(" server failed to start; see", log_path) + rows.append({"config": name, "context": None, "status": "START_FAIL"}) + continue + with open(log_path) as f: + load = re.search(r"\(([0-9.]+)GB model", f.read()) + print(f" loaded ({load.group(1) if load else '?'} GB weights), GPU in-use {gpu_in_use_gb():.1f} GB") + + aborted = False + for ctx in contexts: + if aborted: + rows.append({"config": name, "context": ctx, "status": "SKIPPED_AFTER_ABORT"}) + continue + n_runs = args.long_runs if ctx >= args.long_threshold else args.runs + n_warm = args.warmup if ctx == contexts[0] else 0 + for i in range(n_warm + n_runs): + warm = i < n_warm + prompt, code = build_prompt(ctx, rng) + offset = os.path.getsize(log_path) + watch = MemWatch(args.swap_abort_gb, args.min_free_pct, on_trip=proc.kill) + row = {"config": name, "context": ctx, "run": i - n_warm, "warmup": warm} + with watch: + try: + t0, t_first, t_end, text = run_request(args.port, prompt, args.gen) + ok = True + except Exception as e: + ok, err = False, str(e) + row.update(peak_gpu_gb=round(watch.peak_gpu, 2), swap_delta_gb=round(watch.peak_swap_delta, 2), + min_free_pct=watch.min_free) + if watch.tripped or not ok: + row["status"] = "MEM_ABORT" if watch.tripped else "REQUEST_FAIL" + row["reason"] = watch.tripped or err + print(f" ctx={ctx} {row['status']}: {row['reason']}") + rows.append(row) + aborted = True + break + time.sleep(0.5) # let the server flush its "slot done" line + pre, gen_tokens = parse_server_stats(log_lines_since(log_path, offset)) + gen_tokens = gen_tokens or max(1, len(text.split())) + row.update( + status="OK", + prompt_tokens=int(pre[0]) if pre else None, + prefill_tps=float(pre[2]) if pre else None, + ttft_s=round(t_first - t0, 2) if t_first else None, + decode_tps=round((gen_tokens - 1) / (t_end - t_first), 2) if t_first and gen_tokens > 1 else None, + gen_tokens=gen_tokens, + needle_ok=code in text, + degenerate=is_degenerate(text), + ) + rows.append(row) + tag = "warm" if warm else f"run{row['run']}" + print(f" ctx={ctx:>6} {tag:<5} prompt={row['prompt_tokens']} prefill={row['prefill_tps']} t/s " + f"ttft={row['ttft_s']}s decode={row['decode_tps']} t/s gen={gen_tokens} " + f"needle={'ok' if row['needle_ok'] else 'MISS'}{' DEGEN' if row['degenerate'] else ''} " + f"| gpu={row['peak_gpu_gb']}GB swapΔ={row['swap_delta_gb']}GB free≥{row['min_free_pct']}%") + with open(raw_path, "a") as f: + f.write(json.dumps({"model": args.model, **row}) + "\n") + stop_server(proc) + + write_markdown(md_path, args, rows) + print("\nwrote", md_path, "and", raw_path) + + +def med(vals): + vals = [v for v in vals if v is not None] + return statistics.median(vals) if vals else None + + +def write_markdown(path, args, rows): + hw = subprocess.run(["sysctl", "-n", "machdep.cpu.brand_string", "hw.memsize"], + capture_output=True, text=True).stdout.split("\n") + with open(path, "w") as f: + f.write(f"### `{args.model}`\n\n") + f.write(f"{hw[0]} · {int(hw[1]) / 1024**3:.0f} GB · runs={args.runs} (long={args.long_runs}) · " + f"warmup={args.warmup} · gen={args.gen} · temperature 0 · medians\n\n") + f.write("| Config | Context (prompt tok) | Prefill tok/s | TTFT s | Decode tok/s | Peak GPU GB | Swap Δ GB | Min free % | Checks |\n") + f.write("|---|---|---|---|---|---|---|---|---|\n") + keys = [] + for r in rows: + k = (r["config"], r["context"]) + if k not in keys: + keys.append(k) + for cfg, ctx in keys: + group = [r for r in rows if (r["config"], r["context"]) == (cfg, ctx) and not r.get("warmup")] + bad = [r for r in group if r.get("status") != "OK"] + if bad: + f.write(f"| {cfg} | {ctx} | — | — | — | {bad[0].get('peak_gpu_gb', '—')} | " + f"{bad[0].get('swap_delta_gb', '—')} | {bad[0].get('min_free_pct', '—')} | " + f"**{bad[0]['status']}** {bad[0].get('reason', '')} |\n") + continue + checks = "ok" if all(r["needle_ok"] and not r["degenerate"] for r in group) else \ + f"needle {sum(r['needle_ok'] for r in group)}/{len(group)}, degen {sum(r['degenerate'] for r in group)}" + f.write(f"| {cfg} | {ctx} ({med([r['prompt_tokens'] for r in group])}) | " + f"{med([r['prefill_tps'] for r in group])} | {med([r['ttft_s'] for r in group])} | " + f"{med([r['decode_tps'] for r in group])} | {max(r['peak_gpu_gb'] for r in group)} | " + f"{max(r['swap_delta_gb'] for r in group)} | {min(r['min_free_pct'] for r in group)} | {checks} |\n") + + +if __name__ == "__main__": + main() From 3d2b64a6cc8c2754b5be3d4019af68f36d4f7f82 Mon Sep 17 00:00:00 2001 From: simba Date: Wed, 23 Sep 2026 22:44:15 -0700 Subject: [PATCH 2/6] fix(memory): KV estimate counts only layers that hold a KV cache MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ModelProfile.kvCacheMemoryGB counted every layer as full attention. Gemma 4 has 25 sliding-window layers (capped at 1024 tokens) and 5 full-attention layers with their own KV head count and head dim. Qwen3.5/3.8 has 48 GatedDeltaNet layers, which keep a fixed-size state and no KV cache. At a 64K context the estimate was 16.1 GB for Gemma-4-26B (≈1.6 GB real) and 17.2 GB for Qwen3.8-27B (≈4.4 GB real). On a 32 GB M6, the Gemma overestimate flipped the plan to SWAP-ASSISTED with 7 of 30 layers on the CPU, and that partitioned path crashed with a Metal GPU timeout on the first request (kIOGPUCommandBufferCallbackErrorTimeout, even for a 521-token prompt; the partitioned-path hang itself is a separate issue). With layer_types, sliding_window, num_global_key_value_heads and global_head_dim read from config.json, both models plan FULL GPU at 64K and run cleanly. Configs without layer_types keep the old all-full-attention estimate. m6_bench.py: when a case aborts during its warm-up, report the warm-up row instead of crashing the summary writer. Co-Authored-By: Claude Opus 5.5 --- Sources/SwiftLM/ModelProfiler.swift | 58 +++++++++++++++++++++++++++-- scripts/profiling/m6_bench.py | 4 +- 2 files changed, 57 insertions(+), 5 deletions(-) diff --git a/Sources/SwiftLM/ModelProfiler.swift b/Sources/SwiftLM/ModelProfiler.swift index e36c23b..8b96858 100644 --- a/Sources/SwiftLM/ModelProfiler.swift +++ b/Sources/SwiftLM/ModelProfiler.swift @@ -31,6 +31,14 @@ struct ModelProfile: Sendable { let numActiveExperts: Int? let weightFileSizeBytes: Int let modelId: String + /// Attention layout from `layer_types`. When a config has no `layer_types`, + /// every layer counts as full attention, which is the old estimate. + var fullAttentionLayers: Int? = nil + var slidingAttentionLayers: Int = 0 + var slidingWindow: Int? = nil + /// Gemma 4 gives its full-attention layers their own KV head count and head dim. + var globalKVHeads: Int? = nil + var globalHeadDim: Int? = nil /// Estimated total parameters in billions (rough) var estimatedParamsB: Double { @@ -55,10 +63,19 @@ struct ModelProfile: Sendable { /// KV cache memory in GB for a given context length func kvCacheMemoryGB(contextLength: Int) -> Double { - // KV cache = 2 (K + V) × layers × kv_heads × head_dim × context × 2 bytes (FP16) + // KV cache = 2 (K + V) × layers × kv_heads × head_dim × tokens × 2 bytes (FP16). + // Only attention layers hold a KV cache. Linear-attention layers (GatedDeltaNet) + // keep a fixed-size state instead, and sliding-window layers stop growing at the + // window size. Counting every layer as full attention overestimated Gemma 4 by + // ~10× and Qwen3.5/3.8 by ~4×, which pushed 32 GB machines into CPU + // partitioning they didn't need. let bytesPerElement = 2 // FP16 - let kvBytes = 2 * numLayers * numKVHeads * headDim * contextLength * bytesPerElement - return Double(kvBytes) / 1e9 + let fullLayers = fullAttentionLayers ?? numLayers + let fullBytes = 2 * fullLayers * (globalKVHeads ?? numKVHeads) * (globalHeadDim ?? headDim) + * contextLength * bytesPerElement + let slidingTokens = min(contextLength, slidingWindow ?? contextLength) + let slidingBytes = 2 * slidingAttentionLayers * numKVHeads * headDim * slidingTokens * bytesPerElement + return Double(fullBytes + slidingBytes) / 1e9 } /// Total memory required in GB (weights + KV cache + overhead) @@ -177,6 +194,10 @@ enum ModelProfiler { let vocabSize: Int? let quantizationConfig: QuantConfig? let textConfig: TextConfig? + let layerTypes: [String]? + let slidingWindow: Int? + let numGlobalKeyValueHeads: Int? + let globalHeadDim: Int? enum CodingKeys: String, CodingKey { case modelType = "model_type" @@ -189,6 +210,10 @@ enum ModelProfiler { case vocabSize = "vocab_size" case quantizationConfig = "quantization_config" case textConfig = "text_config" + case layerTypes = "layer_types" + case slidingWindow = "sliding_window" + case numGlobalKeyValueHeads = "num_global_key_value_heads" + case globalHeadDim = "global_head_dim" } } @@ -200,6 +225,10 @@ enum ModelProfiler { let headDim: Int? let intermediateSize: Int? let vocabSize: Int? + let layerTypes: [String]? + let slidingWindow: Int? + let numGlobalKeyValueHeads: Int? + let globalHeadDim: Int? enum CodingKeys: String, CodingKey { case numHiddenLayers = "num_hidden_layers" @@ -209,6 +238,10 @@ enum ModelProfiler { case headDim = "head_dim" case intermediateSize = "intermediate_size" case vocabSize = "vocab_size" + case layerTypes = "layer_types" + case slidingWindow = "sliding_window" + case numGlobalKeyValueHeads = "num_global_key_value_heads" + case globalHeadDim = "global_head_dim" } } @@ -275,7 +308,8 @@ enum ModelProfiler { // Measure weight file sizes on disk (only for MoE to avoid slow walks on dense models) let weightSize = isMoE ? measureWeightFiles(directory: modelDirectory) : 0 - return ModelProfile( + let layerTypes = config.layerTypes ?? config.textConfig?.layerTypes + var profile = ModelProfile( modelType: modelType, numLayers: numLayers, hiddenSize: hiddenSize, @@ -291,6 +325,22 @@ enum ModelProfiler { weightFileSizeBytes: weightSize, modelId: modelId ) + if let layerTypes, layerTypes.count == numLayers { + // Anything that isn't sliding or linear attention is treated as full attention. + let sliding = layerTypes.filter { $0 == "sliding_attention" }.count + let linear = layerTypes.filter { $0 == "linear_attention" }.count + profile.slidingAttentionLayers = sliding + profile.fullAttentionLayers = layerTypes.count - sliding - linear + profile.slidingWindow = config.slidingWindow ?? config.textConfig?.slidingWindow + if sliding > 0 && profile.slidingWindow == nil { + // Can't cap a window we don't know, so count those layers as full. + profile.fullAttentionLayers = layerTypes.count - linear + profile.slidingAttentionLayers = 0 + } + } + profile.globalKVHeads = config.numGlobalKeyValueHeads ?? config.textConfig?.numGlobalKeyValueHeads + profile.globalHeadDim = config.globalHeadDim ?? config.textConfig?.globalHeadDim + return profile } /// Routed-expert count keys, in precedence order within a container. diff --git a/scripts/profiling/m6_bench.py b/scripts/profiling/m6_bench.py index fe79cb7..c35ad5f 100644 --- a/scripts/profiling/m6_bench.py +++ b/scripts/profiling/m6_bench.py @@ -307,7 +307,9 @@ def write_markdown(path, args, rows): if k not in keys: keys.append(k) for cfg, ctx in keys: - group = [r for r in rows if (r["config"], r["context"]) == (cfg, ctx) and not r.get("warmup")] + every = [r for r in rows if (r["config"], r["context"]) == (cfg, ctx)] + # A case that aborted during its warm-up has no measured rows; report the warm-up. + group = [r for r in every if not r.get("warmup")] or every bad = [r for r in group if r.get("status") != "OK"] if bad: f.write(f"| {cfg} | {ctx} | — | — | — | {bad[0].get('peak_gpu_gb', '—')} | " From 396c9603660fcabd7851ef7c236b8780e533c94a Mon Sep 17 00:00:00 2001 From: simba Date: Wed, 23 Sep 2026 23:20:03 -0700 Subject: [PATCH 3/6] fix(load): fall back to text-only when an auto-detected VLM fails to load Vision mode is auto-enabled for any checkpoint whose config looks like a VLM. unsloth/Qwen3.6-35B-A3B-UD-MLX-4bit ships a preprocessor_config.json without image_mean, so the VLM loader threw a DecodingError and the server exited, although the model serves text fine. When vision was only auto-detected (no --vision flag), catch the VLM load error, log it, and load the model through LLMModelFactory with isVision = false. An explicit --vision still fails hard. Verified on a 32 GB M6: Qwen3.6-35B-A3B loads as text-only, and an 8.5K-token prompt prefills at 535 tok/s with a 22 GB peak footprint and no swap. Co-Authored-By: Claude Opus 5.5 --- Sources/SwiftLM/Server.swift | 30 +++++++++++++++++++++++------- 1 file changed, 23 insertions(+), 7 deletions(-) diff --git a/Sources/SwiftLM/Server.swift b/Sources/SwiftLM/Server.swift index ef11128..7f03f20 100644 --- a/Sources/SwiftLM/Server.swift +++ b/Sources/SwiftLM/Server.swift @@ -864,7 +864,7 @@ struct MLXServer: AsyncParsableCommand { let speculativeDecodingRequested = self.draftModel != nil || self.dflash || self.mtp let autoDetectedVision = !self.audio && architecture.supportsVision && !speculativeDecodingRequested - let isVision = self.vision || autoDetectedVision + var isVision = self.vision || autoDetectedVision if architecture.supportsVision, !self.vision, !self.audio, speculativeDecodingRequested { print( "[SwiftLM] Note: \(architecture.modelType ?? "unknown") reports vision support, but speculative/MTP decoding was requested; loading as a text-only LLM." @@ -896,12 +896,28 @@ struct MLXServer: AsyncParsableCommand { } } else if isVision { print("[SwiftLM] Loading VLM (vision-language model)...") - container = try await VLMModelFactory.shared.loadContainer( - from: downloader, - using: TransformersTokenizerLoader(modelId: resolvedModelId), - configuration: modelConfig - ) { progress in - tracker.printProgress(progress) + do { + container = try await VLMModelFactory.shared.loadContainer( + from: downloader, + using: TransformersTokenizerLoader(modelId: resolvedModelId), + configuration: modelConfig + ) { progress in + tracker.printProgress(progress) + } + } catch where !self.vision { + // Vision was only auto-detected. A checkpoint whose vision side + // doesn't load (e.g. a preprocessor_config.json without + // image_mean) can still serve text, so fall back rather than exit. + // With an explicit --vision, the error still propagates. + print("[SwiftLM] ⚠️ Auto-detected VLM failed to load (\(error)); loading as a text-only LLM. Pass --vision to make this fatal.") + isVision = false + container = try await LLMModelFactory.shared.loadContainer( + from: downloader, + using: TransformersTokenizerLoader(modelId: resolvedModelId), + configuration: modelConfig + ) { progress in + tracker.printProgress(progress) + } } } else if isAudio { print("[SwiftLM] Loading ALM (audio-language model)...") From 5eecf22667fdfe04e5cc41012d05d6ed97fe7af3 Mon Sep 17 00:00:00 2001 From: simba Date: Thu, 24 Sep 2026 07:08:29 -0700 Subject: [PATCH 4/6] docs: Mac mini M6 (base, 32 GB) benchmarks, recordings and demo client - README: new "Mac mini M6 (base, 32 GB)" section covering four models (Gemma-4-26B-A4B 4-bit and 8-bit, Qwen3.6-35B-A3B, Qwen3.8-27B), the fixes 32 GB exposed, known issues, and reproduce commands. - docs/profiling/m6/: per-model tables (.md) and raw per-run results (.jsonl) from scripts/profiling/m6_bench.py, plus asciinema recordings (.cast) and GIFs under media/. Server logs are not included; they hold the full test prompts. - scripts/demo/stream_client.py: the streaming client used in the recordings. It prints live prefill progress with the server's memory and swap, then a stats line. Co-Authored-By: Claude Opus 5.5 --- README.md | 82 ++++++++++++ docs/profiling/m6/gemma4_26b_a4b_4bit.jsonl | 20 +++ docs/profiling/m6/gemma4_26b_a4b_4bit.md | 17 +++ docs/profiling/m6/gemma4_26b_a4b_8bit.jsonl | 10 ++ docs/profiling/m6/gemma4_26b_a4b_8bit.md | 14 ++ docs/profiling/m6/media/gemma_long.cast | 77 +++++++++++ docs/profiling/m6/media/gemma_short.cast | 104 +++++++++++++++ .../media/m6_gemma4_26b_a4b_41k_prompt_4x.gif | Bin 0 -> 80601 bytes .../m6/media/m6_gemma4_26b_a4b_stream.gif | Bin 0 -> 80078 bytes .../m6/media/m6_qwen38_27b_8k_prompt_4x.gif | Bin 0 -> 87063 bytes .../m6/media/m6_qwen38_27b_stream.gif | Bin 0 -> 91946 bytes docs/profiling/m6/media/qwen_long.cast | 106 ++++++++++++++++ docs/profiling/m6/media/qwen_short.cast | 97 ++++++++++++++ docs/profiling/m6/qwen36_35b_a3b_4bit.jsonl | 22 ++++ docs/profiling/m6/qwen36_35b_a3b_4bit.md | 14 ++ docs/profiling/m6/qwen38_27b_4bit.jsonl | 22 ++++ docs/profiling/m6/qwen38_27b_4bit.md | 14 ++ scripts/demo/stream_client.py | 120 ++++++++++++++++++ 18 files changed, 719 insertions(+) create mode 100644 docs/profiling/m6/gemma4_26b_a4b_4bit.jsonl create mode 100644 docs/profiling/m6/gemma4_26b_a4b_4bit.md create mode 100644 docs/profiling/m6/gemma4_26b_a4b_8bit.jsonl create mode 100644 docs/profiling/m6/gemma4_26b_a4b_8bit.md create mode 100644 docs/profiling/m6/media/gemma_long.cast create mode 100644 docs/profiling/m6/media/gemma_short.cast create mode 100644 docs/profiling/m6/media/m6_gemma4_26b_a4b_41k_prompt_4x.gif create mode 100644 docs/profiling/m6/media/m6_gemma4_26b_a4b_stream.gif create mode 100644 docs/profiling/m6/media/m6_qwen38_27b_8k_prompt_4x.gif create mode 100644 docs/profiling/m6/media/m6_qwen38_27b_stream.gif create mode 100644 docs/profiling/m6/media/qwen_long.cast create mode 100644 docs/profiling/m6/media/qwen_short.cast create mode 100644 docs/profiling/m6/qwen36_35b_a3b_4bit.jsonl create mode 100644 docs/profiling/m6/qwen36_35b_a3b_4bit.md create mode 100644 docs/profiling/m6/qwen38_27b_4bit.jsonl create mode 100644 docs/profiling/m6/qwen38_27b_4bit.md create mode 100755 scripts/demo/stream_client.py diff --git a/README.md b/README.md index 2338352..febe254 100644 --- a/README.md +++ b/README.md @@ -51,6 +51,88 @@ Then start the server (models download automatically if not cached): *(Add `--stream-experts` when running oversized MoE models to bypass macOS virtual memory swapping and stream expert layers directly from NVMe SSD.)* +## 📊 Performance: Mac mini M6 (base, 32 GB) + +The first SwiftLM numbers from a **32 GB** Mac. Every other table in this README comes from 64 GB hardware. Running the same context lengths on this M6 exposed memory bugs that 64 GB machines had been hiding, and they are fixed in this release (see [What 32 GB exposed](#what-32-gb-exposed)). + +![Gemma-4-26B-A4B streaming at 55 tok/s on a base Mac mini M6 32 GB](docs/profiling/m6/media/m6_gemma4_26b_a4b_stream.gif) + +> *Hardware:* Mac mini (Mac18,5), Apple M6, 12-core GPU, 32 GB unified memory (170 GB/s), macOS 27.0. Metal working set 26.8 GB. +> *Method:* [`scripts/profiling/m6_bench.py`](scripts/profiling/m6_bench.py). One warm-up, then the median of 3 runs (1 run at 32K and above), temperature 0. Every prompt starts with a unique nonce, so the prompt cache can't hit, and hides a code word that the answer must return. A memory guard aborts any case whose swap grows by more than 2 GB. Raw results: [`docs/profiling/m6/`](docs/profiling/m6/). + +### What runs well on a 32 GB M6 + +| Model (4-bit unless noted) | Weights | Mode | Decode, short prompt | Longest prompt that passed | Peak GPU | +|---|---|---|---|---|---| +| **`gemma-4-26b-a4b-it-4bit`** (MoE, ~4B active) | 15.3 GB | GPU | **53.3 tok/s** | 80.7K tokens | 20.2 GB | +| **`Qwen3.6-35B-A3B-UD-MLX-4bit`** (MoE, ~3B active) | 21.6 GB | GPU | **46.7 tok/s** | 40.8K tokens | 22.4 GB | +| `Qwen3.6-35B-A3B-UD-MLX-4bit` | 21.6 GB | `--stream-experts` | 13.2 tok/s | 40.8K tokens | 7.7 GB | +| `Qwen3.8-27B-4bit` (dense) | 11.3 GB | GPU | 9.1 tok/s | 40.8K tokens | 19.6 GB | +| `gemma-4-26b-a4b-it-8bit` | ~26 GB | GPU | swaps (+3.1 GB on the first prompt) | — | — | +| `gemma-4-26b-a4b-it-8bit` | ~26 GB | `--stream-experts` | 8.8 tok/s | 9.5K tokens (32K swapped) | 7.6 GB | + +- **MoE models are the sweet spot at 32 GB.** Only the active experts are read for each token, so they decode 5–6× faster than a dense 27B. A 4-bit MoE with up to about 22 GB of weights runs entirely on the GPU. +- **Qwen3.6-35B-A3B on a base M6 reaches 76%** of the M1 Ultra 64 GB decode speed below (46.7 vs 61.7 tok/s). +- **Dense 27B decode is bandwidth-bound.** 9.1 tok/s × 11.3 GB is about 100 GB/s, roughly 60% of the M6's rated 170 GB/s. +- **An 8-bit 26 GB model needs SSD streaming** and tops out at about 10K tokens of context. + +### Gemma-4-26B-A4B 4-bit — by prompt length + +| Prompt tokens | Prefill | TTFT | Decode | Peak GPU · swap growth | +|---|---|---|---|---| +| 534 | 859 tok/s | 0.7 s | **53.3 tok/s** | 15.2 GB · 0 | +| 2,285 | **998 tok/s** | 2.4 s | 50.1 tok/s | 15.8 GB · 0 | +| 9,544 | 914 tok/s | 10.7 s | 44.9 tok/s | 16.5 GB · 0 | +| 39,773 | 750 tok/s | 53.9 s | 31.4 tok/s | 19.1 GB · 0 | +| 80,711 | 625 tok/s | 130.6 s | 21.8 tok/s | 20.2 GB · 0 | + +### Qwen3.6-35B-A3B 4-bit — GPU vs SSD streaming + +| Prompt tokens | GPU prefill / decode (tok/s) | GPU peak | `--stream-experts` prefill / decode (tok/s) | SSD peak | +|---|---|---|---|---| +| ~550 | 808 / 46.7 | 20.4 GB | 321 / 13.2 | 6.0 GB | +| ~2.3K | 969 / 45.5 | 21.0 GB | 402 / 13.1 | 6.2 GB | +| ~9.8K | 849 / 43.4 | 21.1 GB | 403 / 12.9 | 6.6 GB | +| 40.8K | 635 / 35.1 | 22.4 GB | 340 / 11.9 | 7.7 GB | + +### Qwen3.8-27B-4bit (dense) — Vanilla vs TurboKV + +| Prompt tokens | Vanilla prefill / decode (tok/s) | TurboKV prefill / decode (tok/s) | Peak GPU · swap growth | +|---|---|---|---| +| ~550 | 105 / 9.1 | 102 / 9.3 | 16.5 GB · 0 | +| ~2.3K | 108 / 8.8 | 108 / 9.2 | 16.2 GB · 0 | +| ~9.8K | 96 / 8.6 | 98 / 8.3 | 16.7 GB · 0 | +| ~40.8K | 88 / 7.9 | 85 / 7.3 | 19.6 GB · +0.7 GB (TurboKV +1.5 GB) | + +TurboKV doesn't help this model. Only 16 of its 64 layers use full attention (the other 48 are GatedDeltaNet), so the KV cache is already small. + +### What 32 GB exposed + +| 8.5K-token prompt, Qwen3.8-27B-4bit | Before | After | +|---|---|---| +| Prefill | 33.4 tok/s | **106.7 tok/s** (3.2×) | +| Peak process memory | 38 GB | **19 GB** | +| Swap growth | +15 GB | **0** | + +1. **The MLX buffer cache was unbounded on full-GPU loads.** It could grow to the whole 26.8 GB working set. It is now sized from the RAM left after weights and KV. +2. **The KV-cache estimate counted every layer as full attention.** Gemma 4 (25 of 30 layers use a 1,024-token sliding window) was overestimated 10×, and Qwen3.5/3.8 (48 of 64 layers are linear attention) 4×. On 32 GB that pushed Gemma into CPU/GPU layer partitioning, which crashed with a Metal GPU timeout. +3. **An auto-detected VLM that failed to load exited the server.** `Qwen3.6-35B-A3B-UD-MLX-4bit` ships a `preprocessor_config.json` without `image_mean`. SwiftLM now falls back to text-only unless you pass `--vision`. +4. **Vision-capable models skipped chunked prefill.** On the VLM path, a text-only prompt ran through the model in a single pass. This one is fixed on mlx-swift-lm `main` and lands here with the next mlx-swift-lm bump. Until then, long prompts on Qwen3.5/3.8 and Gemma 4 use far more memory than the tables above. + +> ⚠️ **Known issues on 32 GB:** `--turbo-kv` with Gemma 4 crashes in Metal when a prompt-cache save runs during generation, and dropped the digits of the code word in 2 of 3 runs at 2K. The Gemma 4 MTP assistant (`gemma-4-26B-A4B-it-qat-assistant-4bit`) doesn't load on the current mlx-swift-lm pin. Both are expected to clear with the mlx-swift-lm bump. + +Reproduce: + +```bash +./build.sh +.build/release/SwiftLM --model mlx-community/gemma-4-26b-a4b-it-4bit --port 5431 & +python3 scripts/demo/stream_client.py short +python3 scripts/profiling/m6_bench.py --model mlx-community/gemma-4-26b-a4b-it-4bit \ + --config "Vanilla=" --contexts 512,2048,8192,32768,65536 --out docs/profiling/m6/gemma4_26b_a4b_4bit +``` + +More recordings: [Gemma, 41K-token prompt (4×)](docs/profiling/m6/media/m6_gemma4_26b_a4b_41k_prompt_4x.gif) · [Qwen3.8-27B streaming](docs/profiling/m6/media/m6_qwen38_27b_stream.gif) · [Qwen3.8-27B, 8.6K-token prompt (4×)](docs/profiling/m6/media/m6_qwen38_27b_8k_prompt_4x.gif) + ## 📊 Performance: MTP Speculative Decoding — Gemma 4-26B (MacBook Pro M5 Pro 64 GB) Benchmarked with `gemma-4-26b-a4b-it-4bit` running three configurations across 512 / 40K / 100K token contexts. diff --git a/docs/profiling/m6/gemma4_26b_a4b_4bit.jsonl b/docs/profiling/m6/gemma4_26b_a4b_4bit.jsonl new file mode 100644 index 0000000..e6ddb11 --- /dev/null +++ b/docs/profiling/m6/gemma4_26b_a4b_4bit.jsonl @@ -0,0 +1,20 @@ +{"model": "mlx-community/gemma-4-26b-a4b-it-4bit", "config": "Vanilla", "context": 512, "run": -1, "warmup": true, "peak_gpu_gb": 14.59, "swap_delta_gb": 0.0, "min_free_pct": 42, "status": "OK", "prompt_tokens": 521, "prefill_tps": 471.2, "ttft_s": 1.14, "decode_tps": 53.37, "gen_tokens": 128, "needle_ok": true, "degenerate": false} +{"model": "mlx-community/gemma-4-26b-a4b-it-4bit", "config": "Vanilla", "context": 512, "run": 0, "warmup": false, "peak_gpu_gb": 14.92, "swap_delta_gb": 0.0, "min_free_pct": 44, "status": "OK", "prompt_tokens": 534, "prefill_tps": 723.9, "ttft_s": 0.78, "decode_tps": 53.46, "gen_tokens": 128, "needle_ok": true, "degenerate": false} +{"model": "mlx-community/gemma-4-26b-a4b-it-4bit", "config": "Vanilla", "context": 512, "run": 1, "warmup": false, "peak_gpu_gb": 14.96, "swap_delta_gb": 0.0, "min_free_pct": 44, "status": "OK", "prompt_tokens": 543, "prefill_tps": 858.5, "ttft_s": 0.68, "decode_tps": 53.27, "gen_tokens": 128, "needle_ok": true, "degenerate": false} +{"model": "mlx-community/gemma-4-26b-a4b-it-4bit", "config": "Vanilla", "context": 512, "run": 2, "warmup": false, "peak_gpu_gb": 15.15, "swap_delta_gb": 0.0, "min_free_pct": 43, "status": "OK", "prompt_tokens": 528, "prefill_tps": 910.4, "ttft_s": 0.62, "decode_tps": 52.56, "gen_tokens": 128, "needle_ok": true, "degenerate": false} +{"model": "mlx-community/gemma-4-26b-a4b-it-4bit", "config": "Vanilla", "context": 2048, "run": 0, "warmup": false, "peak_gpu_gb": 15.78, "swap_delta_gb": 0.0, "min_free_pct": 40, "status": "OK", "prompt_tokens": 2274, "prefill_tps": 969.8, "ttft_s": 2.42, "decode_tps": 50.58, "gen_tokens": 128, "needle_ok": true, "degenerate": false} +{"model": "mlx-community/gemma-4-26b-a4b-it-4bit", "config": "Vanilla", "context": 2048, "run": 1, "warmup": false, "peak_gpu_gb": 15.52, "swap_delta_gb": 0.0, "min_free_pct": 41, "status": "OK", "prompt_tokens": 2289, "prefill_tps": 1006.9, "ttft_s": 2.36, "decode_tps": 49.84, "gen_tokens": 128, "needle_ok": true, "degenerate": false} +{"model": "mlx-community/gemma-4-26b-a4b-it-4bit", "config": "Vanilla", "context": 2048, "run": 2, "warmup": false, "peak_gpu_gb": 15.61, "swap_delta_gb": 0.0, "min_free_pct": 41, "status": "OK", "prompt_tokens": 2285, "prefill_tps": 997.6, "ttft_s": 2.38, "decode_tps": 50.08, "gen_tokens": 128, "needle_ok": true, "degenerate": false} +{"model": "mlx-community/gemma-4-26b-a4b-it-4bit", "config": "Vanilla", "context": 8192, "run": 0, "warmup": false, "peak_gpu_gb": 16.2, "swap_delta_gb": 0.0, "min_free_pct": 37, "status": "OK", "prompt_tokens": 9529, "prefill_tps": 941.2, "ttft_s": 10.35, "decode_tps": 44.9, "gen_tokens": 128, "needle_ok": true, "degenerate": false} +{"model": "mlx-community/gemma-4-26b-a4b-it-4bit", "config": "Vanilla", "context": 8192, "run": 1, "warmup": false, "peak_gpu_gb": 16.54, "swap_delta_gb": 0.0, "min_free_pct": 38, "status": "OK", "prompt_tokens": 9544, "prefill_tps": 913.7, "ttft_s": 10.67, "decode_tps": 44.99, "gen_tokens": 128, "needle_ok": true, "degenerate": false} +{"model": "mlx-community/gemma-4-26b-a4b-it-4bit", "config": "Vanilla", "context": 8192, "run": 2, "warmup": false, "peak_gpu_gb": 16.3, "swap_delta_gb": 0.0, "min_free_pct": 39, "status": "OK", "prompt_tokens": 9558, "prefill_tps": 904.5, "ttft_s": 10.81, "decode_tps": 44.93, "gen_tokens": 128, "needle_ok": true, "degenerate": false} +{"model": "mlx-community/gemma-4-26b-a4b-it-4bit", "config": "Vanilla", "context": 32768, "run": 0, "warmup": false, "peak_gpu_gb": 19.13, "swap_delta_gb": 0.0, "min_free_pct": 33, "status": "OK", "prompt_tokens": 39773, "prefill_tps": 749.6, "ttft_s": 53.9, "decode_tps": 31.44, "gen_tokens": 128, "needle_ok": true, "degenerate": false} +{"model": "mlx-community/gemma-4-26b-a4b-it-4bit", "config": "Vanilla", "context": 65536, "run": 0, "warmup": false, "peak_gpu_gb": 20.19, "swap_delta_gb": 0.0, "min_free_pct": 18, "status": "OK", "prompt_tokens": 80711, "prefill_tps": 625.1, "ttft_s": 130.63, "decode_tps": 21.83, "gen_tokens": 128, "needle_ok": true, "degenerate": false} +{"model": "mlx-community/gemma-4-26b-a4b-it-4bit", "config": "TurboKV", "context": 512, "run": -1, "warmup": true, "peak_gpu_gb": 14.59, "swap_delta_gb": 0.0, "min_free_pct": 44, "status": "OK", "prompt_tokens": 527, "prefill_tps": 603.1, "ttft_s": 0.91, "decode_tps": 52.52, "gen_tokens": 128, "needle_ok": true, "degenerate": false} +{"model": "mlx-community/gemma-4-26b-a4b-it-4bit", "config": "TurboKV", "context": 512, "run": 0, "warmup": false, "peak_gpu_gb": 15.01, "swap_delta_gb": 0.0, "min_free_pct": 44, "status": "OK", "prompt_tokens": 536, "prefill_tps": 882.9, "ttft_s": 0.65, "decode_tps": 53.46, "gen_tokens": 128, "needle_ok": true, "degenerate": false} +{"model": "mlx-community/gemma-4-26b-a4b-it-4bit", "config": "TurboKV", "context": 512, "run": 1, "warmup": false, "peak_gpu_gb": 14.91, "swap_delta_gb": 0.0, "min_free_pct": 44, "status": "OK", "prompt_tokens": 532, "prefill_tps": 840.1, "ttft_s": 0.67, "decode_tps": 53.06, "gen_tokens": 128, "needle_ok": true, "degenerate": false} +{"model": "mlx-community/gemma-4-26b-a4b-it-4bit", "config": "TurboKV", "context": 512, "run": 2, "warmup": false, "peak_gpu_gb": 15.02, "swap_delta_gb": 0.0, "min_free_pct": 44, "status": "OK", "prompt_tokens": 532, "prefill_tps": 892.6, "ttft_s": 0.64, "decode_tps": 53.13, "gen_tokens": 128, "needle_ok": true, "degenerate": false} +{"model": "mlx-community/gemma-4-26b-a4b-it-4bit", "config": "TurboKV", "context": 2048, "run": 0, "warmup": false, "peak_gpu_gb": 15.77, "swap_delta_gb": 0.0, "min_free_pct": 42, "status": "OK", "prompt_tokens": 2280, "prefill_tps": 924.0, "ttft_s": 2.65, "decode_tps": 52.96, "gen_tokens": 128, "needle_ok": false, "degenerate": false} +{"model": "mlx-community/gemma-4-26b-a4b-it-4bit", "config": "TurboKV", "context": 2048, "run": 1, "warmup": false, "peak_gpu_gb": 15.63, "swap_delta_gb": 0.0, "min_free_pct": 41, "status": "OK", "prompt_tokens": 2311, "prefill_tps": 886.8, "ttft_s": 2.74, "decode_tps": 53.22, "gen_tokens": 128, "needle_ok": false, "degenerate": false} +{"model": "mlx-community/gemma-4-26b-a4b-it-4bit", "config": "TurboKV", "context": 2048, "run": 2, "warmup": false, "peak_gpu_gb": 15.44, "swap_delta_gb": 0.0, "min_free_pct": 41, "status": "OK", "prompt_tokens": 2299, "prefill_tps": 918.9, "ttft_s": 2.65, "decode_tps": 53.57, "gen_tokens": 128, "needle_ok": true, "degenerate": false} +{"model": "mlx-community/gemma-4-26b-a4b-it-4bit", "config": "TurboKV", "context": 8192, "run": 0, "warmup": false, "peak_gpu_gb": 14.86, "swap_delta_gb": 0.0, "min_free_pct": 42, "status": "OK", "prompt_tokens": 9572, "prefill_tps": 964.6, "ttft_s": null, "decode_tps": null, "gen_tokens": 1, "needle_ok": false, "degenerate": false} diff --git a/docs/profiling/m6/gemma4_26b_a4b_4bit.md b/docs/profiling/m6/gemma4_26b_a4b_4bit.md new file mode 100644 index 0000000..64bed80 --- /dev/null +++ b/docs/profiling/m6/gemma4_26b_a4b_4bit.md @@ -0,0 +1,17 @@ +### `mlx-community/gemma-4-26b-a4b-it-4bit` + +Apple M6 · 32 GB · runs=3 (long=1) · warmup=1 · gen=128 · temperature 0 · medians + +| Config | Context (prompt tok) | Prefill tok/s | TTFT s | Decode tok/s | Peak GPU GB | Swap Δ GB | Min free % | Checks | +|---|---|---|---|---|---|---|---|---| +| Vanilla | 512 (534) | 858.5 | 0.68 | 53.27 | 15.15 | 0.0 | 43 | ok | +| Vanilla | 2048 (2285) | 997.6 | 2.38 | 50.08 | 15.78 | 0.0 | 40 | ok | +| Vanilla | 8192 (9544) | 913.7 | 10.67 | 44.93 | 16.54 | 0.0 | 37 | ok | +| Vanilla | 32768 (39773) | 749.6 | 53.9 | 31.44 | 19.13 | 0.0 | 33 | ok | +| Vanilla | 65536 (80711) | 625.1 | 130.63 | 21.83 | 20.19 | 0.0 | 18 | ok | +| TurboKV | 512 (532) | 882.9 | 0.65 | 53.13 | 15.02 | 0.0 | 44 | ok | +| TurboKV | 2048 (2299) | 918.9 | 2.65 | 53.22 | 15.77 | 0.0 | 41 | needle 1/3, degen 0 | +| TurboKV | 8192 | — | — | — | 0.35 | 0.0 | 87 | **REQUEST_FAIL** | +| TurboKV | 32768 | — | — | — | — | — | — | **SKIPPED_AFTER_ABORT** | +| TurboKV | 65536 | — | — | — | — | — | — | **SKIPPED_AFTER_ABORT** | +| MTP | None | — | — | — | — | — | — | **START_FAIL** | diff --git a/docs/profiling/m6/gemma4_26b_a4b_8bit.jsonl b/docs/profiling/m6/gemma4_26b_a4b_8bit.jsonl new file mode 100644 index 0000000..13f4c52 --- /dev/null +++ b/docs/profiling/m6/gemma4_26b_a4b_8bit.jsonl @@ -0,0 +1,10 @@ +{"model": "mlx-community/gemma-4-26b-a4b-it-8bit", "config": "SSD", "context": 512, "run": -1, "warmup": true, "peak_gpu_gb": 6.21, "swap_delta_gb": 0.0, "min_free_pct": 73, "status": "OK", "prompt_tokens": 534, "prefill_tps": 105.0, "ttft_s": 5.12, "decode_tps": 9.24, "gen_tokens": 128, "needle_ok": true, "degenerate": false} +{"model": "mlx-community/gemma-4-26b-a4b-it-8bit", "config": "SSD", "context": 512, "run": 0, "warmup": false, "peak_gpu_gb": 6.94, "swap_delta_gb": 0.0, "min_free_pct": 73, "status": "OK", "prompt_tokens": 543, "prefill_tps": 219.0, "ttft_s": 2.52, "decode_tps": 9.18, "gen_tokens": 128, "needle_ok": true, "degenerate": false} +{"model": "mlx-community/gemma-4-26b-a4b-it-8bit", "config": "SSD", "context": 512, "run": 1, "warmup": false, "peak_gpu_gb": 6.89, "swap_delta_gb": 0.0, "min_free_pct": 73, "status": "OK", "prompt_tokens": 528, "prefill_tps": 232.6, "ttft_s": 2.32, "decode_tps": 8.78, "gen_tokens": 128, "needle_ok": true, "degenerate": false} +{"model": "mlx-community/gemma-4-26b-a4b-it-8bit", "config": "SSD", "context": 512, "run": 2, "warmup": false, "peak_gpu_gb": 6.95, "swap_delta_gb": 0.0, "min_free_pct": 74, "status": "OK", "prompt_tokens": 526, "prefill_tps": 219.6, "ttft_s": 2.44, "decode_tps": 8.49, "gen_tokens": 128, "needle_ok": true, "degenerate": false} +{"model": "mlx-community/gemma-4-26b-a4b-it-8bit", "config": "SSD", "context": 2048, "run": 0, "warmup": false, "peak_gpu_gb": 7.26, "swap_delta_gb": 0.0, "min_free_pct": 73, "status": "OK", "prompt_tokens": 2269, "prefill_tps": 321.3, "ttft_s": 7.14, "decode_tps": 7.83, "gen_tokens": 128, "needle_ok": true, "degenerate": false} +{"model": "mlx-community/gemma-4-26b-a4b-it-8bit", "config": "SSD", "context": 2048, "run": 1, "warmup": false, "peak_gpu_gb": 7.32, "swap_delta_gb": 0.0, "min_free_pct": 70, "status": "OK", "prompt_tokens": 2293, "prefill_tps": 193.7, "ttft_s": 11.93, "decode_tps": 7.7, "gen_tokens": 128, "needle_ok": true, "degenerate": false} +{"model": "mlx-community/gemma-4-26b-a4b-it-8bit", "config": "SSD", "context": 2048, "run": 2, "warmup": false, "peak_gpu_gb": 7.06, "swap_delta_gb": 0.0, "min_free_pct": 69, "status": "OK", "prompt_tokens": 2291, "prefill_tps": 119.6, "ttft_s": 19.24, "decode_tps": 7.64, "gen_tokens": 128, "needle_ok": true, "degenerate": false} +{"model": "mlx-community/gemma-4-26b-a4b-it-8bit", "config": "SSD", "context": 8192, "run": 0, "warmup": false, "peak_gpu_gb": 7.58, "swap_delta_gb": 0.0, "min_free_pct": 66, "status": "OK", "prompt_tokens": 9543, "prefill_tps": 147.6, "ttft_s": 64.86, "decode_tps": 7.08, "gen_tokens": 128, "needle_ok": true, "degenerate": false} +{"model": "mlx-community/gemma-4-26b-a4b-it-8bit", "config": "SSD", "context": 8192, "run": 1, "warmup": false, "peak_gpu_gb": 7.19, "swap_delta_gb": 0.0, "min_free_pct": 60, "status": "OK", "prompt_tokens": 9518, "prefill_tps": 138.5, "ttft_s": 68.94, "decode_tps": 6.92, "gen_tokens": 128, "needle_ok": true, "degenerate": false} +{"model": "mlx-community/gemma-4-26b-a4b-it-8bit", "config": "SSD", "context": 8192, "run": 2, "warmup": false, "peak_gpu_gb": 7.26, "swap_delta_gb": 0.0, "min_free_pct": 53, "status": "OK", "prompt_tokens": 9577, "prefill_tps": 136.9, "ttft_s": 70.22, "decode_tps": 6.64, "gen_tokens": 128, "needle_ok": true, "degenerate": false} diff --git a/docs/profiling/m6/gemma4_26b_a4b_8bit.md b/docs/profiling/m6/gemma4_26b_a4b_8bit.md new file mode 100644 index 0000000..74ef970 --- /dev/null +++ b/docs/profiling/m6/gemma4_26b_a4b_8bit.md @@ -0,0 +1,14 @@ +### `mlx-community/gemma-4-26b-a4b-it-8bit` + +Apple M6 · 32 GB · runs=3 (long=1) · warmup=1 · gen=128 · temperature 0 · medians + +| Config | Context (prompt tok) | Prefill tok/s | TTFT s | Decode tok/s | Peak GPU GB | Swap Δ GB | Min free % | Checks | +|---|---|---|---|---|---|---|---|---| +| Vanilla | 512 | — | — | — | 3.33 | 3.06 | 28 | **MEM_ABORT** swap grew 3.1 GB | +| Vanilla | 2048 | — | — | — | — | — | — | **SKIPPED_AFTER_ABORT** | +| Vanilla | 8192 | — | — | — | — | — | — | **SKIPPED_AFTER_ABORT** | +| Vanilla | 32768 | — | — | — | — | — | — | **SKIPPED_AFTER_ABORT** | +| SSD | 512 (528) | 219.6 | 2.44 | 8.78 | 6.95 | 0.0 | 73 | ok | +| SSD | 2048 (2291) | 193.7 | 11.93 | 7.7 | 7.32 | 0.0 | 69 | ok | +| SSD | 8192 (9543) | 138.5 | 68.94 | 6.92 | 7.58 | 0.0 | 53 | ok | +| SSD | 32768 | — | — | — | 5.8 | 2.09 | 32 | **MEM_ABORT** swap grew 2.1 GB | diff --git a/docs/profiling/m6/media/gemma_long.cast b/docs/profiling/m6/media/gemma_long.cast new file mode 100644 index 0000000..c8c94fa --- /dev/null +++ b/docs/profiling/m6/media/gemma_long.cast @@ -0,0 +1,77 @@ +{"version":3,"term":{"cols":112,"rows":22},"timestamp":1790229271,"idle_time_limit":3.0,"command":"env CTX=48000 /Users/simba/.cache/swiftlm-bench/demo/record_demo.sh mlx-community/gemma-4-26b-a4b-it-4bit long 2500","title":"SwiftLM · Gemma-4-26B-A4B · 40K-token prompt · M6 32GB","env":{"SHELL":"/bin/zsh"}} +[0.007, "o", "\u001b[36mSwiftLM — github.com/SharpAI/SwiftLM\u001b[39m\r\n\u001b[3244mOpenAI-compatible LLM server for Apple Silicon, in Swift on MLX\u001b[39m\r\n\r\n"] +[0.000, "o", "\u001b[3244m$\u001b[39m sysctl -n machdep.cpu.brand_string hw.memsize | paste -sd' ' -\r\n"] +[0.630, "o", "Apple M6 · 32 GB · macOS 27.0\r\n"] +[0.000, "o", "\r\n"] +[0.000, "o", "\u001b[3244m$\u001b[39m .build/release/SwiftLM --model mlx-community/gemma-4-26b-a4b-it-4bit --port 5431 &\r\n"] +[3.254, "o", "✅ Memory strategy: FULL GPU (15.3GB model, 30.4GB available, cache limited to 4685MB)\r\n✅ Ready. Listening on http://127.0.0.1:5431\r\n"] +[0.000, "o", "\r\n"] +[0.000, "o", "\u001b[33m(this GIF plays at 4× speed — every timing printed on screen is real)\u001b[39m\r\n"] +[0.000, "o", "\u001b[3244m$\u001b[39m python3 scripts/demo/stream_client.py long 2500 # ~40K-token prompt, code word hidden inside\r\n"] +[1.796, "o", "\r\u001b[2m prefilling … 1s | SwiftLM 15.0 GB swap +0.0 GB\u001b[0m "] +[1.078, "o", "\r\u001b[2m prefilling … 2s | SwiftLM 16.0 GB swap +0.0 GB\u001b[0m "] +[1.067, "o", "\r\u001b[2m prefilling … 3s | SwiftLM 16.0 GB swap +0.0 GB\u001b[0m "] +[1.079, "o", "\r\u001b[2m prefilling … 4s | SwiftLM 16.0 GB swap +0.0 GB\u001b[0m "] +[1.080, "o", "\r\u001b[2m prefilling … 5s | SwiftLM 16.0 GB swap +0.0 GB\u001b[0m "] +[1.084, "o", "\r\u001b[2m prefilling … 6s | SwiftLM 17.0 GB swap +0.0 GB\u001b[0m "] +[1.081, "o", "\r\u001b[2m prefilling … 7s | SwiftLM 17.0 GB swap +0.0 GB\u001b[0m "] +[1.081, "o", "\r\u001b[2m prefilling … 9s | SwiftLM 18.0 GB swap +0.0 GB\u001b[0m "] +[1.079, "o", "\r\u001b[2m prefilling … 10s | SwiftLM 18.0 GB swap +0.0 GB\u001b[0m "] +[1.082, "o", "\r\u001b[2m prefilling … 11s | SwiftLM 19.0 GB swap +0.0 GB\u001b[0m "] +[1.086, "o", "\r\u001b[2m prefilling … 12s | SwiftLM 20.0 GB swap +0.0 GB\u001b[0m "] +[1.087, "o", "\r\u001b[2m prefilling … 13s | SwiftLM 20.0 GB swap +0.0 GB\u001b[0m "] +[1.084, "o", "\r\u001b[2m prefilling … 14s | SwiftLM 20.0 GB swap +0.0 GB\u001b[0m "] +[1.084, "o", "\r\u001b[2m prefilling … 15s | SwiftLM 20.0 GB swap +0.0 GB\u001b[0m "] +[1.086, "o", "\r\u001b[2m prefilling … 16s | SwiftLM 20.0 GB swap +0.0 GB\u001b[0m "] +[1.074, "o", "\r\u001b[2m prefilling … 17s | SwiftLM 20.0 GB swap +0.0 GB\u001b[0m "] +[1.085, "o", "\r\u001b[2m prefilling … 18s | SwiftLM 20.0 GB swap +0.0 GB\u001b[0m "] +[1.088, "o", "\r\u001b[2m prefilling … 19s | SwiftLM 20.0 GB swap +0.0 GB\u001b[0m "] +[1.084, "o", "\r\u001b[2m prefilling … 20s | SwiftLM 20.0 GB swap +0.0 GB\u001b[0m "] +[1.096, "o", "\r\u001b[2m prefilling … 22s | SwiftLM 20.0 GB swap +0.0 GB\u001b[0m "] +[1.093, "o", "\r\u001b[2m prefilling … 23s | SwiftLM 20.0 GB swap +0.0 GB\u001b[0m "] +[1.078, "o", "\r\u001b[2m prefilling … 24s | SwiftLM 20.0 GB swap +0.0 GB\u001b[0m "] +[1.104, "o", "\r\u001b[2m prefilling … 25s | SwiftLM 20.0 GB swap +0.0 GB\u001b[0m "] +[1.094, "o", "\r\u001b[2m prefilling … 26s | SwiftLM 20.0 GB swap +0.0 GB\u001b[0m "] +[1.088, "o", "\r\u001b[2m prefilling … 27s | SwiftLM 20.0 GB swap +0.0 GB\u001b[0m "] +[1.084, "o", "\r\u001b[2m prefilling … 28s | SwiftLM 20.0 GB swap +0.0 GB\u001b[0m "] +[1.094, "o", "\r\u001b[2m prefilling … 29s | SwiftLM 20.0 GB swap +0.0 GB\u001b[0m "] +[1.102, "o", "\r\u001b[2m prefilling … 30s | SwiftLM 20.0 GB swap +0.0 GB\u001b[0m "] +[1.098, "o", "\r\u001b[2m prefilling … 31s | SwiftLM 20.0 GB swap +0.0 GB\u001b[0m "] +[1.104, "o", "\r\u001b[2m prefilling … 32s | SwiftLM 20.0 GB swap +0.0 GB\u001b[0m "] +[1.112, "o", "\r\u001b[2m prefilling … 34s | SwiftLM 20.0 GB swap +0.0 GB\u001b[0m "] +[1.093, "o", "\r\u001b[2m prefilling … 35s | SwiftLM 20.0 GB swap +0.0 GB\u001b[0m "] +[1.094, "o", "\r\u001b[2m prefilling … 36s | SwiftLM 20.0 GB swap +0.0 GB\u001b[0m "] +[1.098, "o", "\r\u001b[2m prefilling … 37s | SwiftLM 20.0 GB swap +0.0 GB\u001b[0m "] +[1.094, "o", "\r\u001b[2m prefilling … 38s | SwiftLM 20.0 GB swap +0.0 GB\u001b[0m "] +[1.100, "o", "\r\u001b[2m prefilling … 39s | SwiftLM 21.0 GB swap +0.0 GB\u001b[0m "] +[1.099, "o", "\r\u001b[2m prefilling … 40s | SwiftLM 20.0 GB swap +0.0 GB\u001b[0m "] +[1.093, "o", "\r\u001b[2m prefilling … 41s | SwiftLM 20.0 GB swap +0.0 GB\u001b[0m "] +[1.098, "o", "\r\u001b[2m prefilling … 42s | SwiftLM 21.0 GB swap +0.0 GB\u001b[0m "] +[1.085, "o", "\r\u001b[2m prefilling … 43s | SwiftLM 20.0 GB swap +0.0 GB\u001b[0m "] +[1.095, "o", "\r\u001b[2m prefilling … 45s | SwiftLM 20.0 GB swap +0.0 GB\u001b[0m "] +[1.105, "o", "\r\u001b[2m prefilling … 46s | SwiftLM 21.0 GB swap +0.0 GB\u001b[0m "] +[1.094, "o", "\r\u001b[2m prefilling … 47s | SwiftLM 20.0 GB swap +0.0 GB\u001b[0m "] +[1.091, "o", "\r\u001b[2m prefilling … 48s | SwiftLM 20.0 GB swap +0.0 GB\u001b[0m "] +[1.101, "o", "\r\u001b[2m prefilling … 49s | SwiftLM 20.0 GB swap +0.0 GB\u001b[0m "] +[1.108, "o", "\r\u001b[2m prefilling … 50s | SwiftLM 20.0 GB swap +0.0 GB\u001b[0m "] +[1.096, "o", "\r\u001b[2m prefilling … 51s | SwiftLM 20.0 GB swap +0.0 GB\u001b[0m "] +[1.092, "o", "\r\u001b[2m prefilling … 52s | SwiftLM 20.0 GB swap +0.0 GB\u001b[0m "] +[1.103, "o", "\r\u001b[2m prefilling … 53s | SwiftLM 20.0 GB swap +0.0 GB\u001b[0m "] +[1.088, "o", "\r\u001b[2m prefilling … 54s | SwiftLM 21.0 GB swap +0.0 GB\u001b[0m "] +[1.087, "o", "\r\u001b[2m prefilling … 56s | SwiftLM 20.0 GB swap +0.0 GB\u001b[0m "] +[1.089, "o", "\r\u001b[2m prefilling … 57s | SwiftLM 20.0 GB swap +0.0 GB\u001b[0m "] +[0.248, "o", "\r\u001b[K\u001b[32mThe"] +[0.043, "o", " secret"] +[0.039, "o", " code"] +[0.034, "o", " word"] +[0.035, "o", " is"] +[0.035, "o", " O"] +[0.034, "o", "SP"] +[0.034, "o", "REY"] +[0.033, "o", "-"] +[0.033, "o", "1"] +[0.034, "o", "7"] +[0.033, "o", "."] +[0.033, "o", "\u001b[0m\r\n\r\n\u001b[36m\u001b[1m 12 tokens · decode 26.2 tok/s · TTFT 56.9s · prompt 41,447 tok · prefill 728 tok/s\u001b[0m\r\n\u001b[36m\u001b[1m peak SwiftLM 21.0 GB · swap +0.0 GB\u001b[0m\r\n"] +[0.010, "o", "\r\n"] +[0.162, "x", "0"] diff --git a/docs/profiling/m6/media/gemma_short.cast b/docs/profiling/m6/media/gemma_short.cast new file mode 100644 index 0000000..8b3d405 --- /dev/null +++ b/docs/profiling/m6/media/gemma_short.cast @@ -0,0 +1,104 @@ +{"version":3,"term":{"cols":112,"rows":30},"timestamp":1790229095,"idle_time_limit":2.0,"command":"/Users/simba/.cache/swiftlm-bench/demo/record_demo.sh mlx-community/gemma-4-26b-a4b-it-4bit short","title":"SwiftLM · Gemma-4-26B-A4B · Mac mini M6 32GB","env":{"SHELL":"/bin/zsh"}} +[0.223, "o", "\u001b[36mSwiftLM — github.com/SharpAI/SwiftLM\u001b[39m\r\n"] +[0.000, "o", "\u001b[3244mOpenAI-compatible LLM server for Apple Silicon, in Swift on MLX\u001b[39m\r\n\r\n"] +[0.000, "o", "\u001b[3244m$\u001b[39m sysctl -n machdep.cpu.brand_string hw.memsize | paste -sd' ' -\r\n"] +[0.630, "o", "Apple M6 · 32 GB · macOS 27.0\r\n"] +[0.000, "o", "\r\n"] +[0.000, "o", "\u001b[3244m$\u001b[39m .build/release/SwiftLM --model mlx-community/gemma-4-26b-a4b-it-4bit --port 5431 &\r\n"] +[3.229, "o", "✅ Memory strategy: FULL GPU (15.3GB model, 30.4GB available, cache limited to 4994MB)\r\n✅ Ready. Listening on http://127.0.0.1:5431\r\n"] +[0.001, "o", "\r\n"] +[0.000, "o", "\u001b[3244m$\u001b[39m python3 scripts/demo/stream_client.py short # streams POST /v1/chat/completions\r\n"] +[1.338, "o", "\r\u001b[K\u001b[32m```"] +[0.016, "o", "swift"] +[0.018, "o", "\r\n"] +[0.018, "o", "///"] +[0.018, "o", " Returns"] +[0.018, "o", " the"] +[0.019, "o", " n"] +[0.017, "o", "-"] +[0.019, "o", "th"] +[0.017, "o", " Fibonacci"] +[0.017, "o", " number"] +[0.018, "o", " using"] +[0.017, "o", " an"] +[0.018, "o", " iterative"] +[0.018, "o", " approach"] +[0.019, "o", "."] +[0.016, "o", "\r\n"] +[0.018, "o", "func"] +[0.017, "o", " fib"] +[0.018, "o", "(_"] +[0.018, "o", " n"] +[0.017, "o", ":"] +[0.018, "o", " Int"] +[0.020, "o", ")"] +[0.016, "o", " ->"] +[0.018, "o", " Int"] +[0.018, "o", " {"] +[0.018, "o", "\r\n"] +[0.019, "o", " "] +[0.019, "o", "if"] +[0.018, "o", " n"] +[0.019, "o", " <="] +[0.017, "o", " "] +[0.017, "o", "1"] +[0.018, "o", " {"] +[0.017, "o", " return"] +[0.018, "o", " n"] +[0.018, "o", " }"] +[0.017, "o", "\r\n"] +[0.020, "o", " "] +[0.015, "o", "var"] +[0.019, "o", " a"] +[0.018, "o", " ="] +[0.017, "o", " "] +[0.018, "o", "0"] +[0.018, "o", "\r\n"] +[0.018, "o", " "] +[0.019, "o", "var"] +[0.017, "o", " b"] +[0.017, "o", " ="] +[0.018, "o", " "] +[0.019, "o", "1"] +[0.017, "o", "\r\n"] +[0.019, "o", " "] +[0.017, "o", "for"] +[0.019, "o", " _"] +[0.017, "o", " in"] +[0.017, "o", " "] +[0.018, "o", "2"] +[0.018, "o", "..."] +[0.017, "o", "n"] +[0.018, "o", " {"] +[0.018, "o", "\r\n"] +[0.018, "o", " "] +[0.017, "o", "let"] +[0.018, "o", " temp"] +[0.017, "o", " ="] +[0.018, "o", " a"] +[0.019, "o", " +"] +[0.018, "o", " b"] +[0.018, "o", "\r\n"] +[0.019, "o", " "] +[0.016, "o", "a"] +[0.018, "o", " ="] +[0.019, "o", " b"] +[0.018, "o", "\r\n"] +[0.018, "o", " "] +[0.017, "o", "b"] +[0.018, "o", " ="] +[0.019, "o", " temp"] +[0.016, "o", "\r\n"] +[0.018, "o", " "] +[0.018, "o", "}"] +[0.018, "o", "\r\n"] +[0.018, "o", " "] +[0.017, "o", "return"] +[0.019, "o", " b"] +[0.019, "o", "\r\n"] +[0.018, "o", "}"] +[0.018, "o", "\r\n"] +[0.019, "o", "```"] +[0.018, "o", "\u001b[0m\r\n\r\n\u001b[36m\u001b[1m 91 tokens · decode 55.4 tok/s · TTFT 0.6s · peak SwiftLM 15.0 GB · swap +0.0 GB\u001b[0m\r\n"] +[0.006, "o", "\r\n"] +[0.106, "x", "0"] diff --git a/docs/profiling/m6/media/m6_gemma4_26b_a4b_41k_prompt_4x.gif b/docs/profiling/m6/media/m6_gemma4_26b_a4b_41k_prompt_4x.gif new file mode 100644 index 0000000000000000000000000000000000000000..bd822d41892bb5a41f80c6ea9ee9b33136ff965f GIT binary patch literal 80601 zcmeF&_fr#J{4n~nn@-)(q=^9$0YO8PB4FrUf`C#i0Z{>!4=5-qV1NLj8k!UV=~5*q z3StXQIs^r!6A%lC3RbM#e4ppe+%H&ZE$CaA z*dFy*U0psJ7g<+-Gkf}(t)0b5e_s<*gTUOhn3%}v=@&Y>J4Z(Po%Y#=g$3v5XDu%; zHZ|RP_^8>+nv&4{aAszFZSDPDijkSwp08g&IvzhVH#bpQS{T(_fBb5ELE*KGmxK1l zy!!e&v$C$XwA}Xeay2y4F>`gCpPvf7S#-0i#QKn1N5|u$qC9#l`}y<1_=ISc?TXi5 zPu;#;>l47Z-Ps5Or325vQsK6OA3o}78Yg_d!KkmU5L68&gJ&Ghn^0v zFZc01oOU&FzpK-^(4hFvR!a|;pu#M33zPEl8`?%Xk00MpN@Cnqyy0D_De;Mqat`!mv66I*cP}ly@=IZ4W~J5Cl=Hj7PJWm8|2HSj z;Wq$;m$zjXx5eVc)erTsOF9yet@Z`Bjip`5(mH|DJ&k4ES4kF0@^-h&doxvCYYz3^ zuISGpAL}cyyHh!M-Qe8vbnl&;!#60g0-Nodsz%CeGu03GHB~>qNiDN4w7*+3R_k#m zaHj8W?aKyQN7818dvz0c{GZnx?!Q+*)g1h)uh60S*35(OFUvFi%?)!;=qN!2#}@W{ z2UC2alZ@=!()j2ggaR1KR;bMzq1*g`grRP|3WAsM!TS*=eJ`pE@6jgK92CDz#j?ruxJu9zd~EoZ3Axoy3En5M zQLwf6;ZFfe-Al?gmn_Y=^3sKhfM{Xu!Ah63)p=qOw-mP{e%r2j26-M0ITE9$lIOg8 z`CXa7OdG?@g6B!CfIs-mo`bV#MHe|gzgGi!eCKNl#c~aImeQl8VtaOaLn~ULD2dFf zd>x{`e6ym}03yaZlJTjJMLJa)M|-t8(brn$xr%MGL`Lj{o;IZ5Xsg7+!{Hh63g-%f zaVnVCBY3k6C5g@KcCiN>#Z z^0G%NTmFsDRDFTiwHGUjl4@$|TKiPXNeO?HmBLvLtnK^7lzX$$kp@UJL(K0)QbN#5 zH*(ait*utU@b*@sJDzr`Uo5ujb)J`HNWAi;>5-)ZAismPIYbDKQKbl()tg^&3+dT( z5-~5?;#IdAC+F+mdxmh*F}P#XMUpwv#u2u>-HXX)eSPL6xS`v=HAo}aTER;+^uMiU zOr<^rK{T;jScw*igHVyB7~Eo_FDn%{;>4Z7mK@^tX+3zT*&iq6d1uhz{lJ|bcK63Q znb^*fZiP;<46GzN`Uhs@Tam(@5wTk$lo~L-W~%@m4!J1U{7?)vs~n!L1}d>i9GNZw zWj%0SzVCygU||X7iA52`5VR1x>(BU-fAqGYE-GO^p+76edGdj3HoGazLF*N zqFZI^;k(Q87FQ`}TM$D$#}iA8oks76pm8(C-d3mxKi_mF07}G0mk0%@TB!?wJq&3} zZl6vJY)>T-roCjpvlKOv+ZP9R;4uWH7<~oHG@ZplVJo`D=FbSjR6>DJ=HLFxt~bQ? zP>G<8o&88SQ9>{yR_r6kf)reu&}Q*!742&Ra*>NC@#fW*o=8$&f)73srRKj|*Ad%r z?VvJEI~}73m~G;MiVP5Sk|qA|EJ>Uq(i~d$RQMhdT+J;o-}h7Z7?EXEtSZ^|OO3lGS-_AJ|L2M+qmkG4xH5QBZy8_>P99X2-s>nej@##B=u@wq5&Ng4`97 zRH4{9)X^ojA+h*X%H!=)ehjKck-3Q{a%5+tg_Fh!v#T;)AFZ77s2#$$(JbekXAEq3jFWOpCPhb0u=1`LZS!Dv9 zrP5=nHYRKb7&mt<`NoTsWsONVcTkJXC)4m=Qrec|?W zYk<$@UoV!uUhcZ&&ybM-xxsiu6ip1BoGg+&lE z>twwd`4>}14D&Lr-~2}54%ksv2{a^q>+}myJP{N6;Z$jE$9UiQ-C9DWk4g`hJwF@& zIL7b7gPFe{1CQF5*%WX@b30;BPu*XLHV`@MAqT%MAOV~RBRENDCoqU$iJp7;022BX z-tX{Y%g}z(@8h44=K^!@jehn<8FmO<(m`9&Lv9VU`6!LpHr`ga2o)HZ$=hOPTng#z zQ>p)1W$En*z_K>H4@=>5yBtsCM14Z~lg!1_-Qx_=LMf;KvRM^5fhHU+;Vl<^_Zh4H zd5CKV&%vTWKw}zR@0gvzIFO^Y3ldv`cU)ZAA_Hw ze*c~WqAeWUzSS7HKRmp1OZz5~Yl6km=t3q#(EJ%4gqD)L@${$qrc0&D{Cgbk?jbX z9-+Gmzr+#!R$)UfY|Yl&Ohp?aunG$eXaJ%Tbm-VX5?&La;OJ=Co@fQtlZUxjQ3Tdq zW$bAVk<|}@(=l={Ljn103J-;$V~I3meLF%@jZyAFc-xVMW=I=g0hyphj}mUfI`cpb z9r7U~0R}PK3=kqc!jlAvQ3wbXXcS)(Va6+N;F)MGrZAP6(1Hlj<79t?0d}m(dTfj> zGv1aUycQ#j#G=|5a^ulAbEB)*8K{tWu$pkH1<|Czgtj=@w{bO_uC%OQLc7H3=f=Wq ziKci491^3}5~Jxsd{mX(Qx&7pgWL^AOlfGWODf=|phFUK$Il&P#(A|Mo$nICYD!-Z zq6ZSr+9sSIkB8GCh(!=u1<~vDU%P=Z7mYH*U}yrH-a&X8@F5d4*`~XBK#q-4UxoH_ zj|x#BLLSPG?Wh&5Q0SL8Fp+!5((K?%@XQ89qWPiEQZwqR&W)vA|vKZjBg^#PbM1>(kixY$N%5J*GhCy+f9sMH_HC*j|J3E50y*z05UZ3x=$3V8&un^c5r z!xnBw%+uV`M%5K<}AtO1MksBK_rLp*OQR0m+o;UEaMX##C+){Z-;`KL# zvMn`;5f!IE$I{p-=(X$DWUj#Jmww*Afi^2YCR>^_UZgK@z4(45JYOW3Ug14ifojC) z(2hvrpvQ!KSh2jFK=c;?z$9>fG+z=YfoBBCHVjMKuV;(;VJ+Fbf9z8C-wtjT6T z?CL^w#CsKvV21>g5#p~3aar(ll#pXofm*9BF{&YGWp7nSlDz~J*aW~TC6vIJRdf!L z259vt#hM$oSWFwFOf3W?OyJw<;?`T^M$C`0gRt|;eFC2?W=#}UPX^w z-DGIq9C#TKqesFnK$~3)xV2A` zP!6_tVITeqDbq3HKVpsvmYD7+v7EU3&#R$<8SZiYu6HdmDNs0Ve}z>HDwJ*!Mt~Is zQeb24$6IpOTL38$>x21x5wsCnJycuE`x~OvkpJZF`o3%xQM~7utRPU_3^>iM4#>j? zjp&kAx$UjOinYgSEjTE7vjcLv|0ag`0HxS`=>1&?+}lLF&J+Yk1&L1u0eThWZE&y# z^gCNXbH6u2w?_tR5UyOa&V`uKQ;)12?q9p!)V=*ax)G(!!r0Jq_Fevu*m51JtsZNw z5h*UjK~HuF-aEj$+aL(ot;iPd+UERPDN6JCemMMn;q}&rBDum;pyf;>#tba!hCRB~!DhRE` zc_c)aj>Y>tJ^BDdAYqaeIDNI|O)c^>Ao`zvwTvK6dZkuYqb^haDm;(!#Q`S-Z2f~e zw3@g5bcu9L3Az#bVT9xebxg@dbs2Y{Tsj1`Fc|KUj)9JQ)2BvzF>ihkSj!LIs=ZwG zC#2t~b$l8rSm`aEE*B8!Uv%t!B0q2~r5Dk{c)x-bXqAUgBOIZp#h!gP50%f<_0lyE zZ3H+V#BsSN{eOnmG!Se4rP5&h${lOsy^2}^V~qV zbp3sNw?@zR2Z-=0N|xTUi&x`+__==JbEgQTl7yeie;GLVa(1OtsHEHO(P-oc#Mq<= zUVE-7JVyRIYG*isa(QvmqSy5WE>C zkc7d|QAupQU@jIzMiq^Z)<;Coo6I`%;^gU2AqTgG)Q)NdbP}Y1054UB=k>BUHu|-| zZFD0@CksHlnnwTGclEQRq(m{^3w4E=zC(y01&dz=rmHCBR9K~G_Wj}U?;6nI)K_oo zU)}H@7bK2sZ00TYyb_t8UDceER-IjZlteA!krfuUeoQb-TPT;uA7i0RX_!4}^SK_c zm7*^Arp5ivo%=mA2lK->K`ASRQz#+<;tVAe-ZP4PDjSLH;k-T~@&*M#3c=MVF5%Xt zH*y;`2vKuhB4}QC{>|e0bo8Hxn5qRpLSc%NvnY^N?aa^kXm@D&i^?+AZ26=j1`2*y z^mzG-&$7$>@+a(jUZK=#%ALBX_YsQk_m#YVUHSf@h*S;&E~LEgJhJjMYNe-WrSI{| z!0gJgW57V=mQ{G~D*EUu_R1>$#;U-RRiU|6 zk&RVk%bM8UHHo8ZQdicbZ>-5aS(BezQy5;>BD43bh04oGoTx)2PXep9$nEK$HK0nF zkk6D2=!?7}D(->gPG>|k_={lUmo3gRTAXrSmv)~d3GJ(h;a&-i|HSN^iIxqB?iHfV zCvles;_f*y=ef_?-iWCv@$kl%t05TYRUjISmLY#N7JX==^$k1n)vWRBw)yX3>ECv= zeLoiRO~dR*$dhkIH@*|rzR`xIRjI(W7^?wr%D0g4s)Ptz>j+vZYUByrxPEy&;fa5& z!8_7iOUOH~ulujYaNku#7&5HF8Fu)%{kCzp@PL#1^U(E_5d-8f7shb05;dP2*O_KS{ZB^mp@>go_?OL$2SQS53^? z@UNU)|5f6Qq)>jJ3QlaffxMCaJ???L-}}qbpJ5w*{kBJp`TD=gE7!B;*1gB$&>@hg z_aum3z~8|A=LRUb)Om9myp*Y96{qdmHp6%0wk^dD*KvyeG{>Gdi6}Gac9I4{d2PRm zfDzNhyHq-+D?6#IJS(Nh2|_{|5xiiP&SHyH1*?3wrTvvog{E<`?#pg9?)68y^4;Gb zsCHckOfwZVG%lK?JW;Odqr8QnC@~Jx>pYtR#bYiasF*a(gJSuJz#1mLT1fTucse?D zQyCU^jCKRj$y*N~D!+(6ZE0IgrAVE%ISofaJaNZ~6t)GB+S$iiC2-<5P@U?gwlZ{T zG!BhzcMLS+`M-M<8TRG7@S*S}n4p7hp^e5Q80~H!_4q79VF0V!RaEGW&WXVSldZai z;f;YWZuxBJ8vQu!6-QS*`$Oc&!*(X}QwHCy_%r|NV* z*q485;E2UETF8{Z&u)!*U3O|?BzXzg->NLXZNH1vg$y?yThU!H~X*Wzm0izEQOvv;v zTB5{m(iYDeuL~~T1~OFX#2J{f&;{7!Wf!IdY0S+n@0^Iy5=;`#0KOFF1KAX>rjchV z7~U{t*WhSx-onFkJ&e#of)$9ClqwO0lRG__${%#b?VEF>1>$7!Jf}P?rkHCX9>#WM zP>wSWog-S|J@X3UR0TzOwoF&&38xzCat}@Sd#;klb&u#|M%vDWS;W~NiDO#Xx~@Mg zZ}Cmu_0-^4s{WhYK1@-MkI)WnihUeh)Y9o1S5C&1DCz3T9M2{uDFO*(D3e?*h68%1D9l^=NEdlE1Ip2au~MSXOXEkKWK> z-C)QlN)DNvmz3v-fVpR-M}E`p6PMe)n7;ddDjIKExD~{FH{%^>xQ#6v z+_q`q{wE#1)c`soBz#=RELNfQT^ZDK>Ai~l?_Hr~M5Tx~4C##*s8Vrt6UAG<-OsBW z7?!&3RB`axgRqWs4KuHA-4HYV*aP7s7Se7cm|j}CdGqnFk$NwMtm0cRXkLHc|M^!aIk&D2|J3Ve;9V%E-M&JM+8|wP&3*Lh*5Qa zS|wfihoa-m(^=YnB3E{l#0Du8vo@qgomJMvUz$s>+ZdtbGmU{$jvAaNXWe~+B)n`P zQ9K>J6FCr>oQ762xS!DUU&Lz^XI`Rxv-HlL{@Xhh%|n?iiB*Imnk5M-un4<(oO4@1 z=LSQH1Bvir)Jssy_dJ>)rOt#;uZD?|rLl;yk2P3b*ra1yHr?yTkRQzxB35x21w^Jf z3{t=*mTT!z{NnZD!bFns91vsoZzxd@)j` zLF#9x3->+{%&7qNlt$kdT5|1>We<6alC^iKcGep-SOILh5?+ZQNUU=G6P7izSzK{i zw`{lg{-IxsJ4+AFtAh4k#lB|YxI(F`g?;Q z@yvnHnu846l#1rAGeKbwrqUWYcrvL&ip_~t>MMu#aw!;*)fiC?KRpF}mP~r>p*QN5 zSkZSd+N~JNt%=6j<_4Uy;Oz4>m-Gk5>Oe^mFWgd$6ms8$-Fa~M8FKH;@yVFWzOk?= z-3%v5k0y$R$jgrb+)?lM2W4Uoe>j`Nd91}gPijMvgXzMW)Kh+v&oYhH-=N;6zqfcX zHTz@sZq@qOCxgodGp~2+E6!qeEx?zR^d?`@uz?&Q`^kOy-NnGBpCV$;(`5KdD`q-v z?7H$-kOpn_q(5^CN)B+G9sBxK(f;3mbeyA&oZ?#}oOKU#M)0Vdf_~pvD_^;kVs3;fz1QrHOMM`Y=b{Va^3EI zyCzE8Jp98cnhmG-_@UxpmLq zfb265=c#5t%LA^R3jH+kM!);w&^bAjo|_d$B0PKOzA~{EIsDE$&^7$3>EzX2GfU11 zmqsf@vbCHl;A~FY*-F!GWv&(Py&IAQ>p1ZO{>7O4=m+~%0<#)!&V2YU;qr9JPPBmS z{K>No_ETl0KO6-1ZyRs&kP&hLyRu62!xMTY6WT9y>d&rSO^8_Bw)bM+UaPh2?ua*f zPc9B!nEi4C7x~U=@1>=mCZOCVa@qaKr5DW#Un(y|t{mTcdGh7#ceS{`AHtq&T;_M0 zA5U)Be~jK6v9M`wz1!x|>Z@C!<>V_%LpD)gEA~b%+gSY^>yG+<_etc(A2Xk3a97s5 z_C|d^xb*9_&6QtcPyT(ru|?7A3jR+f9LalruPzXeR}WZX+tUiRqeY5ZlDv z+9dtjq%4ypLffRX+GOO-q|4jnI@{#Y6uHqhg|BT}R!kMp?TX6nN@!C>-F9WS_HBnu zl>OSbGul)6oq>)0LI zq0i_r$m%dG?=WiW*wfizJlbKh*kSs$V=uasBGGB4+-a`cX<^xE>DFoG*J&NvX~XEW z&FZu(@3e2~bm;7K9PM;k?A-UY(;3}GmFRL&?%J>0mZ}cBg<;$ z6{n2Fsjsq1>g{?u)#a)Di6e~k0bs>lhwqzr*p~H@@T%= zc&b-tJ=6EpefsInrKhLRj{=O_{zG@4jVL;jVjYr|=)GcfR>COE(Ij+Q^MadsxNi65 z6yr;sHZD!wP0wwzes#MD^+dY0MXiX%>Z&mw3d9wd#)k?doTgOLd+MZZH)4!i6PtQc zMr}%A7*o5SeM&Fal7x9b$_&F}0rTx|;FSzP&H*p-wH@ zPVcLI9=^X?+F_4|L#1W^(w_dNL)G==%FT6@7C)2wSpuzf{h3}4_eLEI2m049cRglo zWk=X?7Lf6r-wo~!};@&QMsfxc14cfA7|O9O-GL9WE$ zi1Oew-NEOUgQISPV}64#LI+ZL(7eW zxBd*i`kJv&Zu;7CU(CwW+Yv)=vi7CO?9;5?x91h-y5G>!;?T#hLoyHdRg4dPQXXy= zbS@*=zuhzZ*>CuJsPn!89VBazoJ% zIxU|u-G~lJ`;{Vl)$cyjXxnckG`w@HPb1Y_rCxgb>qnZ01+*d^Hpq8PbjBQZyF2Np z3K*QRE?g8aG#L=PyLZoVHIv9^rd?vD?yh#|QHm4C3}a=nZB)+Et=D_hGHlc)Zqzn= z)UIOG{_dzl*Qn#zsMBk=sLuOqE2C7&F&E63i=Ml^ru$N(lXB|*Do6La@UgcKk{VOS z^8DSZ*w4KmnMBsPFE5R8e~&FKjnUlkzE1cl-2*Nu`?MVol=&YRz5L={UGA_@uRq3$ zwqkqpw7c=>n93P}Q`xowChjEkK?#iGt}(I5l>=woo}36fn5_2lo#)F1@owwG&WwVW zI@v`LgZ0LL_t$XjpDw-(=^BpS<}s)<9@|wOF6kH-Hl7eS&deU)NURu7x;viSHJ&my zp89$`?c4ZO%mhnvB7NILhTcS`)kK#2ME3ECYhe>PaTB@O6L}RA`FAI-cTE(GO%%SK zDEc;W12b7HIa#u8vQ%%f%xbdSeX`>CWM$ao&A7>`?8)ki$(p;9wOx~SW0Uo-CvSb5 zY`{#hC8rv8CXWw_tu8hrocs={^+w3RI+^Xc<+P1mR zdUIc_=DxbmeLFt)J#6kr+}wKh+|P=+Uw7wzcg_77oBR8E?%%h$4Ga(Pvnnb)csCDa z%|jpHVNUR{=Xtnz9{w7SP{|Xx#}ji!z?E#ye8hi4jl`r*1M~C=eu;u=3UA%5ZEg7fD?5|}Z3!FMLe zpU)3py_&VNw`^{1JD=3nR@}Ief8wOih47Fo^oyx! z%*&U-nmlzgH2Us1M!l__5@7QCC``$wB22hv{*SR8QXYf3(l%w2eSV`V;P zZZvJAJ9Vg&4+i<7FsZ-o|3`lR-<{+C!hmQ>!2iO4vYqAs2L==t^qppM#VmJ->76z1 z3I2a$z&CdGEbQ*vd<^KEn;mtlv)c9l#DJ!Q6XdGV{|5uw=zqvEl=7K~RdPuRYhf-7 z-6QC4YZAEkzcHXm{ynv^)*O{~J-cS*?#IHY2jzQmlzc0%{ILHY40t@@YNUFr;};i; z`-15r*LrdnI|oek&;2h9SXFkkHYIfAm37x92iNj5NE2l^O>J4qprC%`RZr%QW+B24 zXI4XD_n%r-?e04}8d1_m{`!6?C&e10vD*2WCY>QVyc+s}yr_%3l z9vy!2WMjig%~$#ed}2(&Jl!eX?KIYDgc*pEyjkpmf&J&>q!+r1De0ppT|yjY5)fu; zTmm=#zOXLM{EHq#$sB=KXDu}kgpDL`F17THH~#*v%tfKE#Vd7(nOM2iSx;O66CfA4 z>6?H0m0H*gt-s3lI8pujnzUy?PR^ltwKutb*8<+;`Bzp~UJ<{w^yYf-Q?<7Rp)Ug7 z7KXp6ep?jred+BDI#&H%F+(cwT?tdA=3QyZ|6o9t^`t)@tgdD#5`<&8Sz-S;UZhK* zhin z8snfxe6RLE8Mt) zh)4ZIx|(%=8nJ}Mzs+O8Z`n=&%t*TN6fIsd(kd?btk^t4=qm=C5z11x{H_qXYUK|& z6nP1P`zRU30t`L7+a0v83?Pv8FHmZN z^l8&Gn=`Q!z8jt2DVH3YAoE3d=$qq}tIE441V&QtT1Go(eR1>`EdNePM2T=-k}nE_ zaZ#tB#)kl`xV{15BCQq?WeOt-`}_UW%)`Zl5F$KL+(apL_WN$FxusKoGs>`lIo%foam0# zNA{~5u-^A}#)^y-n^9C*I>;x(y60Pt44lwQ%i5*nwpH;BAm8~ZQ;u@pWBW&We@kkK zGNvg|0JovI(D9JRa?oS+5EHF4H~A_D-f-v>E0j)GR9FoD=c?#PIcc=Xx125#-EJd$ zyCZ?y7PKRPbfj)wa`$)J6p=hJNq23V(#e(kn-MeOYo()#hxU|Moi|GVEF-D( z>5Gz8j6gaPKB_WPwq&hs$F1?Y>uCL;=0J1b*cfkL)nVaUkM3XD7c#!p`8(Bmz3h8& zuk~AfaBA(LxArevC%@eaAFMs{qwnS8U*8(&!gVy9!+5*wcQ(_h&UaJ)_*0|rjjYr< zzwHhaeO}*h=ML7L(C?oZy7c`{v2eY=jl<-#{O?UwPW6EY`zK$te!t63tv`LzVQO+? z^83A(!TO*J{Zq5QzBhA(gNn;14=gBjXSYA94SCr*{gR}AfB!tErqbr-o651)`inb5 zZzx%h53W=Tc*=m7?&`_J=BT~m%ow&qdZpc>@24+5-AKkP)m*}dK#i%CWHQfdo~6Y` z>aBGVZ(iUDcDw~xgdJP$@D8Z6@f zwEXTv_u$oTQ__snkK|kS-9%GT$_}-v-cAZV9LiLix1Q+{_8Ty@W@d{o-~uXxHVVaM zLNbKm*Ni%uUiDu2Y?I&n6WyHS@grG{|KziO>-mLu$t9M^wVNcQWNz)z*|{w*A>GQA z!PO3!!y^9a-#*;WVM;OA0N4Ncg4PJ&=-S(FCK_5Sj^JFrS$aegJsYIz>?QE%W0j}s zfRSPWmSbwhKF$P_b#`sHuFILPFnf>*k&DGnX{p4=y4#|B>q_P3iM49a zPBS7NY=3KwZ!+_yB}r&S9r)@acJ%Y9Gd?f#OyqkW{#DD0+!UrvNwIyrc_l;XnU>OY z5>vdSr8RM7LQzyd-07)Fdh`y<1(oUx=H!p!soi(Sv2Buq1s-PU-xp_58-~X$96v55 z)a}`(k<)vdSb7$E@K8yzi@D|K(0_5$T33w^_H^{Ns3jXK4s0zkune4K6*T)X%|5M+ zshYbVAnchGgHB}a`ZWgb2_}owRqr{Foi*ZV)|FihoOSFlR2Wh${)<C?prcjiCJ=tvZCRDaiV!ZZ0FaTuGjuO37LFkOsoBcKmi*A`jalN<z43{A()bso0wk;Cy^?IcfSUiTf7$xykx>Lgd!;EAN^Q3xpG6 z>E{=HE(^9;n@L1Vwe6MVp;~`zMQo$xtK_$c)4Xm+Z#IazvMokAJVtfg3u5zCT#VX! z41Fv{8y~CNb5MIcMlUxuJS=u+RjjGOK@FywA~$x^8UzRP^YcW61Wo`0I2fXop=3C~ zgBBoXhSml!fr1MrD{d)<)mXrciWc+1_>v(Z0H@r6Y+Aq`1oi5zgaI8RiNNlhy<{E^ z&qmdMMvh9yAM-~ff*A}|a1apDt0)2mG6C4V8>*ffwzhzZ+u<)pWHIC*2v67Cnggh+ zh$ju`0_5xdaH;r1>V6yg|ksI>&*DB7@1?Rn*AUDjmoJ5QVwWQy5zk6S`34v7?17#U*ElgCHtenF9hyXjF8DdT++gi^zL_ zWFLu4*g!Bks|d1+G9h6B3$vYc6>fw_aN_H^hL=e|dKD25j(BW<;0;|=wE(<|!E>=H zY?Km9oyNl1vVZ~=t7C}7A&?LWHY6*mfnB>vfbY$eNRWJEmXqB@n0i!TEeSTm3-SrS zL`KTp7;Uxz;FqbYJp*n#_KJr3}@2LmdwqeHY+$btf= zsUp5CU{67NQ_(rG@cv+ngLnAMCQexKdcgt^qFuyqD8f0)XrW>(9BdO~mbCnEb~>Ow>;Qbj?@bVR!J23Ju5q1K^_}mK3BDzHO65>jRH=&65V7&kYIzR$}?4sBJ4PSN)ta}6I763XhA|WsRD?IEob5#*M zCk$SLUrr#Xe3T%fSCI%LdB(>`01_Z78@XZFsLlXHgAA$BtdL767{c31X9IvfL4|gz z--M~9h)*_p1AuM8fNi61MLEr|#lRsj%*og8E8m@ORecS$i(2Add9xq}3nM`y#LDe- zIN}a)S}s?*2zT9&5#s=Xvw-j0mFS5rHMK|8kw2bHMlKd!R?`axB$s?~a-b>;r9Fa% zN#-;Jr%1gf+=hce7D@}sWnM?6LuPNT!`vz?s1_#wk0qAmqOX~wU@CyMa6dhEANSH@ z8zQ-VXrfmAn3tUdiP$d-I~ib>2(?NVZ(@C*7akR;XfWAYAzWLJYP%6cEfd!&j#*FK z$*CKX6{nJb3KWML038RLGsp{zd@ioTdY(ZbYjgHOk0wR{ACf zql)TVLHVpSF=t5cKpShc{mYht_P?!2AcZ>WsfEeN*I;Sj^{I5arR zV*xh$fIV6eDH9pF_upkip9DT+g2X^SxVQlXV^q15O3S54B&|67ZZ!#vFg<1`)^!uF{fxv`TOaKXHUl(JNa5^*$h60m#%IXoy^^t;#lswJ7LgAniu7hm$Q@(>7k0o*~Re3DIy(r&5Ec zZ9?=mBX^7f382cU3LNm~CL+BDsUQHqVkUtNp{T)PBv_Jy^Cj;glIoVG5aVEI#}dj0 z>G)yEB+${@-rRmAaA(0=O$0>hO+A2pU=oM_NN@+daA!C`AvghU#0FAuDi7fcONgOH z9kmXE$vOlV4lbP;=8x^3;>2{tZYS7dqchGHbf=nke+lT`wbXq{z9+W5Tec1f*XUt7 zsxmeTdQu*ChfepfE$GeX2l=Oai~jT$%lDNU_mv;&tBmNYD(I_u z*jG2*ck53dTfYCcF+Y;ue=nlHrJ%p{VgJMF{>Oj%Ir0PT#si&)2A)O?^b`#AM!<@D z!~|Hin_Pfh!F9%ZE#Bphc?9z8&nco0Bl?oWlm>FKB_UFk_^hA}wWbcQ0%Q%qNGrCH zVf`EBye=`mk}!5!Y*qujI4$$GPHetT(r{oX3Lo#g{>a53&fNeRo)$xCBEqS}jR-MO z;SugMBCaWy>&4vbkojH%@u-SBB&~aZjehqV5*xvI(C&L4M+Q!d5zi21Od9`g6tH2| zAeM;pq>ShdiW?2442^4W4Tw6L$X3veSA?({$VZ`JR7qk%4=C~<*4HHdsZKL7k+G^D zm0Nr6)rM7cADqA+Rb7hUw3UW{^95$FpoeAfq3(5W@$bi-Zj0<}olUTqxoV!69_aZ=QDMy?WNF*39mJ1E2+VE29Z!hqx9Ilrf`+!8vAR~WY;L@|;jWz615?Yu&PSirdv}!zr z5n|(1$T+v)EaKXLKRGTWI7h!&SCa$`$cPbz`A(?rZ{1NLI$D4_hHHd&(GVmMGNM2d zycYc>tl|C4BbN}O={#yJ+sE+Q@g>Z8-v3l2d^bQg-O40H^H5qj1T%Q^DMVu@@;8zp zV|>5eo-0(`ai?Q)Z6%YUmbD|LnJ?JAC$bm*z+M^fbrABg1(6lmOTFZ zkJbq04+oLI|32YIK7N|LF_nlM1t$VeAy#Lyt2L3A^{<@&qKeh>%hjeRA_eU-`kmF# zWnKGPDxWwSp1D!kn_t8lOIk z)qL5`PmC^oHU9J=MC7ABov#t0-E@rb&6hYA%p3D#L+CXW5i7{STJmK9LaabcKY^npLaFz)=WQr3#ur-f#ljln|Y|%JxJb- zr4lr%VZwGXb?;{O9FF+NFZhGJ3opkN1=Dv2??ldi{P{Zy@uZ_sA?Wuaz>E6~fRZ1l zkbi_?$qiFv%GvaA5TdbMnk(Wzw_!Z*{8zKEY|mubYAnFH+_{puw&})b?cbsL4{D~= zV&$XRFufE&e8>vKiU7rf0)!ZzED}1{k^>k!rV%s$*fu#PP%?NYt-S~!S-`zdVv#zp zDhU>=7I)!9)0OrXvs|8&EaS+w`IgmUoZ(D0oYKQK;426jfN6gBD3OP@n5!!z`(vQ= z!%|A}opdW(O*5k)Rj9GAGij4fki6IJD*IBit4VcRi}wwt8J}NVB=Ml5k2U#Kdhgl> z1?0A@_~ph>qrq1EDLmD@<;3hG@CTOC$h&=fAiqJNXELOA>G2f^t)S7Wy+QBK+v7Xd zm;EiM9fxL^sajGpV{qb8R!lR1eq4J|Cx8~~94lf&ii+AStAv4I<e8U(wR{u@AGw{N@n9RRaglw-p)|m(!4k&?FdV$d;o9|1iki}xzEyw2VL(6JE)YFK6+e+2w%#loMG1js~12~Rjce>+6qZ?E24 zw-kdmdgt3Ljt(wWF{-n~J79(!&-Jwwr92z{eJyZVO=1JDm-s}Ucy^~U(ihYYi8a1( zde$o~WfA>-7VYuScy349x%y&4zCTh77#iVF9Og(dRLXiFm*<;IxSmO1h_#fZ9fT;I zt#NxM8*S3*epO|P0egVSHoeS{6VQeS^U?{aAzczRSq+gb5xGQpH_s$wwVt?Y`aUx8~%Usb*J%A#s9`T#9iX;u$3Pr0*`JZp! z-}U%iH~x?7ru%c8bKd9qetkZ;dM`=Wvnuw!xc4fMD`m-9xM=nF80)e2hM!Y;u!3U; zC8)$fZ((JtGC-QdP`EidUXW;w<7LwTJfWncL3U0B$lGsLA0NN2{*CB)rJDG%y*O^` zkB<)W0r#0!MrmPOr9%TL{nYjI45XzrtfEEz*QhVdNDg~U2O%W_N1YroZ+L|u1Ci8a zd<`ZEx=$Vl9H@$RF60|hLKoUyX>tR!LTd(Q<8XV`I&6aUVSAi4J)1{nZ6?uc>k6u( zRi?yM&jM27VI)`QUO^!M*tGfyP4GfFV1dpw9%B#?7$&j8-ej$EiyuJtamx3o(N^Vc zDY`Fnrzx*u_o0Y%RW0Y&&t6`t`*u1yY_C5ufX67V4{@Q^%aj8AD+AF4K!VeYz&eut zEG!+}fds_O;xh1@&h+yvjVerMdoI;2GDKD#yT?mr*51Wfx|$qHoMer_Xo;PyUicoF z-t(!~d6<1PDerT2TR+d7Ey%9WfeCgxv_0jT-u0;KtiNWRu)%`8uUIfL+v=K##KFC& zj^ka0DnnB02QUMr|!L1z2gTBC@#hWIK%m zaI&Nxb>kOQz2+eSE4(pfF#e?$f@aH=rKNNe$jB0ol&%G=9vP+1!HCZV5k_f%9+x6< z@)S|>>9Ex10&OkIKBZi4a=+%Ur&(4OgEh_X_rTwrBh8zfvxf~!@e=J&YJiQpCEuxi zEcm34;h-LhoNko$HRPEc#&p=+e5*!9+3}z4lE+CF+$m$Nu!*?~)}uXj`=sb0$93(d z!d+hWx*CU)+iWZxH~3zwzF5Jm3Mp55l0rCa(j-Op%1x(Uvdr`O{M*3iMZ^GaHLtvC zSps?!Q_%|CS9NADVZY)BkBEzbFkkTGes!B2*FHWoS=-kJ*d&vfI2Al_q!%XPEM(}! zldm3k(=nbf1Bg*X#E213p^hphwQq0LupdiI?hq0t%M^322AEtDYqL&Rsfz+r;Wi0n zJw>i>7?7f;@AiA=zJN6mwXL&RvJlszAodc;NDwA9O}Ntx8;d@y&O&K5(Qq~+0?f;L zBQ&)Jg&#TK`tGwgP{2nVO~=@!Ydu}$e!hMJ&e*%j%+jLzhl5^r65Q!_CYd0;gWiG~wB z9ovh%VD(HfIWmLIo_{kFGMK$Tc`YXX$_B3iz1upvUW{m)_DqlzA|4J>cIfVfKP$X_ zi9<1puk`g;jJo^iO1h-}{IRzYZ3#`4_BX$QHt*KHhrrOpO-LQaHJSD1Z2)HDfw`6< zBWs2v^wy1V=zTXrv>_PR+rXRv))vjqhN=__E}Mi>qEUdYyaj0){<*7rpP*ieRuPKw}pOL-0r!w@9^1z~-I!_V9FtWCl!8520vd zlz^+hG9p>DWWn)-dcX)wR?=oODiw{>{6MgK+dc|y)h>9q6~uplVNmRs3FE?`L}tY~hD+8kbW@-toV;+WXdotB`Bl}~#qW1IB-ZQx4h@;n>X4M?F(epAUR+B{s59+g z*RhKpH(1=i8mRh=e>G4%li!6T{cr=7elt&eAWXB zE*}0r7*MQr5qfdAh}Zg2huyt&{^9YNtvgmYNoilN9&(2Eqkj$m!+?KY`%=U+Oe7>d zsG0g<0SSFuo16YmeN3B*g{eLF9w8~9)4tXyLRp1cAfZk-PLW{od1IX^V&E37X#L{ zZT#B)4+GlbkR3+#9ynh&Qi0s(;4+Bn-cYW>r4+h+~V~^H93>ek?KkQ`F|6wP^2psHx*~!<3 z3IDe|fv5>2Patyw2@^Ufs_cOTwd2j{I@R!`4$MGWMnWQH1ef2o|oXf!(xNSE>p;{w0AuCPwmOk zsFv$#W~`T-5_fQ)g{VGy(`H?Wra-0z0x%GIfw)K|XWwA?A;_XYhy~Iq5Nm;~3nX43 zeDYuM0x_8Pcj&^(kSpo?fo9-#t}mhp0a+J_wLoOW*_H%>7D%DMZoxj?kAwPEkaB?> zi;uG@pXuI`9}wngl^SZdg=7F(7s%c~#V^RKK>7t}0L~@uDN3Wl+QcBu^043lBxfKD z12w21gp(b&tGgs0>#O1 z?;v$km9ejS=Bj$%CdpRt{`(dLA5%P4{NnQq*?Y2VPFnPEJoTyDtFNOc-(($l6}F+q zO5IFV!(@HYnRDXU&~R2xe(DwZMq669cD{IdV4bzB!h}#P!;TCzaS`! z`TuHAWoB;v|7}pk1wP1!8dNPSaaBEqX8%`%>RXLuSZkTnR=GVN=|1_wa zKVS9jD86-+@ZSd2hRrVjX;2N<&tA`w5E-?UQZ7uy#OPFuSa`GQbJ2v`-*$P;UHNO#ebX0iNr-8C9K7cd5*B(kPp2R=*U3MJeYbC>I6lK+ zDm$rMdv;ff&MjSvXYEjE$y^x=Ja<@q^w}lA07}}x4QtO<=qlod_?(d1_f^G-AKqW# zXBd2_u7KXPYO1ShKh)OU{_x>yefOHdd|lJai1};HGqv;ATfTpozacU`CHc#b8e!M$Zb@k)Dh1>HV?=N+4 z_|)?CW#p#^D>GL=wXS}j|MUv~`=E7k~CRTO5lyy0cGUde^=t3Hj^&fg>*9Yxz{EVE?SwTEA_Z zI$Rd!ysrfW+tx&?oL|;F9qsn1^~>+0)O_Wkqpp>^JFRV>?s&WU_UWCxM?UutZ~1%e zLimpDV>6jwQ;W9mKk@gs>i%o)E9mL#7B=l2YuEpfejKL$-C1_P4q1KfqkZSWU%UBm z`Cb9qa)}9M^O3qvZ8)DLmcnB`dTVbR;ph^Zh%du9I<-p|E^+jn%W$5(?Q-{)(n;B6 z_)w<~rO~Af^T%a`q}~p-UrU)}d^xz5>C~yAw9IvKE|UCS^u6uW{-!EaD(;0KAy{DsgYN2ep9Cx9ZF3-or;*=Llq<)q2qxa*i5zCCXi^pzLnQp_$&EChig2+bVtPCC%F@ za=|u>V^}L~BqLd)vsCJ06_c;Hb}l|7qrg^w)?xMi7FJ{5`GaG=Hn(o}`p0#a88X8{ zmcsc*A}aE}SaD_5S#G;bjW@04;nty~-C17yv=mB$?e`hT=C^ab$A@~STnwbU&VMCt zmMC=$GRQBk;#4`oKI}YxPpaGud4XVPV0+wP2(CD!jr+Qj$`Agrlj|

%lG$Cih$2A?Os0cXA?0+C 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 z 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

sq_HXc|& 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

Qv^Gedb!o(U2!E9ByS>Y-mpy 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 DARP}G literal 0 HcmV?d00001 diff --git a/docs/profiling/m6/media/qwen_long.cast b/docs/profiling/m6/media/qwen_long.cast new file mode 100644 index 0000000..5008f50 --- /dev/null +++ b/docs/profiling/m6/media/qwen_long.cast @@ -0,0 +1,106 @@ +{"version":3,"term":{"cols":112,"rows":22},"timestamp":1790227258,"idle_time_limit":3.0,"command":"/Users/simba/.cache/swiftlm-bench/demo/record_demo.sh mlx-community/Qwen3.8-27B-4bit long 540","title":"SwiftLM · 8.6K-token prompt · Mac mini M6 32GB","env":{"SHELL":"/bin/zsh"}} +[0.008, "o", "\u001b[36mSwiftLM — github.com/SharpAI/SwiftLM\u001b[39m\r\n\u001b[3244mOpenAI-compatible LLM server for Apple Silicon, in Swift on MLX\u001b[39m\r\n\r\n"] +[0.000, "o", "\u001b[3244m$\u001b[39m sysctl -n machdep.cpu.brand_string hw.memsize | paste -sd' ' -\r\n"] +[0.631, "o", "Apple M6 · 32 GB · macOS 27.0\r\n"] +[0.000, "o", "\r\n"] +[0.000, "o", "\u001b[3244m$\u001b[39m .build/release/SwiftLM --model mlx-community/Qwen3.8-27B-4bit --port 5431 &\r\n"] +[3.221, "o", "✅ Memory strategy: FULL GPU (11.3GB model, 30.4GB available, cache limited to 5115MB)\r\n✅ Ready. Listening on http://127.0.0.1:5431\r\n"] +[0.001, "o", "\r\n"] +[0.000, "o", "\u001b[33m(this GIF plays at 4× speed — every timing printed on screen is real)\u001b[39m\r\n"] +[0.000, "o", "\u001b[3244m$\u001b[39m python3 scripts/demo/stream_client.py long 540 # ~9K-token prompt, code word hidden inside\r\n"] +[1.803, "o", "\r\u001b[2m prefilling … 1s | SwiftLM 17.0 GB swap +0.0 GB\u001b[0m "] +[1.081, "o", "\r\u001b[2m prefilling … 2s | SwiftLM 17.0 GB swap +0.0 GB\u001b[0m "] +[1.076, "o", "\r\u001b[2m prefilling … 3s | SwiftLM 17.0 GB swap +0.0 GB\u001b[0m "] +[1.076, "o", "\r\u001b[2m prefilling … 4s | SwiftLM 17.0 GB swap +0.0 GB\u001b[0m "] +[1.073, "o", "\r\u001b[2m prefilling … 5s | SwiftLM 17.0 GB swap +0.0 GB\u001b[0m "] +[1.087, "o", "\r\u001b[2m prefilling … 6s | SwiftLM 17.0 GB swap +0.0 GB\u001b[0m "] +[1.083, "o", "\r\u001b[2m prefilling … 7s | SwiftLM 17.0 GB swap +0.0 GB\u001b[0m "] +[1.108, "o", "\r\u001b[2m prefilling … 9s | SwiftLM 17.0 GB swap +0.0 GB\u001b[0m "] +[1.087, "o", "\r\u001b[2m prefilling … 10s | SwiftLM 17.0 GB swap +0.0 GB\u001b[0m "] +[1.077, "o", "\r\u001b[2m prefilling … 11s | SwiftLM 17.0 GB swap +0.0 GB\u001b[0m "] +[1.088, "o", "\r\u001b[2m prefilling … 12s | SwiftLM 17.0 GB swap +0.0 GB\u001b[0m "] +[1.094, "o", "\r\u001b[2m prefilling … 13s | SwiftLM 17.0 GB swap +0.0 GB\u001b[0m "] +[1.091, "o", "\r\u001b[2m prefilling … 14s | SwiftLM 17.0 GB swap +0.0 GB\u001b[0m "] +[1.098, "o", "\r\u001b[2m prefilling … 15s | SwiftLM 17.0 GB swap +0.0 GB\u001b[0m "] +[1.085, "o", "\r\u001b[2m prefilling … 16s | SwiftLM 17.0 GB swap +0.0 GB\u001b[0m "] +[1.093, "o", "\r\u001b[2m prefilling … 17s | SwiftLM 17.0 GB swap +0.0 GB\u001b[0m "] +[1.080, "o", "\r\u001b[2m prefilling … 18s | SwiftLM 17.0 GB swap +0.0 GB\u001b[0m "] +[1.087, "o", "\r\u001b[2m prefilling … 19s | SwiftLM 17.0 GB swap +0.0 GB\u001b[0m "] +[1.096, "o", "\r\u001b[2m prefilling … 21s | SwiftLM 17.0 GB swap +0.0 GB\u001b[0m "] +[1.099, "o", "\r\u001b[2m prefilling … 22s | SwiftLM 17.0 GB swap +0.0 GB\u001b[0m "] +[1.105, "o", "\r\u001b[2m prefilling … 23s | SwiftLM 17.0 GB swap +0.0 GB\u001b[0m "] +[1.100, "o", "\r\u001b[2m prefilling … 24s | SwiftLM 17.0 GB swap +0.0 GB\u001b[0m "] +[1.099, "o", "\r\u001b[2m prefilling … 25s | SwiftLM 17.0 GB swap +0.0 GB\u001b[0m "] +[1.090, "o", "\r\u001b[2m prefilling … 26s | SwiftLM 17.0 GB swap +0.0 GB\u001b[0m "] +[1.088, "o", "\r\u001b[2m prefilling … 27s | SwiftLM 18.0 GB swap +0.0 GB\u001b[0m "] +[1.096, "o", "\r\u001b[2m prefilling … 28s | SwiftLM 18.0 GB swap +0.0 GB\u001b[0m "] +[1.107, "o", "\r\u001b[2m prefilling … 29s | SwiftLM 18.0 GB swap +0.0 GB\u001b[0m "] +[1.088, "o", "\r\u001b[2m prefilling … 30s | SwiftLM 18.0 GB swap +0.0 GB\u001b[0m "] +[1.100, "o", "\r\u001b[2m prefilling … 32s | SwiftLM 18.0 GB swap +0.0 GB\u001b[0m "] +[1.105, "o", "\r\u001b[2m prefilling … 33s | SwiftLM 18.0 GB swap +0.0 GB\u001b[0m "] +[1.097, "o", "\r\u001b[2m prefilling … 34s | SwiftLM 18.0 GB swap +0.0 GB\u001b[0m "] +[1.099, "o", "\r\u001b[2m prefilling … 35s | SwiftLM 18.0 GB swap +0.0 GB\u001b[0m "] +[1.094, "o", "\r\u001b[2m prefilling … 36s | SwiftLM 18.0 GB swap +0.0 GB\u001b[0m "] +[1.121, "o", "\r\u001b[2m prefilling … 37s | SwiftLM 18.0 GB swap +0.0 GB\u001b[0m "] +[1.097, "o", "\r\u001b[2m prefilling … 38s | SwiftLM 18.0 GB swap +0.0 GB\u001b[0m "] +[1.089, "o", "\r\u001b[2m prefilling … 39s | SwiftLM 18.0 GB swap +0.0 GB\u001b[0m "] +[1.115, "o", "\r\u001b[2m prefilling … 40s | SwiftLM 18.0 GB swap +0.0 GB\u001b[0m "] +[1.096, "o", "\r\u001b[2m prefilling … 41s | SwiftLM 18.0 GB swap +0.0 GB\u001b[0m "] +[1.095, "o", "\r\u001b[2m prefilling … 43s | SwiftLM 19.0 GB swap +0.0 GB\u001b[0m "] +[1.095, "o", "\r\u001b[2m prefilling … 44s | SwiftLM 19.0 GB swap +0.0 GB\u001b[0m "] +[1.109, "o", "\r\u001b[2m prefilling … 45s | SwiftLM 19.0 GB swap +0.0 GB\u001b[0m "] +[1.101, "o", "\r\u001b[2m prefilling … 46s | SwiftLM 19.0 GB swap +0.0 GB\u001b[0m "] +[1.096, "o", "\r\u001b[2m prefilling … 47s | SwiftLM 19.0 GB swap +0.0 GB\u001b[0m "] +[1.105, "o", "\r\u001b[2m prefilling … 48s | SwiftLM 19.0 GB swap +0.0 GB\u001b[0m "] +[1.100, "o", "\r\u001b[2m prefilling … 49s | SwiftLM 19.0 GB swap +0.0 GB\u001b[0m "] +[1.095, "o", "\r\u001b[2m prefilling … 50s | SwiftLM 19.0 GB swap +0.0 GB\u001b[0m "] +[1.094, "o", "\r\u001b[2m prefilling … 51s | SwiftLM 19.0 GB swap +0.0 GB\u001b[0m "] +[1.109, "o", "\r\u001b[2m prefilling … 52s | SwiftLM 19.0 GB swap +0.0 GB\u001b[0m "] +[1.101, "o", "\r\u001b[2m prefilling … 54s | SwiftLM 19.0 GB swap +0.0 GB\u001b[0m "] +[1.095, "o", "\r\u001b[2m prefilling … 55s | SwiftLM 20.0 GB swap +0.0 GB\u001b[0m "] +[1.095, "o", "\r\u001b[2m prefilling … 56s | SwiftLM 20.0 GB swap +0.0 GB\u001b[0m "] +[1.106, "o", "\r\u001b[2m prefilling … 57s | SwiftLM 20.0 GB swap +0.0 GB\u001b[0m "] +[1.102, "o", "\r\u001b[2m prefilling … 58s | SwiftLM 20.0 GB swap +0.0 GB\u001b[0m "] +[1.101, "o", "\r\u001b[2m prefilling … 59s | SwiftLM 20.0 GB swap +0.0 GB\u001b[0m "] +[1.095, "o", "\r\u001b[2m prefilling … 60s | SwiftLM 20.0 GB swap +0.0 GB\u001b[0m "] +[1.105, "o", "\r\u001b[2m prefilling … 61s | SwiftLM 20.0 GB swap +0.0 GB\u001b[0m "] +[1.102, "o", "\r\u001b[2m prefilling … 62s | SwiftLM 20.0 GB swap +0.0 GB\u001b[0m "] +[1.103, "o", "\r\u001b[2m prefilling … 63s | SwiftLM 20.0 GB swap +0.0 GB\u001b[0m "] +[1.094, "o", "\r\u001b[2m prefilling … 65s | SwiftLM 21.0 GB swap +0.0 GB\u001b[0m "] +[1.090, "o", "\r\u001b[2m prefilling … 66s | SwiftLM 21.0 GB swap +0.0 GB\u001b[0m "] +[1.101, "o", "\r\u001b[2m prefilling … 67s | SwiftLM 21.0 GB swap +0.0 GB\u001b[0m "] +[1.091, "o", "\r\u001b[2m prefilling … 68s | SwiftLM 21.0 GB swap +0.0 GB\u001b[0m "] +[1.094, "o", "\r\u001b[2m prefilling … 69s | SwiftLM 21.0 GB swap +0.0 GB\u001b[0m "] +[1.098, "o", "\r\u001b[2m prefilling … 70s | SwiftLM 21.0 GB swap +0.0 GB\u001b[0m "] +[1.099, "o", "\r\u001b[2m prefilling … 71s | SwiftLM 21.0 GB swap +0.0 GB\u001b[0m "] +[1.105, "o", "\r\u001b[2m prefilling … 72s | SwiftLM 21.0 GB swap +0.0 GB\u001b[0m "] +[1.109, "o", "\r\u001b[2m prefilling … 73s | SwiftLM 21.0 GB swap +0.0 GB\u001b[0m "] +[1.107, "o", "\r\u001b[2m prefilling … 74s | SwiftLM 21.0 GB swap +0.0 GB\u001b[0m "] +[1.104, "o", "\r\u001b[2m prefilling … 76s | SwiftLM 21.0 GB swap +0.0 GB\u001b[0m "] +[1.105, "o", "\r\u001b[2m prefilling … 77s | SwiftLM 21.0 GB swap +0.0 GB\u001b[0m "] +[1.095, "o", "\r\u001b[2m prefilling … 78s | SwiftLM 21.0 GB swap +0.0 GB\u001b[0m "] +[1.090, "o", "\r\u001b[2m prefilling … 79s | SwiftLM 21.0 GB swap +0.0 GB\u001b[0m "] +[1.111, "o", "\r\u001b[2m prefilling … 80s | SwiftLM 21.0 GB swap +0.0 GB\u001b[0m "] +[1.117, "o", "\r\u001b[2m prefilling … 81s | SwiftLM 21.0 GB swap +0.0 GB\u001b[0m "] +[1.101, "o", "\r\u001b[2m prefilling … 82s | SwiftLM 21.0 GB swap +0.0 GB\u001b[0m "] +[1.121, "o", "\r\u001b[2m prefilling … 83s | SwiftLM 21.0 GB swap +0.0 GB\u001b[0m "] +[1.101, "o", "\r\u001b[2m prefilling … 84s | SwiftLM 21.0 GB swap +0.0 GB\u001b[0m "] +[1.108, "o", "\r\u001b[2m prefilling … 85s | SwiftLM 21.0 GB swap +0.0 GB\u001b[0m "] +[1.105, "o", "\r\u001b[2m prefilling … 87s | SwiftLM 21.0 GB swap +0.0 GB\u001b[0m "] +[1.104, "o", "\r\u001b[2m prefilling … 88s | SwiftLM 21.0 GB swap +0.0 GB\u001b[0m "] +[0.904, "o", "\r\u001b[K\u001b[32m"] +[0.000, "o", "The"] +[0.119, "o", " secret"] +[0.122, "o", " code"] +[0.120, "o", " word"] +[0.120, "o", " is"] +[0.120, "o", " OSP"] +[0.125, "o", "RE"] +[0.126, "o", "Y"] +[0.119, "o", "-"] +[0.119, "o", "1"] +[0.123, "o", "7"] +[0.123, "o", "."] +[0.118, "o", "\u001b[0m\r\n\r\n\u001b[36m\u001b[1m 12 tokens · decode 7.6 tok/s · TTFT 88.7s · prefill 96.8 tok/s · peak SwiftLM 21.0 GB · swap +0.0 GB\u001b[0m\r\n"] +[0.011, "o", "\r\n"] +[0.194, "x", "0"] diff --git a/docs/profiling/m6/media/qwen_short.cast b/docs/profiling/m6/media/qwen_short.cast new file mode 100644 index 0000000..0803e30 --- /dev/null +++ b/docs/profiling/m6/media/qwen_short.cast @@ -0,0 +1,97 @@ +{"version":3,"term":{"cols":112,"rows":26},"timestamp":1790227384,"idle_time_limit":2.0,"command":"/Users/simba/.cache/swiftlm-bench/demo/record_demo.sh mlx-community/Qwen3.8-27B-4bit short","title":"SwiftLM · Qwen3.8-27B-4bit · Mac mini M6 32GB","env":{"SHELL":"/bin/zsh"}} +[0.006, "o", "\u001b[36mSwiftLM — github.com/SharpAI/SwiftLM\u001b[39m\r\n\u001b[3244mOpenAI-compatible LLM server for Apple Silicon, in Swift on MLX\u001b[39m\r\n\r\n"] +[0.000, "o", "\u001b[3244m$\u001b[39m sysctl -n machdep.cpu.brand_string hw.memsize | paste -sd' ' -\r\n"] +[0.637, "o", "Apple M6 · 32 GB · macOS 27.0\r\n"] +[0.000, "o", "\r\n"] +[0.000, "o", "\u001b[3244m$\u001b[39m .build/release/SwiftLM --model mlx-community/Qwen3.8-27B-4bit --port 5431 &\r\n"] +[3.262, "o", "✅ Memory strategy: FULL GPU (11.3GB model, 30.4GB available, cache limited to 5115MB)\r\n✅ Ready. Listening on http://127.0.0.1:5431\r\n"] +[0.001, "o", "\r\n"] +[0.000, "o", "\u001b[3244m$\u001b[39m python3 scripts/demo/stream_client.py short # streams POST /v1/chat/completions\r\n"] +[1.859, "o", "\r\u001b[K\u001b[32m```"] +[0.115, "o", "swift"] +[0.117, "o", "\r\n"] +[0.116, "o", "///"] +[0.114, "o", " Returns"] +[0.115, "o", " the"] +[0.117, "o", " n"] +[0.114, "o", "-th"] +[0.114, "o", " Fibonacci"] +[0.116, "o", " number"] +[0.117, "o", " computed"] +[0.116, "o", " iter"] +[0.115, "o", "atively"] +[0.119, "o", "."] +[0.115, "o", "\r\n"] +[0.123, "o", "func"] +[0.119, "o", " fib"] +[0.123, "o", "(_"] +[0.117, "o", " n"] +[0.121, "o", ":"] +[0.116, "o", " Int"] +[0.113, "o", ")"] +[0.115, "o", " ->"] +[0.118, "o", " Int"] +[0.113, "o", " {"] +[0.113, "o", "\r\n"] +[0.115, "o", " "] +[0.116, "o", " guard"] +[0.118, "o", " n"] +[0.114, "o", " >="] +[0.116, "o", " "] +[0.116, "o", "0"] +[0.114, "o", " else"] +[0.116, "o", " {"] +[0.114, "o", " return"] +[0.114, "o", " "] +[0.116, "o", "0"] +[0.117, "o", " }"] +[0.115, "o", "\r\n"] +[0.116, "o", " "] +[0.116, "o", " var"] +[0.118, "o", " a"] +[0.116, "o", " ="] +[0.118, "o", " "] +[0.118, "o", "0"] +[0.119, "o", ","] +[0.119, "o", " b"] +[0.121, "o", " ="] +[0.113, "o", " "] +[0.116, "o", "1"] +[0.115, "o", "\r\n"] +[0.115, "o", " "] +[0.113, "o", " for"] +[0.115, "o", " _"] +[0.117, "o", " in"] +[0.115, "o", " "] +[0.115, "o", "0"] +[0.233, "o", " +""" +import json, re, subprocess, sys, threading, time, urllib.request + +PORT = 5431 +DIM, BOLD, CYAN, GREEN, RESET = "\033[2m", "\033[1m", "\033[36m", "\033[32m", "\033[0m" + + +def server_pid(): + out = subprocess.run(["pgrep", "-n", "-f", "SwiftLM --model"], capture_output=True, text=True).stdout.split() + return out[0] if out else None + + +def footprint_gb(pid): + out = subprocess.run(["footprint", "-p", pid], capture_output=True, text=True).stdout + m = re.search(r"phys_footprint:\s+([0-9.]+)\s+(GB|MB)", out) + if not m: + return 0.0 + v = float(m.group(1)) + return v if m.group(2) == "GB" else v / 1024 + + +def swap_gb(): + out = subprocess.run(["sysctl", "-n", "vm.swapusage"], capture_output=True, text=True).stdout + m = re.search(r"used = ([0-9.]+)M", out) + return float(m.group(1)) / 1024 if m else 0.0 + + +def main(): + kind = sys.argv[1] + if kind == "short": + prompt = "Write a Swift function `fib(_ n: Int) -> Int` that returns the n-th Fibonacci number iteratively. Code only, with a one-line doc comment." + max_tokens = 160 + else: + n = int(sys.argv[2]) + lines = [f"Sensor {i} in the greenhouse reported stable humidity and mild warmth." for i in range(n)] + lines.insert(n * 2 // 3, "Note: the secret code word is OSPREY-17.") + prompt = f"[demo-{int(time.time())}]\n" + "\n".join(lines) + "\n\nWhat is the secret code word? Answer in one short sentence." + max_tokens = 24 + + pid = server_pid() + swap0, peak_fp, peak_swap = swap_gb(), [0.0], [0.0] + stop = threading.Event() + + def sample(): + while not stop.is_set(): + peak_fp[0] = max(peak_fp[0], footprint_gb(pid)) + peak_swap[0] = max(peak_swap[0], swap_gb() - swap0) + stop.wait(1) + + threading.Thread(target=sample, daemon=True).start() + + # Client-side prefill ticker. The server's opt-in prefill_progress heartbeat + # doesn't fire on the VLM path yet, so we show elapsed time and live memory + # here until the first token arrives. + first_token = threading.Event() + out_lock = threading.Lock() # keeps the ticker from writing over the first token + t0 = time.time() + + def ticker(): + while not first_token.wait(1): + with out_lock: + if first_token.is_set(): + break + sys.stdout.write(f"\r{DIM} prefilling … {time.time() - t0:5.0f}s | SwiftLM {footprint_gb(pid):4.1f} GB " + f"swap +{max(0, swap_gb() - swap0):.1f} GB{RESET} ") + sys.stdout.flush() + + if kind != "short": + threading.Thread(target=ticker, daemon=True).start() + + body = json.dumps({"messages": [{"role": "user", "content": prompt}], "max_tokens": max_tokens, + "temperature": 0, "stream": True, + "stream_options": {"include_usage": True}}).encode() + req = urllib.request.Request(f"http://127.0.0.1:{PORT}/v1/chat/completions", body, + {"Content-Type": "application/json", "X-SwiftLM-Prefill-Progress": "true"}) + t_first = None; n_tok = 0; event = None; n_prompt = None + with urllib.request.urlopen(req, timeout=3600) as r: + for raw in r: + line = raw.decode().strip() + if line.startswith("event:"): + event = line[6:].strip(); continue + if not line.startswith("data:") or line.endswith("[DONE]"): + continue + d = json.loads(line[5:]) + if event == "prefill_progress": + n_prompt = d.get("n_prompt_tokens") or n_prompt + sys.stdout.write(f"\r{DIM} prefilling {n_prompt or '?':,} tokens … {d.get('elapsed_seconds', time.time() - t0):5.0f}s " + f"| SwiftLM {footprint_gb(pid):4.1f} GB swap +{max(0, swap_gb() - swap0):.1f} GB{RESET} ") + sys.stdout.flush(); event = None; continue + event = None + if d.get("usage"): + n_prompt = d["usage"].get("prompt_tokens", n_prompt) + delta = (d.get("choices") or [{}])[0].get("delta", {}).get("content") + if delta: + if t_first is None: + with out_lock: + t_first = time.time(); first_token.set() + sys.stdout.write("\r\033[K" + GREEN) + n_tok += 1 + sys.stdout.write(delta); sys.stdout.flush() + t_end = time.time(); stop.set(); first_token.set() + sys.stdout.write(RESET + "\n\n") + decode = (n_tok - 1) / (t_end - t_first) if n_tok > 1 else 0 + ttft = t_first - t0 + pf = f" prompt {n_prompt:,} tok · prefill {n_prompt / ttft:.0f} tok/s ·" if n_prompt and kind != "short" else "" + print(f"{CYAN}{BOLD} {n_tok} tokens · decode {decode:.1f} tok/s · TTFT {ttft:.1f}s ·{pf.rstrip(' ·')}{RESET}") + print(f"{CYAN}{BOLD} peak SwiftLM {peak_fp[0]:.1f} GB · swap +{max(0, peak_swap[0]):.1f} GB{RESET}") + + +if __name__ == "__main__": + main() From 398252e211c8ebe4543eb5e2c55953fbc44fbaeb Mon Sep 17 00:00:00 2001 From: simba Date: Thu, 24 Sep 2026 08:44:21 -0700 Subject: [PATCH 5/6] fix(load): only fall back to text-only for VLM checkpoint mismatches Review on #173: `catch where !self.vision` caught every error, so a download failure or a CancellationError triggered a second, LLM load attempt and then surfaced a confusing error. The fallback now requires isVLMCheckpointMismatch(error): a DecodingError, an MLXNN UpdateError (unhandledKeys, keyNotFound, mismatchedSize, ...), or a ModelFactoryError for an unsupported model/processor type or an undecodable/invalid config. Every other error propagates unchanged. VLMFallbackTests covers the fallback cases (missing image_mean, unhandled weight keys, unsupported model type) and the pass-through cases (cancellation, URLError, missing config file). Co-Authored-By: Claude Opus 5.5 --- Sources/SwiftLM/Server.swift | 33 ++++++++++++++--- tests/SwiftLMTests/VLMFallbackTests.swift | 44 +++++++++++++++++++++++ 2 files changed, 72 insertions(+), 5 deletions(-) create mode 100644 tests/SwiftLMTests/VLMFallbackTests.swift diff --git a/Sources/SwiftLM/Server.swift b/Sources/SwiftLM/Server.swift index 7f03f20..4e0e185 100644 --- a/Sources/SwiftLM/Server.swift +++ b/Sources/SwiftLM/Server.swift @@ -205,6 +205,28 @@ private struct TransformersTokenizerBridge: MLXLMCommon.Tokenizer, Sendable { /// Returns `nil` when the value must be dropped (JSON `null` / NSNull), otherwise a /// structure with every nested null removed. See `TransformersTokenizerBridge.applyChatTemplate`. +/// True when a VLM load failed because the checkpoint doesn't match the VLM code: +/// its config doesn't decode, its weights don't line up with the module tree, or the +/// factory doesn't know the model/processor type. Only these justify retrying an +/// auto-detected VLM as a text-only LLM. Anything else (cancellation, download, I/O) +/// would fail the same way again and just hide the real error. +func isVLMCheckpointMismatch(_ error: any Error) -> Bool { + switch error { + case is DecodingError, is UpdateError: + return true + case let factoryError as ModelFactoryError: + switch factoryError { + case .unsupportedModelType, .unsupportedProcessorType, .configurationDecodingError, + .invalidConfiguration: + return true + default: + return false + } + default: + return false + } +} + func sanitizeForJinja(_ value: any Sendable) -> (any Sendable)? { if value is NSNull { return nil } let mirror = Mirror(reflecting: value) @@ -904,11 +926,12 @@ struct MLXServer: AsyncParsableCommand { ) { progress in tracker.printProgress(progress) } - } catch where !self.vision { - // Vision was only auto-detected. A checkpoint whose vision side - // doesn't load (e.g. a preprocessor_config.json without - // image_mean) can still serve text, so fall back rather than exit. - // With an explicit --vision, the error still propagates. + } catch where !self.vision && isVLMCheckpointMismatch(error) { + // Vision was only auto-detected, and the vision side of the checkpoint + // doesn't match the VLM code (e.g. a preprocessor_config.json without + // image_mean). The text model can still serve, so fall back rather than + // exit. Cancellation, network and I/O errors still propagate, as does + // any error under an explicit --vision. print("[SwiftLM] ⚠️ Auto-detected VLM failed to load (\(error)); loading as a text-only LLM. Pass --vision to make this fatal.") isVision = false container = try await LLMModelFactory.shared.loadContainer( diff --git a/tests/SwiftLMTests/VLMFallbackTests.swift b/tests/SwiftLMTests/VLMFallbackTests.swift new file mode 100644 index 0000000..63f072e --- /dev/null +++ b/tests/SwiftLMTests/VLMFallbackTests.swift @@ -0,0 +1,44 @@ +import XCTest +import Foundation +import MLXLMCommon +import MLXNN +@testable import SwiftLM + +/// An auto-detected VLM that fails to load falls back to text-only only for +/// checkpoint mismatches. Other failures must surface as themselves. +final class VLMFallbackTests: XCTestCase { + + private struct Probe: Decodable { let image_mean: [Double] } + + func testConfigDecodingErrorFallsBack() { + // The real case: unsloth/Qwen3.6-35B-A3B's preprocessor_config.json has no image_mean. + do { + _ = try JSONDecoder().decode(Probe.self, from: Data("{}".utf8)) + XCTFail("expected a DecodingError") + } catch { + XCTAssertTrue(isVLMCheckpointMismatch(error)) + } + } + + func testWeightMismatchFallsBack() { + let error = UpdateError.unhandledKeys(path: [], modules: ["Vision"], keys: ["pre_projection"]) + XCTAssertTrue(isVLMCheckpointMismatch(error)) + } + + func testUnsupportedModelTypeFallsBack() { + XCTAssertTrue(isVLMCheckpointMismatch(ModelFactoryError.unsupportedModelType("qwen4_exp"))) + } + + func testCancellationDoesNotFallBack() { + XCTAssertFalse(isVLMCheckpointMismatch(CancellationError())) + } + + func testNetworkErrorDoesNotFallBack() { + XCTAssertFalse(isVLMCheckpointMismatch(URLError(.notConnectedToInternet))) + } + + func testMissingConfigFileDoesNotFallBack() { + let io = CocoaError(.fileReadNoSuchFile) + XCTAssertFalse(isVLMCheckpointMismatch(ModelFactoryError.configurationFileError("config.json", "m", io))) + } +} From 7773c3999416fbae7d202959590c1a2175f596ee Mon Sep 17 00:00:00 2001 From: simba Date: Thu, 24 Sep 2026 09:28:29 -0700 Subject: [PATCH 6/6] docs(m6): re-measure Gemma 4 and Qwen3.8 on main (mlx-swift-lm 460ff81) + this PR MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit main now ships chunked VLM prefill (#167), so the earlier Gemma-4-26B-A4B and Qwen3.8-27B runs, which relied on a local backport, are replaced with runs on main 318f712 + this PR. Nothing unshipped is involved any more. - Gemma-4-26B-A4B 4-bit: 52.2 tok/s decode at ~530 tokens; an 80.7K-token prompt at 622 tok/s prefill / 24.3 decode, 19.5 GB peak, 0 swap. --turbo-kv now passes all 13 runs up to 80.9K tokens (the Metal assertion and needle misses are gone). --mtp with the bf16 assistant works but is slower on the M6 (45.2 / 35.6 / 30.4 vs 53.0 / 50.8 / 46.0 tok/s). - Qwen3.8-27B 4-bit: prefill ~235 tok/s at every length (~2.3× the backport), 9.3 tok/s decode, 18.4 GB peak at 40.8K tokens. - Known issues now cover --gpu-layers partitioning (Metal GPU timeout) and QAT MTP assistants (unhandledKeys); the fixed items are removed. - m6_bench.py records the code word and the start of each answer, so a needle miss shows what the model actually said. Co-Authored-By: Claude Opus 5.5 --- README.md | 42 +++++++++--------- docs/profiling/m6/gemma4_26b_a4b_4bit.jsonl | 44 ++++++++++--------- docs/profiling/m6/gemma4_26b_a4b_4bit.md | 20 ++++----- .../m6/gemma4_26b_a4b_4bit_mtp_bf16.jsonl | 20 +++++++++ .../m6/gemma4_26b_a4b_4bit_mtp_bf16.md | 12 +++++ docs/profiling/m6/qwen38_27b_4bit.jsonl | 44 +++++++++---------- docs/profiling/m6/qwen38_27b_4bit.md | 16 +++---- scripts/profiling/m6_bench.py | 2 + 8 files changed, 120 insertions(+), 80 deletions(-) create mode 100644 docs/profiling/m6/gemma4_26b_a4b_4bit_mtp_bf16.jsonl create mode 100644 docs/profiling/m6/gemma4_26b_a4b_4bit_mtp_bf16.md diff --git a/README.md b/README.md index febe254..cfd3a67 100644 --- a/README.md +++ b/README.md @@ -64,27 +64,29 @@ The first SwiftLM numbers from a **32 GB** Mac. Every other table in this README | Model (4-bit unless noted) | Weights | Mode | Decode, short prompt | Longest prompt that passed | Peak GPU | |---|---|---|---|---|---| -| **`gemma-4-26b-a4b-it-4bit`** (MoE, ~4B active) | 15.3 GB | GPU | **53.3 tok/s** | 80.7K tokens | 20.2 GB | +| **`gemma-4-26b-a4b-it-4bit`** (MoE, ~4B active) | 15.3 GB | GPU | **52.2 tok/s** | 80.7K tokens | 19.5 GB | | **`Qwen3.6-35B-A3B-UD-MLX-4bit`** (MoE, ~3B active) | 21.6 GB | GPU | **46.7 tok/s** | 40.8K tokens | 22.4 GB | | `Qwen3.6-35B-A3B-UD-MLX-4bit` | 21.6 GB | `--stream-experts` | 13.2 tok/s | 40.8K tokens | 7.7 GB | -| `Qwen3.8-27B-4bit` (dense) | 11.3 GB | GPU | 9.1 tok/s | 40.8K tokens | 19.6 GB | +| `Qwen3.8-27B-4bit` (dense) | 11.3 GB | GPU | 9.3 tok/s | 40.8K tokens | 18.4 GB | | `gemma-4-26b-a4b-it-8bit` | ~26 GB | GPU | swaps (+3.1 GB on the first prompt) | — | — | | `gemma-4-26b-a4b-it-8bit` | ~26 GB | `--stream-experts` | 8.8 tok/s | 9.5K tokens (32K swapped) | 7.6 GB | - **MoE models are the sweet spot at 32 GB.** Only the active experts are read for each token, so they decode 5–6× faster than a dense 27B. A 4-bit MoE with up to about 22 GB of weights runs entirely on the GPU. - **Qwen3.6-35B-A3B on a base M6 reaches 76%** of the M1 Ultra 64 GB decode speed below (46.7 vs 61.7 tok/s). -- **Dense 27B decode is bandwidth-bound.** 9.1 tok/s × 11.3 GB is about 100 GB/s, roughly 60% of the M6's rated 170 GB/s. +- **Dense 27B decode is bandwidth-bound.** 9.3 tok/s × 11.3 GB is about 105 GB/s, roughly 60% of the M6's rated 170 GB/s. - **An 8-bit 26 GB model needs SSD streaming** and tops out at about 10K tokens of context. ### Gemma-4-26B-A4B 4-bit — by prompt length -| Prompt tokens | Prefill | TTFT | Decode | Peak GPU · swap growth | +| Prompt tokens | Vanilla prefill / decode (tok/s) | TTFT | `--turbo-kv` prefill / decode (tok/s) | Peak GPU · swap growth | |---|---|---|---|---| -| 534 | 859 tok/s | 0.7 s | **53.3 tok/s** | 15.2 GB · 0 | -| 2,285 | **998 tok/s** | 2.4 s | 50.1 tok/s | 15.8 GB · 0 | -| 9,544 | 914 tok/s | 10.7 s | 44.9 tok/s | 16.5 GB · 0 | -| 39,773 | 750 tok/s | 53.9 s | 31.4 tok/s | 19.1 GB · 0 | -| 80,711 | 625 tok/s | 130.6 s | 21.8 tok/s | 20.2 GB · 0 | +| ~530 | 733 / **52.2** | 0.8 s | 785 / 53.2 | 14.5 GB · 0 | +| ~2.3K | **963** / 50.2 | 2.5 s | 969 / 50.5 | 15.0 GB · 0 | +| ~9.5K | 959 / 45.1 | 10.1 s | 971 / 45.5 | 15.8 GB · 0 | +| ~39.7K | 757 / 31.0 | 53.3 s | 787 / 31.5 | 17.9 GB · 0 | +| ~80.7K | 622 / 24.3 | 131.3 s | 630 / 24.5 | 19.5 GB · 0 | + +Every needle check passed in both modes. `--mtp` with the bf16 assistant (`gemma-4-26B-A4B-it-assistant-bf16`) works but is slower on the M6: 45.2 / 35.6 / 30.4 tok/s decode at ~530 / 2.3K / 9.5K tokens, against 53.0 / 50.8 / 46.0 without it. A 4-bit MoE is compute-bound, so verifying the drafted tokens costs more than it saves (the same finding as the M5 Pro tables below). ### Qwen3.6-35B-A3B 4-bit — GPU vs SSD streaming @@ -99,33 +101,33 @@ The first SwiftLM numbers from a **32 GB** Mac. Every other table in this README | Prompt tokens | Vanilla prefill / decode (tok/s) | TurboKV prefill / decode (tok/s) | Peak GPU · swap growth | |---|---|---|---| -| ~550 | 105 / 9.1 | 102 / 9.3 | 16.5 GB · 0 | -| ~2.3K | 108 / 8.8 | 108 / 9.2 | 16.2 GB · 0 | -| ~9.8K | 96 / 8.6 | 98 / 8.3 | 16.7 GB · 0 | -| ~40.8K | 88 / 7.9 | 85 / 7.3 | 19.6 GB · +0.7 GB (TurboKV +1.5 GB) | +| ~550 | 233 / 9.3 | 231 / 9.3 | 15.2 GB · 0 | +| ~2.3K | 242 / 9.1 | 261 / 9.2 | 16.1 GB · 0 | +| ~9.8K | 238 / 8.9 | 250 / 8.9 | 16.9 GB · 0 | +| ~40.8K | 200 / 7.9 | 202 / 7.9 | 18.4 GB · 0 (TurboKV 16.9 GB) | -TurboKV doesn't help this model. Only 16 of its 64 layers use full attention (the other 48 are GatedDeltaNet), so the KV cache is already small. +TurboKV barely changes speed on this model. Only 16 of its 64 layers use full attention (the other 48 are GatedDeltaNet), so the KV cache is already small. It saves about 1.5 GB at 40K tokens. ### What 32 GB exposed -| 8.5K-token prompt, Qwen3.8-27B-4bit | Before | After | +| 8.5K-token prompt, Qwen3.8-27B-4bit | Before (old pin) | After (this release) | |---|---|---| -| Prefill | 33.4 tok/s | **106.7 tok/s** (3.2×) | -| Peak process memory | 38 GB | **19 GB** | +| Prefill | 33.4 tok/s | **~240 tok/s** (≈7×; 238 tok/s measured at 9.8K) | +| Peak memory | 38 GB process footprint | **≤19 GB** process (16.9 GB GPU peak at 9.8K) | | Swap growth | +15 GB | **0** | 1. **The MLX buffer cache was unbounded on full-GPU loads.** It could grow to the whole 26.8 GB working set. It is now sized from the RAM left after weights and KV. 2. **The KV-cache estimate counted every layer as full attention.** Gemma 4 (25 of 30 layers use a 1,024-token sliding window) was overestimated 10×, and Qwen3.5/3.8 (48 of 64 layers are linear attention) 4×. On 32 GB that pushed Gemma into CPU/GPU layer partitioning, which crashed with a Metal GPU timeout. 3. **An auto-detected VLM that failed to load exited the server.** `Qwen3.6-35B-A3B-UD-MLX-4bit` ships a `preprocessor_config.json` without `image_mean`. SwiftLM now falls back to text-only unless you pass `--vision`. -4. **Vision-capable models skipped chunked prefill.** On the VLM path, a text-only prompt ran through the model in a single pass. This one is fixed on mlx-swift-lm `main` and lands here with the next mlx-swift-lm bump. Until then, long prompts on Qwen3.5/3.8 and Gemma 4 use far more memory than the tables above. +4. **Vision-capable models skipped chunked prefill.** On the older mlx-swift-lm pin, a text-only prompt on the VLM path ran through the model in a single pass. It's fixed by the mlx-swift-lm bump in #167. Every number in this section was measured on `main` with that bump. -> ⚠️ **Known issues on 32 GB:** `--turbo-kv` with Gemma 4 crashes in Metal when a prompt-cache save runs during generation, and dropped the digits of the code word in 2 of 3 runs at 2K. The Gemma 4 MTP assistant (`gemma-4-26B-A4B-it-qat-assistant-4bit`) doesn't load on the current mlx-swift-lm pin. Both are expected to clear with the mlx-swift-lm bump. +> ⚠️ **Known issues:** `--gpu-layers N` (CPU/GPU layer partitioning) hits a Metal GPU timeout on the first request (repro: `--model mlx-community/gemma-4-26b-a4b-it-4bit --gpu-layers 23`). QAT-quantized Gemma 4 MTP assistants (`…-qat-assistant-4bit`) fail with `unhandledKeys pre_projection/post_projection`; use `gemma-4-26B-A4B-it-assistant-bf16`. Reproduce: ```bash ./build.sh -.build/release/SwiftLM --model mlx-community/gemma-4-26b-a4b-it-4bit --port 5431 & +.build/release/SwiftLM --model mlx-community/gemma-4-26b-a4b-it-4bit --port 5431 --ctx-size 48000 & python3 scripts/demo/stream_client.py short python3 scripts/profiling/m6_bench.py --model mlx-community/gemma-4-26b-a4b-it-4bit \ --config "Vanilla=" --contexts 512,2048,8192,32768,65536 --out docs/profiling/m6/gemma4_26b_a4b_4bit diff --git a/docs/profiling/m6/gemma4_26b_a4b_4bit.jsonl b/docs/profiling/m6/gemma4_26b_a4b_4bit.jsonl index e6ddb11..c6c2b24 100644 --- a/docs/profiling/m6/gemma4_26b_a4b_4bit.jsonl +++ b/docs/profiling/m6/gemma4_26b_a4b_4bit.jsonl @@ -1,20 +1,24 @@ -{"model": "mlx-community/gemma-4-26b-a4b-it-4bit", "config": "Vanilla", "context": 512, "run": -1, "warmup": true, "peak_gpu_gb": 14.59, "swap_delta_gb": 0.0, "min_free_pct": 42, "status": "OK", "prompt_tokens": 521, "prefill_tps": 471.2, "ttft_s": 1.14, "decode_tps": 53.37, "gen_tokens": 128, "needle_ok": true, "degenerate": false} -{"model": "mlx-community/gemma-4-26b-a4b-it-4bit", "config": "Vanilla", "context": 512, "run": 0, "warmup": false, "peak_gpu_gb": 14.92, "swap_delta_gb": 0.0, "min_free_pct": 44, "status": "OK", "prompt_tokens": 534, "prefill_tps": 723.9, "ttft_s": 0.78, "decode_tps": 53.46, "gen_tokens": 128, "needle_ok": true, "degenerate": false} -{"model": "mlx-community/gemma-4-26b-a4b-it-4bit", "config": "Vanilla", "context": 512, "run": 1, "warmup": false, "peak_gpu_gb": 14.96, "swap_delta_gb": 0.0, "min_free_pct": 44, "status": "OK", "prompt_tokens": 543, "prefill_tps": 858.5, "ttft_s": 0.68, "decode_tps": 53.27, "gen_tokens": 128, "needle_ok": true, "degenerate": false} -{"model": "mlx-community/gemma-4-26b-a4b-it-4bit", "config": "Vanilla", "context": 512, "run": 2, "warmup": false, "peak_gpu_gb": 15.15, "swap_delta_gb": 0.0, "min_free_pct": 43, "status": "OK", "prompt_tokens": 528, "prefill_tps": 910.4, "ttft_s": 0.62, "decode_tps": 52.56, "gen_tokens": 128, "needle_ok": true, "degenerate": false} -{"model": "mlx-community/gemma-4-26b-a4b-it-4bit", "config": "Vanilla", "context": 2048, "run": 0, "warmup": false, "peak_gpu_gb": 15.78, "swap_delta_gb": 0.0, "min_free_pct": 40, "status": "OK", "prompt_tokens": 2274, "prefill_tps": 969.8, "ttft_s": 2.42, "decode_tps": 50.58, "gen_tokens": 128, "needle_ok": true, "degenerate": false} -{"model": "mlx-community/gemma-4-26b-a4b-it-4bit", "config": "Vanilla", "context": 2048, "run": 1, "warmup": false, "peak_gpu_gb": 15.52, "swap_delta_gb": 0.0, "min_free_pct": 41, "status": "OK", "prompt_tokens": 2289, "prefill_tps": 1006.9, "ttft_s": 2.36, "decode_tps": 49.84, "gen_tokens": 128, "needle_ok": true, "degenerate": false} -{"model": "mlx-community/gemma-4-26b-a4b-it-4bit", "config": "Vanilla", "context": 2048, "run": 2, "warmup": false, "peak_gpu_gb": 15.61, "swap_delta_gb": 0.0, "min_free_pct": 41, "status": "OK", "prompt_tokens": 2285, "prefill_tps": 997.6, "ttft_s": 2.38, "decode_tps": 50.08, "gen_tokens": 128, "needle_ok": true, "degenerate": false} -{"model": "mlx-community/gemma-4-26b-a4b-it-4bit", "config": "Vanilla", "context": 8192, "run": 0, "warmup": false, "peak_gpu_gb": 16.2, "swap_delta_gb": 0.0, "min_free_pct": 37, "status": "OK", "prompt_tokens": 9529, "prefill_tps": 941.2, "ttft_s": 10.35, "decode_tps": 44.9, "gen_tokens": 128, "needle_ok": true, "degenerate": false} -{"model": "mlx-community/gemma-4-26b-a4b-it-4bit", "config": "Vanilla", "context": 8192, "run": 1, "warmup": false, "peak_gpu_gb": 16.54, "swap_delta_gb": 0.0, "min_free_pct": 38, "status": "OK", "prompt_tokens": 9544, "prefill_tps": 913.7, "ttft_s": 10.67, "decode_tps": 44.99, "gen_tokens": 128, "needle_ok": true, "degenerate": false} -{"model": "mlx-community/gemma-4-26b-a4b-it-4bit", "config": "Vanilla", "context": 8192, "run": 2, "warmup": false, "peak_gpu_gb": 16.3, "swap_delta_gb": 0.0, "min_free_pct": 39, "status": "OK", "prompt_tokens": 9558, "prefill_tps": 904.5, "ttft_s": 10.81, "decode_tps": 44.93, "gen_tokens": 128, "needle_ok": true, "degenerate": false} -{"model": "mlx-community/gemma-4-26b-a4b-it-4bit", "config": "Vanilla", "context": 32768, "run": 0, "warmup": false, "peak_gpu_gb": 19.13, "swap_delta_gb": 0.0, "min_free_pct": 33, "status": "OK", "prompt_tokens": 39773, "prefill_tps": 749.6, "ttft_s": 53.9, "decode_tps": 31.44, "gen_tokens": 128, "needle_ok": true, "degenerate": false} -{"model": "mlx-community/gemma-4-26b-a4b-it-4bit", "config": "Vanilla", "context": 65536, "run": 0, "warmup": false, "peak_gpu_gb": 20.19, "swap_delta_gb": 0.0, "min_free_pct": 18, "status": "OK", "prompt_tokens": 80711, "prefill_tps": 625.1, "ttft_s": 130.63, "decode_tps": 21.83, "gen_tokens": 128, "needle_ok": true, "degenerate": false} -{"model": "mlx-community/gemma-4-26b-a4b-it-4bit", "config": "TurboKV", "context": 512, "run": -1, "warmup": true, "peak_gpu_gb": 14.59, "swap_delta_gb": 0.0, "min_free_pct": 44, "status": "OK", "prompt_tokens": 527, "prefill_tps": 603.1, "ttft_s": 0.91, "decode_tps": 52.52, "gen_tokens": 128, "needle_ok": true, "degenerate": false} -{"model": "mlx-community/gemma-4-26b-a4b-it-4bit", "config": "TurboKV", "context": 512, "run": 0, "warmup": false, "peak_gpu_gb": 15.01, "swap_delta_gb": 0.0, "min_free_pct": 44, "status": "OK", "prompt_tokens": 536, "prefill_tps": 882.9, "ttft_s": 0.65, "decode_tps": 53.46, "gen_tokens": 128, "needle_ok": true, "degenerate": false} -{"model": "mlx-community/gemma-4-26b-a4b-it-4bit", "config": "TurboKV", "context": 512, "run": 1, "warmup": false, "peak_gpu_gb": 14.91, "swap_delta_gb": 0.0, "min_free_pct": 44, "status": "OK", "prompt_tokens": 532, "prefill_tps": 840.1, "ttft_s": 0.67, "decode_tps": 53.06, "gen_tokens": 128, "needle_ok": true, "degenerate": false} -{"model": "mlx-community/gemma-4-26b-a4b-it-4bit", "config": "TurboKV", "context": 512, "run": 2, "warmup": false, "peak_gpu_gb": 15.02, "swap_delta_gb": 0.0, "min_free_pct": 44, "status": "OK", "prompt_tokens": 532, "prefill_tps": 892.6, "ttft_s": 0.64, "decode_tps": 53.13, "gen_tokens": 128, "needle_ok": true, "degenerate": false} -{"model": "mlx-community/gemma-4-26b-a4b-it-4bit", "config": "TurboKV", "context": 2048, "run": 0, "warmup": false, "peak_gpu_gb": 15.77, "swap_delta_gb": 0.0, "min_free_pct": 42, "status": "OK", "prompt_tokens": 2280, "prefill_tps": 924.0, "ttft_s": 2.65, "decode_tps": 52.96, "gen_tokens": 128, "needle_ok": false, "degenerate": false} -{"model": "mlx-community/gemma-4-26b-a4b-it-4bit", "config": "TurboKV", "context": 2048, "run": 1, "warmup": false, "peak_gpu_gb": 15.63, "swap_delta_gb": 0.0, "min_free_pct": 41, "status": "OK", "prompt_tokens": 2311, "prefill_tps": 886.8, "ttft_s": 2.74, "decode_tps": 53.22, "gen_tokens": 128, "needle_ok": false, "degenerate": false} -{"model": "mlx-community/gemma-4-26b-a4b-it-4bit", "config": "TurboKV", "context": 2048, "run": 2, "warmup": false, "peak_gpu_gb": 15.44, "swap_delta_gb": 0.0, "min_free_pct": 41, "status": "OK", "prompt_tokens": 2299, "prefill_tps": 918.9, "ttft_s": 2.65, "decode_tps": 53.57, "gen_tokens": 128, "needle_ok": true, "degenerate": false} -{"model": "mlx-community/gemma-4-26b-a4b-it-4bit", "config": "TurboKV", "context": 8192, "run": 0, "warmup": false, "peak_gpu_gb": 14.86, "swap_delta_gb": 0.0, "min_free_pct": 42, "status": "OK", "prompt_tokens": 9572, "prefill_tps": 964.6, "ttft_s": null, "decode_tps": null, "gen_tokens": 1, "needle_ok": false, "degenerate": false} +{"model": "mlx-community/gemma-4-26b-a4b-it-4bit", "config": "Vanilla", "context": 512, "run": -1, "warmup": true, "peak_gpu_gb": 14.0, "swap_delta_gb": 0.0, "min_free_pct": 43, "status": "OK", "prompt_tokens": 520, "prefill_tps": 439.0, "ttft_s": 1.21, "decode_tps": 52.63, "gen_tokens": 128, "needle_ok": true, "degenerate": false, "code": "MARLIN-60", "answer_head": "The secret code word is MARLIN-60.\n\nElias Thorne lived in the rhythm of the tides and the mechanical pulse of the Great North Light. For thirty years, the lighthouse had been his only constant companion, a towering sentinel of granite and g"} +{"model": "mlx-community/gemma-4-26b-a4b-it-4bit", "config": "Vanilla", "context": 512, "run": 0, "warmup": false, "peak_gpu_gb": 14.32, "swap_delta_gb": 0.0, "min_free_pct": 44, "status": "OK", "prompt_tokens": 533, "prefill_tps": 733.3, "ttft_s": 0.77, "decode_tps": 52.48, "gen_tokens": 128, "needle_ok": true, "degenerate": false, "code": "MARLIN-23", "answer_head": "The secret code word is: **MARLIN-23**.\n\n***\n\nElias Thorne had lived within the salt-crusted stone walls of the Blackwood Rock Lighthouse for twenty-two years, and in that time, he had learned that the sea was not a thing of water, but a th"} +{"model": "mlx-community/gemma-4-26b-a4b-it-4bit", "config": "Vanilla", "context": 512, "run": 1, "warmup": false, "peak_gpu_gb": 14.48, "swap_delta_gb": 0.0, "min_free_pct": 44, "status": "OK", "prompt_tokens": 542, "prefill_tps": 738.4, "ttft_s": 0.77, "decode_tps": 52.24, "gen_tokens": 128, "needle_ok": true, "degenerate": false, "code": "PELICAN-81", "answer_head": "The secret code word is **PELICAN-81**.\n\n***\n\nElias was a man of rhythm, a man of stone, and a man of salt. For thirty years, he had lived within the circular confines of the Blackwood Rock Lighthouse, a towering sentinel that stood defiant"} +{"model": "mlx-community/gemma-4-26b-a4b-it-4bit", "config": "Vanilla", "context": 512, "run": 2, "warmup": false, "peak_gpu_gb": 14.08, "swap_delta_gb": 0.0, "min_free_pct": 43, "status": "OK", "prompt_tokens": 527, "prefill_tps": 728.6, "ttft_s": 0.76, "decode_tps": 51.88, "gen_tokens": 128, "needle_ok": true, "degenerate": false, "code": "HERON-20", "answer_head": "The secret code word is: **HERON-20**\n\n***\n\nThe salt spray was a constant companion to Elias, a fine mist that clung to his beard and turned the heavy wool of his coat into a weighted-down second skin. He sat in the lantern room of the Blac"} +{"model": "mlx-community/gemma-4-26b-a4b-it-4bit", "config": "Vanilla", "context": 2048, "run": 0, "warmup": false, "peak_gpu_gb": 14.86, "swap_delta_gb": 0.0, "min_free_pct": 40, "status": "OK", "prompt_tokens": 2273, "prefill_tps": 950.7, "ttft_s": 2.46, "decode_tps": 50.07, "gen_tokens": 128, "needle_ok": true, "degenerate": false, "code": "PELICAN-68", "answer_head": "The secret code word is: **PELICAN-68**.\n\n***\n\nThe salt spray was a constant companion to Elias, a fine mist that clung to his beard and turned the heavy wool of his coat into a sodden weight. He sat in the lantern room of the Blackwood Roc"} +{"model": "mlx-community/gemma-4-26b-a4b-it-4bit", "config": "Vanilla", "context": 2048, "run": 1, "warmup": false, "peak_gpu_gb": 14.89, "swap_delta_gb": 0.0, "min_free_pct": 40, "status": "OK", "prompt_tokens": 2288, "prefill_tps": 963.0, "ttft_s": 2.45, "decode_tps": 50.24, "gen_tokens": 128, "needle_ok": true, "degenerate": false, "code": "MARLIN-77", "answer_head": "The secret code word is MARLIN-77.\n\nElias Thorne had lived within the salt-sprayed stone walls of the Blackwood Lighthouse for thirty-two years, a duration that felt less like a career and more like a slow merging of man and masonry. Every "} +{"model": "mlx-community/gemma-4-26b-a4b-it-4bit", "config": "Vanilla", "context": 2048, "run": 2, "warmup": false, "peak_gpu_gb": 14.95, "swap_delta_gb": 0.0, "min_free_pct": 40, "status": "OK", "prompt_tokens": 2284, "prefill_tps": 962.9, "ttft_s": 2.45, "decode_tps": 50.31, "gen_tokens": 128, "needle_ok": true, "degenerate": false, "code": "MARLIN-75", "answer_head": "The secret code word is MARLIN-75.\n\nElias Thorne had lived within the salt-sprayed stone walls of the Blackwood Lighthouse for thirty-two years, a duration that felt less like a career and more like a slow merging of man and masonry. Every "} +{"model": "mlx-community/gemma-4-26b-a4b-it-4bit", "config": "Vanilla", "context": 8192, "run": 0, "warmup": false, "peak_gpu_gb": 15.78, "swap_delta_gb": 0.0, "min_free_pct": 39, "status": "OK", "prompt_tokens": 9528, "prefill_tps": 958.8, "ttft_s": 10.14, "decode_tps": 45.0, "gen_tokens": 128, "needle_ok": true, "degenerate": false, "code": "PELICAN-70", "answer_head": "The secret code word is PELICAN-70.\n\nElias Thorne was a man of salt, iron, and silence. For thirty-two years, he had inhabited the Blackwood Rock Lighthouse, a tapering finger of granite that rose defiantly from the churning Atlantic. His w"} +{"model": "mlx-community/gemma-4-26b-a4b-it-4bit", "config": "Vanilla", "context": 8192, "run": 1, "warmup": false, "peak_gpu_gb": 15.73, "swap_delta_gb": 0.0, "min_free_pct": 40, "status": "OK", "prompt_tokens": 9543, "prefill_tps": 961.0, "ttft_s": 10.14, "decode_tps": 45.26, "gen_tokens": 128, "needle_ok": true, "degenerate": false, "code": "OSPREY-30", "answer_head": "The secret code word is OSPREY-30.\n\nElias Thorne had lived within the salt-sprayed stone walls of the Blackwood Rock Lighthouse for twenty-two years, a duration that felt less like a career and more like a slow, rhythmic merging with the se"} +{"model": "mlx-community/gemma-4-26b-a4b-it-4bit", "config": "Vanilla", "context": 8192, "run": 2, "warmup": false, "peak_gpu_gb": 15.5, "swap_delta_gb": 0.0, "min_free_pct": 40, "status": "OK", "prompt_tokens": 9557, "prefill_tps": 947.5, "ttft_s": 10.3, "decode_tps": 45.09, "gen_tokens": 128, "needle_ok": true, "degenerate": false, "code": "PELICAN-57", "answer_head": "The secret code word is PELICAN-57.\n\nElias Thorne had lived within the salt-crusted stone walls of the Blackwood Lighthouse for thirty-two years, a duration that felt less like a career and more like a slow merging of man and masonry. Every"} +{"model": "mlx-community/gemma-4-26b-a4b-it-4bit", "config": "Vanilla", "context": 32768, "run": 0, "warmup": false, "peak_gpu_gb": 17.91, "swap_delta_gb": 0.0, "min_free_pct": 32, "status": "OK", "prompt_tokens": 39772, "prefill_tps": 756.8, "ttft_s": 53.33, "decode_tps": 31.03, "gen_tokens": 128, "needle_ok": true, "degenerate": false, "code": "OSPREY-28", "answer_head": "The secret code word is: OSPREY-28.\n\nElias Thorne had lived within the salt-sprayed stone walls of the Blackwood Lighthouse for twenty-two years, a duration that felt less like a measurement of time and more like a gradual merging of man an"} +{"model": "mlx-community/gemma-4-26b-a4b-it-4bit", "config": "Vanilla", "context": 65536, "run": 0, "warmup": false, "peak_gpu_gb": 19.48, "swap_delta_gb": 0.0, "min_free_pct": 25, "status": "OK", "prompt_tokens": 80710, "prefill_tps": 621.7, "ttft_s": 131.31, "decode_tps": 24.34, "gen_tokens": 128, "needle_ok": true, "degenerate": false, "code": "OSPREY-54", "answer_head": "The secret code word is **OSPREY-54**.\n\n***\n\nThe brass lantern of the Great North Beacon was a temperamental beast, much like the sea it sought to tame. Elias, a man whose face was etched with as many lines as a nautical chart, polished the"} +{"model": "mlx-community/gemma-4-26b-a4b-it-4bit", "config": "TurboKV", "context": 512, "run": -1, "warmup": true, "peak_gpu_gb": 13.97, "swap_delta_gb": 0.0, "min_free_pct": 43, "status": "OK", "prompt_tokens": 526, "prefill_tps": 582.5, "ttft_s": 0.93, "decode_tps": 52.64, "gen_tokens": 128, "needle_ok": true, "degenerate": false, "code": "MARLIN-41", "answer_head": "The secret code word is MARLIN-41.\n\nElias Thorne had lived within the salt-crusted stone walls of the Blackwood Rock Lighthouse for twenty-two years, a duration that felt less like a span of time and more like a rhythmic breathing of the ti"} +{"model": "mlx-community/gemma-4-26b-a4b-it-4bit", "config": "TurboKV", "context": 512, "run": 0, "warmup": false, "peak_gpu_gb": 14.32, "swap_delta_gb": 0.0, "min_free_pct": 43, "status": "OK", "prompt_tokens": 535, "prefill_tps": 742.1, "ttft_s": 0.76, "decode_tps": 53.17, "gen_tokens": 128, "needle_ok": true, "degenerate": false, "code": "HERON-63", "answer_head": "The secret code word is: **HERON-63**.\n\n***\n\nElias was a man of rhythm, a man who found comfort in the predictable pulse of the world. As the keeper of the Blackwood Reach Lighthouse, his life was measured not by hours, but by the steady ro"} +{"model": "mlx-community/gemma-4-26b-a4b-it-4bit", "config": "TurboKV", "context": 512, "run": 1, "warmup": false, "peak_gpu_gb": 14.36, "swap_delta_gb": 0.0, "min_free_pct": 43, "status": "OK", "prompt_tokens": 531, "prefill_tps": 784.5, "ttft_s": 0.72, "decode_tps": 53.28, "gen_tokens": 128, "needle_ok": true, "degenerate": false, "code": "HERON-89", "answer_head": "The secret code word is: **HERON-89**.\n\n***\n\nElias Thorne had lived in the Blackwood Lighthouse for forty years, and in that time, he had learned that the sea was not a living thing, but a vast, breathing clock. It did not care for the ambi"} +{"model": "mlx-community/gemma-4-26b-a4b-it-4bit", "config": "TurboKV", "context": 512, "run": 2, "warmup": false, "peak_gpu_gb": 14.37, "swap_delta_gb": 0.0, "min_free_pct": 43, "status": "OK", "prompt_tokens": 531, "prefill_tps": 787.0, "ttft_s": 0.71, "decode_tps": 52.88, "gen_tokens": 128, "needle_ok": true, "degenerate": false, "code": "OSPREY-98", "answer_head": "The secret code word is: **OSPREY-98**.\n\n***\n\nThe salt spray was a constant companion to Elias, a fine, abrasive mist that coated the glass of the lantern room and the weathered creases of his face. For thirty years, the Great North Point L"} +{"model": "mlx-community/gemma-4-26b-a4b-it-4bit", "config": "TurboKV", "context": 2048, "run": 0, "warmup": false, "peak_gpu_gb": 14.75, "swap_delta_gb": 0.0, "min_free_pct": 40, "status": "OK", "prompt_tokens": 2279, "prefill_tps": 971.9, "ttft_s": 2.41, "decode_tps": 50.59, "gen_tokens": 128, "needle_ok": true, "degenerate": false, "code": "OSPREY-86", "answer_head": "The secret code word is: OSPREY-86.\n\n***\n\nElias lived in the rhythm of the tides and the mechanical pulse of the Great North Beacon. For forty years, the lighthouse had been his only constant, a towering sentinel of granite and glass perche"} +{"model": "mlx-community/gemma-4-26b-a4b-it-4bit", "config": "TurboKV", "context": 2048, "run": 1, "warmup": false, "peak_gpu_gb": 14.88, "swap_delta_gb": 0.0, "min_free_pct": 40, "status": "OK", "prompt_tokens": 2310, "prefill_tps": 965.8, "ttft_s": 2.46, "decode_tps": 50.46, "gen_tokens": 128, "needle_ok": true, "degenerate": false, "code": "PELICAN-51", "answer_head": "The secret code word is PELICAN-51.\n\nElias Thorne had lived within the salt-sprayed stone walls of the Blackwood Rock Lighthouse for twenty-two years, and in that time, he had learned that the sea did not speak in words, but in rhythms. The"} +{"model": "mlx-community/gemma-4-26b-a4b-it-4bit", "config": "TurboKV", "context": 2048, "run": 2, "warmup": false, "peak_gpu_gb": 14.93, "swap_delta_gb": 0.0, "min_free_pct": 40, "status": "OK", "prompt_tokens": 2298, "prefill_tps": 968.5, "ttft_s": 2.44, "decode_tps": 49.02, "gen_tokens": 128, "needle_ok": true, "degenerate": false, "code": "HERON-43", "answer_head": "The secret code word is HERON-43.\n\nElias Thorne lived in the rhythm of the tides and the mechanical pulse of the Great North Beacon. For thirty years, the lighthouse had been his only constant, a towering sentinel of granite and glass perch"} +{"model": "mlx-community/gemma-4-26b-a4b-it-4bit", "config": "TurboKV", "context": 8192, "run": 0, "warmup": false, "peak_gpu_gb": 15.58, "swap_delta_gb": 0.0, "min_free_pct": 39, "status": "OK", "prompt_tokens": 9571, "prefill_tps": 970.6, "ttft_s": 10.05, "decode_tps": 45.52, "gen_tokens": 128, "needle_ok": true, "degenerate": false, "code": "OSPREY-34", "answer_head": "The secret code word is OSPREY-34.\n\nElias Thorne had lived within the salt-crusted stone walls of the Blackwood Rock Lighthouse for twenty-two years, a duration that felt less like a career and more like a slow, rhythmic merging with the se"} +{"model": "mlx-community/gemma-4-26b-a4b-it-4bit", "config": "TurboKV", "context": 8192, "run": 1, "warmup": false, "peak_gpu_gb": 15.88, "swap_delta_gb": 0.0, "min_free_pct": 39, "status": "OK", "prompt_tokens": 9565, "prefill_tps": 973.2, "ttft_s": 10.03, "decode_tps": 42.01, "gen_tokens": 128, "needle_ok": true, "degenerate": false, "code": "OSPREY-43", "answer_head": "The secret code word is OSPREY-43.\n\nElias Thorne had lived within the salt-sprayed stone walls of the Blackwood Rock Lighthouse for twenty-two years, a duration that felt less like a career and more like a slow, rhythmic merging with the se"} +{"model": "mlx-community/gemma-4-26b-a4b-it-4bit", "config": "TurboKV", "context": 8192, "run": 2, "warmup": false, "peak_gpu_gb": 15.74, "swap_delta_gb": 0.0, "min_free_pct": 39, "status": "OK", "prompt_tokens": 9602, "prefill_tps": 970.0, "ttft_s": 10.1, "decode_tps": 45.62, "gen_tokens": 128, "needle_ok": true, "degenerate": false, "code": "HERON-76", "answer_head": "The secret code word is HERON-76.\n\nElias Thorne had lived within the salt-sprayed stone walls of the Blackwood Lighthouse for thirty-two years, a duration that felt less like a career and more like a slow merging of man and masonry. Every m"} +{"model": "mlx-community/gemma-4-26b-a4b-it-4bit", "config": "TurboKV", "context": 32768, "run": 0, "warmup": false, "peak_gpu_gb": 17.55, "swap_delta_gb": 0.0, "min_free_pct": 32, "status": "OK", "prompt_tokens": 39672, "prefill_tps": 786.6, "ttft_s": 51.13, "decode_tps": 31.47, "gen_tokens": 128, "needle_ok": true, "degenerate": false, "code": "MARLIN-59", "answer_head": "The secret code word is MARLIN-59.\n\nElias Thorne had lived within the salt-crusted stone walls of the Blackwood Rock Lighthouse for twenty-two years, a duration that felt less like a measurement of time and more like a slow, rhythmic breath"} +{"model": "mlx-community/gemma-4-26b-a4b-it-4bit", "config": "TurboKV", "context": 65536, "run": 0, "warmup": false, "peak_gpu_gb": 19.28, "swap_delta_gb": 0.0, "min_free_pct": 26, "status": "OK", "prompt_tokens": 80922, "prefill_tps": 630.3, "ttft_s": 129.75, "decode_tps": 24.51, "gen_tokens": 128, "needle_ok": true, "degenerate": false, "code": "HERON-75", "answer_head": "The secret code word is **HERON-75**.\n\n***\n\nThe brass lantern of the Great North Beacon did not merely shine; it breathed. For Elias, a man whose skin had become as weathered and salt-crusted as the driftwood on the shores of Oakhaven, the "} diff --git a/docs/profiling/m6/gemma4_26b_a4b_4bit.md b/docs/profiling/m6/gemma4_26b_a4b_4bit.md index 64bed80..bdfd4e2 100644 --- a/docs/profiling/m6/gemma4_26b_a4b_4bit.md +++ b/docs/profiling/m6/gemma4_26b_a4b_4bit.md @@ -4,14 +4,14 @@ Apple M6 · 32 GB · runs=3 (long=1) · warmup=1 · gen=128 · temperature 0 · | Config | Context (prompt tok) | Prefill tok/s | TTFT s | Decode tok/s | Peak GPU GB | Swap Δ GB | Min free % | Checks | |---|---|---|---|---|---|---|---|---| -| Vanilla | 512 (534) | 858.5 | 0.68 | 53.27 | 15.15 | 0.0 | 43 | ok | -| Vanilla | 2048 (2285) | 997.6 | 2.38 | 50.08 | 15.78 | 0.0 | 40 | ok | -| Vanilla | 8192 (9544) | 913.7 | 10.67 | 44.93 | 16.54 | 0.0 | 37 | ok | -| Vanilla | 32768 (39773) | 749.6 | 53.9 | 31.44 | 19.13 | 0.0 | 33 | ok | -| Vanilla | 65536 (80711) | 625.1 | 130.63 | 21.83 | 20.19 | 0.0 | 18 | ok | -| TurboKV | 512 (532) | 882.9 | 0.65 | 53.13 | 15.02 | 0.0 | 44 | ok | -| TurboKV | 2048 (2299) | 918.9 | 2.65 | 53.22 | 15.77 | 0.0 | 41 | needle 1/3, degen 0 | -| TurboKV | 8192 | — | — | — | 0.35 | 0.0 | 87 | **REQUEST_FAIL** | -| TurboKV | 32768 | — | — | — | — | — | — | **SKIPPED_AFTER_ABORT** | -| TurboKV | 65536 | — | — | — | — | — | — | **SKIPPED_AFTER_ABORT** | +| Vanilla | 512 (533) | 733.3 | 0.77 | 52.24 | 14.48 | 0.0 | 43 | ok | +| Vanilla | 2048 (2284) | 962.9 | 2.45 | 50.24 | 14.95 | 0.0 | 40 | ok | +| Vanilla | 8192 (9543) | 958.8 | 10.14 | 45.09 | 15.78 | 0.0 | 39 | ok | +| Vanilla | 32768 (39772) | 756.8 | 53.33 | 31.03 | 17.91 | 0.0 | 32 | ok | +| Vanilla | 65536 (80710) | 621.7 | 131.31 | 24.34 | 19.48 | 0.0 | 25 | ok | +| TurboKV | 512 (531) | 784.5 | 0.72 | 53.17 | 14.37 | 0.0 | 43 | ok | +| TurboKV | 2048 (2298) | 968.5 | 2.44 | 50.46 | 14.93 | 0.0 | 40 | ok | +| TurboKV | 8192 (9571) | 970.6 | 10.05 | 45.52 | 15.88 | 0.0 | 39 | ok | +| TurboKV | 32768 (39672) | 786.6 | 51.13 | 31.47 | 17.55 | 0.0 | 32 | ok | +| TurboKV | 65536 (80922) | 630.3 | 129.75 | 24.51 | 19.28 | 0.0 | 26 | ok | | MTP | None | — | — | — | — | — | — | **START_FAIL** | diff --git a/docs/profiling/m6/gemma4_26b_a4b_4bit_mtp_bf16.jsonl b/docs/profiling/m6/gemma4_26b_a4b_4bit_mtp_bf16.jsonl new file mode 100644 index 0000000..696be97 --- /dev/null +++ b/docs/profiling/m6/gemma4_26b_a4b_4bit_mtp_bf16.jsonl @@ -0,0 +1,20 @@ +{"model": "mlx-community/gemma-4-26b-a4b-it-4bit", "config": "Vanilla", "context": 512, "run": -1, "warmup": true, "peak_gpu_gb": 13.96, "swap_delta_gb": 0.0, "min_free_pct": 45, "status": "OK", "prompt_tokens": 520, "prefill_tps": 636.3, "ttft_s": 0.85, "decode_tps": 53.2, "gen_tokens": 128, "needle_ok": true, "degenerate": false, "code": "MARLIN-60", "answer_head": "The secret code word is MARLIN-60.\n\nElias Thorne lived in the rhythm of the tides and the mechanical pulse of the Great North Light. For thirty years, the lighthouse had been his only constant companion, a towering sentinel of granite and g"} +{"model": "mlx-community/gemma-4-26b-a4b-it-4bit", "config": "Vanilla", "context": 512, "run": 0, "warmup": false, "peak_gpu_gb": 14.27, "swap_delta_gb": 0.0, "min_free_pct": 45, "status": "OK", "prompt_tokens": 533, "prefill_tps": 789.3, "ttft_s": 0.72, "decode_tps": 52.95, "gen_tokens": 128, "needle_ok": true, "degenerate": false, "code": "MARLIN-23", "answer_head": "The secret code word is: **MARLIN-23**.\n\n***\n\nElias Thorne had lived within the salt-crusted stone walls of the Blackwood Rock Lighthouse for twenty-two years, and in that time, he had learned that the sea did not speak in words, but in rhy"} +{"model": "mlx-community/gemma-4-26b-a4b-it-4bit", "config": "Vanilla", "context": 512, "run": 1, "warmup": false, "peak_gpu_gb": 14.5, "swap_delta_gb": 0.0, "min_free_pct": 45, "status": "OK", "prompt_tokens": 542, "prefill_tps": 788.5, "ttft_s": 0.73, "decode_tps": 53.09, "gen_tokens": 128, "needle_ok": true, "degenerate": false, "code": "PELICAN-81", "answer_head": "The secret code word is **PELICAN-81**.\n\n***\n\nThe salt spray was a constant companion to Elias, a fine mist that coated the brass fittings of the lantern room and turned his beard into a coarse, white thicket. He had lived in the Blackwood "} +{"model": "mlx-community/gemma-4-26b-a4b-it-4bit", "config": "Vanilla", "context": 512, "run": 2, "warmup": false, "peak_gpu_gb": 14.1, "swap_delta_gb": 0.0, "min_free_pct": 45, "status": "OK", "prompt_tokens": 527, "prefill_tps": 774.6, "ttft_s": 0.72, "decode_tps": 52.53, "gen_tokens": 128, "needle_ok": true, "degenerate": false, "code": "HERON-20", "answer_head": "The secret code word is **HERON-20**.\n\n***\n\nThe salt spray was a constant companion to Elias, a fine, microscopic mist that coated the brass fittings of the lantern room and settled into the deep creases of his weathered face. He had lived "} +{"model": "mlx-community/gemma-4-26b-a4b-it-4bit", "config": "Vanilla", "context": 2048, "run": 0, "warmup": false, "peak_gpu_gb": 15.14, "swap_delta_gb": 0.0, "min_free_pct": 41, "status": "OK", "prompt_tokens": 2273, "prefill_tps": 971.3, "ttft_s": 2.41, "decode_tps": 50.72, "gen_tokens": 128, "needle_ok": true, "degenerate": false, "code": "PELICAN-68", "answer_head": "The secret code word is: **PELICAN-68**.\n\n***\n\nThe salt spray was a constant companion to Elias, a man whose skin had become as weathered and creased as the driftwood that washed up on the jagged shores of Blackwood Cove. For forty years, h"} +{"model": "mlx-community/gemma-4-26b-a4b-it-4bit", "config": "Vanilla", "context": 2048, "run": 1, "warmup": false, "peak_gpu_gb": 14.89, "swap_delta_gb": 0.0, "min_free_pct": 42, "status": "OK", "prompt_tokens": 2288, "prefill_tps": 974.8, "ttft_s": 2.42, "decode_tps": 50.78, "gen_tokens": 128, "needle_ok": true, "degenerate": false, "code": "MARLIN-77", "answer_head": "The secret code word is MARLIN-77.\n\nElias Thorne had lived within the salt-sprayed stone walls of the Blackwood Lighthouse for thirty-two years, a duration that felt less like a career and more like a slow merging of man and masonry. Every "} +{"model": "mlx-community/gemma-4-26b-a4b-it-4bit", "config": "Vanilla", "context": 2048, "run": 2, "warmup": false, "peak_gpu_gb": 14.91, "swap_delta_gb": 0.0, "min_free_pct": 42, "status": "OK", "prompt_tokens": 2284, "prefill_tps": 975.0, "ttft_s": 2.41, "decode_tps": 50.76, "gen_tokens": 128, "needle_ok": true, "degenerate": false, "code": "MARLIN-75", "answer_head": "The secret code word is MARLIN-75.\n\nElias Thorne had lived within the salt-sprayed stone walls of the Blackwood Lighthouse for thirty-two years, a duration that felt less like a career and more like a slow merging of man and masonry. Every "} +{"model": "mlx-community/gemma-4-26b-a4b-it-4bit", "config": "Vanilla", "context": 8192, "run": 0, "warmup": false, "peak_gpu_gb": 16.6, "swap_delta_gb": 0.0, "min_free_pct": 41, "status": "OK", "prompt_tokens": 9528, "prefill_tps": 972.9, "ttft_s": 9.99, "decode_tps": 45.96, "gen_tokens": 128, "needle_ok": true, "degenerate": false, "code": "PELICAN-70", "answer_head": "The secret code word is PELICAN-70.\n\n***\n\nElias Thorne lived in the rhythm of the tides and the heavy, rhythmic pulse of the Great North Beacon. For forty years, the lighthouse had been his only constant, a towering sentinel of granite and "} +{"model": "mlx-community/gemma-4-26b-a4b-it-4bit", "config": "Vanilla", "context": 8192, "run": 1, "warmup": false, "peak_gpu_gb": 16.71, "swap_delta_gb": 0.0, "min_free_pct": 41, "status": "OK", "prompt_tokens": 9543, "prefill_tps": 972.3, "ttft_s": 10.01, "decode_tps": 45.93, "gen_tokens": 128, "needle_ok": true, "degenerate": false, "code": "OSPREY-30", "answer_head": "The secret code word is OSPREY-30.\n\nElias Thorne had lived in the Blackwood Rock Lighthouse for twenty-two years, a duration that felt less like a span of time and more like a slow, rhythmic breathing of the sea. The tower was a salt-cruste"} +{"model": "mlx-community/gemma-4-26b-a4b-it-4bit", "config": "Vanilla", "context": 8192, "run": 2, "warmup": false, "peak_gpu_gb": 15.43, "swap_delta_gb": 0.0, "min_free_pct": 41, "status": "OK", "prompt_tokens": 9557, "prefill_tps": 966.6, "ttft_s": 10.09, "decode_tps": 46.06, "gen_tokens": 128, "needle_ok": true, "degenerate": false, "code": "PELICAN-57", "answer_head": "The secret code word is PELICAN-57.\n\nElias Thorne had lived within the salt-sprayed stone walls of the Blackwood Lighthouse for thirty-two years, a duration that felt less like a career and more like a slow merging of man and masonry. Every"} +{"model": "mlx-community/gemma-4-26b-a4b-it-4bit", "config": "MTP-bf16", "context": 512, "run": -1, "warmup": true, "peak_gpu_gb": 16.26, "swap_delta_gb": 0.0, "min_free_pct": 40, "status": "OK", "prompt_tokens": 542, "prefill_tps": 608.5, "ttft_s": 0.92, "decode_tps": 44.83, "gen_tokens": 128, "needle_ok": true, "degenerate": false, "code": "OSPREY-28", "answer_head": "The secret code word is OSPREY-28.\n\nElias Thorne had lived within the salt-crusted stone walls of the Blackwood Rock Lighthouse for twenty-two years, and in that time, he had learned that silence was not the absence of sound, but the presen"} +{"model": "mlx-community/gemma-4-26b-a4b-it-4bit", "config": "MTP-bf16", "context": 512, "run": 0, "warmup": false, "peak_gpu_gb": 16.28, "swap_delta_gb": 0.0, "min_free_pct": 40, "status": "OK", "prompt_tokens": 536, "prefill_tps": 791.9, "ttft_s": 0.71, "decode_tps": 46.67, "gen_tokens": 128, "needle_ok": true, "degenerate": false, "code": "HERON-93", "answer_head": "The secret code word is HERON-93.\n\nElias Thorne lived in the rhythm of the tides and the mechanical pulse of the Great North Light. For thirty years, the lighthouse had been his only constant, a towering sentinel of white stone perched prec"} +{"model": "mlx-community/gemma-4-26b-a4b-it-4bit", "config": "MTP-bf16", "context": 512, "run": 1, "warmup": false, "peak_gpu_gb": 16.33, "swap_delta_gb": 0.0, "min_free_pct": 40, "status": "OK", "prompt_tokens": 519, "prefill_tps": 892.2, "ttft_s": 0.63, "decode_tps": 43.59, "gen_tokens": 128, "needle_ok": true, "degenerate": false, "code": "PELICAN-98", "answer_head": "The secret code word is PELICAN-98.\n\nElias Thorne had lived within the salt-crusted stone walls of the Blackwood Rock Lighthouse for twenty-two years, and in that time, he had learned that silence was not the absence of sound, but the prese"} +{"model": "mlx-community/gemma-4-26b-a4b-it-4bit", "config": "MTP-bf16", "context": 512, "run": 2, "warmup": false, "peak_gpu_gb": 16.26, "swap_delta_gb": 0.0, "min_free_pct": 40, "status": "OK", "prompt_tokens": 522, "prefill_tps": 750.0, "ttft_s": 0.73, "decode_tps": 45.18, "gen_tokens": 128, "needle_ok": true, "degenerate": false, "code": "PELICAN-97", "answer_head": "The secret code word is PELICAN-97.\n\nElias Thorne had lived within the salt-crusted stone walls of the Blackwood Rock Lighthouse for twenty-two years, and in that time, he had learned that silence was not the absence of sound, but the prese"} +{"model": "mlx-community/gemma-4-26b-a4b-it-4bit", "config": "MTP-bf16", "context": 2048, "run": 0, "warmup": false, "peak_gpu_gb": 15.74, "swap_delta_gb": 0.0, "min_free_pct": 42, "status": "OK", "prompt_tokens": 2286, "prefill_tps": 983.6, "ttft_s": 2.4, "decode_tps": 35.63, "gen_tokens": 128, "needle_ok": true, "degenerate": false, "code": "HERON-48", "answer_head": "The secret code word is HERON-48.\n\nElias Thorne lived in the rhythm of the tides and the Great Crag Lighthouse were separated entities, linked to the other only by the salt spray and the heavy, rotating beam that cut through the Atlantic wi"} +{"model": "mlx-community/gemma-4-26b-a4b-it-4bit", "config": "MTP-bf16", "context": 2048, "run": 1, "warmup": false, "peak_gpu_gb": 16.3, "swap_delta_gb": 0.0, "min_free_pct": 42, "status": "OK", "prompt_tokens": 2293, "prefill_tps": 972.0, "ttft_s": 2.43, "decode_tps": 35.34, "gen_tokens": 128, "needle_ok": true, "degenerate": false, "code": "MARLIN-82", "answer_head": "The secret code word is MARLIN-82.\n\nElias Thorne had lived within the salt spray and the rhythmic pulse of the Great Lens for forty-year stretch. To were calloused, mapped of deep in his once, but now they were etched history he sea. Every "} +{"model": "mlx-community/gemma-4-26b-a4b-it-4bit", "config": "MTP-bf16", "context": 2048, "run": 2, "warmup": false, "peak_gpu_gb": 16.06, "swap_delta_gb": 0.0, "min_free_pct": 43, "status": "OK", "prompt_tokens": 2263, "prefill_tps": 973.5, "ttft_s": 2.39, "decode_tps": 36.23, "gen_tokens": 128, "needle_ok": true, "degenerate": false, "code": "OSPREY-42", "answer_head": "OSPREY-42\n\nElias Thorne\u2019s lighthouse for forty years, and in many ways, the stone and salt was the only heartbeat he truly understand. Every morning, before the sun had even begun to crest of the Atlantic, Elias the spiral staircase, his bo"} +{"model": "mlx-community/gemma-4-26b-a4b-it-4bit", "config": "MTP-bf16", "context": 8192, "run": 0, "warmup": false, "peak_gpu_gb": 16.66, "swap_delta_gb": 0.0, "min_free_pct": 38, "status": "OK", "prompt_tokens": 9582, "prefill_tps": 966.5, "ttft_s": 10.11, "decode_tps": 29.9, "gen_tokens": 128, "needle_ok": true, "degenerate": false, "code": "OSPREY-72", "answer_head": "The secret code word is OSPREY-72.\n\nElias had been his entire life, a weathered by salt and the relentless, rhythmic pulse of the Atlantic. Forged in the spray, and his only constant, a low growl that spoke of the deep. Every evening, and n"} +{"model": "mlx-community/gemma-4-26b-a4b-it-4bit", "config": "MTP-bf16", "context": 8192, "run": 1, "warmup": false, "peak_gpu_gb": 16.65, "swap_delta_gb": 0.0, "min_free_pct": 38, "status": "OK", "prompt_tokens": 9552, "prefill_tps": 955.0, "ttft_s": 10.2, "decode_tps": 30.35, "gen_tokens": 128, "needle_ok": true, "degenerate": false, "code": "PELICAN-50", "answer_head": "The secret code word is PELICAN-50.\n\nElias was a man of salt, stone, and silence that follows of a great distance. For thirty, he had been the sole of the Blackwood Rock-bound to a tooth of the coast. He lived in a world of rhythmic pulses "} +{"model": "mlx-community/gemma-4-26b-a4b-it-4bit", "config": "MTP-bf16", "context": 8192, "run": 2, "warmup": false, "peak_gpu_gb": 16.61, "swap_delta_gb": 0.0, "min_free_pct": 38, "status": "OK", "prompt_tokens": 9487, "prefill_tps": 951.2, "ttft_s": 10.17, "decode_tps": 30.82, "gen_tokens": 128, "needle_ok": true, "degenerate": false, "code": "HERON-38", "answer_head": "The secret code word is HERON-38.\n\nElias Thorne had lived within the salt spray and the rhythmic pulse of the Great Lens for forty-year stretch. To the villagers in the valley, he was a ghost story and shadow and stone and sea. He was a man"} diff --git a/docs/profiling/m6/gemma4_26b_a4b_4bit_mtp_bf16.md b/docs/profiling/m6/gemma4_26b_a4b_4bit_mtp_bf16.md new file mode 100644 index 0000000..a3d73f0 --- /dev/null +++ b/docs/profiling/m6/gemma4_26b_a4b_4bit_mtp_bf16.md @@ -0,0 +1,12 @@ +### `mlx-community/gemma-4-26b-a4b-it-4bit` + +Apple M6 · 32 GB · runs=3 (long=1) · warmup=1 · gen=128 · temperature 0 · medians + +| Config | Context (prompt tok) | Prefill tok/s | TTFT s | Decode tok/s | Peak GPU GB | Swap Δ GB | Min free % | Checks | +|---|---|---|---|---|---|---|---|---| +| Vanilla | 512 (533) | 788.5 | 0.72 | 52.95 | 14.5 | 0.0 | 45 | ok | +| Vanilla | 2048 (2284) | 974.8 | 2.41 | 50.76 | 15.14 | 0.0 | 41 | ok | +| Vanilla | 8192 (9543) | 972.3 | 10.01 | 45.96 | 16.71 | 0.0 | 41 | ok | +| MTP-bf16 | 512 (522) | 791.9 | 0.71 | 45.18 | 16.33 | 0.0 | 40 | ok | +| MTP-bf16 | 2048 (2286) | 973.5 | 2.4 | 35.63 | 16.3 | 0.0 | 42 | ok | +| MTP-bf16 | 8192 (9552) | 955.0 | 10.17 | 30.35 | 16.66 | 0.0 | 38 | ok | diff --git a/docs/profiling/m6/qwen38_27b_4bit.jsonl b/docs/profiling/m6/qwen38_27b_4bit.jsonl index 736e2e3..909062e 100644 --- a/docs/profiling/m6/qwen38_27b_4bit.jsonl +++ b/docs/profiling/m6/qwen38_27b_4bit.jsonl @@ -1,22 +1,22 @@ -{"model": "mlx-community/Qwen3.8-27B-4bit", "config": "Vanilla", "context": 512, "run": -1, "warmup": true, "peak_gpu_gb": 16.22, "swap_delta_gb": 0.0, "min_free_pct": 39, "status": "OK", "prompt_tokens": 527, "prefill_tps": 88.5, "ttft_s": 5.97, "decode_tps": 8.74, "gen_tokens": 128, "needle_ok": true, "degenerate": false} -{"model": "mlx-community/Qwen3.8-27B-4bit", "config": "Vanilla", "context": 512, "run": 0, "warmup": false, "peak_gpu_gb": 16.45, "swap_delta_gb": 0.0, "min_free_pct": 40, "status": "OK", "prompt_tokens": 548, "prefill_tps": 98.3, "ttft_s": 5.59, "decode_tps": 9.14, "gen_tokens": 128, "needle_ok": true, "degenerate": false} -{"model": "mlx-community/Qwen3.8-27B-4bit", "config": "Vanilla", "context": 512, "run": 1, "warmup": false, "peak_gpu_gb": 16.07, "swap_delta_gb": 0.0, "min_free_pct": 42, "status": "OK", "prompt_tokens": 560, "prefill_tps": 105.3, "ttft_s": 5.33, "decode_tps": 9.17, "gen_tokens": 128, "needle_ok": true, "degenerate": false} -{"model": "mlx-community/Qwen3.8-27B-4bit", "config": "Vanilla", "context": 512, "run": 2, "warmup": false, "peak_gpu_gb": 16.12, "swap_delta_gb": 0.0, "min_free_pct": 42, "status": "OK", "prompt_tokens": 541, "prefill_tps": 105.2, "ttft_s": 5.16, "decode_tps": 9.04, "gen_tokens": 128, "needle_ok": true, "degenerate": false} -{"model": "mlx-community/Qwen3.8-27B-4bit", "config": "Vanilla", "context": 2048, "run": 0, "warmup": false, "peak_gpu_gb": 16.15, "swap_delta_gb": 0.0, "min_free_pct": 41, "status": "OK", "prompt_tokens": 2336, "prefill_tps": 108.2, "ttft_s": 21.62, "decode_tps": 8.83, "gen_tokens": 128, "needle_ok": true, "degenerate": false} -{"model": "mlx-community/Qwen3.8-27B-4bit", "config": "Vanilla", "context": 2048, "run": 1, "warmup": false, "peak_gpu_gb": 15.64, "swap_delta_gb": 0.0, "min_free_pct": 43, "status": "OK", "prompt_tokens": 2350, "prefill_tps": 108.5, "ttft_s": 21.69, "decode_tps": 8.99, "gen_tokens": 128, "needle_ok": true, "degenerate": false} -{"model": "mlx-community/Qwen3.8-27B-4bit", "config": "Vanilla", "context": 2048, "run": 2, "warmup": false, "peak_gpu_gb": 15.98, "swap_delta_gb": 0.0, "min_free_pct": 43, "status": "OK", "prompt_tokens": 2346, "prefill_tps": 108.2, "ttft_s": 21.72, "decode_tps": 8.84, "gen_tokens": 128, "needle_ok": true, "degenerate": false} -{"model": "mlx-community/Qwen3.8-27B-4bit", "config": "Vanilla", "context": 8192, "run": 0, "warmup": false, "peak_gpu_gb": 16.68, "swap_delta_gb": 0.0, "min_free_pct": 37, "status": "OK", "prompt_tokens": 9798, "prefill_tps": 102.8, "ttft_s": 95.39, "decode_tps": 8.75, "gen_tokens": 128, "needle_ok": true, "degenerate": false} -{"model": "mlx-community/Qwen3.8-27B-4bit", "config": "Vanilla", "context": 8192, "run": 1, "warmup": false, "peak_gpu_gb": 16.38, "swap_delta_gb": 0.0, "min_free_pct": 33, "status": "OK", "prompt_tokens": 9809, "prefill_tps": 96.3, "ttft_s": 101.9, "decode_tps": 8.35, "gen_tokens": 128, "needle_ok": true, "degenerate": false} -{"model": "mlx-community/Qwen3.8-27B-4bit", "config": "Vanilla", "context": 8192, "run": 2, "warmup": false, "peak_gpu_gb": 16.58, "swap_delta_gb": 0.0, "min_free_pct": 35, "status": "OK", "prompt_tokens": 9829, "prefill_tps": 96.1, "ttft_s": 102.32, "decode_tps": 8.57, "gen_tokens": 128, "needle_ok": true, "degenerate": false} -{"model": "mlx-community/Qwen3.8-27B-4bit", "config": "Vanilla", "context": 32768, "run": 0, "warmup": false, "peak_gpu_gb": 19.56, "swap_delta_gb": 0.7, "min_free_pct": 27, "status": "OK", "prompt_tokens": 40829, "prefill_tps": 88.2, "ttft_s": 463.18, "decode_tps": 7.92, "gen_tokens": 128, "needle_ok": true, "degenerate": false} -{"model": "mlx-community/Qwen3.8-27B-4bit", "config": "TurboKV", "context": 512, "run": -1, "warmup": true, "peak_gpu_gb": 16.28, "swap_delta_gb": 0.0, "min_free_pct": 38, "status": "OK", "prompt_tokens": 542, "prefill_tps": 88.5, "ttft_s": 6.14, "decode_tps": 9.24, "gen_tokens": 128, "needle_ok": true, "degenerate": false} -{"model": "mlx-community/Qwen3.8-27B-4bit", "config": "TurboKV", "context": 512, "run": 0, "warmup": false, "peak_gpu_gb": 16.46, "swap_delta_gb": 0.0, "min_free_pct": 40, "status": "OK", "prompt_tokens": 548, "prefill_tps": 102.1, "ttft_s": 5.39, "decode_tps": 9.3, "gen_tokens": 128, "needle_ok": true, "degenerate": false} -{"model": "mlx-community/Qwen3.8-27B-4bit", "config": "TurboKV", "context": 512, "run": 1, "warmup": false, "peak_gpu_gb": 16.47, "swap_delta_gb": 0.0, "min_free_pct": 41, "status": "OK", "prompt_tokens": 534, "prefill_tps": 101.1, "ttft_s": 5.3, "decode_tps": 9.26, "gen_tokens": 128, "needle_ok": true, "degenerate": false} -{"model": "mlx-community/Qwen3.8-27B-4bit", "config": "TurboKV", "context": 512, "run": 2, "warmup": false, "peak_gpu_gb": 16.5, "swap_delta_gb": 0.0, "min_free_pct": 40, "status": "OK", "prompt_tokens": 549, "prefill_tps": 102.7, "ttft_s": 5.36, "decode_tps": 9.26, "gen_tokens": 128, "needle_ok": true, "degenerate": false} -{"model": "mlx-community/Qwen3.8-27B-4bit", "config": "TurboKV", "context": 2048, "run": 0, "warmup": false, "peak_gpu_gb": 16.07, "swap_delta_gb": 0.0, "min_free_pct": 42, "status": "OK", "prompt_tokens": 2366, "prefill_tps": 108.3, "ttft_s": 21.88, "decode_tps": 9.2, "gen_tokens": 128, "needle_ok": true, "degenerate": false} -{"model": "mlx-community/Qwen3.8-27B-4bit", "config": "TurboKV", "context": 2048, "run": 1, "warmup": false, "peak_gpu_gb": 15.77, "swap_delta_gb": 0.0, "min_free_pct": 43, "status": "OK", "prompt_tokens": 2324, "prefill_tps": 107.9, "ttft_s": 21.58, "decode_tps": 9.15, "gen_tokens": 128, "needle_ok": true, "degenerate": false} -{"model": "mlx-community/Qwen3.8-27B-4bit", "config": "TurboKV", "context": 2048, "run": 2, "warmup": false, "peak_gpu_gb": 15.86, "swap_delta_gb": 0.0, "min_free_pct": 41, "status": "OK", "prompt_tokens": 2356, "prefill_tps": 108.3, "ttft_s": 21.79, "decode_tps": 8.76, "gen_tokens": 128, "needle_ok": true, "degenerate": false} -{"model": "mlx-community/Qwen3.8-27B-4bit", "config": "TurboKV", "context": 8192, "run": 0, "warmup": false, "peak_gpu_gb": 16.57, "swap_delta_gb": 0.0, "min_free_pct": 34, "status": "OK", "prompt_tokens": 9811, "prefill_tps": 98.2, "ttft_s": 99.97, "decode_tps": 8.7, "gen_tokens": 128, "needle_ok": true, "degenerate": false} -{"model": "mlx-community/Qwen3.8-27B-4bit", "config": "TurboKV", "context": 8192, "run": 1, "warmup": false, "peak_gpu_gb": 16.82, "swap_delta_gb": 0.0, "min_free_pct": 38, "status": "OK", "prompt_tokens": 9810, "prefill_tps": 100.7, "ttft_s": 97.47, "decode_tps": 8.29, "gen_tokens": 128, "needle_ok": true, "degenerate": false} -{"model": "mlx-community/Qwen3.8-27B-4bit", "config": "TurboKV", "context": 8192, "run": 2, "warmup": false, "peak_gpu_gb": 16.45, "swap_delta_gb": 0.0, "min_free_pct": 33, "status": "OK", "prompt_tokens": 9872, "prefill_tps": 96.2, "ttft_s": 102.69, "decode_tps": 7.92, "gen_tokens": 128, "needle_ok": true, "degenerate": false} -{"model": "mlx-community/Qwen3.8-27B-4bit", "config": "TurboKV", "context": 32768, "run": 0, "warmup": false, "peak_gpu_gb": 19.56, "swap_delta_gb": 1.52, "min_free_pct": 32, "status": "OK", "prompt_tokens": 40806, "prefill_tps": 85.1, "ttft_s": 479.54, "decode_tps": 7.29, "gen_tokens": 128, "needle_ok": true, "degenerate": false} +{"model": "mlx-community/Qwen3.8-27B-4bit", "config": "Vanilla", "context": 512, "run": -1, "warmup": true, "peak_gpu_gb": 14.72, "swap_delta_gb": 0.0, "min_free_pct": 44, "status": "OK", "prompt_tokens": 527, "prefill_tps": 232.5, "ttft_s": 2.27, "decode_tps": 9.29, "gen_tokens": 128, "needle_ok": true, "degenerate": false, "code": "MARLIN-60", "answer_head": "The secret code word is **MARLIN-60**.\n\nThe fog rolled in thick and heavy, swallowing the horizon until the world was nothing but a gray, humming void. Elias, the lighthouse keeper, stood on the gallery of the Ironclad Point Light, his brea"} +{"model": "mlx-community/Qwen3.8-27B-4bit", "config": "Vanilla", "context": 512, "run": 0, "warmup": false, "peak_gpu_gb": 15.19, "swap_delta_gb": 0.0, "min_free_pct": 43, "status": "OK", "prompt_tokens": 548, "prefill_tps": 233.1, "ttft_s": 2.37, "decode_tps": 9.28, "gen_tokens": 128, "needle_ok": true, "degenerate": false, "code": "MARLIN-23", "answer_head": "The secret code word is MARLIN-23.\n\nElias had kept the lighthouse on the jagged tip of Blackrock Point for thirty years, a tenure that had worn the salt into his very bones. The light, a massive Fresnel lens that swept the dark ocean in a r"} +{"model": "mlx-community/Qwen3.8-27B-4bit", "config": "Vanilla", "context": 512, "run": 1, "warmup": false, "peak_gpu_gb": 15.22, "swap_delta_gb": 0.0, "min_free_pct": 43, "status": "OK", "prompt_tokens": 560, "prefill_tps": 236.2, "ttft_s": 2.38, "decode_tps": 9.21, "gen_tokens": 128, "needle_ok": true, "degenerate": false, "code": "PELICAN-81", "answer_head": "The secret code word is PELICAN-81.\n\nElias had kept the lighthouse on Blackrock Point for thirty years, a tenure that had worn the salt into his very bones. The light, a massive Fresnel lens that swept the dark ocean in a rhythmic, hypnotic"} +{"model": "mlx-community/Qwen3.8-27B-4bit", "config": "Vanilla", "context": 512, "run": 2, "warmup": false, "peak_gpu_gb": 14.78, "swap_delta_gb": 0.0, "min_free_pct": 43, "status": "OK", "prompt_tokens": 541, "prefill_tps": 231.7, "ttft_s": 2.35, "decode_tps": 9.27, "gen_tokens": 128, "needle_ok": true, "degenerate": false, "code": "HERON-20", "answer_head": "The secret code word is HERON-20.\n\nElias had kept the lighthouse on the jagged tip of Blackwood Point for thirty years, a tenure that had worn the salt into his very bones. The tower stood like a white bone against the dark, churning sea, a"} +{"model": "mlx-community/Qwen3.8-27B-4bit", "config": "Vanilla", "context": 2048, "run": 0, "warmup": false, "peak_gpu_gb": 14.83, "swap_delta_gb": 0.0, "min_free_pct": 44, "status": "OK", "prompt_tokens": 2336, "prefill_tps": 246.7, "ttft_s": 9.5, "decode_tps": 9.14, "gen_tokens": 128, "needle_ok": true, "degenerate": false, "code": "PELICAN-68", "answer_head": "The secret code word is PELICAN-68.\n\nThe fog rolled in thick and heavy, swallowing the horizon until the world was nothing but a gray, humming void. Elias, the lighthouse keeper, stood on the gallery of the Ironclad Point Light, his breath "} +{"model": "mlx-community/Qwen3.8-27B-4bit", "config": "Vanilla", "context": 2048, "run": 1, "warmup": false, "peak_gpu_gb": 15.45, "swap_delta_gb": 0.0, "min_free_pct": 44, "status": "OK", "prompt_tokens": 2350, "prefill_tps": 241.8, "ttft_s": 9.75, "decode_tps": 9.13, "gen_tokens": 128, "needle_ok": true, "degenerate": false, "code": "MARLIN-77", "answer_head": "The secret code word is **MARLIN-77**.\n\nThe fog rolled in thick and heavy, swallowing the jagged cliffs of Blackwood Point until only the rhythmic, deafening crash of the waves remained. Elias, the lighthouse keeper, stood on the gallery de"} +{"model": "mlx-community/Qwen3.8-27B-4bit", "config": "Vanilla", "context": 2048, "run": 2, "warmup": false, "peak_gpu_gb": 16.08, "swap_delta_gb": 0.0, "min_free_pct": 44, "status": "OK", "prompt_tokens": 2346, "prefill_tps": 239.8, "ttft_s": 9.81, "decode_tps": 9.12, "gen_tokens": 128, "needle_ok": true, "degenerate": false, "code": "MARLIN-75", "answer_head": "The secret code word is **MARLIN-75**.\n\nThe fog rolled in thick and heavy, swallowing the horizon until the world was nothing but a gray, humming void. Elias, the lighthouse keeper, stood on the gallery of the Ironclad Point Light, his brea"} +{"model": "mlx-community/Qwen3.8-27B-4bit", "config": "Vanilla", "context": 8192, "run": 0, "warmup": false, "peak_gpu_gb": 16.86, "swap_delta_gb": 0.0, "min_free_pct": 43, "status": "OK", "prompt_tokens": 9798, "prefill_tps": 232.7, "ttft_s": 42.18, "decode_tps": 8.88, "gen_tokens": 128, "needle_ok": true, "degenerate": false, "code": "PELICAN-70", "answer_head": "The secret code word is PELICAN-70.\n\nThe fog rolled in thick and heavy, swallowing the horizon until the world was nothing but a gray, humming void. Elias, the lighthouse keeper, stood on the gallery deck, his breath pluming in the frigid a"} +{"model": "mlx-community/Qwen3.8-27B-4bit", "config": "Vanilla", "context": 8192, "run": 1, "warmup": false, "peak_gpu_gb": 15.89, "swap_delta_gb": 0.0, "min_free_pct": 43, "status": "OK", "prompt_tokens": 9809, "prefill_tps": 237.8, "ttft_s": 41.32, "decode_tps": 8.88, "gen_tokens": 128, "needle_ok": true, "degenerate": false, "code": "OSPREY-30", "answer_head": "The secret code word is OSPREY-30.\n\nThe fog rolled in thick and heavy, swallowing the horizon until the world was nothing but a gray, humming void. Elias, the lighthouse keeper, stood on the gallery deck, his breath pluming in the frigid ai"} +{"model": "mlx-community/Qwen3.8-27B-4bit", "config": "Vanilla", "context": 8192, "run": 2, "warmup": false, "peak_gpu_gb": 15.64, "swap_delta_gb": 0.0, "min_free_pct": 43, "status": "OK", "prompt_tokens": 9829, "prefill_tps": 244.8, "ttft_s": 40.22, "decode_tps": 8.87, "gen_tokens": 128, "needle_ok": true, "degenerate": false, "code": "PELICAN-57", "answer_head": "The secret code word is **PELICAN-57**.\n\nThe fog rolled in thick and heavy, swallowing the horizon until the world was nothing but a gray, humming void. Elias, the lighthouse keeper, stood on the gallery deck, his breath pluming in the cold"} +{"model": "mlx-community/Qwen3.8-27B-4bit", "config": "Vanilla", "context": 32768, "run": 0, "warmup": false, "peak_gpu_gb": 18.43, "swap_delta_gb": 0.0, "min_free_pct": 38, "status": "OK", "prompt_tokens": 40829, "prefill_tps": 200.1, "ttft_s": 204.28, "decode_tps": 7.86, "gen_tokens": 128, "needle_ok": true, "degenerate": false, "code": "OSPREY-28", "answer_head": "The secret code word is OSPREY-28.\n\nElias had spent forty years on the jagged cliffs of Blackwood Point, and in that time, the lighthouse had become less a structure and more a living extension of his own body. The routine was his heartbeat"} +{"model": "mlx-community/Qwen3.8-27B-4bit", "config": "TurboKV", "context": 512, "run": -1, "warmup": true, "peak_gpu_gb": 14.71, "swap_delta_gb": 0.0, "min_free_pct": 43, "status": "OK", "prompt_tokens": 542, "prefill_tps": 230.4, "ttft_s": 2.36, "decode_tps": 9.28, "gen_tokens": 128, "needle_ok": true, "degenerate": false, "code": "OSPREY-54", "answer_head": "The secret code word is OSPREY-54.\n\nElias had kept the lighthouse on Blackrock Point for thirty years, a tenure that had worn the salt into his very bones. The station was a solitary sentinel against the churning gray Atlantic, a place wher"} +{"model": "mlx-community/Qwen3.8-27B-4bit", "config": "TurboKV", "context": 512, "run": 0, "warmup": false, "peak_gpu_gb": 15.16, "swap_delta_gb": 0.0, "min_free_pct": 43, "status": "OK", "prompt_tokens": 548, "prefill_tps": 231.4, "ttft_s": 2.38, "decode_tps": 9.3, "gen_tokens": 128, "needle_ok": true, "degenerate": false, "code": "PELICAN-32", "answer_head": "The secret code word is PELICAN-32.\n\nThe fog rolled in thick and gray, swallowing the horizon until the world outside the lighthouse door ceased to exist. Elias, the keeper, stood on the gallery, his breath pluming in the cold air, watching"} +{"model": "mlx-community/Qwen3.8-27B-4bit", "config": "TurboKV", "context": 512, "run": 1, "warmup": false, "peak_gpu_gb": 14.78, "swap_delta_gb": 0.0, "min_free_pct": 42, "status": "OK", "prompt_tokens": 534, "prefill_tps": 229.6, "ttft_s": 2.34, "decode_tps": 9.29, "gen_tokens": 128, "needle_ok": true, "degenerate": false, "code": "OSPREY-26", "answer_head": "The secret code word is OSPREY-26.\n\nThe fog rolled in thick and gray, swallowing the horizon until the world seemed to shrink to the radius of the lighthouse beam. Elias, the keeper, stood on the gallery, his breath pluming in the cold air,"} +{"model": "mlx-community/Qwen3.8-27B-4bit", "config": "TurboKV", "context": 512, "run": 2, "warmup": false, "peak_gpu_gb": 14.83, "swap_delta_gb": 0.0, "min_free_pct": 43, "status": "OK", "prompt_tokens": 549, "prefill_tps": 233.6, "ttft_s": 2.37, "decode_tps": 9.29, "gen_tokens": 128, "needle_ok": true, "degenerate": false, "code": "HERON-40", "answer_head": "The secret code word is HERON-40.\n\nThe fog rolled in thick and gray, swallowing the horizon until the world was nothing but a white void and the rhythmic, mournful cry of the gulls. Elias, the lighthouse keeper, stood on the gallery of the "} +{"model": "mlx-community/Qwen3.8-27B-4bit", "config": "TurboKV", "context": 2048, "run": 0, "warmup": false, "peak_gpu_gb": 15.39, "swap_delta_gb": 0.0, "min_free_pct": 42, "status": "OK", "prompt_tokens": 2366, "prefill_tps": 266.9, "ttft_s": 8.9, "decode_tps": 9.2, "gen_tokens": 128, "needle_ok": true, "degenerate": false, "code": "OSPREY-75", "answer_head": "The secret code word is OSPREY-75.\n\nThe fog rolled in thick and gray, swallowing the horizon until the world outside the lighthouse door ceased to exist. Elias, the keeper, wiped the condensation from the great glass lens, his breath plumin"} +{"model": "mlx-community/Qwen3.8-27B-4bit", "config": "TurboKV", "context": 2048, "run": 1, "warmup": false, "peak_gpu_gb": 15.5, "swap_delta_gb": 0.0, "min_free_pct": 42, "status": "OK", "prompt_tokens": 2324, "prefill_tps": 261.2, "ttft_s": 8.93, "decode_tps": 9.19, "gen_tokens": 128, "needle_ok": true, "degenerate": false, "code": "MARLIN-96", "answer_head": "The secret code word is **MARLIN-96**.\n\nThe fog rolled in thick and heavy, swallowing the jagged cliffs of Blackrock Point until only the rhythmic, deafening crash of the waves remained. Elias, the lighthouse keeper, wiped the condensation "} +{"model": "mlx-community/Qwen3.8-27B-4bit", "config": "TurboKV", "context": 2048, "run": 2, "warmup": false, "peak_gpu_gb": 15.5, "swap_delta_gb": 0.0, "min_free_pct": 43, "status": "OK", "prompt_tokens": 2356, "prefill_tps": 260.7, "ttft_s": 9.07, "decode_tps": 9.19, "gen_tokens": 128, "needle_ok": true, "degenerate": false, "code": "HERON-55", "answer_head": "The secret code word is HERON-55.\n\nThe fog rolled in thick and gray, swallowing the horizon until the world was nothing but a white void and the rhythmic, mournful cry of the gulls. Elias, the lighthouse keeper, stood on the gallery of the "} +{"model": "mlx-community/Qwen3.8-27B-4bit", "config": "TurboKV", "context": 8192, "run": 0, "warmup": false, "peak_gpu_gb": 15.63, "swap_delta_gb": 0.0, "min_free_pct": 42, "status": "OK", "prompt_tokens": 9811, "prefill_tps": 248.6, "ttft_s": 39.54, "decode_tps": 8.9, "gen_tokens": 128, "needle_ok": true, "degenerate": false, "code": "HERON-51", "answer_head": "The secret code word is HERON-51.\n\nElias had kept the lighthouse on the jagged tip of Blackwood Point for thirty years, a tenure that had worn the salt into his very bones. The light, a massive Fresnel lens that rotated with a hypnotic, mec"} +{"model": "mlx-community/Qwen3.8-27B-4bit", "config": "TurboKV", "context": 8192, "run": 1, "warmup": false, "peak_gpu_gb": 15.9, "swap_delta_gb": 0.0, "min_free_pct": 41, "status": "OK", "prompt_tokens": 9810, "prefill_tps": 250.4, "ttft_s": 39.25, "decode_tps": 8.89, "gen_tokens": 128, "needle_ok": true, "degenerate": false, "code": "MARLIN-58", "answer_head": "The secret code word is **MARLIN-58**.\n\nThe fog rolled in thick and heavy, swallowing the horizon until the world was nothing but a gray, humming void. Elias, the lighthouse keeper, stood on the gallery of the Ironclad Point Light, his brea"} +{"model": "mlx-community/Qwen3.8-27B-4bit", "config": "TurboKV", "context": 8192, "run": 2, "warmup": false, "peak_gpu_gb": 15.34, "swap_delta_gb": 0.0, "min_free_pct": 42, "status": "OK", "prompt_tokens": 9872, "prefill_tps": 252.9, "ttft_s": 39.1, "decode_tps": 8.89, "gen_tokens": 128, "needle_ok": true, "degenerate": false, "code": "PELICAN-41", "answer_head": "The secret code word is **PELICAN-41**.\n\nThe fog rolled in thick and gray, swallowing the horizon until the world was nothing but a white void and the rhythmic, mournful cry of the gulls. Elias, the lighthouse keeper, stood on the gallery o"} +{"model": "mlx-community/Qwen3.8-27B-4bit", "config": "TurboKV", "context": 32768, "run": 0, "warmup": false, "peak_gpu_gb": 16.86, "swap_delta_gb": 0.0, "min_free_pct": 37, "status": "OK", "prompt_tokens": 40806, "prefill_tps": 201.7, "ttft_s": 202.54, "decode_tps": 7.87, "gen_tokens": 128, "needle_ok": true, "degenerate": false, "code": "HERON-53", "answer_head": "The secret code word is HERON-53.\n\nElias had kept the lighthouse on the jagged tip of Cape Morrow for thirty years, a tenure that had worn the smoothness from his face and the color from his hair. The lighthouse, a stark white cylinder agai"} diff --git a/docs/profiling/m6/qwen38_27b_4bit.md b/docs/profiling/m6/qwen38_27b_4bit.md index 59bb76e..8e39692 100644 --- a/docs/profiling/m6/qwen38_27b_4bit.md +++ b/docs/profiling/m6/qwen38_27b_4bit.md @@ -4,11 +4,11 @@ Apple M6 · 32 GB · runs=3 (long=1) · warmup=1 · gen=128 · temperature 0 · | Config | Context (prompt tok) | Prefill tok/s | TTFT s | Decode tok/s | Peak GPU GB | Swap Δ GB | Min free % | Checks | |---|---|---|---|---|---|---|---|---| -| Vanilla | 512 (548) | 105.2 | 5.33 | 9.14 | 16.45 | 0.0 | 40 | ok | -| Vanilla | 2048 (2346) | 108.2 | 21.69 | 8.84 | 16.15 | 0.0 | 41 | ok | -| Vanilla | 8192 (9809) | 96.3 | 101.9 | 8.57 | 16.68 | 0.0 | 33 | ok | -| Vanilla | 32768 (40829) | 88.2 | 463.18 | 7.92 | 19.56 | 0.7 | 27 | ok | -| TurboKV | 512 (548) | 102.1 | 5.36 | 9.26 | 16.5 | 0.0 | 40 | ok | -| TurboKV | 2048 (2356) | 108.3 | 21.79 | 9.15 | 16.07 | 0.0 | 41 | ok | -| TurboKV | 8192 (9811) | 98.2 | 99.97 | 8.29 | 16.82 | 0.0 | 33 | ok | -| TurboKV | 32768 (40806) | 85.1 | 479.54 | 7.29 | 19.56 | 1.52 | 32 | ok | +| Vanilla | 512 (548) | 233.1 | 2.37 | 9.27 | 15.22 | 0.0 | 43 | ok | +| Vanilla | 2048 (2346) | 241.8 | 9.75 | 9.13 | 16.08 | 0.0 | 44 | ok | +| Vanilla | 8192 (9809) | 237.8 | 41.32 | 8.88 | 16.86 | 0.0 | 43 | ok | +| Vanilla | 32768 (40829) | 200.1 | 204.28 | 7.86 | 18.43 | 0.0 | 38 | ok | +| TurboKV | 512 (548) | 231.4 | 2.37 | 9.29 | 15.16 | 0.0 | 42 | ok | +| TurboKV | 2048 (2356) | 261.2 | 8.93 | 9.19 | 15.5 | 0.0 | 42 | ok | +| TurboKV | 8192 (9811) | 250.4 | 39.25 | 8.89 | 15.9 | 0.0 | 41 | ok | +| TurboKV | 32768 (40806) | 201.7 | 202.54 | 7.87 | 16.86 | 0.0 | 37 | ok | diff --git a/scripts/profiling/m6_bench.py b/scripts/profiling/m6_bench.py index c35ad5f..d5f975a 100644 --- a/scripts/profiling/m6_bench.py +++ b/scripts/profiling/m6_bench.py @@ -272,6 +272,8 @@ def main(): gen_tokens=gen_tokens, needle_ok=code in text, degenerate=is_degenerate(text), + code=code, + answer_head=text[:240], # enough to see what a needle miss actually said ) rows.append(row) tag = "warm" if warm else f"run{row['run']}"