SSD tier: parallel demand reads + expert-contiguous TITAN layout (cold 16-slot 8-10 -> 36 tok/s); sim v2 results; probe fix; LOG/DECISIONS
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
30 changed files +827 −18
added
benchmarks/raw/gateC/cold_nvme_laptop/quick_v2.jsonl
+2 −0
@@ -0,0 +1,2 @@ | ||
| 1 | +{"backend": "titan", "capacity": 16, "policy": "lru", "predictor": "none", "m": 8, "prefetch_workers": 2, "nocache": true, "max_tokens": 64, "split": "heldout", "tag": "cold_v2_contig_parallel", "model": "/Users/simon-pierreboucher/.cache/huggingface/hub/models--mlx-community--OLMoE-1B-7B-0125-Instruct-4bit/snapshots/e23844197887b031e7ddddbb0b8959c5a6853a7b", "cmd": "benchmarks/scripts/bench_decode.py --model /Users/simon-pierreboucher/.cache/huggingface/hub/models--mlx-community--OLMoE-1B-7B-0125-Instruct-4bit/snapshots/e23844197887b031e7ddddbb0b8959c5a6853a7b --backend titan --capacity 16 --predictor none --nocache --families general --split heldout --repeats 1 --warmup 0 --max-tokens 64 --tag cold_v2_contig_parallel --out benchmarks/raw/gateC/cold_nvme_laptop/quick_v2.jsonl", "env": {"host": "MacBookPro-de-simon-pierre-2.local", "chip": "Apple M5 Max", "ram_gb": 48, "macos": "27.0", "python": "3.12.13", "mlx": "0.32.4", "mlx_lm": "0.32.2", "numpy": "2.5.4", "git": "8a2444c"}, "seed": 0, "warmup": false, "repeat": 0, "family": "general", "prompt": "Describe the main differences between a Mac Studio and a Mac", "ts": "2026-11-01T01:49:10", "prompt_tokens": 18, "gen_tokens": 64, "ttft_ms": 803.916750010103, "prompt_tps": 22.535348808701784, "gen_tps": 18.323417113767114, "decode_tps_wall": 18.03752965713207, "itl_ms_p50": 53.5679169697687, "itl_ms_p95": 71.37474999763072, "itl_ms_p99": 74.9241670127958, "itl_ms_mean": 55.43996428605169, "total_s": 4.2966345000313595, "peak_mem_gb": 1.829203036, "text": "\n\nMac Studio:\n- More powerful hardware options, including multiple GPUs and more RAM.\n- Higher-end CPU options, often with more cores and higher clock speeds.\n- Larger display with a higher resolution", "cache_hit_rate": 0.4996987346856799, "cache_misses": 4982, "cache_hits": 4976, "stall_s": 2.954887881525792, "hits_device": 0, "layers_complete": 0, "prefetch": null, "ssd_bytes": 17631019008, "ssd_read_s": 8.434191456297413} | |
| 2 | +{"backend": "titan", "capacity": 16, "policy": "lru", "predictor": "none", "m": 8, "prefetch_workers": 2, "nocache": true, "max_tokens": 64, "split": "heldout", "tag": "cold_v2_contig_parallel", "model": "/Users/simon-pierreboucher/.cache/huggingface/hub/models--mlx-community--OLMoE-1B-7B-0125-Instruct-4bit/snapshots/e23844197887b031e7ddddbb0b8959c5a6853a7b", "cmd": "benchmarks/scripts/bench_decode.py --model /Users/simon-pierreboucher/.cache/huggingface/hub/models--mlx-community--OLMoE-1B-7B-0125-Instruct-4bit/snapshots/e23844197887b031e7ddddbb0b8959c5a6853a7b --backend titan --capacity 16 --predictor none --nocache --families general --split heldout --repeats 1 --warmup 0 --max-tokens 64 --tag cold_v2_contig_parallel --out benchmarks/raw/gateC/cold_nvme_laptop/quick_v2.jsonl", "env": {"host": "MacBookPro-de-simon-pierre-2.local", "chip": "Apple M5 Max", "ram_gb": 48, "macos": "27.0", "python": "3.12.13", "mlx": "0.32.4", "mlx_lm": "0.32.2", "numpy": "2.5.4", "git": "8a2444c"}, "seed": 0, "warmup": false, "repeat": 0, "family": "general", "prompt": "Summarize the history of the Rideau Canal in one paragraph.", "ts": "2026-11-01T01:49:14", "prompt_tokens": 14, "gen_tokens": 64, "ttft_ms": 663.5876669315621, "prompt_tps": 21.10723001459196, "gen_tps": 17.82187991563441, "decode_tps_wall": 17.5434704435222, "itl_ms_p50": 56.79500009864569, "itl_ms_p95": 73.50704108830541, "itl_ms_p99": 78.22308293543756, "itl_ms_mean": 57.00126455705021, "total_s": 4.254667334025726, "peak_mem_gb": 1.747773596, "text": "\n\nThe Rideau Canal, officially opened in 1832, was constructed by the British to connect Ottawa to Montreal via the Ottawa River. It was designed by Colonel John By and took approximately three years ", "cache_hit_rate": 0.4795243019648397, "cache_misses": 5033, "cache_hits": 4637, "stall_s": 2.9577913424000144, "hits_device": 0, "layers_complete": 0, "prefetch": null, "ssd_bytes": 17811505152, "ssd_read_s": 8.498102859477513} | |
added
benchmarks/raw/gateC/cold_nvme_laptop/quick_v3.jsonl
+2 −0
@@ -0,0 +1,2 @@ | ||
| 1 | +{"backend": "titan", "capacity": 16, "policy": "lru", "predictor": "none", "m": 8, "prefetch_workers": 2, "nocache": true, "max_tokens": 64, "split": "heldout", "tag": "cold_v3_contig_layout_parallel4", "model": "/Users/simon-pierreboucher/.cache/huggingface/hub/models--mlx-community--OLMoE-1B-7B-0125-Instruct-4bit/snapshots/e23844197887b031e7ddddbb0b8959c5a6853a7b", "cmd": "benchmarks/scripts/bench_decode.py --model /Users/simon-pierreboucher/.cache/huggingface/hub/models--mlx-community--OLMoE-1B-7B-0125-Instruct-4bit/snapshots/e23844197887b031e7ddddbb0b8959c5a6853a7b --backend titan --capacity 16 --predictor none --nocache --families general --split heldout --repeats 1 --warmup 0 --max-tokens 64 --tag cold_v3_contig_layout_parallel4 --out benchmarks/raw/gateC/cold_nvme_laptop/quick_v3.jsonl", "env": {"host": "MacBookPro-de-simon-pierre-2.local", "chip": "Apple M5 Max", "ram_gb": 48, "macos": "27.0", "python": "3.12.13", "mlx": "0.32.4", "mlx_lm": "0.32.2", "numpy": "2.5.4", "git": "8a2444c"}, "seed": 0, "warmup": false, "repeat": 0, "family": "general", "prompt": "Describe the main differences between a Mac Studio and a Mac", "ts": "2026-11-01T01:50:34", "prompt_tokens": 18, "gen_tokens": 64, "ttft_ms": 488.5364999063313, "prompt_tps": 37.24041945787185, "gen_tps": 36.406036799921125, "decode_tps_wall": 35.83867900614282, "itl_ms_p50": 27.031624922528863, "itl_ms_p95": 34.49200000613928, "itl_ms_p99": 36.87300009187311, "itl_ms_mean": 27.90281415865239, "total_s": 2.246413791901432, "peak_mem_gb": 1.829203036, "text": "\n\nMac Studio:\n- More powerful hardware options, including multiple GPUs and more RAM.\n- Higher-end CPU options, often with more cores and higher clock speeds.\n- Larger display with a higher resolution", "cache_hit_rate": 0.4996987346856799, "cache_misses": 4982, "cache_hits": 4976, "stall_s": 1.2363767947535962, "hits_device": 0, "layers_complete": 0, "prefetch": null, "ssd_bytes": 17631019008, "ssd_read_s": 3.280213507357985} | |
| 2 | +{"backend": "titan", "capacity": 16, "policy": "lru", "predictor": "none", "m": 8, "prefetch_workers": 2, "nocache": true, "max_tokens": 64, "split": "heldout", "tag": "cold_v3_contig_layout_parallel4", "model": "/Users/simon-pierreboucher/.cache/huggingface/hub/models--mlx-community--OLMoE-1B-7B-0125-Instruct-4bit/snapshots/e23844197887b031e7ddddbb0b8959c5a6853a7b", "cmd": "benchmarks/scripts/bench_decode.py --model /Users/simon-pierreboucher/.cache/huggingface/hub/models--mlx-community--OLMoE-1B-7B-0125-Instruct-4bit/snapshots/e23844197887b031e7ddddbb0b8959c5a6853a7b --backend titan --capacity 16 --predictor none --nocache --families general --split heldout --repeats 1 --warmup 0 --max-tokens 64 --tag cold_v3_contig_layout_parallel4 --out benchmarks/raw/gateC/cold_nvme_laptop/quick_v3.jsonl", "env": {"host": "MacBookPro-de-simon-pierre-2.local", "chip": "Apple M5 Max", "ram_gb": 48, "macos": "27.0", "python": "3.12.13", "mlx": "0.32.4", "mlx_lm": "0.32.2", "numpy": "2.5.4", "git": "8a2444c"}, "seed": 0, "warmup": false, "repeat": 0, "family": "general", "prompt": "Summarize the history of the Rideau Canal in one paragraph.", "ts": "2026-11-01T01:50:36", "prompt_tokens": 14, "gen_tokens": 64, "ttft_ms": 327.6590419700369, "prompt_tps": 42.770810288913786, "gen_tps": 35.63977846912582, "decode_tps_wall": 35.08310472207398, "itl_ms_p50": 28.59441703185439, "itl_ms_p95": 35.45754204969853, "itl_ms_p99": 37.86633303388953, "itl_ms_mean": 28.503748682504963, "total_s": 2.1233952089678496, "peak_mem_gb": 1.747773596, "text": "\n\nThe Rideau Canal, officially opened in 1832, was constructed by the British to connect Ottawa to Montreal via the Ottawa River. It was designed by Colonel John By and took approximately three years ", "cache_hit_rate": 0.4795243019648397, "cache_misses": 5033, "cache_hits": 4637, "stall_s": 1.1357120022876188, "hits_device": 0, "layers_complete": 0, "prefetch": null, "ssd_bytes": 17811505152, "ssd_read_s": 2.9532211498590186} | |
modified
benchmarks/raw/gateC/cold_nvme_laptop/sweep.jsonl
+7 −3
@@ -1,3 +1,7 @@ | ||
| 1 | −{"backend": "titan", "capacity": 16, "policy": "lru", "predictor": "none", "m": 8, "prefetch_workers": 2, "nocache": true, "max_tokens": 64, "split": "heldout", "tag": "cold_nvme", "model": "/Users/simon-pierreboucher/.cache/huggingface/hub/models--mlx-community--OLMoE-1B-7B-0125-Instruct-4bit/snapshots/e23844197887b031e7ddddbb0b8959c5a6853a7b", "cmd": "benchmarks/scripts/bench_decode.py --model /Users/simon-pierreboucher/.cache/huggingface/hub/models--mlx-community--OLMoE-1B-7B-0125-Instruct-4bit/snapshots/e23844197887b031e7ddddbb0b8959c5a6853a7b --backend titan --capacity 16 --predictor none --m 8 --nocache --traces benchmarks/raw/gateC/traces_olmoe_v2_laptop --families general,code,reasoning --split heldout --repeats 2 --max-tokens 64 --tag cold_nvme --out benchmarks/raw/gateC/cold_nvme_laptop/sweep.jsonl", "env": {"host": "MacBookPro-de-simon-pierre-2.local", "chip": "Apple M5 Max", "ram_gb": 48, "macos": "27.0", "python": "3.12.13", "mlx": "0.32.4", "mlx_lm": "0.32.2", "numpy": "2.5.4", "git": "258ba81"}, "seed": 0, "warmup": true, "repeat": -1, "family": "reasoning", "prompt": "Q: A tank fills in 6 hours with pipe A and 9 hours with pipe", "ts": "2026-11-01T01:47:04", "prompt_tokens": 32, "gen_tokens": 64, "ttft_ms": 3041.2979170214385, "prompt_tps": 10.538982502473754, "gen_tps": 9.615565496623349, "decode_tps_wall": 9.465435344104892, "itl_ms_p50": 102.56666608620435, "itl_ms_p95": 147.70795905496925, "itl_ms_p99": 167.03716607298702, "itl_ms_mean": 105.64754431742051, "total_s": 9.69709320901893, "peak_mem_gb": 2.090173904, "text": "If pipe A fills the tank in 6 hours, then the rate of pipe A is 1 / 6 of the tank per hour. If pipe B fills the tank in 9 hours, then the rate of pipe B is 1 / 9 of the tank per hour. The combined rat", "cache_hit_rate": 0.4844649021864212, "cache_misses": 5824, "cache_hits": 5473, "stall_s": 8.191949911764823, "hits_device": 0, "layers_complete": 0, "prefetch": null, "ssd_bytes": 20610809856, "ssd_read_s": 7.725407627178356} | |
| 2 | −{"backend": "titan", "capacity": 16, "policy": "lru", "predictor": "none", "m": 8, "prefetch_workers": 2, "nocache": true, "max_tokens": 64, "split": "heldout", "tag": "cold_nvme", "model": "/Users/simon-pierreboucher/.cache/huggingface/hub/models--mlx-community--OLMoE-1B-7B-0125-Instruct-4bit/snapshots/e23844197887b031e7ddddbb0b8959c5a6853a7b", "cmd": "benchmarks/scripts/bench_decode.py --model /Users/simon-pierreboucher/.cache/huggingface/hub/models--mlx-community--OLMoE-1B-7B-0125-Instruct-4bit/snapshots/e23844197887b031e7ddddbb0b8959c5a6853a7b --backend titan --capacity 16 --predictor none --m 8 --nocache --traces benchmarks/raw/gateC/traces_olmoe_v2_laptop --families general,code,reasoning --split heldout --repeats 2 --max-tokens 64 --tag cold_nvme --out benchmarks/raw/gateC/cold_nvme_laptop/sweep.jsonl", "env": {"host": "MacBookPro-de-simon-pierre-2.local", "chip": "Apple M5 Max", "ram_gb": 48, "macos": "27.0", "python": "3.12.13", "mlx": "0.32.4", "mlx_lm": "0.32.2", "numpy": "2.5.4", "git": "258ba81"}, "seed": 0, "warmup": true, "repeat": -1, "family": "code", "prompt": "Write a C function that computes the dot product of two floa", "ts": "2026-11-01T01:47:11", "prompt_tokens": 24, "gen_tokens": 64, "ttft_ms": 1772.822791012004, "prompt_tps": 13.540661227523396, "gen_tps": 14.592826924160933, "decode_tps_wall": 14.364850714221733, "itl_ms_p50": 64.1560829244554, "itl_ms_p95": 111.17766599636525, "itl_ms_p99": 147.35658396966755, "itl_ms_mean": 69.61436772955552, "total_s": 6.158527957974002, "peak_mem_gb": 1.930492816, "text": "#include <arm_neon.h>\n\nfloat dot_product_neon(const float *a, const float *b, int len) {\n // TODO: Implement the dot product computation using NEON intrinsics\n // Start by loading the arrays int", "cache_hit_rate": 0.6523887973640856, "cache_misses": 3587, "cache_hits": 6732, "stall_s": 4.940353738376871, "hits_device": 0, "layers_complete": 0, "prefetch": null, "ssd_bytes": 12694192128, "ssd_read_s": 4.6701676497468725} | |
| 3 | −{"backend": "titan", "capacity": 16, "policy": "lru", "predictor": "none", "m": 8, "prefetch_workers": 2, "nocache": true, "max_tokens": 64, "split": "heldout", "tag": "cold_nvme", "model": "/Users/simon-pierreboucher/.cache/huggingface/hub/models--mlx-community--OLMoE-1B-7B-0125-Instruct-4bit/snapshots/e23844197887b031e7ddddbb0b8959c5a6853a7b", "cmd": "benchmarks/scripts/bench_decode.py --model /Users/simon-pierreboucher/.cache/huggingface/hub/models--mlx-community--OLMoE-1B-7B-0125-Instruct-4bit/snapshots/e23844197887b031e7ddddbb0b8959c5a6853a7b --backend titan --capacity 16 --predictor none --m 8 --nocache --traces benchmarks/raw/gateC/traces_olmoe_v2_laptop --families general,code,reasoning --split heldout --repeats 2 --max-tokens 64 --tag cold_nvme --out benchmarks/raw/gateC/cold_nvme_laptop/sweep.jsonl", "env": {"host": "MacBookPro-de-simon-pierre-2.local", "chip": "Apple M5 Max", "ram_gb": 48, "macos": "27.0", "python": "3.12.13", "mlx": "0.32.4", "mlx_lm": "0.32.2", "numpy": "2.5.4", "git": "258ba81"}, "seed": 0, "warmup": true, "repeat": -1, "family": "general", "prompt": "Summarize the history of the Rideau Canal in one paragraph.", "ts": "2026-11-01T01:47:19", "prompt_tokens": 14, "gen_tokens": 64, "ttft_ms": 1448.2218329794705, "prompt_tps": 9.668972925355584, "gen_tps": 9.486046026204507, "decode_tps_wall": 9.337841435614223, "itl_ms_p50": 106.86812503263354, "itl_ms_p95": 156.7806249950081, "itl_ms_p99": 170.41387502104044, "itl_ms_mean": 107.09113095303081, "total_s": 8.194963083020411, "peak_mem_gb": 1.742661784, "text": "\n\nThe Rideau Canal, officially opened in 1832, was constructed by the British to connect Ottawa to Montreal via the Ottawa River. It was designed by Colonel John By and took approximately three years ", "cache_hit_rate": 0.48355739400206826, "cache_misses": 4994, "cache_hits": 4676, "stall_s": 6.844891174114309, "hits_device": 0, "layers_complete": 0, "prefetch": null, "ssd_bytes": 17673486336, "ssd_read_s": 6.502651879563928} | |
| 1 | +{"backend": "titan", "capacity": 16, "policy": "lru", "predictor": "none", "m": 8, "prefetch_workers": 2, "nocache": true, "max_tokens": 64, "split": "heldout", "tag": "cold_nvme", "model": "/Users/simon-pierreboucher/.cache/huggingface/hub/models--mlx-community--OLMoE-1B-7B-0125-Instruct-4bit/snapshots/e23844197887b031e7ddddbb0b8959c5a6853a7b", "cmd": "benchmarks/scripts/bench_decode.py --model /Users/simon-pierreboucher/.cache/huggingface/hub/models--mlx-community--OLMoE-1B-7B-0125-Instruct-4bit/snapshots/e23844197887b031e7ddddbb0b8959c5a6853a7b --backend titan --capacity 16 --predictor none --m 8 --nocache --traces benchmarks/raw/gateC/traces_olmoe_v2_laptop --families general,code,reasoning --split heldout --repeats 2 --max-tokens 64 --tag cold_nvme --out benchmarks/raw/gateC/cold_nvme_laptop/sweep.jsonl", "env": {"host": "MacBookPro-de-simon-pierre-2.local", "chip": "Apple M5 Max", "ram_gb": 48, "macos": "27.0", "python": "3.12.13", "mlx": "0.32.4", "mlx_lm": "0.32.2", "numpy": "2.5.4", "git": "8a2444c"}, "seed": 0, "warmup": true, "repeat": -1, "family": "reasoning", "prompt": "Q: A tank fills in 6 hours with pipe A and 9 hours with pipe", "ts": "2026-11-01T01:50:48", "prompt_tokens": 32, "gen_tokens": 64, "ttft_ms": 692.0957081019878, "prompt_tps": 46.59402246111043, "gen_tps": 36.57738284532069, "decode_tps_wall": 36.007635327202976, "itl_ms_p50": 27.320333058014512, "itl_ms_p95": 33.130957977846265, "itl_ms_p99": 39.143749978393316, "itl_ms_mean": 27.77188757087089, "total_s": 2.441724625066854, "peak_mem_gb": 2.090173904, "text": "If pipe A fills the tank in 6 hours, then the rate of pipe A is 1 / 6 of the tank per hour. If pipe B fills the tank in 9 hours, then the rate of pipe B is 1 / 9 of the tank per hour. The combined rat", "cache_hit_rate": 0.4844649021864212, "cache_misses": 5824, "cache_hits": 5473, "stall_s": 1.3842638342175633, "hits_device": 0, "layers_complete": 0, "prefetch": null, "ssd_bytes": 20610809856, "ssd_read_s": 3.7224394695367664} | |
| 2 | +{"backend": "titan", "capacity": 16, "policy": "lru", "predictor": "none", "m": 8, "prefetch_workers": 2, "nocache": true, "max_tokens": 64, "split": "heldout", "tag": "cold_nvme", "model": "/Users/simon-pierreboucher/.cache/huggingface/hub/models--mlx-community--OLMoE-1B-7B-0125-Instruct-4bit/snapshots/e23844197887b031e7ddddbb0b8959c5a6853a7b", "cmd": "benchmarks/scripts/bench_decode.py --model /Users/simon-pierreboucher/.cache/huggingface/hub/models--mlx-community--OLMoE-1B-7B-0125-Instruct-4bit/snapshots/e23844197887b031e7ddddbb0b8959c5a6853a7b --backend titan --capacity 16 --predictor none --m 8 --nocache --traces benchmarks/raw/gateC/traces_olmoe_v2_laptop --families general,code,reasoning --split heldout --repeats 2 --max-tokens 64 --tag cold_nvme --out benchmarks/raw/gateC/cold_nvme_laptop/sweep.jsonl", "env": {"host": "MacBookPro-de-simon-pierre-2.local", "chip": "Apple M5 Max", "ram_gb": 48, "macos": "27.0", "python": "3.12.13", "mlx": "0.32.4", "mlx_lm": "0.32.2", "numpy": "2.5.4", "git": "8a2444c"}, "seed": 0, "warmup": true, "repeat": -1, "family": "code", "prompt": "Write a C function that computes the dot product of two floa", "ts": "2026-11-01T01:50:50", "prompt_tokens": 24, "gen_tokens": 64, "ttft_ms": 369.74300001747906, "prompt_tps": 64.96787686611094, "gen_tps": 44.10237031807938, "decode_tps_wall": 43.4135612400075, "itl_ms_p50": 22.59599999524653, "itl_ms_p95": 29.346165945753455, "itl_ms_p99": 34.49933393858373, "itl_ms_mean": 23.034277111513628, "total_s": 1.8209024580428377, "peak_mem_gb": 1.9139122, "text": "#include <arm_neon.h>\n\nfloat dot_product_neon(const float *a, const float *b, int len) {\n // TODO: Implement the dot product computation using NEON intrinsics\n // Start by loading the arrays int", "cache_hit_rate": 0.6523887973640856, "cache_misses": 3587, "cache_hits": 6732, "stall_s": 0.9014140029903501, "hits_device": 0, "layers_complete": 0, "prefetch": null, "ssd_bytes": 12694192128, "ssd_read_s": 2.055849175201729} | |
| 3 | +{"backend": "titan", "capacity": 16, "policy": "lru", "predictor": "none", "m": 8, "prefetch_workers": 2, "nocache": true, "max_tokens": 64, "split": "heldout", "tag": "cold_nvme", "model": "/Users/simon-pierreboucher/.cache/huggingface/hub/models--mlx-community--OLMoE-1B-7B-0125-Instruct-4bit/snapshots/e23844197887b031e7ddddbb0b8959c5a6853a7b", "cmd": "benchmarks/scripts/bench_decode.py --model /Users/simon-pierreboucher/.cache/huggingface/hub/models--mlx-community--OLMoE-1B-7B-0125-Instruct-4bit/snapshots/e23844197887b031e7ddddbb0b8959c5a6853a7b --backend titan --capacity 16 --predictor none --m 8 --nocache --traces benchmarks/raw/gateC/traces_olmoe_v2_laptop --families general,code,reasoning --split heldout --repeats 2 --max-tokens 64 --tag cold_nvme --out benchmarks/raw/gateC/cold_nvme_laptop/sweep.jsonl", "env": {"host": "MacBookPro-de-simon-pierre-2.local", "chip": "Apple M5 Max", "ram_gb": 48, "macos": "27.0", "python": "3.12.13", "mlx": "0.32.4", "mlx_lm": "0.32.2", "numpy": "2.5.4", "git": "8a2444c"}, "seed": 0, "warmup": true, "repeat": -1, "family": "general", "prompt": "Summarize the history of the Rideau Canal in one paragraph.", "ts": "2026-11-01T01:50:52", "prompt_tokens": 14, "gen_tokens": 64, "ttft_ms": 316.1524999886751, "prompt_tps": 44.3261007825923, "gen_tps": 37.43535274314916, "decode_tps_wall": 36.85073790399236, "itl_ms_p50": 26.99137502349913, "itl_ms_p95": 33.23575004469603, "itl_ms_p99": 36.866707960143685, "itl_ms_mean": 27.136498666737996, "total_s": 2.025751915993169, "peak_mem_gb": 1.737943192, "text": "\n\nThe Rideau Canal, officially opened in 1832, was constructed by the British to connect Ottawa to Montreal via the Ottawa River. It was designed by Colonel John By and took approximately three years ", "cache_hit_rate": 0.48355739400206826, "cache_misses": 4994, "cache_hits": 4676, "stall_s": 1.0538058636011556, "hits_device": 0, "layers_complete": 0, "prefetch": null, "ssd_bytes": 17673486336, "ssd_read_s": 2.6701927126850933} | |
| 4 | +{"backend": "titan", "capacity": 16, "policy": "lru", "predictor": "none", "m": 8, "prefetch_workers": 2, "nocache": true, "max_tokens": 64, "split": "heldout", "tag": "cold_nvme", "model": "/Users/simon-pierreboucher/.cache/huggingface/hub/models--mlx-community--OLMoE-1B-7B-0125-Instruct-4bit/snapshots/e23844197887b031e7ddddbb0b8959c5a6853a7b", "cmd": "benchmarks/scripts/bench_decode.py --model /Users/simon-pierreboucher/.cache/huggingface/hub/models--mlx-community--OLMoE-1B-7B-0125-Instruct-4bit/snapshots/e23844197887b031e7ddddbb0b8959c5a6853a7b --backend titan --capacity 16 --predictor none --m 8 --nocache --traces benchmarks/raw/gateC/traces_olmoe_v2_laptop --families general,code,reasoning --split heldout --repeats 2 --max-tokens 64 --tag cold_nvme --out benchmarks/raw/gateC/cold_nvme_laptop/sweep.jsonl", "env": {"host": "MacBookPro-de-simon-pierre-2.local", "chip": "Apple M5 Max", "ram_gb": 48, "macos": "27.0", "python": "3.12.13", "mlx": "0.32.4", "mlx_lm": "0.32.2", "numpy": "2.5.4", "git": "8a2444c"}, "seed": 0, "warmup": true, "repeat": -1, "family": "general", "prompt": "Describe the main differences between a Mac Studio and a Mac", "ts": "2026-11-01T01:50:55", "prompt_tokens": 18, "gen_tokens": 64, "ttft_ms": 345.18750000279397, "prompt_tps": 52.19889665094133, "gen_tps": 35.34670805642188, "decode_tps_wall": 34.79462232635829, "itl_ms_p50": 28.336417046375573, "itl_ms_p95": 35.60750000178814, "itl_ms_p99": 37.13658300694078, "itl_ms_mean": 28.74007341193242, "total_s": 2.1558121249545366, "peak_mem_gb": 1.814131732, "text": "\n\nMac Studio:\n- More powerful hardware options, including multiple GPUs and more RAM.\n- Higher-end CPU options, often with more cores and higher clock speeds.\n- Larger display with a higher resolution", "cache_hit_rate": 0.5051215103434424, "cache_misses": 4928, "cache_hits": 5030, "stall_s": 1.1506640871521086, "hits_device": 0, "layers_complete": 0, "prefetch": null, "ssd_bytes": 17439916032, "ssd_read_s": 2.9321806946536526} | |
| 5 | +{"backend": "titan", "capacity": 16, "policy": "lru", "predictor": "none", "m": 8, "prefetch_workers": 2, "nocache": true, "max_tokens": 64, "split": "heldout", "tag": "cold_nvme", "model": "/Users/simon-pierreboucher/.cache/huggingface/hub/models--mlx-community--OLMoE-1B-7B-0125-Instruct-4bit/snapshots/e23844197887b031e7ddddbb0b8959c5a6853a7b", "cmd": "benchmarks/scripts/bench_decode.py --model /Users/simon-pierreboucher/.cache/huggingface/hub/models--mlx-community--OLMoE-1B-7B-0125-Instruct-4bit/snapshots/e23844197887b031e7ddddbb0b8959c5a6853a7b --backend titan --capacity 16 --predictor none --m 8 --nocache --traces benchmarks/raw/gateC/traces_olmoe_v2_laptop --families general,code,reasoning --split heldout --repeats 2 --max-tokens 64 --tag cold_nvme --out benchmarks/raw/gateC/cold_nvme_laptop/sweep.jsonl", "env": {"host": "MacBookPro-de-simon-pierre-2.local", "chip": "Apple M5 Max", "ram_gb": 48, "macos": "27.0", "python": "3.12.13", "mlx": "0.32.4", "mlx_lm": "0.32.2", "numpy": "2.5.4", "git": "8a2444c"}, "seed": 0, "warmup": true, "repeat": -1, "family": "reasoning", "prompt": "Q: What is the smallest positive integer divisible by 2, 3, ", "ts": "2026-11-01T01:50:57", "prompt_tokens": 29, "gen_tokens": 64, "ttft_ms": 420.1389999361709, "prompt_tps": 69.07719609252912, "gen_tps": 37.35810759487954, "decode_tps_wall": 36.77462865794749, "itl_ms_p50": 28.77229091245681, "itl_ms_p95": 33.97729201242328, "itl_ms_p99": 35.62474995851517, "itl_ms_mean": 27.192660714573567, "total_s": 2.1332766249543056, "peak_mem_gb": 1.905393932, "text": "The least common multiple (LCM) of 2, 3, 4, 5, and 6 is the smallest positive integer that is divisible by all of these numbers. The prime factorization of 2 is 2. The prime factorization of 3 is 3. T", "cache_hit_rate": 0.5451856093138658, "cache_misses": 4766, "cache_hits": 5713, "stall_s": 1.1352890465641394, "hits_device": 0, "layers_complete": 0, "prefetch": null, "ssd_bytes": 16866607104, "ssd_read_s": 2.85799129109364} | |
| 6 | +{"backend": "titan", "capacity": 16, "policy": "lru", "predictor": "none", "m": 8, "prefetch_workers": 2, "nocache": true, "max_tokens": 64, "split": "heldout", "tag": "cold_nvme", "model": "/Users/simon-pierreboucher/.cache/huggingface/hub/models--mlx-community--OLMoE-1B-7B-0125-Instruct-4bit/snapshots/e23844197887b031e7ddddbb0b8959c5a6853a7b", "cmd": "benchmarks/scripts/bench_decode.py --model /Users/simon-pierreboucher/.cache/huggingface/hub/models--mlx-community--OLMoE-1B-7B-0125-Instruct-4bit/snapshots/e23844197887b031e7ddddbb0b8959c5a6853a7b --backend titan --capacity 16 --predictor none --m 8 --nocache --traces benchmarks/raw/gateC/traces_olmoe_v2_laptop --families general,code,reasoning --split heldout --repeats 2 --max-tokens 64 --tag cold_nvme --out benchmarks/raw/gateC/cold_nvme_laptop/sweep.jsonl", "env": {"host": "MacBookPro-de-simon-pierre-2.local", "chip": "Apple M5 Max", "ram_gb": 48, "macos": "27.0", "python": "3.12.13", "mlx": "0.32.4", "mlx_lm": "0.32.2", "numpy": "2.5.4", "git": "8a2444c"}, "seed": 0, "warmup": true, "repeat": -1, "family": "code", "prompt": "Write a bash script that lists the ten largest files under a", "ts": "2026-11-01T01:50:58", "prompt_tokens": 19, "gen_tokens": 64, "ttft_ms": 325.22700005210936, "prompt_tps": 58.47830967620645, "gen_tps": 44.22672637332204, "decode_tps_wall": 43.53605355216225, "itl_ms_p50": 21.73804200720042, "itl_ms_p95": 29.404125059954822, "itl_ms_p99": 31.615916988812387, "itl_ms_mean": 22.96946825466991, "total_s": 1.7723035000963137, "peak_mem_gb": 1.773794588, "text": "#!/bin/bash\n\n# Specify the directory\ndir=\"/path/to/directory\"\n\n# Get the size of each file and store it in an array\nfiles=( $(ls -l \"$dir\" | awk '{print $5, $9}') )\n\n# Sort the array", "cache_hit_rate": 0.6699147381242387, "cache_misses": 3252, "cache_hits": 6600, "stall_s": 0.8593332751188427, "hits_device": 0, "layers_complete": 0, "prefetch": null, "ssd_bytes": 11508645888, "ssd_read_s": 1.9043039631797} | |
| 7 | +{"backend": "titan", "capacity": 16, "policy": "lru", "predictor": "none", "m": 8, "prefetch_workers": 2, "nocache": true, "max_tokens": 64, "split": "heldout", "tag": "cold_nvme", "model": "/Users/simon-pierreboucher/.cache/huggingface/hub/models--mlx-community--OLMoE-1B-7B-0125-Instruct-4bit/snapshots/e23844197887b031e7ddddbb0b8959c5a6853a7b", "cmd": "benchmarks/scripts/bench_decode.py --model /Users/simon-pierreboucher/.cache/huggingface/hub/models--mlx-community--OLMoE-1B-7B-0125-Instruct-4bit/snapshots/e23844197887b031e7ddddbb0b8959c5a6853a7b --backend titan --capacity 16 --predictor none --m 8 --nocache --traces benchmarks/raw/gateC/traces_olmoe_v2_laptop --families general,code,reasoning --split heldout --repeats 2 --max-tokens 64 --tag cold_nvme --out benchmarks/raw/gateC/cold_nvme_laptop/sweep.jsonl", "env": {"host": "MacBookPro-de-simon-pierre-2.local", "chip": "Apple M5 Max", "ram_gb": 48, "macos": "27.0", "python": "3.12.13", "mlx": "0.32.4", "mlx_lm": "0.32.2", "numpy": "2.5.4", "git": "8a2444c"}, "seed": 0, "warmup": false, "repeat": 0, "family": "reasoning", "prompt": "Q: A tank fills in 6 hours with pipe A and 9 hours with pipe", "ts": "2026-11-01T01:51:01", "prompt_tokens": 32, "gen_tokens": 64, "ttft_ms": 958.3374169887975, "prompt_tps": 33.402911106697594, "gen_tps": 33.07673168156339, "decode_tps_wall": 32.560083043862754, "itl_ms_p50": 29.210791923105717, "itl_ms_p95": 35.54279205854982, "itl_ms_p99": 116.7389169568196, "itl_ms_mean": 30.712452380814486, "total_s": 2.89322191698011, "peak_mem_gb": 2.094958152, "text": "If pipe A fills the tank in 6 hours, then the rate of pipe A is 1 / 6 of the tank per hour. If pipe B fills the tank in 9 hours, then the rate of pipe B is 1 / 9 of the tank per hour. The combined rat", "cache_hit_rate": 0.49030716119323714, "cache_misses": 5758, "cache_hits": 5539, "stall_s": 1.7997499047778547, "hits_device": 0, "layers_complete": 0, "prefetch": null, "ssd_bytes": 20377239552, "ssd_read_s": 4.840675379149616} | |
added
benchmarks/raw/gateC/cold_nvme_laptop/sweep_v1_9preads_serial.jsonl
+15 −0
@@ -0,0 +1,15 @@ | ||
| 1 | +{"backend": "titan", "capacity": 16, "policy": "lru", "predictor": "none", "m": 8, "prefetch_workers": 2, "nocache": true, "max_tokens": 64, "split": "heldout", "tag": "cold_nvme", "model": "/Users/simon-pierreboucher/.cache/huggingface/hub/models--mlx-community--OLMoE-1B-7B-0125-Instruct-4bit/snapshots/e23844197887b031e7ddddbb0b8959c5a6853a7b", "cmd": "benchmarks/scripts/bench_decode.py --model /Users/simon-pierreboucher/.cache/huggingface/hub/models--mlx-community--OLMoE-1B-7B-0125-Instruct-4bit/snapshots/e23844197887b031e7ddddbb0b8959c5a6853a7b --backend titan --capacity 16 --predictor none --m 8 --nocache --traces benchmarks/raw/gateC/traces_olmoe_v2_laptop --families general,code,reasoning --split heldout --repeats 2 --max-tokens 64 --tag cold_nvme --out benchmarks/raw/gateC/cold_nvme_laptop/sweep.jsonl", "env": {"host": "MacBookPro-de-simon-pierre-2.local", "chip": "Apple M5 Max", "ram_gb": 48, "macos": "27.0", "python": "3.12.13", "mlx": "0.32.4", "mlx_lm": "0.32.2", "numpy": "2.5.4", "git": "258ba81"}, "seed": 0, "warmup": true, "repeat": -1, "family": "reasoning", "prompt": "Q: A tank fills in 6 hours with pipe A and 9 hours with pipe", "ts": "2026-11-01T01:47:04", "prompt_tokens": 32, "gen_tokens": 64, "ttft_ms": 3041.2979170214385, "prompt_tps": 10.538982502473754, "gen_tps": 9.615565496623349, "decode_tps_wall": 9.465435344104892, "itl_ms_p50": 102.56666608620435, "itl_ms_p95": 147.70795905496925, "itl_ms_p99": 167.03716607298702, "itl_ms_mean": 105.64754431742051, "total_s": 9.69709320901893, "peak_mem_gb": 2.090173904, "text": "If pipe A fills the tank in 6 hours, then the rate of pipe A is 1 / 6 of the tank per hour. If pipe B fills the tank in 9 hours, then the rate of pipe B is 1 / 9 of the tank per hour. The combined rat", "cache_hit_rate": 0.4844649021864212, "cache_misses": 5824, "cache_hits": 5473, "stall_s": 8.191949911764823, "hits_device": 0, "layers_complete": 0, "prefetch": null, "ssd_bytes": 20610809856, "ssd_read_s": 7.725407627178356} | |
| 2 | +{"backend": "titan", "capacity": 16, "policy": "lru", "predictor": "none", "m": 8, "prefetch_workers": 2, "nocache": true, "max_tokens": 64, "split": "heldout", "tag": "cold_nvme", "model": "/Users/simon-pierreboucher/.cache/huggingface/hub/models--mlx-community--OLMoE-1B-7B-0125-Instruct-4bit/snapshots/e23844197887b031e7ddddbb0b8959c5a6853a7b", "cmd": "benchmarks/scripts/bench_decode.py --model /Users/simon-pierreboucher/.cache/huggingface/hub/models--mlx-community--OLMoE-1B-7B-0125-Instruct-4bit/snapshots/e23844197887b031e7ddddbb0b8959c5a6853a7b --backend titan --capacity 16 --predictor none --m 8 --nocache --traces benchmarks/raw/gateC/traces_olmoe_v2_laptop --families general,code,reasoning --split heldout --repeats 2 --max-tokens 64 --tag cold_nvme --out benchmarks/raw/gateC/cold_nvme_laptop/sweep.jsonl", "env": {"host": "MacBookPro-de-simon-pierre-2.local", "chip": "Apple M5 Max", "ram_gb": 48, "macos": "27.0", "python": "3.12.13", "mlx": "0.32.4", "mlx_lm": "0.32.2", "numpy": "2.5.4", "git": "258ba81"}, "seed": 0, "warmup": true, "repeat": -1, "family": "code", "prompt": "Write a C function that computes the dot product of two floa", "ts": "2026-11-01T01:47:11", "prompt_tokens": 24, "gen_tokens": 64, "ttft_ms": 1772.822791012004, "prompt_tps": 13.540661227523396, "gen_tps": 14.592826924160933, "decode_tps_wall": 14.364850714221733, "itl_ms_p50": 64.1560829244554, "itl_ms_p95": 111.17766599636525, "itl_ms_p99": 147.35658396966755, "itl_ms_mean": 69.61436772955552, "total_s": 6.158527957974002, "peak_mem_gb": 1.930492816, "text": "#include <arm_neon.h>\n\nfloat dot_product_neon(const float *a, const float *b, int len) {\n // TODO: Implement the dot product computation using NEON intrinsics\n // Start by loading the arrays int", "cache_hit_rate": 0.6523887973640856, "cache_misses": 3587, "cache_hits": 6732, "stall_s": 4.940353738376871, "hits_device": 0, "layers_complete": 0, "prefetch": null, "ssd_bytes": 12694192128, "ssd_read_s": 4.6701676497468725} | |
| 3 | +{"backend": "titan", "capacity": 16, "policy": "lru", "predictor": "none", "m": 8, "prefetch_workers": 2, "nocache": true, "max_tokens": 64, "split": "heldout", "tag": "cold_nvme", "model": "/Users/simon-pierreboucher/.cache/huggingface/hub/models--mlx-community--OLMoE-1B-7B-0125-Instruct-4bit/snapshots/e23844197887b031e7ddddbb0b8959c5a6853a7b", "cmd": "benchmarks/scripts/bench_decode.py --model /Users/simon-pierreboucher/.cache/huggingface/hub/models--mlx-community--OLMoE-1B-7B-0125-Instruct-4bit/snapshots/e23844197887b031e7ddddbb0b8959c5a6853a7b --backend titan --capacity 16 --predictor none --m 8 --nocache --traces benchmarks/raw/gateC/traces_olmoe_v2_laptop --families general,code,reasoning --split heldout --repeats 2 --max-tokens 64 --tag cold_nvme --out benchmarks/raw/gateC/cold_nvme_laptop/sweep.jsonl", "env": {"host": "MacBookPro-de-simon-pierre-2.local", "chip": "Apple M5 Max", "ram_gb": 48, "macos": "27.0", "python": "3.12.13", "mlx": "0.32.4", "mlx_lm": "0.32.2", "numpy": "2.5.4", "git": "258ba81"}, "seed": 0, "warmup": true, "repeat": -1, "family": "general", "prompt": "Summarize the history of the Rideau Canal in one paragraph.", "ts": "2026-11-01T01:47:19", "prompt_tokens": 14, "gen_tokens": 64, "ttft_ms": 1448.2218329794705, "prompt_tps": 9.668972925355584, "gen_tps": 9.486046026204507, "decode_tps_wall": 9.337841435614223, "itl_ms_p50": 106.86812503263354, "itl_ms_p95": 156.7806249950081, "itl_ms_p99": 170.41387502104044, "itl_ms_mean": 107.09113095303081, "total_s": 8.194963083020411, "peak_mem_gb": 1.742661784, "text": "\n\nThe Rideau Canal, officially opened in 1832, was constructed by the British to connect Ottawa to Montreal via the Ottawa River. It was designed by Colonel John By and took approximately three years ", "cache_hit_rate": 0.48355739400206826, "cache_misses": 4994, "cache_hits": 4676, "stall_s": 6.844891174114309, "hits_device": 0, "layers_complete": 0, "prefetch": null, "ssd_bytes": 17673486336, "ssd_read_s": 6.502651879563928} | |
| 4 | +{"backend": "titan", "capacity": 16, "policy": "lru", "predictor": "none", "m": 8, "prefetch_workers": 2, "nocache": true, "max_tokens": 64, "split": "heldout", "tag": "cold_nvme", "model": "/Users/simon-pierreboucher/.cache/huggingface/hub/models--mlx-community--OLMoE-1B-7B-0125-Instruct-4bit/snapshots/e23844197887b031e7ddddbb0b8959c5a6853a7b", "cmd": "benchmarks/scripts/bench_decode.py --model /Users/simon-pierreboucher/.cache/huggingface/hub/models--mlx-community--OLMoE-1B-7B-0125-Instruct-4bit/snapshots/e23844197887b031e7ddddbb0b8959c5a6853a7b --backend titan --capacity 16 --predictor none --m 8 --nocache --traces benchmarks/raw/gateC/traces_olmoe_v2_laptop --families general,code,reasoning --split heldout --repeats 2 --max-tokens 64 --tag cold_nvme --out benchmarks/raw/gateC/cold_nvme_laptop/sweep.jsonl", "env": {"host": "MacBookPro-de-simon-pierre-2.local", "chip": "Apple M5 Max", "ram_gb": 48, "macos": "27.0", "python": "3.12.13", "mlx": "0.32.4", "mlx_lm": "0.32.2", "numpy": "2.5.4", "git": "258ba81"}, "seed": 0, "warmup": true, "repeat": -1, "family": "general", "prompt": "Describe the main differences between a Mac Studio and a Mac", "ts": "2026-11-01T01:47:27", "prompt_tokens": 18, "gen_tokens": 64, "ttft_ms": 1678.9133329875767, "prompt_tps": 10.7232358439087, "gen_tps": 10.018922261039506, "decode_tps_wall": 9.862394227537603, "itl_ms_p50": 97.25870797410607, "itl_ms_p95": 146.2174579501152, "itl_ms_p99": 158.16250001080334, "itl_ms_mean": 101.3952572700671, "total_s": 8.066814541001804, "peak_mem_gb": 1.832743964, "text": "\n\nMac Studio:\n- More powerful hardware options, including multiple GPUs and more RAM.\n- Higher-end CPU options, often with more cores and higher clock speeds.\n- Larger display with a higher resolution", "cache_hit_rate": 0.5051215103434424, "cache_misses": 4928, "cache_hits": 5030, "stall_s": 6.716066468274221, "hits_device": 0, "layers_complete": 0, "prefetch": null, "ssd_bytes": 17439916032, "ssd_read_s": 6.371192621882074} | |
| 5 | +{"backend": "titan", "capacity": 16, "policy": "lru", "predictor": "none", "m": 8, "prefetch_workers": 2, "nocache": true, "max_tokens": 64, "split": "heldout", "tag": "cold_nvme", "model": "/Users/simon-pierreboucher/.cache/huggingface/hub/models--mlx-community--OLMoE-1B-7B-0125-Instruct-4bit/snapshots/e23844197887b031e7ddddbb0b8959c5a6853a7b", "cmd": "benchmarks/scripts/bench_decode.py --model /Users/simon-pierreboucher/.cache/huggingface/hub/models--mlx-community--OLMoE-1B-7B-0125-Instruct-4bit/snapshots/e23844197887b031e7ddddbb0b8959c5a6853a7b --backend titan --capacity 16 --predictor none --m 8 --nocache --traces benchmarks/raw/gateC/traces_olmoe_v2_laptop --families general,code,reasoning --split heldout --repeats 2 --max-tokens 64 --tag cold_nvme --out benchmarks/raw/gateC/cold_nvme_laptop/sweep.jsonl", "env": {"host": "MacBookPro-de-simon-pierre-2.local", "chip": "Apple M5 Max", "ram_gb": 48, "macos": "27.0", "python": "3.12.13", "mlx": "0.32.4", "mlx_lm": "0.32.2", "numpy": "2.5.4", "git": "258ba81"}, "seed": 0, "warmup": true, "repeat": -1, "family": "reasoning", "prompt": "Q: What is the smallest positive integer divisible by 2, 3, ", "ts": "2026-11-01T01:47:35", "prompt_tokens": 29, "gen_tokens": 64, "ttft_ms": 2036.6630000062287, "prompt_tps": 14.241123672657547, "gen_tps": 11.004827989819676, "decode_tps_wall": 10.832897886006371, "itl_ms_p50": 100.70604097563773, "itl_ms_p95": 135.63829089980572, "itl_ms_p99": 152.31495804619044, "itl_ms_mean": 92.31140277725423, "total_s": 7.852281374973245, "peak_mem_gb": 1.905393952, "text": "The least common multiple (LCM) of 2, 3, 4, 5, and 6 is the smallest positive integer that is divisible by all of these numbers. The prime factorization of 2 is 2. The prime factorization of 3 is 3. T", "cache_hit_rate": 0.5451856093138658, "cache_misses": 4766, "cache_hits": 5713, "stall_s": 6.519519609515555, "hits_device": 0, "layers_complete": 0, "prefetch": null, "ssd_bytes": 16866607104, "ssd_read_s": 6.186666315770708} | |
| 6 | +{"backend": "titan", "capacity": 16, "policy": "lru", "predictor": "none", "m": 8, "prefetch_workers": 2, "nocache": true, "max_tokens": 64, "split": "heldout", "tag": "cold_nvme", "model": "/Users/simon-pierreboucher/.cache/huggingface/hub/models--mlx-community--OLMoE-1B-7B-0125-Instruct-4bit/snapshots/e23844197887b031e7ddddbb0b8959c5a6853a7b", "cmd": "benchmarks/scripts/bench_decode.py --model /Users/simon-pierreboucher/.cache/huggingface/hub/models--mlx-community--OLMoE-1B-7B-0125-Instruct-4bit/snapshots/e23844197887b031e7ddddbb0b8959c5a6853a7b --backend titan --capacity 16 --predictor none --m 8 --nocache --traces benchmarks/raw/gateC/traces_olmoe_v2_laptop --families general,code,reasoning --split heldout --repeats 2 --max-tokens 64 --tag cold_nvme --out benchmarks/raw/gateC/cold_nvme_laptop/sweep.jsonl", "env": {"host": "MacBookPro-de-simon-pierre-2.local", "chip": "Apple M5 Max", "ram_gb": 48, "macos": "27.0", "python": "3.12.13", "mlx": "0.32.4", "mlx_lm": "0.32.2", "numpy": "2.5.4", "git": "258ba81"}, "seed": 0, "warmup": true, "repeat": -1, "family": "code", "prompt": "Write a bash script that lists the ten largest files under a", "ts": "2026-11-01T01:47:40", "prompt_tokens": 19, "gen_tokens": 64, "ttft_ms": 1480.4692500038072, "prompt_tps": 12.836366279140407, "gen_tps": 15.293047498172099, "decode_tps_wall": 15.054134848034861, "itl_ms_p50": 56.96449999231845, "itl_ms_p95": 114.80837501585484, "itl_ms_p99": 126.13425008021295, "itl_ms_mean": 66.4269325401013, "total_s": 5.66536600003019, "peak_mem_gb": 1.773794588, "text": "#!/bin/bash\n\n# Specify the directory\ndir=\"/path/to/directory\"\n\n# Get the size of each file and store it in an array\nfiles=( $(ls -l \"$dir\" | awk '{print $5, $9}') )\n\n# Sort the array", "cache_hit_rate": 0.6699147381242387, "cache_misses": 3252, "cache_hits": 6600, "stall_s": 4.478065619710833, "hits_device": 0, "layers_complete": 0, "prefetch": null, "ssd_bytes": 11508645888, "ssd_read_s": 4.2451598775805905} | |
| 7 | +{"backend": "titan", "capacity": 16, "policy": "lru", "predictor": "none", "m": 8, "prefetch_workers": 2, "nocache": true, "max_tokens": 64, "split": "heldout", "tag": "cold_nvme", "model": "/Users/simon-pierreboucher/.cache/huggingface/hub/models--mlx-community--OLMoE-1B-7B-0125-Instruct-4bit/snapshots/e23844197887b031e7ddddbb0b8959c5a6853a7b", "cmd": "benchmarks/scripts/bench_decode.py --model /Users/simon-pierreboucher/.cache/huggingface/hub/models--mlx-community--OLMoE-1B-7B-0125-Instruct-4bit/snapshots/e23844197887b031e7ddddbb0b8959c5a6853a7b --backend titan --capacity 16 --predictor none --m 8 --nocache --traces benchmarks/raw/gateC/traces_olmoe_v2_laptop --families general,code,reasoning --split heldout --repeats 2 --max-tokens 64 --tag cold_nvme --out benchmarks/raw/gateC/cold_nvme_laptop/sweep.jsonl", "env": {"host": "MacBookPro-de-simon-pierre-2.local", "chip": "Apple M5 Max", "ram_gb": 48, "macos": "27.0", "python": "3.12.13", "mlx": "0.32.4", "mlx_lm": "0.32.2", "numpy": "2.5.4", "git": "258ba81"}, "seed": 0, "warmup": false, "repeat": 0, "family": "reasoning", "prompt": "Q: A tank fills in 6 hours with pipe A and 9 hours with pipe", "ts": "2026-11-01T01:47:50", "prompt_tokens": 32, "gen_tokens": 64, "ttft_ms": 2848.683707998134, "prompt_tps": 11.23438886125646, "gen_tps": 9.901486845998365, "decode_tps_wall": 9.746792386317114, "itl_ms_p50": 98.78045890945941, "itl_ms_p95": 139.5513330353424, "itl_ms_p99": 161.6568339522928, "itl_ms_mean": 102.59785582422323, "total_s": 9.312348624924198, "peak_mem_gb": 2.094958152, "text": "If pipe A fills the tank in 6 hours, then the rate of pipe A is 1 / 6 of the tank per hour. If pipe B fills the tank in 9 hours, then the rate of pipe B is 1 / 9 of the tank per hour. The combined rat", "cache_hit_rate": 0.49030716119323714, "cache_misses": 5758, "cache_hits": 5539, "stall_s": 7.887103883433156, "hits_device": 0, "layers_complete": 0, "prefetch": null, "ssd_bytes": 20377239552, "ssd_read_s": 7.472977954312228} | |
| 8 | +{"backend": "titan", "capacity": 16, "policy": "lru", "predictor": "none", "m": 8, "prefetch_workers": 2, "nocache": true, "max_tokens": 64, "split": "heldout", "tag": "cold_nvme", "model": "/Users/simon-pierreboucher/.cache/huggingface/hub/models--mlx-community--OLMoE-1B-7B-0125-Instruct-4bit/snapshots/e23844197887b031e7ddddbb0b8959c5a6853a7b", "cmd": "benchmarks/scripts/bench_decode.py --model /Users/simon-pierreboucher/.cache/huggingface/hub/models--mlx-community--OLMoE-1B-7B-0125-Instruct-4bit/snapshots/e23844197887b031e7ddddbb0b8959c5a6853a7b --backend titan --capacity 16 --predictor none --m 8 --nocache --traces benchmarks/raw/gateC/traces_olmoe_v2_laptop --families general,code,reasoning --split heldout --repeats 2 --max-tokens 64 --tag cold_nvme --out benchmarks/raw/gateC/cold_nvme_laptop/sweep.jsonl", "env": {"host": "MacBookPro-de-simon-pierre-2.local", "chip": "Apple M5 Max", "ram_gb": 48, "macos": "27.0", "python": "3.12.13", "mlx": "0.32.4", "mlx_lm": "0.32.2", "numpy": "2.5.4", "git": "258ba81"}, "seed": 0, "warmup": false, "repeat": 0, "family": "general", "prompt": "Describe the main differences between a Mac Studio and a Mac", "ts": "2026-11-01T01:47:58", "prompt_tokens": 18, "gen_tokens": 64, "ttft_ms": 1657.9446670366451, "prompt_tps": 10.85866666318932, "gen_tps": 9.96284746620274, "decode_tps_wall": 9.807193241289706, "itl_ms_p50": 99.73604197148234, "itl_ms_p95": 146.3351669954136, "itl_ms_p99": 159.94337503798306, "itl_ms_mean": 101.96597287283531, "total_s": 8.08180095802527, "peak_mem_gb": 1.839953, "text": "\n\nMac Studio:\n- More powerful hardware options, including multiple GPUs and more RAM.\n- Higher-end CPU options, often with more cores and higher clock speeds.\n- Larger display with a higher resolution", "cache_hit_rate": 0.5069291022293633, "cache_misses": 4910, "cache_hits": 5048, "stall_s": 6.72081563831307, "hits_device": 0, "layers_complete": 0, "prefetch": null, "ssd_bytes": 17376215040, "ssd_read_s": 6.373155025416054} | |
| 9 | +{"backend": "titan", "capacity": 16, "policy": "lru", "predictor": "none", "m": 8, "prefetch_workers": 2, "nocache": true, "max_tokens": 64, "split": "heldout", "tag": "cold_nvme", "model": "/Users/simon-pierreboucher/.cache/huggingface/hub/models--mlx-community--OLMoE-1B-7B-0125-Instruct-4bit/snapshots/e23844197887b031e7ddddbb0b8959c5a6853a7b", "cmd": "benchmarks/scripts/bench_decode.py --model /Users/simon-pierreboucher/.cache/huggingface/hub/models--mlx-community--OLMoE-1B-7B-0125-Instruct-4bit/snapshots/e23844197887b031e7ddddbb0b8959c5a6853a7b --backend titan --capacity 16 --predictor none --m 8 --nocache --traces benchmarks/raw/gateC/traces_olmoe_v2_laptop --families general,code,reasoning --split heldout --repeats 2 --max-tokens 64 --tag cold_nvme --out benchmarks/raw/gateC/cold_nvme_laptop/sweep.jsonl", "env": {"host": "MacBookPro-de-simon-pierre-2.local", "chip": "Apple M5 Max", "ram_gb": 48, "macos": "27.0", "python": "3.12.13", "mlx": "0.32.4", "mlx_lm": "0.32.2", "numpy": "2.5.4", "git": "258ba81"}, "seed": 0, "warmup": false, "repeat": 0, "family": "general", "prompt": "Summarize the history of the Rideau Canal in one paragraph.", "ts": "2026-11-01T01:48:07", "prompt_tokens": 14, "gen_tokens": 64, "ttft_ms": 1504.7367500374094, "prompt_tps": 9.305675828688162, "gen_tps": 7.954694823209586, "decode_tps_wall": 7.830415043880024, "itl_ms_p50": 125.9298330405727, "itl_ms_p95": 180.7774999178946, "itl_ms_p99": 192.8413329878822, "itl_ms_mean": 127.70715145955957, "total_s": 9.550287291989662, "peak_mem_gb": 1.747773596, "text": "\n\nThe Rideau Canal, officially opened in 1832, was constructed by the British to connect Ottawa to Montreal via the Ottawa River. It was designed by Colonel John By and took approximately three years ", "cache_hit_rate": 0.4795243019648397, "cache_misses": 5033, "cache_hits": 4637, "stall_s": 8.067980261519551, "hits_device": 0, "layers_complete": 0, "prefetch": null, "ssd_bytes": 17811505152, "ssd_read_s": 7.641573060769588} | |
| 10 | +{"backend": "titan", "capacity": 16, "policy": "lru", "predictor": "none", "m": 8, "prefetch_workers": 2, "nocache": true, "max_tokens": 64, "split": "heldout", "tag": "cold_nvme", "model": "/Users/simon-pierreboucher/.cache/huggingface/hub/models--mlx-community--OLMoE-1B-7B-0125-Instruct-4bit/snapshots/e23844197887b031e7ddddbb0b8959c5a6853a7b", "cmd": "benchmarks/scripts/bench_decode.py --model /Users/simon-pierreboucher/.cache/huggingface/hub/models--mlx-community--OLMoE-1B-7B-0125-Instruct-4bit/snapshots/e23844197887b031e7ddddbb0b8959c5a6853a7b --backend titan --capacity 16 --predictor none --m 8 --nocache --traces benchmarks/raw/gateC/traces_olmoe_v2_laptop --families general,code,reasoning --split heldout --repeats 2 --max-tokens 64 --tag cold_nvme --out benchmarks/raw/gateC/cold_nvme_laptop/sweep.jsonl", "env": {"host": "MacBookPro-de-simon-pierre-2.local", "chip": "Apple M5 Max", "ram_gb": 48, "macos": "27.0", "python": "3.12.13", "mlx": "0.32.4", "mlx_lm": "0.32.2", "numpy": "2.5.4", "git": "258ba81"}, "seed": 0, "warmup": false, "repeat": 0, "family": "reasoning", "prompt": "Q: What is the smallest positive integer divisible by 2, 3, ", "ts": "2026-11-01T01:48:16", "prompt_tokens": 29, "gen_tokens": 64, "ttft_ms": 2396.1164170177653, "prompt_tps": 12.10512571237578, "gen_tps": 10.396180431335797, "decode_tps_wall": 10.23376338708268, "itl_ms_p50": 106.55224998481572, "itl_ms_p95": 146.57462493050843, "itl_ms_p99": 172.6577919907868, "itl_ms_mean": 97.71576322179051, "total_s": 8.552209499990568, "peak_mem_gb": 1.90539394, "text": "The least common multiple (LCM) of 2, 3, 4, 5, and 6 is the smallest positive integer that is divisible by all of these numbers. The prime factorization of 2 is 2. The prime factorization of 3 is 3. T", "cache_hit_rate": 0.5457581830327322, "cache_misses": 4760, "cache_hits": 5719, "stall_s": 7.159492473700084, "hits_device": 0, "layers_complete": 0, "prefetch": null, "ssd_bytes": 16845373440, "ssd_read_s": 6.763606808730401} | |
| 11 | +{"backend": "titan", "capacity": 16, "policy": "lru", "predictor": "none", "m": 8, "prefetch_workers": 2, "nocache": true, "max_tokens": 64, "split": "heldout", "tag": "cold_nvme", "model": "/Users/simon-pierreboucher/.cache/huggingface/hub/models--mlx-community--OLMoE-1B-7B-0125-Instruct-4bit/snapshots/e23844197887b031e7ddddbb0b8959c5a6853a7b", "cmd": "benchmarks/scripts/bench_decode.py --model /Users/simon-pierreboucher/.cache/huggingface/hub/models--mlx-community--OLMoE-1B-7B-0125-Instruct-4bit/snapshots/e23844197887b031e7ddddbb0b8959c5a6853a7b --backend titan --capacity 16 --predictor none --m 8 --nocache --traces benchmarks/raw/gateC/traces_olmoe_v2_laptop --families general,code,reasoning --split heldout --repeats 2 --max-tokens 64 --tag cold_nvme --out benchmarks/raw/gateC/cold_nvme_laptop/sweep.jsonl", "env": {"host": "MacBookPro-de-simon-pierre-2.local", "chip": "Apple M5 Max", "ram_gb": 48, "macos": "27.0", "python": "3.12.13", "mlx": "0.32.4", "mlx_lm": "0.32.2", "numpy": "2.5.4", "git": "258ba81"}, "seed": 0, "warmup": false, "repeat": 0, "family": "code", "prompt": "Write a C function that computes the dot product of two floa", "ts": "2026-11-01T01:48:22", "prompt_tokens": 24, "gen_tokens": 64, "ttft_ms": 1804.6072499128059, "prompt_tps": 13.30151745591803, "gen_tps": 14.163653287680651, "decode_tps_wall": 13.942378732507121, "itl_ms_p50": 66.09183398541063, "itl_ms_p95": 115.31287501566112, "itl_ms_p99": 150.83458297885954, "itl_ms_mean": 71.72377247710727, "total_s": 6.323204915970564, "peak_mem_gb": 1.925970816, "text": "#include <arm_neon.h>\n\nfloat dot_product_neon(const float *a, const float *b, int len) {\n // TODO: Implement the dot product computation using NEON intrinsics\n // Start by loading the arrays int", "cache_hit_rate": 0.6497722647543367, "cache_misses": 3614, "cache_hits": 6705, "stall_s": 5.050725456792861, "hits_device": 0, "layers_complete": 0, "prefetch": null, "ssd_bytes": 12789743616, "ssd_read_s": 4.767083190614358} | |
| 12 | +{"backend": "titan", "capacity": 16, "policy": "lru", "predictor": "none", "m": 8, "prefetch_workers": 2, "nocache": true, "max_tokens": 64, "split": "heldout", "tag": "cold_nvme", "model": "/Users/simon-pierreboucher/.cache/huggingface/hub/models--mlx-community--OLMoE-1B-7B-0125-Instruct-4bit/snapshots/e23844197887b031e7ddddbb0b8959c5a6853a7b", "cmd": "benchmarks/scripts/bench_decode.py --model /Users/simon-pierreboucher/.cache/huggingface/hub/models--mlx-community--OLMoE-1B-7B-0125-Instruct-4bit/snapshots/e23844197887b031e7ddddbb0b8959c5a6853a7b --backend titan --capacity 16 --predictor none --m 8 --nocache --traces benchmarks/raw/gateC/traces_olmoe_v2_laptop --families general,code,reasoning --split heldout --repeats 2 --max-tokens 64 --tag cold_nvme --out benchmarks/raw/gateC/cold_nvme_laptop/sweep.jsonl", "env": {"host": "MacBookPro-de-simon-pierre-2.local", "chip": "Apple M5 Max", "ram_gb": 48, "macos": "27.0", "python": "3.12.13", "mlx": "0.32.4", "mlx_lm": "0.32.2", "numpy": "2.5.4", "git": "258ba81"}, "seed": 0, "warmup": false, "repeat": 0, "family": "code", "prompt": "Write a bash script that lists the ten largest files under a", "ts": "2026-11-01T01:48:28", "prompt_tokens": 19, "gen_tokens": 64, "ttft_ms": 1421.2836669757962, "prompt_tps": 13.370988297603747, "gen_tps": 14.862207311364184, "decode_tps_wall": 14.630028638893691, "itl_ms_p50": 57.85045796073973, "itl_ms_p95": 115.3351670363918, "itl_ms_p99": 126.18254090193659, "itl_ms_mean": 68.35256612837492, "total_s": 5.727495333063416, "peak_mem_gb": 1.783100804, "text": "#!/bin/bash\n\n# Specify the directory\ndir=\"/path/to/directory\"\n\n# Get the size of each file and store it in an array\nfiles=( $(ls -l \"$dir\" | awk '{print $5, $9}') )\n\n# Sort the array", "cache_hit_rate": 0.6759033698741372, "cache_misses": 3193, "cache_hits": 6659, "stall_s": 4.475894676987082, "hits_device": 0, "layers_complete": 0, "prefetch": null, "ssd_bytes": 11299848192, "ssd_read_s": 4.227993114502169} | |
| 13 | +{"backend": "titan", "capacity": 16, "policy": "lru", "predictor": "none", "m": 8, "prefetch_workers": 2, "nocache": true, "max_tokens": 64, "split": "heldout", "tag": "cold_nvme", "model": "/Users/simon-pierreboucher/.cache/huggingface/hub/models--mlx-community--OLMoE-1B-7B-0125-Instruct-4bit/snapshots/e23844197887b031e7ddddbb0b8959c5a6853a7b", "cmd": "benchmarks/scripts/bench_decode.py --model /Users/simon-pierreboucher/.cache/huggingface/hub/models--mlx-community--OLMoE-1B-7B-0125-Instruct-4bit/snapshots/e23844197887b031e7ddddbb0b8959c5a6853a7b --backend titan --capacity 16 --predictor none --m 8 --nocache --traces benchmarks/raw/gateC/traces_olmoe_v2_laptop --families general,code,reasoning --split heldout --repeats 2 --max-tokens 64 --tag cold_nvme --out benchmarks/raw/gateC/cold_nvme_laptop/sweep.jsonl", "env": {"host": "MacBookPro-de-simon-pierre-2.local", "chip": "Apple M5 Max", "ram_gb": 48, "macos": "27.0", "python": "3.12.13", "mlx": "0.32.4", "mlx_lm": "0.32.2", "numpy": "2.5.4", "git": "258ba81"}, "seed": 0, "warmup": false, "repeat": 1, "family": "reasoning", "prompt": "Q: What is the smallest positive integer divisible by 2, 3, ", "ts": "2026-11-01T01:48:36", "prompt_tokens": 29, "gen_tokens": 64, "ttft_ms": 2034.2665419448167, "prompt_tps": 14.257879813570804, "gen_tps": 10.601058847905994, "decode_tps_wall": 10.435437038113436, "itl_ms_p50": 103.03058300632983, "itl_ms_p95": 140.08616702631116, "itl_ms_p99": 154.924959060736, "itl_ms_mean": 95.82732341230093, "total_s": 8.071387916919775, "peak_mem_gb": 1.90341144, "text": "The least common multiple (LCM) of 2, 3, 4, 5, and 6 is the smallest positive integer that is divisible by all of these numbers. The prime factorization of 2 is 2. The prime factorization of 3 is 3. T", "cache_hit_rate": 0.5446130355949995, "cache_misses": 4772, "cache_hits": 5707, "stall_s": 6.683604668593034, "hits_device": 0, "layers_complete": 0, "prefetch": null, "ssd_bytes": 16887840768, "ssd_read_s": 6.316679805400781} | |
| 14 | +{"backend": "titan", "capacity": 16, "policy": "lru", "predictor": "none", "m": 8, "prefetch_workers": 2, "nocache": true, "max_tokens": 64, "split": "heldout", "tag": "cold_nvme", "model": "/Users/simon-pierreboucher/.cache/huggingface/hub/models--mlx-community--OLMoE-1B-7B-0125-Instruct-4bit/snapshots/e23844197887b031e7ddddbb0b8959c5a6853a7b", "cmd": "benchmarks/scripts/bench_decode.py --model /Users/simon-pierreboucher/.cache/huggingface/hub/models--mlx-community--OLMoE-1B-7B-0125-Instruct-4bit/snapshots/e23844197887b031e7ddddbb0b8959c5a6853a7b --backend titan --capacity 16 --predictor none --m 8 --nocache --traces benchmarks/raw/gateC/traces_olmoe_v2_laptop --families general,code,reasoning --split heldout --repeats 2 --max-tokens 64 --tag cold_nvme --out benchmarks/raw/gateC/cold_nvme_laptop/sweep.jsonl", "env": {"host": "MacBookPro-de-simon-pierre-2.local", "chip": "Apple M5 Max", "ram_gb": 48, "macos": "27.0", "python": "3.12.13", "mlx": "0.32.4", "mlx_lm": "0.32.2", "numpy": "2.5.4", "git": "258ba81"}, "seed": 0, "warmup": false, "repeat": 1, "family": "code", "prompt": "Write a bash script that lists the ten largest files under a", "ts": "2026-11-01T01:48:42", "prompt_tokens": 19, "gen_tokens": 64, "ttft_ms": 1547.3737920401618, "prompt_tps": 12.281128276714327, "gen_tps": 14.79498984013145, "decode_tps_wall": 14.563857265509588, "itl_ms_p50": 58.28862497583032, "itl_ms_p95": 116.0697090672329, "itl_ms_p99": 129.21441695652902, "itl_ms_mean": 68.6631283024326, "total_s": 5.873150875093415, "peak_mem_gb": 1.773794588, "text": "#!/bin/bash\n\n# Specify the directory\ndir=\"/path/to/directory\"\n\n# Get the size of each file and store it in an array\nfiles=( $(ls -l \"$dir\" | awk '{print $5, $9}') )\n\n# Sort the array", "cache_hit_rate": 0.6699147381242387, "cache_misses": 3252, "cache_hits": 6600, "stall_s": 4.632669512648135, "hits_device": 0, "layers_complete": 0, "prefetch": null, "ssd_bytes": 11508645888, "ssd_read_s": 4.369992908556014} | |
| 15 | +{"backend": "titan", "capacity": 16, "policy": "lru", "predictor": "none", "m": 8, "prefetch_workers": 2, "nocache": true, "max_tokens": 64, "split": "heldout", "tag": "cold_nvme", "model": "/Users/simon-pierreboucher/.cache/huggingface/hub/models--mlx-community--OLMoE-1B-7B-0125-Instruct-4bit/snapshots/e23844197887b031e7ddddbb0b8959c5a6853a7b", "cmd": "benchmarks/scripts/bench_decode.py --model /Users/simon-pierreboucher/.cache/huggingface/hub/models--mlx-community--OLMoE-1B-7B-0125-Instruct-4bit/snapshots/e23844197887b031e7ddddbb0b8959c5a6853a7b --backend titan --capacity 16 --predictor none --m 8 --nocache --traces benchmarks/raw/gateC/traces_olmoe_v2_laptop --families general,code,reasoning --split heldout --repeats 2 --max-tokens 64 --tag cold_nvme --out benchmarks/raw/gateC/cold_nvme_laptop/sweep.jsonl", "env": {"host": "MacBookPro-de-simon-pierre-2.local", "chip": "Apple M5 Max", "ram_gb": 48, "macos": "27.0", "python": "3.12.13", "mlx": "0.32.4", "mlx_lm": "0.32.2", "numpy": "2.5.4", "git": "258ba81"}, "seed": 0, "warmup": false, "repeat": 1, "family": "general", "prompt": "Describe the main differences between a Mac Studio and a Mac", "ts": "2026-11-01T01:48:50", "prompt_tokens": 18, "gen_tokens": 64, "ttft_ms": 1817.269332939759, "prompt_tps": 9.906602292857812, "gen_tps": 9.587975958629395, "decode_tps_wall": 9.438182157713433, "itl_ms_p50": 102.33312495984137, "itl_ms_p95": 156.4575000666082, "itl_ms_p99": 179.1806248947978, "itl_ms_mean": 105.95260647546854, "total_s": 8.492283540894277, "peak_mem_gb": 1.843491944, "text": "\n\nMac Studio:\n- More powerful hardware options, including multiple GPUs and more RAM.\n- Higher-end CPU options, often with more cores and higher clock speeds.\n- Larger display with a higher resolution", "cache_hit_rate": 0.5079333199437638, "cache_misses": 4900, "cache_hits": 5058, "stall_s": 7.061306995572522, "hits_device": 0, "layers_complete": 0, "prefetch": null, "ssd_bytes": 17340825600, "ssd_read_s": 6.670634448295459} | |
added
benchmarks/raw/tests/greedy_olmoe_cap16_20261101T014903.json
+14 −0
@@ -0,0 +1,14 @@ | ||
| 1 | +[ | |
| 2 | + { | |
| 3 | + "prompt": "The capital of Canada is", | |
| 4 | + "ref": "Ottawa.\n\nOttawa is the capital of Canada, and it is located in the province of Ontario. It is situated on the south bank of the Ottawa", | |
| 5 | + "titan": "Ottawa.\n\nOttawa is the capital of Canada, and it is located in the province of Ontario. It is situated on the south bank of the Ottawa", | |
| 6 | + "equal": true | |
| 7 | + }, | |
| 8 | + { | |
| 9 | + "prompt": "def fibonacci(n):\n \"\"\"Return the n-th", | |
| 10 | + "ref": " if n <= 0:\n return \"Invalid input\"\n elif n == 1:\n return 0\n elif n == 2:\n", | |
| 11 | + "titan": " if n <= 0:\n return \"Invalid input\"\n elif n == 1:\n return 0\n elif n == 2:\n", | |
| 12 | + "equal": true | |
| 13 | + } | |
| 14 | +] | |
| \ No newline at end of file | ||
added
benchmarks/raw/tests/greedy_olmoe_cap16_20261101T015010.json
+14 −0
@@ -0,0 +1,14 @@ | ||
| 1 | +[ | |
| 2 | + { | |
| 3 | + "prompt": "The capital of Canada is", | |
| 4 | + "ref": "Ottawa.\n\nOttawa is the capital of Canada, and it is located in the province of Ontario. It is situated on the south bank of the Ottawa", | |
| 5 | + "titan": "Ottawa.\n\nOttawa is the capital of Canada, and it is located in the province of Ontario. It is situated on the south bank of the Ottawa", | |
| 6 | + "equal": true | |
| 7 | + }, | |
| 8 | + { | |
| 9 | + "prompt": "def fibonacci(n):\n \"\"\"Return the n-th", | |
| 10 | + "ref": " if n <= 0:\n return \"Invalid input\"\n elif n == 1:\n return 0\n elif n == 2:\n", | |
| 11 | + "titan": " if n <= 0:\n return \"Invalid input\"\n elif n == 1:\n return 0\n elif n == 2:\n", | |
| 12 | + "equal": true | |
| 13 | + } | |
| 14 | +] | |
| \ No newline at end of file | ||
added
benchmarks/raw/tests/greedy_olmoe_cap16_20261101T015029.json
+14 −0
@@ -0,0 +1,14 @@ | ||
| 1 | +[ | |
| 2 | + { | |
| 3 | + "prompt": "The capital of Canada is", | |
| 4 | + "ref": "Ottawa.\n\nOttawa is the capital of Canada, and it is located in the province of Ontario. It is situated on the south bank of the Ottawa", | |
| 5 | + "titan": "Ottawa.\n\nOttawa is the capital of Canada, and it is located in the province of Ontario. It is situated on the south bank of the Ottawa", | |
| 6 | + "equal": true | |
| 7 | + }, | |
| 8 | + { | |
| 9 | + "prompt": "def fibonacci(n):\n \"\"\"Return the n-th", | |
| 10 | + "ref": " if n <= 0:\n return \"Invalid input\"\n elif n == 1:\n return 0\n elif n == 2:\n", | |
| 11 | + "titan": " if n <= 0:\n return \"Invalid input\"\n elif n == 1:\n return 0\n elif n == 2:\n", | |
| 12 | + "equal": true | |
| 13 | + } | |
| 14 | +] | |
| \ No newline at end of file | ||
added
benchmarks/raw/tests/numerical_olmoe_cap16_2026-11-01T014859.json
+50 −0
@@ -0,0 +1,50 @@ | ||
| 1 | +{ | |
| 2 | + "capacity": 16, | |
| 3 | + "prompts": [ | |
| 4 | + { | |
| 5 | + "prompt": "The capital of Canada is", | |
| 6 | + "tokens": 5, | |
| 7 | + "max_abs_dlogit": 0.0, | |
| 8 | + "argmax_equal": true, | |
| 9 | + "hit_rate": 0.2580101180438449, | |
| 10 | + "misses": 440, | |
| 11 | + "stall_s": 0.06682696042116731, | |
| 12 | + "layers_routed": 46 | |
| 13 | + }, | |
| 14 | + { | |
| 15 | + "prompt": "def fibonacci(n):\n \"\"\"Return the n-th", | |
| 16 | + "tokens": 21, | |
| 17 | + "max_abs_dlogit": 0.0, | |
| 18 | + "argmax_equal": true, | |
| 19 | + "hit_rate": 0.42512908777969016, | |
| 20 | + "misses": 1002, | |
| 21 | + "stall_s": 0.15063788229599595, | |
| 22 | + "layers_routed": 127 | |
| 23 | + }, | |
| 24 | + { | |
| 25 | + "prompt": "Q: If a train travels 60 km in 45 minute", | |
| 26 | + "tokens": 25, | |
| 27 | + "max_abs_dlogit": 0.0, | |
| 28 | + "argmax_equal": true, | |
| 29 | + "hit_rate": 0.41904344010530936, | |
| 30 | + "misses": 1324, | |
| 31 | + "stall_s": 0.18718991475179791, | |
| 32 | + "layers_routed": 161 | |
| 33 | + }, | |
| 34 | + { | |
| 35 | + "prompt": "Les mod\u00e8les \u00e0 m\u00e9lange d'experts activent", | |
| 36 | + "tokens": 26, | |
| 37 | + "max_abs_dlogit": 0.0, | |
| 38 | + "argmax_equal": true, | |
| 39 | + "hit_rate": 0.45278969957081544, | |
| 40 | + "misses": 1275, | |
| 41 | + "stall_s": 0.18172545277047902, | |
| 42 | + "layers_routed": 164 | |
| 43 | + } | |
| 44 | + ], | |
| 45 | + "tol": 0.001, | |
| 46 | + "ts": "2026-11-01T01:48:59", | |
| 47 | + "max_abs_dlogit_worst": 0.0, | |
| 48 | + "model": "/Users/simon-pierreboucher/.cache/huggingface/hub/models--mlx-community--OLMoE-1B-7B-0125-Instruct-4bit/snapshots/e23844197887b031e7ddddbb0b8959c5a6853a7b", | |
| 49 | + "model_type": "olmoe" | |
| 50 | +} | |
| \ No newline at end of file | ||
added
benchmarks/raw/tests/numerical_olmoe_cap16_2026-11-01T015006.json
+50 −0
@@ -0,0 +1,50 @@ | ||
| 1 | +{ | |
| 2 | + "capacity": 16, | |
| 3 | + "prompts": [ | |
| 4 | + { | |
| 5 | + "prompt": "The capital of Canada is", | |
| 6 | + "tokens": 5, | |
| 7 | + "max_abs_dlogit": 0.0, | |
| 8 | + "argmax_equal": true, | |
| 9 | + "hit_rate": 0.2580101180438449, | |
| 10 | + "misses": 440, | |
| 11 | + "stall_s": 0.055347624816931784, | |
| 12 | + "layers_routed": 46 | |
| 13 | + }, | |
| 14 | + { | |
| 15 | + "prompt": "def fibonacci(n):\n \"\"\"Return the n-th", | |
| 16 | + "tokens": 21, | |
| 17 | + "max_abs_dlogit": 0.0, | |
| 18 | + "argmax_equal": true, | |
| 19 | + "hit_rate": 0.42512908777969016, | |
| 20 | + "misses": 1002, | |
| 21 | + "stall_s": 0.1264939100947231, | |
| 22 | + "layers_routed": 127 | |
| 23 | + }, | |
| 24 | + { | |
| 25 | + "prompt": "Q: If a train travels 60 km in 45 minute", | |
| 26 | + "tokens": 25, | |
| 27 | + "max_abs_dlogit": 0.0, | |
| 28 | + "argmax_equal": true, | |
| 29 | + "hit_rate": 0.41904344010530936, | |
| 30 | + "misses": 1324, | |
| 31 | + "stall_s": 0.1644190422957763, | |
| 32 | + "layers_routed": 161 | |
| 33 | + }, | |
| 34 | + { | |
| 35 | + "prompt": "Les mod\u00e8les \u00e0 m\u00e9lange d'experts activent", | |
| 36 | + "tokens": 26, | |
| 37 | + "max_abs_dlogit": 0.0, | |
| 38 | + "argmax_equal": true, | |
| 39 | + "hit_rate": 0.45278969957081544, | |
| 40 | + "misses": 1275, | |
| 41 | + "stall_s": 0.15638224757276475, | |
| 42 | + "layers_routed": 164 | |
| 43 | + } | |
| 44 | + ], | |
| 45 | + "tol": 0.001, | |
| 46 | + "ts": "2026-11-01T01:50:06", | |
| 47 | + "max_abs_dlogit_worst": 0.0, | |
| 48 | + "model": "/Users/simon-pierreboucher/.cache/huggingface/hub/models--mlx-community--OLMoE-1B-7B-0125-Instruct-4bit/snapshots/e23844197887b031e7ddddbb0b8959c5a6853a7b", | |
| 49 | + "model_type": "olmoe" | |
| 50 | +} | |
| \ No newline at end of file | ||
added
benchmarks/raw/tests/numerical_olmoe_cap16_2026-11-01T015025.json
+50 −0
@@ -0,0 +1,50 @@ | ||
| 1 | +{ | |
| 2 | + "capacity": 16, | |
| 3 | + "prompts": [ | |
| 4 | + { | |
| 5 | + "prompt": "The capital of Canada is", | |
| 6 | + "tokens": 5, | |
| 7 | + "max_abs_dlogit": 0.0, | |
| 8 | + "argmax_equal": true, | |
| 9 | + "hit_rate": 0.2580101180438449, | |
| 10 | + "misses": 440, | |
| 11 | + "stall_s": 0.054807875072583556, | |
| 12 | + "layers_routed": 46 | |
| 13 | + }, | |
| 14 | + { | |
| 15 | + "prompt": "def fibonacci(n):\n \"\"\"Return the n-th", | |
| 16 | + "tokens": 21, | |
| 17 | + "max_abs_dlogit": 0.0, | |
| 18 | + "argmax_equal": true, | |
| 19 | + "hit_rate": 0.42512908777969016, | |
| 20 | + "misses": 1002, | |
| 21 | + "stall_s": 0.1280115059344098, | |
| 22 | + "layers_routed": 127 | |
| 23 | + }, | |
| 24 | + { | |
| 25 | + "prompt": "Q: If a train travels 60 km in 45 minute", | |
| 26 | + "tokens": 25, | |
| 27 | + "max_abs_dlogit": 0.0, | |
| 28 | + "argmax_equal": true, | |
| 29 | + "hit_rate": 0.41904344010530936, | |
| 30 | + "misses": 1324, | |
| 31 | + "stall_s": 0.1614124964689836, | |
| 32 | + "layers_routed": 161 | |
| 33 | + }, | |
| 34 | + { | |
| 35 | + "prompt": "Les mod\u00e8les \u00e0 m\u00e9lange d'experts activent", | |
| 36 | + "tokens": 26, | |
| 37 | + "max_abs_dlogit": 0.0, | |
| 38 | + "argmax_equal": true, | |
| 39 | + "hit_rate": 0.45278969957081544, | |
| 40 | + "misses": 1275, | |
| 41 | + "stall_s": 0.15579284261912107, | |
| 42 | + "layers_routed": 164 | |
| 43 | + } | |
| 44 | + ], | |
| 45 | + "tol": 0.001, | |
| 46 | + "ts": "2026-11-01T01:50:25", | |
| 47 | + "max_abs_dlogit_worst": 0.0, | |
| 48 | + "model": "/Users/simon-pierreboucher/.cache/huggingface/hub/models--mlx-community--OLMoE-1B-7B-0125-Instruct-4bit/snapshots/e23844197887b031e7ddddbb0b8959c5a6853a7b", | |
| 49 | + "model_type": "olmoe" | |
| 50 | +} | |
| \ No newline at end of file | ||
added
benchmarks/raw/tests/numerical_olmoe_cap32_2026-11-01T014858.json
+50 −0
@@ -0,0 +1,50 @@ | ||
| 1 | +{ | |
| 2 | + "capacity": 32, | |
| 3 | + "prompts": [ | |
| 4 | + { | |
| 5 | + "prompt": "The capital of Canada is", | |
| 6 | + "tokens": 5, | |
| 7 | + "max_abs_dlogit": 0.0, | |
| 8 | + "argmax_equal": true, | |
| 9 | + "hit_rate": 0.0, | |
| 10 | + "misses": 430, | |
| 11 | + "stall_s": 0.06809187470935285, | |
| 12 | + "layers_routed": 16 | |
| 13 | + }, | |
| 14 | + { | |
| 15 | + "prompt": "def fibonacci(n):\n \"\"\"Return the n-th", | |
| 16 | + "tokens": 21, | |
| 17 | + "max_abs_dlogit": 0.0, | |
| 18 | + "argmax_equal": true, | |
| 19 | + "hit_rate": 0.6060606060606061, | |
| 20 | + "misses": 429, | |
| 21 | + "stall_s": 0.06508483353536576, | |
| 22 | + "layers_routed": 40 | |
| 23 | + }, | |
| 24 | + { | |
| 25 | + "prompt": "Q: If a train travels 60 km in 45 minute", | |
| 26 | + "tokens": 25, | |
| 27 | + "max_abs_dlogit": 0.0, | |
| 28 | + "argmax_equal": true, | |
| 29 | + "hit_rate": 0.6090458488228006, | |
| 30 | + "misses": 631, | |
| 31 | + "stall_s": 0.09457516169641167, | |
| 32 | + "layers_routed": 58 | |
| 33 | + }, | |
| 34 | + { | |
| 35 | + "prompt": "Les mod\u00e8les \u00e0 m\u00e9lange d'experts activent", | |
| 36 | + "tokens": 26, | |
| 37 | + "max_abs_dlogit": 0.0, | |
| 38 | + "argmax_equal": true, | |
| 39 | + "hit_rate": 0.6224188790560472, | |
| 40 | + "misses": 512, | |
| 41 | + "stall_s": 0.08756570424884558, | |
| 42 | + "layers_routed": 49 | |
| 43 | + } | |
| 44 | + ], | |
| 45 | + "tol": 0.001, | |
| 46 | + "ts": "2026-11-01T01:48:58", | |
| 47 | + "max_abs_dlogit_worst": 0.0, | |
| 48 | + "model": "/Users/simon-pierreboucher/.cache/huggingface/hub/models--mlx-community--OLMoE-1B-7B-0125-Instruct-4bit/snapshots/e23844197887b031e7ddddbb0b8959c5a6853a7b", | |
| 49 | + "model_type": "olmoe" | |
| 50 | +} | |
| \ No newline at end of file | ||
added
benchmarks/raw/tests/numerical_olmoe_cap32_2026-11-01T015005.json
+50 −0
@@ -0,0 +1,50 @@ | ||
| 1 | +{ | |
| 2 | + "capacity": 32, | |
| 3 | + "prompts": [ | |
| 4 | + { | |
| 5 | + "prompt": "The capital of Canada is", | |
| 6 | + "tokens": 5, | |
| 7 | + "max_abs_dlogit": 0.0, | |
| 8 | + "argmax_equal": true, | |
| 9 | + "hit_rate": 0.0, | |
| 10 | + "misses": 430, | |
| 11 | + "stall_s": 0.05290862487163395, | |
| 12 | + "layers_routed": 16 | |
| 13 | + }, | |
| 14 | + { | |
| 15 | + "prompt": "def fibonacci(n):\n \"\"\"Return the n-th", | |
| 16 | + "tokens": 21, | |
| 17 | + "max_abs_dlogit": 0.0, | |
| 18 | + "argmax_equal": true, | |
| 19 | + "hit_rate": 0.6060606060606061, | |
| 20 | + "misses": 429, | |
| 21 | + "stall_s": 0.057208749698475, | |
| 22 | + "layers_routed": 40 | |
| 23 | + }, | |
| 24 | + { | |
| 25 | + "prompt": "Q: If a train travels 60 km in 45 minute", | |
| 26 | + "tokens": 25, | |
| 27 | + "max_abs_dlogit": 0.0, | |
| 28 | + "argmax_equal": true, | |
| 29 | + "hit_rate": 0.6090458488228006, | |
| 30 | + "misses": 631, | |
| 31 | + "stall_s": 0.07817478699143976, | |
| 32 | + "layers_routed": 58 | |
| 33 | + }, | |
| 34 | + { | |
| 35 | + "prompt": "Les mod\u00e8les \u00e0 m\u00e9lange d'experts activent", | |
| 36 | + "tokens": 26, | |
| 37 | + "max_abs_dlogit": 0.0, | |
| 38 | + "argmax_equal": true, | |
| 39 | + "hit_rate": 0.6224188790560472, | |
| 40 | + "misses": 512, | |
| 41 | + "stall_s": 0.06320704496465623, | |
| 42 | + "layers_routed": 49 | |
| 43 | + } | |
| 44 | + ], | |
| 45 | + "tol": 0.001, | |
| 46 | + "ts": "2026-11-01T01:50:05", | |
| 47 | + "max_abs_dlogit_worst": 0.0, | |
| 48 | + "model": "/Users/simon-pierreboucher/.cache/huggingface/hub/models--mlx-community--OLMoE-1B-7B-0125-Instruct-4bit/snapshots/e23844197887b031e7ddddbb0b8959c5a6853a7b", | |
| 49 | + "model_type": "olmoe" | |
| 50 | +} | |
| \ No newline at end of file | ||
added
benchmarks/raw/tests/numerical_olmoe_cap32_2026-11-01T015024.json
+50 −0
@@ -0,0 +1,50 @@ | ||
| 1 | +{ | |
| 2 | + "capacity": 32, | |
| 3 | + "prompts": [ | |
| 4 | + { | |
| 5 | + "prompt": "The capital of Canada is", | |
| 6 | + "tokens": 5, | |
| 7 | + "max_abs_dlogit": 0.0, | |
| 8 | + "argmax_equal": true, | |
| 9 | + "hit_rate": 0.0, | |
| 10 | + "misses": 430, | |
| 11 | + "stall_s": 0.05366220697760582, | |
| 12 | + "layers_routed": 16 | |
| 13 | + }, | |
| 14 | + { | |
| 15 | + "prompt": "def fibonacci(n):\n \"\"\"Return the n-th", | |
| 16 | + "tokens": 21, | |
| 17 | + "max_abs_dlogit": 0.0, | |
| 18 | + "argmax_equal": true, | |
| 19 | + "hit_rate": 0.6060606060606061, | |
| 20 | + "misses": 429, | |
| 21 | + "stall_s": 0.05273353960365057, | |
| 22 | + "layers_routed": 40 | |
| 23 | + }, | |
| 24 | + { | |
| 25 | + "prompt": "Q: If a train travels 60 km in 45 minute", | |
| 26 | + "tokens": 25, | |
| 27 | + "max_abs_dlogit": 0.0, | |
| 28 | + "argmax_equal": true, | |
| 29 | + "hit_rate": 0.6090458488228006, | |
| 30 | + "misses": 631, | |
| 31 | + "stall_s": 0.07555628998670727, | |
| 32 | + "layers_routed": 58 | |
| 33 | + }, | |
| 34 | + { | |
| 35 | + "prompt": "Les mod\u00e8les \u00e0 m\u00e9lange d'experts activent", | |
| 36 | + "tokens": 26, | |
| 37 | + "max_abs_dlogit": 0.0, | |
| 38 | + "argmax_equal": true, | |
| 39 | + "hit_rate": 0.6224188790560472, | |
| 40 | + "misses": 512, | |
| 41 | + "stall_s": 0.062176456209272146, | |
| 42 | + "layers_routed": 49 | |
| 43 | + } | |
| 44 | + ], | |
| 45 | + "tol": 0.001, | |
| 46 | + "ts": "2026-11-01T01:50:24", | |
| 47 | + "max_abs_dlogit_worst": 0.0, | |
| 48 | + "model": "/Users/simon-pierreboucher/.cache/huggingface/hub/models--mlx-community--OLMoE-1B-7B-0125-Instruct-4bit/snapshots/e23844197887b031e7ddddbb0b8959c5a6853a7b", | |
| 49 | + "model_type": "olmoe" | |
| 50 | +} | |
| \ No newline at end of file | ||
added
benchmarks/raw/tests/numerical_olmoe_cap64_2026-11-01T014858.json
+50 −0
@@ -0,0 +1,50 @@ | ||
| 1 | +{ | |
| 2 | + "capacity": 64, | |
| 3 | + "prompts": [ | |
| 4 | + { | |
| 5 | + "prompt": "The capital of Canada is", | |
| 6 | + "tokens": 5, | |
| 7 | + "max_abs_dlogit": 0.0, | |
| 8 | + "argmax_equal": true, | |
| 9 | + "hit_rate": 0.0, | |
| 10 | + "misses": 430, | |
| 11 | + "stall_s": 0.06326587486546487, | |
| 12 | + "layers_routed": 16 | |
| 13 | + }, | |
| 14 | + { | |
| 15 | + "prompt": "def fibonacci(n):\n \"\"\"Return the n-th", | |
| 16 | + "tokens": 21, | |
| 17 | + "max_abs_dlogit": 0.0, | |
| 18 | + "argmax_equal": true, | |
| 19 | + "hit_rate": 0.4637904468412943, | |
| 20 | + "misses": 348, | |
| 21 | + "stall_s": 0.05040391813963652, | |
| 22 | + "layers_routed": 16 | |
| 23 | + }, | |
| 24 | + { | |
| 25 | + "prompt": "Q: If a train travels 60 km in 45 minute", | |
| 26 | + "tokens": 25, | |
| 27 | + "max_abs_dlogit": 0.0, | |
| 28 | + "argmax_equal": true, | |
| 29 | + "hit_rate": 0.823076923076923, | |
| 30 | + "misses": 138, | |
| 31 | + "stall_s": 0.02257291681598872, | |
| 32 | + "layers_routed": 16 | |
| 33 | + }, | |
| 34 | + { | |
| 35 | + "prompt": "Les mod\u00e8les \u00e0 m\u00e9lange d'experts activent", | |
| 36 | + "tokens": 26, | |
| 37 | + "max_abs_dlogit": 0.0, | |
| 38 | + "argmax_equal": true, | |
| 39 | + "hit_rate": 0.9234828496042217, | |
| 40 | + "misses": 58, | |
| 41 | + "stall_s": 0.011926291976124048, | |
| 42 | + "layers_routed": 16 | |
| 43 | + } | |
| 44 | + ], | |
| 45 | + "tol": 0.001, | |
| 46 | + "ts": "2026-11-01T01:48:58", | |
| 47 | + "max_abs_dlogit_worst": 0.0, | |
| 48 | + "model": "/Users/simon-pierreboucher/.cache/huggingface/hub/models--mlx-community--OLMoE-1B-7B-0125-Instruct-4bit/snapshots/e23844197887b031e7ddddbb0b8959c5a6853a7b", | |
| 49 | + "model_type": "olmoe" | |
| 50 | +} | |
| \ No newline at end of file | ||
added
benchmarks/raw/tests/numerical_olmoe_cap64_2026-11-01T015005.json
+50 −0
@@ -0,0 +1,50 @@ | ||
| 1 | +{ | |
| 2 | + "capacity": 64, | |
| 3 | + "prompts": [ | |
| 4 | + { | |
| 5 | + "prompt": "The capital of Canada is", | |
| 6 | + "tokens": 5, | |
| 7 | + "max_abs_dlogit": 0.0, | |
| 8 | + "argmax_equal": true, | |
| 9 | + "hit_rate": 0.0, | |
| 10 | + "misses": 430, | |
| 11 | + "stall_s": 0.052728913724422455, | |
| 12 | + "layers_routed": 16 | |
| 13 | + }, | |
| 14 | + { | |
| 15 | + "prompt": "def fibonacci(n):\n \"\"\"Return the n-th", | |
| 16 | + "tokens": 21, | |
| 17 | + "max_abs_dlogit": 0.0, | |
| 18 | + "argmax_equal": true, | |
| 19 | + "hit_rate": 0.4637904468412943, | |
| 20 | + "misses": 348, | |
| 21 | + "stall_s": 0.04487437487114221, | |
| 22 | + "layers_routed": 16 | |
| 23 | + }, | |
| 24 | + { | |
| 25 | + "prompt": "Q: If a train travels 60 km in 45 minute", | |
| 26 | + "tokens": 25, | |
| 27 | + "max_abs_dlogit": 0.0, | |
| 28 | + "argmax_equal": true, | |
| 29 | + "hit_rate": 0.823076923076923, | |
| 30 | + "misses": 138, | |
| 31 | + "stall_s": 0.019109665183350444, | |
| 32 | + "layers_routed": 16 | |
| 33 | + }, | |
| 34 | + { | |
| 35 | + "prompt": "Les mod\u00e8les \u00e0 m\u00e9lange d'experts activent", | |
| 36 | + "tokens": 26, | |
| 37 | + "max_abs_dlogit": 0.0, | |
| 38 | + "argmax_equal": true, | |
| 39 | + "hit_rate": 0.9234828496042217, | |
| 40 | + "misses": 58, | |
| 41 | + "stall_s": 0.009046415099874139, | |
| 42 | + "layers_routed": 16 | |
| 43 | + } | |
| 44 | + ], | |
| 45 | + "tol": 0.001, | |
| 46 | + "ts": "2026-11-01T01:50:05", | |
| 47 | + "max_abs_dlogit_worst": 0.0, | |
| 48 | + "model": "/Users/simon-pierreboucher/.cache/huggingface/hub/models--mlx-community--OLMoE-1B-7B-0125-Instruct-4bit/snapshots/e23844197887b031e7ddddbb0b8959c5a6853a7b", | |
| 49 | + "model_type": "olmoe" | |
| 50 | +} | |
| \ No newline at end of file | ||
added
benchmarks/raw/tests/numerical_olmoe_cap64_2026-11-01T015024.json
+50 −0
@@ -0,0 +1,50 @@ | ||
| 1 | +{ | |
| 2 | + "capacity": 64, | |
| 3 | + "prompts": [ | |
| 4 | + { | |
| 5 | + "prompt": "The capital of Canada is", | |
| 6 | + "tokens": 5, | |
| 7 | + "max_abs_dlogit": 0.0, | |
| 8 | + "argmax_equal": true, | |
| 9 | + "hit_rate": 0.0, | |
| 10 | + "misses": 430, | |
| 11 | + "stall_s": 0.05269420798867941, | |
| 12 | + "layers_routed": 16 | |
| 13 | + }, | |
| 14 | + { | |
| 15 | + "prompt": "def fibonacci(n):\n \"\"\"Return the n-th", | |
| 16 | + "tokens": 21, | |
| 17 | + "max_abs_dlogit": 0.0, | |
| 18 | + "argmax_equal": true, | |
| 19 | + "hit_rate": 0.4637904468412943, | |
| 20 | + "misses": 348, | |
| 21 | + "stall_s": 0.04307745990809053, | |
| 22 | + "layers_routed": 16 | |
| 23 | + }, | |
| 24 | + { | |
| 25 | + "prompt": "Q: If a train travels 60 km in 45 minute", | |
| 26 | + "tokens": 25, | |
| 27 | + "max_abs_dlogit": 0.0, | |
| 28 | + "argmax_equal": true, | |
| 29 | + "hit_rate": 0.823076923076923, | |
| 30 | + "misses": 138, | |
| 31 | + "stall_s": 0.018091750680468976, | |
| 32 | + "layers_routed": 16 | |
| 33 | + }, | |
| 34 | + { | |
| 35 | + "prompt": "Les mod\u00e8les \u00e0 m\u00e9lange d'experts activent", | |
| 36 | + "tokens": 26, | |
| 37 | + "max_abs_dlogit": 0.0, | |
| 38 | + "argmax_equal": true, | |
| 39 | + "hit_rate": 0.9234828496042217, | |
| 40 | + "misses": 58, | |
| 41 | + "stall_s": 0.008422082057222724, | |
| 42 | + "layers_routed": 16 | |
| 43 | + } | |
| 44 | + ], | |
| 45 | + "tol": 0.001, | |
| 46 | + "ts": "2026-11-01T01:50:24", | |
| 47 | + "max_abs_dlogit_worst": 0.0, | |
| 48 | + "model": "/Users/simon-pierreboucher/.cache/huggingface/hub/models--mlx-community--OLMoE-1B-7B-0125-Instruct-4bit/snapshots/e23844197887b031e7ddddbb0b8959c5a6853a7b", | |
| 49 | + "model_type": "olmoe" | |
| 50 | +} | |
| \ No newline at end of file | ||
added
benchmarks/raw/tests/numerical_olmoe_cap8_2026-11-01T014900.json
+50 −0
@@ -0,0 +1,50 @@ | ||
| 1 | +{ | |
| 2 | + "capacity": 8, | |
| 3 | + "prompts": [ | |
| 4 | + { | |
| 5 | + "prompt": "The capital of Canada is", | |
| 6 | + "tokens": 5, | |
| 7 | + "max_abs_dlogit": 0.0, | |
| 8 | + "argmax_equal": true, | |
| 9 | + "hit_rate": 0.1625, | |
| 10 | + "misses": 536, | |
| 11 | + "stall_s": 0.07683816191274673, | |
| 12 | + "layers_routed": 80 | |
| 13 | + }, | |
| 14 | + { | |
| 15 | + "prompt": "def fibonacci(n):\n \"\"\"Return the n-th", | |
| 16 | + "tokens": 21, | |
| 17 | + "max_abs_dlogit": 0.0, | |
| 18 | + "argmax_equal": true, | |
| 19 | + "hit_rate": 0.4425981873111782, | |
| 20 | + "misses": 1476, | |
| 21 | + "stall_s": 0.20861312677152455, | |
| 22 | + "layers_routed": 331 | |
| 23 | + }, | |
| 24 | + { | |
| 25 | + "prompt": "Q: If a train travels 60 km in 45 minute", | |
| 26 | + "tokens": 25, | |
| 27 | + "max_abs_dlogit": 0.0, | |
| 28 | + "argmax_equal": true, | |
| 29 | + "hit_rate": 0.375, | |
| 30 | + "misses": 1995, | |
| 31 | + "stall_s": 0.2837240828666836, | |
| 32 | + "layers_routed": 399 | |
| 33 | + }, | |
| 34 | + { | |
| 35 | + "prompt": "Les mod\u00e8les \u00e0 m\u00e9lange d'experts activent", | |
| 36 | + "tokens": 26, | |
| 37 | + "max_abs_dlogit": 0.0, | |
| 38 | + "argmax_equal": true, | |
| 39 | + "hit_rate": 0.3878048780487805, | |
| 40 | + "misses": 2008, | |
| 41 | + "stall_s": 0.2809703811071813, | |
| 42 | + "layers_routed": 410 | |
| 43 | + } | |
| 44 | + ], | |
| 45 | + "tol": 0.001, | |
| 46 | + "ts": "2026-11-01T01:49:00", | |
| 47 | + "max_abs_dlogit_worst": 0.0, | |
| 48 | + "model": "/Users/simon-pierreboucher/.cache/huggingface/hub/models--mlx-community--OLMoE-1B-7B-0125-Instruct-4bit/snapshots/e23844197887b031e7ddddbb0b8959c5a6853a7b", | |
| 49 | + "model_type": "olmoe" | |
| 50 | +} | |
| \ No newline at end of file | ||
added
benchmarks/raw/tests/numerical_olmoe_cap8_2026-11-01T015007.json
+50 −0
@@ -0,0 +1,50 @@ | ||
| 1 | +{ | |
| 2 | + "capacity": 8, | |
| 3 | + "prompts": [ | |
| 4 | + { | |
| 5 | + "prompt": "The capital of Canada is", | |
| 6 | + "tokens": 5, | |
| 7 | + "max_abs_dlogit": 0.0, | |
| 8 | + "argmax_equal": true, | |
| 9 | + "hit_rate": 0.1625, | |
| 10 | + "misses": 536, | |
| 11 | + "stall_s": 0.06772437284234911, | |
| 12 | + "layers_routed": 80 | |
| 13 | + }, | |
| 14 | + { | |
| 15 | + "prompt": "def fibonacci(n):\n \"\"\"Return the n-th", | |
| 16 | + "tokens": 21, | |
| 17 | + "max_abs_dlogit": 0.0, | |
| 18 | + "argmax_equal": true, | |
| 19 | + "hit_rate": 0.4425981873111782, | |
| 20 | + "misses": 1476, | |
| 21 | + "stall_s": 0.19338525040075183, | |
| 22 | + "layers_routed": 331 | |
| 23 | + }, | |
| 24 | + { | |
| 25 | + "prompt": "Q: If a train travels 60 km in 45 minute", | |
| 26 | + "tokens": 25, | |
| 27 | + "max_abs_dlogit": 0.0, | |
| 28 | + "argmax_equal": true, | |
| 29 | + "hit_rate": 0.375, | |
| 30 | + "misses": 1995, | |
| 31 | + "stall_s": 0.2538081571692601, | |
| 32 | + "layers_routed": 399 | |
| 33 | + }, | |
| 34 | + { | |
| 35 | + "prompt": "Les mod\u00e8les \u00e0 m\u00e9lange d'experts activent", | |
| 36 | + "tokens": 26, | |
| 37 | + "max_abs_dlogit": 0.0, | |
| 38 | + "argmax_equal": true, | |
| 39 | + "hit_rate": 0.3878048780487805, | |
| 40 | + "misses": 2008, | |
| 41 | + "stall_s": 0.25273924763314426, | |
| 42 | + "layers_routed": 410 | |
| 43 | + } | |
| 44 | + ], | |
| 45 | + "tol": 0.001, | |
| 46 | + "ts": "2026-11-01T01:50:07", | |
| 47 | + "max_abs_dlogit_worst": 0.0, | |
| 48 | + "model": "/Users/simon-pierreboucher/.cache/huggingface/hub/models--mlx-community--OLMoE-1B-7B-0125-Instruct-4bit/snapshots/e23844197887b031e7ddddbb0b8959c5a6853a7b", | |
| 49 | + "model_type": "olmoe" | |
| 50 | +} | |
| \ No newline at end of file | ||
added
benchmarks/raw/tests/numerical_olmoe_cap8_2026-11-01T015026.json
+50 −0
@@ -0,0 +1,50 @@ | ||
| 1 | +{ | |
| 2 | + "capacity": 8, | |
| 3 | + "prompts": [ | |
| 4 | + { | |
| 5 | + "prompt": "The capital of Canada is", | |
| 6 | + "tokens": 5, | |
| 7 | + "max_abs_dlogit": 0.0, | |
| 8 | + "argmax_equal": true, | |
| 9 | + "hit_rate": 0.1625, | |
| 10 | + "misses": 536, | |
| 11 | + "stall_s": 0.06717508309520781, | |
| 12 | + "layers_routed": 80 | |
| 13 | + }, | |
| 14 | + { | |
| 15 | + "prompt": "def fibonacci(n):\n \"\"\"Return the n-th", | |
| 16 | + "tokens": 21, | |
| 17 | + "max_abs_dlogit": 0.0, | |
| 18 | + "argmax_equal": true, | |
| 19 | + "hit_rate": 0.4425981873111782, | |
| 20 | + "misses": 1476, | |
| 21 | + "stall_s": 0.18977228936273605, | |
| 22 | + "layers_routed": 331 | |
| 23 | + }, | |
| 24 | + { | |
| 25 | + "prompt": "Q: If a train travels 60 km in 45 minute", | |
| 26 | + "tokens": 25, | |
| 27 | + "max_abs_dlogit": 0.0, | |
| 28 | + "argmax_equal": true, | |
| 29 | + "hit_rate": 0.375, | |
| 30 | + "misses": 1995, | |
| 31 | + "stall_s": 0.2510305915493518, | |
| 32 | + "layers_routed": 399 | |
| 33 | + }, | |
| 34 | + { | |
| 35 | + "prompt": "Les mod\u00e8les \u00e0 m\u00e9lange d'experts activent", | |
| 36 | + "tokens": 26, | |
| 37 | + "max_abs_dlogit": 0.0, | |
| 38 | + "argmax_equal": true, | |
| 39 | + "hit_rate": 0.3878048780487805, | |
| 40 | + "misses": 2008, | |
| 41 | + "stall_s": 0.250745591474697, | |
| 42 | + "layers_routed": 410 | |
| 43 | + } | |
| 44 | + ], | |
| 45 | + "tol": 0.001, | |
| 46 | + "ts": "2026-11-01T01:50:26", | |
| 47 | + "max_abs_dlogit_worst": 0.0, | |
| 48 | + "model": "/Users/simon-pierreboucher/.cache/huggingface/hub/models--mlx-community--OLMoE-1B-7B-0125-Instruct-4bit/snapshots/e23844197887b031e7ddddbb0b8959c5a6853a7b", | |
| 49 | + "model_type": "olmoe" | |
| 50 | +} | |
| \ No newline at end of file | ||
modified
paper/main.pdf
+0 −0
Binary file not shown.
modified
paper/sections/results.tex
+13 −4
@@ -48,8 +48,9 @@ model does 53 misses per token (Prop.~\ref{prop:capacity}), i.e.\ about 11~ms of | ||
| 48 | 48 | From the v1 traces (18 prompts, 3\,686 tokens), per-layer LRU hit rates are 0.57 at 16 slots, 0.80 at 32 and 0.93 at 48 (LFU |
| 49 | 49 | within 0.01), nearly identical on fit and held-out prompts (\code{benchmarks/processed/gateC/sim\_olmoe\_laptop\_ssd\_v1.json}); |
| 50 | 50 | a one-layer-ahead transition predictor has recall@8 of 0.50 on held-out prompts; a linear probe on the previous layer's |
| 51 | −log-probabilities only 0.16 with these few traces. The v2 traces (65 prompts, 6 families) and the depth-$d$ predictors: | |
| 52 | −\textsc{pending} (simulation running at the time of writing; Table~\ref{tab:sim} is generated from its JSON). | |
| 51 | +log-probabilities only 0.16 with these few traces. Table~\ref{tab:sim} is generated from the simulation JSON (v2 traces when available, else v1). | |
| 52 | + | |
| 53 | +\input{tables/sim} | |
| 53 | 54 | |
| 54 | 55 | \subsection{Prefetching (H1)} |
| 55 | 56 | \label{sec:results-prefetch} |
@@ -57,10 +58,18 @@ With the one-layer horizon the online prefetcher raised the hit rate from 0.48 t | ||
| 57 | 58 | (code) but reduced throughput from 51 to 35 and from 73 to 56~\tps{} (Table~\ref{tab:capacity}): the lead time |
| 58 | 59 | $d\,\tau_\ell = 0.13$~ms is shorter than the 0.21~ms fetch, so predicted experts arrive late and are waited for, and the |
| 59 | 60 | 50\,\% of wrong predictions add traffic. This is exactly the regime excluded by condition~\eqref{eq:condition}. |
| 60 | −Depth-$d$ and token-horizon prefetching, and the cold-NVMe tier: \textsc{pending} (next experiments of Gate C). | |
| 61 | +Depth-$d$ and token-horizon prefetching on the cold-NVMe tier are reported in Table~\ref{tab:cold} (generated from | |
| 62 | +\code{benchmarks/raw/gateC/cold\_nvme\_laptop/sweep.jsonl}; rows present only for configurations that have run). | |
| 63 | + | |
| 64 | +\input{tables/cold} | |
| 61 | 65 | |
| 62 | 66 | \subsection{Medium model (Qwen3-30B-A3B)} |
| 63 | −mlx-lm and \titan{} all-resident baselines on M3U96a (96~GB): \textsc{pending} (running). | |
| 67 | +On M3U96a (M3 Ultra, 96~GB) the stacked-layout registry reads byte-equal slices, logits are bit-identical to mlx-lm at 128, 64, | |
| 68 | +32 and 16 slots per layer and greedy decoding is token-identical at 32 slots | |
| 69 | +(\code{benchmarks/raw/tests/m3u96a/}). Table~\ref{tab:qwen3} gives the baselines: mlx-lm 121.4~\tps{} and \titan{} all-resident | |
| 70 | +121.7~\tps{} (medians of 3 repeats), i.e.\ parity on a model whose decode step touches 0.97~GiB of expert weights. | |
| 71 | + | |
| 72 | +\input{tables/qwen3} | |
| 64 | 73 | |
| 65 | 74 | \subsection{Distributed execution (H2, H3), Metal kernels (H4), energy frontier (H5)} |
| 66 | 75 | \textsc{pending}: Gates D--F have protocols (Section~\ref{sec:algorithms}, \code{research/protocol.md}) and no logs in this version. |
modified
paper/tables/cold.tex
+1 −0
@@ -6,6 +6,7 @@ | ||
| 6 | 6 | \toprule |
| 7 | 7 | Backend & cfg & $n$ & decode tok/s (median) & p95 ITL ms & hit & stall s & TTFT ms \\ |
| 8 | 8 | \midrule |
| 9 | +titan & C=16, none, m=8, cold & 1 & 9.9 & 139.6 & 0.490 & 7.89 & 2849 \\ | |
| 9 | 10 | \bottomrule |
| 10 | 11 | \end{tabular} |
| 11 | 12 | \begin{tablenotes}\footnotesize |
modified
research/DECISIONS.md
+7 −0
@@ -53,3 +53,10 @@ on M3U96a (cluster coordinator for Gates E/F), then rsync to worker nodes over t | ||
| 53 | 53 | OLMoE (3.6 GB of experts) fits in every node's RAM, so the memory-budget regimes of H1/H3 need a model whose experts exceed |
| 54 | 54 | the budget of the smaller nodes (36–64 GB) and whose expert count (6 144) gives a realistic routing problem. gpt-oss-120b (62 GB) |
| 55 | 55 | is deferred until explicitly authorized. |
| 56 | + | |
| 57 | +## D-009 · 2026-11-01 · Expert-contiguous storage layout for the SSD tier | |
| 58 | +Decision: the SSD tier reads from a TITAN blob (`experts.titan`, one 4 KiB-aligned contiguous record per expert, index JSON) | |
| 59 | +generated once from the checkpoint by `scripts/convert_layout.py`; the source checkpoint is never modified and remains the | |
| 60 | +source of dense weights. Rationale: measured 9 scattered reads per expert in the HF safetensors (expert span 1.5 GB) → cold | |
| 61 | +16-slot decode 8–10 tok/s; with parallel reads 18; with the contiguous layout 36 tok/s (4.5× over v1). Colibri performs an | |
| 62 | +equivalent conversion to its own container; we keep safetensors for everything else so mlx-lm remains the exact reference. | |
modified
research/LOG.md
+13 −0
@@ -79,3 +79,16 @@ Chronological, append-only. Times are local (America/Toronto). Every entry names | ||
| 79 | 79 | - Cluster venvs ready on M3U96a, M3U96b, M4M64a, M2U64, M4M64c (`scripts/cluster_setup.sh`, mlx 0.32.4 / mlx-lm 0.32.2 everywhere). |
| 80 | 80 | - Paper skeleton v0.1 compiles (24 pages; `tab:sim` pending the v2 simulation). Cold-NVMe prefetch sweep launched on the laptop |
| 81 | 81 | (`benchmarks/scripts/run_cold_nvme_laptop.sh`: purge + F_NOCACHE, 16/32 slots, none/transition{1,2,3}/prev_rank, held-out). |
| 82 | +- Offline simulation v2 (`benchmarks/processed/gateC/sim_olmoe_v2_ssd043_m8.json`, 65 prompts, per-layer LRU, t_read 0.43 ms, 1 loader), | |
| 83 | + held-out: LRU hit 0.581 / 0.706 / 0.806 / 0.933 at C = 16 / 24 / 32 / 48. Transition predictor recall@8 **0.534 at depth 1, 0.525 | |
| 84 | + at depth 2, 0.517 at depth 3** → a 3-layer lead costs almost no accuracy, which is what the lead-time condition needs on a cold NVMe | |
| 85 | + (d·τ_layer ≥ λ → d ≥ 4 at 0.43 ms). Hit rate with transition prefetch 0.686 / 0.771 / 0.840 / 0.942 (+0.01–0.10) at +60–100 % loads; | |
| 86 | + prev_rank (m = 16) *hurts* (prefetch precision 0.18–0.47, evicts useful experts); the linear probe was broken by a label-alignment | |
| 87 | + bug (rows not offset across traces) → fixed, re-simulated (`sim_olmoe_v2_ssd043_m8_probe_fixed.json`); oracle 0.94–0.99. | |
| 88 | +- Cold NVMe tier (purge + F_NOCACHE), 16 slots, held-out general prompts, laptop: **v1** (9 `pread` per expert, serial) 8–10 tok/s, | |
| 89 | + stall 7–8 s / 64 tokens (`benchmarks/raw/gateC/cold_nvme_laptop/sweep_v1_9preads_serial.jsonl`); **v2** parallel demand reads | |
| 90 | + (4 reader threads) 18 tok/s, stall 3.0 s (`quick_v2.jsonl`); finding: in the mlx-community OLMoE file the 9 tensors of one expert are | |
| 91 | + scattered over a 1.5 GB span (hash order of keys), so every miss costs 9 random reads. **v3**: `scripts/convert_layout.py` writes an | |
| 92 | + expert-contiguous blob (one 4 KiB-aligned 3.4 MB record per expert, 3.6 GB written in 3.2 s; `~/.cache/titan/<hash>/`), the registry | |
| 93 | + points at it transparently, tests verify byte equality with the original (`tests/test_registry_store.py`, one pread per expert) → | |
| 94 | + **36 tok/s**, stall 1.2 s / 64 tokens (`quick_v3.jsonl`), vs 51–73 tok/s from the page cache. Cold sweep restarted with v3. | |
added
scripts/convert_layout.py
+48 −0
@@ -0,0 +1,48 @@ | ||
| 1 | +#!/usr/bin/env python3 | |
| 2 | +"""Convert a checkpoint's expert tensors into the TITAN expert-contiguous layout: one 4 KiB-aligned blob per (layer, expert) | |
| 3 | +holding its tensors back to back, so that the SSD tier reads an expert with a single pread. Dense tensors stay in the | |
| 4 | +original safetensors. Output: <out_dir>/experts.titan (blob) + <out_dir>/experts.titan.json (index). Never modifies the source. | |
| 5 | +""" | |
| 6 | +import argparse, hashlib, json, os, sys, time | |
| 7 | +sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) | |
| 8 | +from titan.registry import load_spec | |
| 9 | + | |
| 10 | +ALIGN = 4096 | |
| 11 | + | |
| 12 | +def main(): | |
| 13 | + ap = argparse.ArgumentParser() | |
| 14 | + ap.add_argument("model_dir") | |
| 15 | + ap.add_argument("--out", default=None, help="default: ~/.cache/titan/<sha1 of realpath>/") | |
| 16 | + a = ap.parse_args() | |
| 17 | + spec = load_spec(a.model_dir) | |
| 18 | + out = a.out or os.path.expanduser(f"~/.cache/titan/{hashlib.sha1(os.path.realpath(a.model_dir).encode()).hexdigest()[:12]}") | |
| 19 | + os.makedirs(out, exist_ok=True) | |
| 20 | + blob = os.path.join(out, "experts.titan") | |
| 21 | + index = {"source": os.path.realpath(a.model_dir), "model_type": spec.model_type, "align": ALIGN, "experts": {}} | |
| 22 | + fds = {} | |
| 23 | + t0 = time.perf_counter(); written = 0 | |
| 24 | + with open(blob, "wb") as w: | |
| 25 | + pos = 0 | |
| 26 | + for l in range(spec.num_layers): | |
| 27 | + for e in range(spec.num_experts): | |
| 28 | + es = spec.experts[(l, e)] | |
| 29 | + parts = {}; off = 0 | |
| 30 | + chunks = [] | |
| 31 | + for name, loc in es.tensors.items(): # fixed order: as in the registry (gate, up, down × weight, scales, biases) | |
| 32 | + fd = fds.get(loc.file) or fds.setdefault(loc.file, os.open(loc.file, os.O_RDONLY)) | |
| 33 | + b = os.pread(fd, loc.nbytes, loc.offset) | |
| 34 | + assert len(b) == loc.nbytes | |
| 35 | + parts[name] = {"off": off, "n": loc.nbytes, "dtype": loc.dtype, "shape": list(loc.shape)} | |
| 36 | + chunks.append(b); off += loc.nbytes | |
| 37 | + data = b"".join(chunks) | |
| 38 | + pad = (-len(data)) % ALIGN | |
| 39 | + w.write(data); w.write(b"\0" * pad) | |
| 40 | + index["experts"][f"{l},{e}"] = {"offset": pos, "nbytes": len(data), "tensors": parts} | |
| 41 | + pos += len(data) + pad; written += len(data) | |
| 42 | + print(f"layer {l} done, {pos/1e9:.2f} GB", file=sys.stderr) | |
| 43 | + index["blob_bytes"] = pos | |
| 44 | + json.dump(index, open(blob + ".json", "w")) | |
| 45 | + print(json.dumps({"out": out, "experts": len(index["experts"]), "bytes": written, "blob_bytes": pos, "seconds": time.perf_counter() - t0})) | |
| 46 | + | |
| 47 | +if __name__ == "__main__": | |
| 48 | + main() | |
modified
tests/test_registry_store.py
+4 −1
@@ -15,8 +15,9 @@ def test_registry_olmoe(model_dir): | ||
| 15 | 15 | def test_store_reads_match_mx_load(model_dir): |
| 16 | 16 | """Bytes read with pread at registry offsets must equal what mx.load returns for the same tensor.""" |
| 17 | 17 | s = load_spec(model_dir) |
| 18 | − if s.layout != "per_expert": | |
| 18 | + if s.layout.startswith("stacked"): | |
| 19 | 19 | pytest.skip("stacked layout covered by test_registry_stacked.py") |
| 20 | + # with the TITAN contiguous layout present, this also verifies the conversion byte-for-byte against the original file | |
| 20 | 21 | st = ExpertStore(s) |
| 21 | 22 | ref = mx.load(f"{model_dir}/model.safetensors") |
| 22 | 23 | for (l, e) in [(0, 0), (7, 33), (15, 63)]: |
@@ -27,4 +28,6 @@ def test_store_reads_match_mx_load(model_dir): | ||
| 27 | 28 | assert arr.shape == r.shape and arr.dtype == r.dtype |
| 28 | 29 | assert bool(mx.array_equal(arr, r)), (l, e, name) |
| 29 | 30 | assert st.stats()["bytes_read"] == 3 * s.bytes_per_expert |
| 31 | + if "titan_contiguous" in s.layout: | |
| 32 | + assert st.stats()["reads"] == 3 # one pread per expert | |
| 30 | 33 | st.close() |
modified
titan/predictors.py
+4 −5
@@ -88,11 +88,10 @@ class Probe(Predictor): | ||
| 88 | 88 | for l in range(1, self.L): |
| 89 | 89 | X = np.concatenate([p[:, l - 1].astype(np.float32) for _, p in traces], 0) |
| 90 | 90 | Y = np.zeros((X.shape[0], self.E), np.float32) |
| 91 | − rows = np.concatenate([np.repeat(np.arange(t.shape[0]), t.shape[2]) for t, _ in traces]); off = 0; cols = [] | |
| 92 | − for t, _ in traces: | |
| 93 | − cols.append(t[:, l].reshape(-1)); | |
| 94 | − cols = np.concatenate(cols) | |
| 95 | − Y[rows, cols] = 1.0 | |
| 91 | + rows, cols, off = [], [], 0 | |
| 92 | + for t, _ in traces: # row offsets accumulate across traces (bug fixed 2026-11-01: labels were misaligned) | |
| 93 | + rows.append(off + np.repeat(np.arange(t.shape[0]), t.shape[2])); cols.append(t[:, l].reshape(-1)); off += t.shape[0] | |
| 94 | + Y[np.concatenate(rows), np.concatenate(cols)] = 1.0 | |
| 96 | 95 | X = np.log(np.clip(X, 1e-6, None)) # log-probabilities as features (scale-free) |
| 97 | 96 | self.mu[l] = X.mean(0); self.sd[l] = X.std(0) + 1e-6 |
| 98 | 97 | Xb = np.concatenate([(X - self.mu[l]) / self.sd[l], np.ones((X.shape[0], 1), np.float32)], 1) |
modified
titan/registry.py
+24 −1
@@ -123,7 +123,26 @@ def read_safetensors_header(path: str) -> Dict[str, TensorLoc]: | ||
| 123 | 123 | return locs |
| 124 | 124 | |
| 125 | 125 | |
| 126 | −def load_spec(model_dir: str) -> ModelSpec: | |
| 126 | +def titan_layout_dir(model_dir: str): | |
| 127 | + import hashlib | |
| 128 | + d = os.path.expanduser(f"~/.cache/titan/{hashlib.sha1(os.path.realpath(model_dir).encode()).hexdigest()[:12]}") | |
| 129 | + return d if os.path.exists(os.path.join(d, "experts.titan.json")) else None | |
| 130 | + | |
| 131 | + | |
| 132 | +def apply_titan_layout(spec: "ModelSpec", layout_dir: str) -> "ModelSpec": | |
| 133 | + """Point every expert's tensors at the contiguous blob produced by scripts/convert_layout.py.""" | |
| 134 | + idx = json.load(open(os.path.join(layout_dir, "experts.titan.json"))) | |
| 135 | + blob = os.path.join(layout_dir, "experts.titan") | |
| 136 | + for key, ent in idx["experts"].items(): | |
| 137 | + l, e = map(int, key.split(",")) | |
| 138 | + es = spec.experts[(l, e)] | |
| 139 | + es.tensors = {name: TensorLoc(f"titan:{l},{e}:{name}", p["dtype"], tuple(p["shape"]), blob, ent["offset"] + p["off"], p["n"]) | |
| 140 | + for name, p in ent["tensors"].items()} | |
| 141 | + spec.layout = spec.layout + "+titan_contiguous" | |
| 142 | + return spec | |
| 143 | + | |
| 144 | + | |
| 145 | +def load_spec(model_dir: str, use_titan_layout: bool = True) -> ModelSpec: | |
| 127 | 146 | model_dir = os.path.realpath(model_dir) |
| 128 | 147 | with open(os.path.join(model_dir, "config.json")) as f: |
| 129 | 148 | cfg = json.load(f) |
@@ -170,6 +189,10 @@ def load_spec(model_dir: str) -> ModelSpec: | ||
| 170 | 189 | raise ValueError(f"no expert tensors found for layer {l} expert {e} (neither per-expert nor stacked keys)") |
| 171 | 190 | spec.experts[(l, e)] = ExpertSpec(l, e, tensors) |
| 172 | 191 | spec.dense = {k: v for k, v in locs.items() if k not in per_expert_keys} |
| 192 | + if use_titan_layout: | |
| 193 | + d = titan_layout_dir(model_dir) | |
| 194 | + if d: | |
| 195 | + apply_titan_layout(spec, d) | |
| 173 | 196 | return spec |
| 174 | 197 | |
| 175 | 198 | |
modified
titan/slots.py
+1 −1
@@ -142,7 +142,7 @@ class SlotTable: | ||
| 142 | 142 | self.misses += len(missing) |
| 143 | 143 | if missing: |
| 144 | 144 | t = time.perf_counter() |
| 145 | − tensors = {e: self.store.read_expert(self.layer, e) for e in missing} | |
| 145 | + tensors = self.store.read_experts(self.layer, missing) | |
| 146 | 146 | self.stall_time += time.perf_counter() - t |
| 147 | 147 | for e in missing: |
| 148 | 148 | self._install(e, tensors[e], needed) |
modified
titan/store.py
+44 −3
@@ -15,6 +15,7 @@ from typing import Dict, Tuple | ||
| 15 | 15 | import mlx.core as mx |
| 16 | 16 | import numpy as np |
| 17 | 17 | |
| 18 | +from concurrent.futures import ThreadPoolExecutor | |
| 18 | 19 | from .registry import ModelSpec, TensorLoc |
| 19 | 20 | |
| 20 | 21 | F_NOCACHE = 48 |
@@ -23,13 +24,21 @@ MX_DTYPE = {"F32": mx.float32, "F16": mx.float16, "U32": mx.uint32, "I32": mx.in | ||
| 23 | 24 | |
| 24 | 25 | |
| 25 | 26 | class ExpertStore: |
| 26 | − def __init__(self, spec: ModelSpec, nocache: bool = False): | |
| 27 | + def __init__(self, spec: ModelSpec, nocache: bool = False, readers: int = 4): | |
| 27 | 28 | self.spec = spec |
| 28 | 29 | self.nocache = nocache |
| 29 | 30 | self._fds: Dict[str, int] = {} |
| 30 | 31 | self.bytes_read = 0 |
| 31 | 32 | self.reads = 0 |
| 32 | 33 | self.read_time = 0.0 |
| 34 | + self.readers = readers | |
| 35 | + self._pool = ThreadPoolExecutor(max_workers=readers, thread_name_prefix="titan-store") if readers > 1 else None | |
| 36 | + # an expert whose tensors are contiguous in the file is read with ONE pread (OLMoE: all 1 024 experts are contiguous) | |
| 37 | + self._contig: Dict[Tuple[int, int], Tuple[str, int, int, list]] = {} | |
| 38 | + for key, es in spec.experts.items(): | |
| 39 | + locs = sorted(es.tensors.items(), key=lambda kv: kv[1].offset) | |
| 40 | + if all(a[1].file == b[1].file and a[1].offset + a[1].nbytes == b[1].offset for a, b in zip(locs, locs[1:])): | |
| 41 | + self._contig[key] = (locs[0][1].file, locs[0][1].offset, sum(t.nbytes for _, t in locs), locs) | |
| 33 | 42 | |
| 34 | 43 | def _fd(self, path: str) -> int: |
| 35 | 44 | fd = self._fds.get(path) |
@@ -54,9 +63,41 @@ class ExpertStore: | ||
| 54 | 63 | return mx.array(arr).view(mx.bfloat16) |
| 55 | 64 | return mx.array(arr) |
| 56 | 65 | |
| 66 | + def _wrap(self, loc: TensorLoc, buf) -> mx.array: | |
| 67 | + arr = np.frombuffer(buf, dtype=NP_DTYPE[loc.dtype]).reshape(loc.shape) | |
| 68 | + if loc.dtype == "BF16": | |
| 69 | + return mx.array(arr).view(mx.bfloat16) | |
| 70 | + return mx.array(arr) | |
| 71 | + | |
| 57 | 72 | def read_expert(self, layer: int, expert: int) -> Dict[str, mx.array]: |
| 58 | − es = self.spec.experts[(layer, expert)] | |
| 59 | − return {name: self.read_tensor(loc) for name, loc in es.tensors.items()} | |
| 73 | + c = self._contig.get((layer, expert)) | |
| 74 | + if c is None: | |
| 75 | + es = self.spec.experts[(layer, expert)] | |
| 76 | + return {name: self.read_tensor(loc) for name, loc in es.tensors.items()} | |
| 77 | + path, off, n, locs = c | |
| 78 | + fd = self._fd(path) | |
| 79 | + t = time.perf_counter() | |
| 80 | + buf = os.pread(fd, n, off) | |
| 81 | + self.read_time += time.perf_counter() - t | |
| 82 | + self.bytes_read += len(buf); self.reads += 1 | |
| 83 | + if len(buf) != n: | |
| 84 | + raise IOError(f"short read for expert ({layer},{expert}): {len(buf)} != {n}") | |
| 85 | + out = {} | |
| 86 | + for name, loc in locs: | |
| 87 | + a = loc.offset - off | |
| 88 | + out[name] = self._wrap(loc, memoryview(buf)[a:a + loc.nbytes]) | |
| 89 | + return out | |
| 90 | + | |
| 91 | + def read_experts(self, layer: int, experts) -> Dict[int, Dict[str, mx.array]]: | |
| 92 | + """Read several experts, in parallel when a reader pool exists (NVMe benefits from queue depth).""" | |
| 93 | + experts = list(experts) | |
| 94 | + if self._pool is None or len(experts) == 1: | |
| 95 | + return {e: self.read_expert(layer, e) for e in experts} | |
| 96 | + t = time.perf_counter() | |
| 97 | + res = dict(zip(experts, self._pool.map(lambda e: self.read_expert(layer, e), experts))) | |
| 98 | + self.read_time += 0 # per-read times already accumulated inside read_expert (sum of thread times, not wall) | |
| 99 | + self.wall_batch_time = getattr(self, "wall_batch_time", 0.0) + (time.perf_counter() - t) | |
| 100 | + return res | |
| 60 | 101 | |
| 61 | 102 | def read_expert_bytes(self, layer: int, expert: int) -> Dict[str, bytes]: |
| 62 | 103 | """Raw bytes (for the network transport).""" |
| 63 | 104 | |