Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
74 commits
Select commit Hold shift + click to select a range
3c6d9f1
ramp: keep DeepSeek-V4 FP8 residents as their source bytes (opt-in mx…
jackmaxwil Nov 5, 2026
450c925
bench: gate DSV4 headline rows on memory coming back in (row schema v2)
jackmaxwil Nov 5, 2026
bd7fd54
keep: REAP expert saliency from the real gate, collected in the calib…
jackmaxwil Nov 5, 2026
33a5681
keep: replay recorded routing through an in-RAM expert hot set (SSD-t…
jackmaxwil Nov 5, 2026
5baed30
ramp: opt-in one-dispatch sinkhorn for DeepSeek-V4 hyper-connections
jackmaxwil Nov 5, 2026
00580c4
ramp: opt-in single-token E8P kernels for 16-bit codes on GPUs withou…
jackmaxwil Nov 5, 2026
7deda77
docs: Phase 0 kill-test runbook and one-command Mac runner
jackmaxwil Nov 5, 2026
b392eb3
docs: V4.1 plan and Phase 0 closeout status
jackmaxwil Nov 5, 2026
8618f29
bench: Phase 0 kill-test evidence from the M4 Max
jackmaxwil Nov 6, 2026
1052620
docs: decoding each E8P codeword once is slower on the M4 Max
jackmaxwil Nov 6, 2026
3a66e5b
bench: time the E8P kill test as one decode step (row schema v2)
jackmaxwil Nov 6, 2026
bff76f2
bench: time the mxfp8 resident kill test as one decode step (v2)
jackmaxwil Nov 6, 2026
89e287d
docs: M4 Max reads 474-477 GB/s, not 409.4
jackmaxwil Nov 6, 2026
7a6619d
ramp: tuned single-token E8P kernel for GPUs without NAX (opt-in)
jackmaxwil Nov 6, 2026
ec08ddc
ramp: make the tuned E8P M=1 kernel the default on GPUs without NAX
jackmaxwil Nov 6, 2026
705ed34
ramp: serve MTP verify windows (<= 32 tokens) with the E8P kernel on …
jackmaxwil Nov 6, 2026
d5ad5c0
runpod: V4.1-Flash REAP kit (teacher pass, candidate scoring, byte-ex…
jackmaxwil Nov 6, 2026
751fa64
runpod: single-pod mode (all stage), REAP 50% and 75% prunes
jackmaxwil Nov 6, 2026
94b8cf5
runpod: document 8xH200 provisioning lessons in the V4.1 REAP runbook
jackmaxwil Nov 6, 2026
1f771cc
docs: single-GPU layer-streamed design for the V4.1-Flash REAP run
jackmaxwil Nov 6, 2026
0622bc2
runpod: layer-streamed single-GPU driver for the V4.1-Flash REAP run
jackmaxwil Nov 6, 2026
b864452
runpod: pod.sh fixes from the first H100 pod (hf includes, self-stop,…
jackmaxwil Nov 6, 2026
d7d91e6
docs: record the idle-GPU prep failure on the first H100 pod
jackmaxwil Nov 6, 2026
1795112
runpod: build_pack exits without finalization (datasets threads abort…
jackmaxwil Nov 6, 2026
c56d7e1
runpod: 262144-token chunks (524288 OOMed in the indexer on the H100)
jackmaxwil Nov 7, 2026
cc57078
v41 recovery: local eval harness, KEEP refits, precision allocation, …
jackmaxwil Nov 9, 2026
5252788
v41 routed precision: per-token tier 0 (--tau-drop), cost report, pap…
jackmaxwil Nov 9, 2026
3834329
docs: routing regimes by depth, headline progress rubric
jackmaxwil Nov 9, 2026
6967984
docs: routed-precision plan to 100% with prior art; keep_quant stores…
jackmaxwil Nov 9, 2026
194b02b
docs: headline is now 'Offload the Residual, Not the Expert'
jackmaxwil Nov 9, 2026
264190b
docs: candidate levers X1-X7 from the campaign and the KEEP survey
jackmaxwil Nov 9, 2026
cddc65a
v41 routed precision: separate-copy and oracle baselines, projection …
jackmaxwil Nov 9, 2026
ffab2bf
v41 routed precision: default code_bits 16 for the first E8P runs (se…
jackmaxwil Nov 9, 2026
2849338
runpod: masked calibration (collect.py --mask), rerank.py and the X1 …
jackmaxwil Nov 9, 2026
fd3d57e
docs: X2 closed (format artifact), X1 pod run started
jackmaxwil Nov 9, 2026
35bff84
v41 sidecars: unmap Engram tables after use, resumable fit, partial-f…
jackmaxwil Nov 9, 2026
51c0edd
runpod x1: copy the checkpoint to the container disk before GPU work …
jackmaxwil Nov 10, 2026
849b442
docs: routed sweep pass 1 (R beats S by 0.068, loses to flat 144 by 0…
jackmaxwil Nov 10, 2026
3641baf
X1 result (total mass beats REAP-50 by 0.184 KL), plan revision 2, re…
jackmaxwil Nov 10, 2026
ab9bd7c
plan: cut the 1-bit base; cancel passes 2b and 3
jackmaxwil Nov 10, 2026
691f97a
findings: where the selection gain sits (0.052 on teacher-confident p…
jackmaxwil Nov 10, 2026
e8d8530
plan revision 3: pruning as a frozen cache, critique, conjectures C1-…
jackmaxwil Nov 10, 2026
0cdfacc
local_eval: expert cache with drop or re-route on a miss (--miss), ga…
jackmaxwil Nov 10, 2026
199687d
docs: V4.1 build plan (pinned oMLX fork, compact router, kill tests, …
jackmaxwil Nov 10, 2026
027dace
build plan: memory cap stays at 80 GB (C = 160 on the Mac)
jackmaxwil Nov 10, 2026
dfe8f75
build plan: K1 runbook for stock oMLX
jackmaxwil Nov 10, 2026
780721f
docs: static resident-set costs at 250 and 288 (K3), pod terminated
jackmaxwil Nov 10, 2026
99f983f
docs: E1 result, an expert cache with re-route beats a static set at …
jackmaxwil Nov 10, 2026
681e131
K1: stock oMLX on the pruned checkpoint; a fixed resident set with a …
jackmaxwil Nov 10, 2026
95b9a85
v41_build: expert cache that never waits, under stock oMLX (router as…
jackmaxwil Nov 10, 2026
21603b5
K2: lattice kernel matches oMLX's expert formats per expert at V4.1 s…
jackmaxwil Nov 10, 2026
8796962
v41_build: 2-bit lattice experts in the no-wait cache under stock oML…
jackmaxwil Nov 10, 2026
3e620bd
docs: the exact pruned pool of 192 also fails with thinking on; not t…
jackmaxwil Nov 10, 2026
b8b218d
docs: thinking finishes under sampling with a 12,000-token budget (la…
jackmaxwil Nov 10, 2026
ef28778
v41_reap: the E8P fit in torch (matches the Metal search) and a pod j…
jackmaxwil Nov 10, 2026
136cc1f
v41_reap: extract_tensors.py, raw expert and router tensors from a po…
jackmaxwil Nov 10, 2026
0098ea8
v41_build: lattice cache over a pool wider than the loaded checkpoint…
jackmaxwil Nov 10, 2026
12607cc
docs: the full pool of 384 serves on the M4 Max (144 lattice resident…
jackmaxwil Nov 10, 2026
59c3282
v41_reap: local_eval.py on a GPU and on the unpruned checkpoint; tau3…
jackmaxwil Nov 11, 2026
46fff81
v41_reap: local_eval.py --router, the pool of 384 scored on a pruned …
jackmaxwil Nov 11, 2026
c5ec2d4
docs: tau sweep over the pool of 384 (cache of 144 at KL 0.454 agains…
jackmaxwil Nov 11, 2026
d6cf35d
v41_build: k5_pagecache.py, the page-cache kill test (MLX aliases a m…
jackmaxwil Nov 11, 2026
76384aa
v41_reap: local_eval.py --hot, the hottest residents as the checkpoin…
jackmaxwil Nov 11, 2026
cca338a
docs: drafter on the no-wait cache (+26-43% tok/s), sampling at the c…
jackmaxwil Nov 11, 2026
650fa6a
docs: KL by resident count over the pool of 384 (cache of 48 level wi…
jackmaxwil Nov 12, 2026
ccca2bc
docs: serving at 48 and 96 residents (speed holds, sampled scripts fa…
jackmaxwil Nov 12, 2026
7d18b31
docs: hot tier at 92 GB (217 residents with 32 FP4 beat 250 at 2 bits…
jackmaxwil Nov 12, 2026
0ab2081
docs: 200 residents served under the 100 GB limit (19 of 24 sampled s…
jackmaxwil Nov 12, 2026
ff7b7af
v41_reap: local_eval.py --hot-tier DIR, hot experts as 2-bit codes pl…
jackmaxwil Nov 12, 2026
97062e1
v41_build: resident experts from RAM by default (OMLX_LATTICE_SLOTS=a…
jackmaxwil Nov 12, 2026
f2a55a6
docs: slots-from-RAM table, 64 GB with the drafter is 49
jackmaxwil Nov 12, 2026
15a08a8
v41_build: slim_checkpoint.py and run_v41.sh, one command from a pool…
jackmaxwil Nov 12, 2026
5f28893
ramp: e8_1bit_m1, few-token kernels for the 1-bit E8 residual of a ne…
jackmaxwil Nov 12, 2026
61abef8
v41_build: d3_pressure.py, decode speed under memory pressure (33.5 t…
jackmaxwil Nov 12, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
import os, sys, time
import numpy as np, mlx.core as mx
sys.path.insert(0, ".")
from benchmarks.bench_e8p_m1 import synthetic_projection, _ffn, projection_bytes_per_expert, PROJECTIONS
from ramp.kernels import e8p_m1
layers = {
"gate_proj": synthetic_projection(experts=64, out=2048, inp=4096, group_size=512, seed=1),
"up_proj": synthetic_projection(experts=64, out=2048, inp=4096, group_size=512, seed=2),
"down_proj": synthetic_projection(experts=64, out=4096, inp=2048, group_size=512, seed=3),
}
rng = np.random.default_rng(0)
routes = [mx.array(np.sort(rng.choice(64, 6, replace=False))[None].astype(np.uint32)) for _ in range(64)]
ffn_bytes = 6 * sum(projection_bytes_per_expert(layers[p]) for p in PROJECTIONS)
x0 = mx.array(rng.normal(size=(1, 4096)).astype(np.float16))

def chain(n):
x = x0
for i in range(n): # dependent, like consecutive layers in one decode step
y = _ffn(layers, x, routes[i % 64], 2048)
x = (x + y.sum(axis=0, keepdims=True) * 1e-3).astype(mx.float16)
return x

for flag in ("0", "1"):
os.environ[e8p_m1.E8P_M1_ENV] = flag
for n in (1, 43):
for _ in range(3): mx.eval(chain(n))
best = min((lambda a: (mx.eval(chain(n)), time.perf_counter() - a)[1])(time.perf_counter()) for _ in range(30))
ms = best / n * 1e3
print(f"E8P_M1={flag} ffns/eval={n:2d} {ms:.4f} ms/ffn {ffn_bytes / (ms / 1e3) / 1e9:.1f} GB/s")
Original file line number Diff line number Diff line change
@@ -0,0 +1,100 @@
// Single-token (M=1) gather matvec for 16-bit E8P codes, decoding each
// codeword once into eight values (the generic M=1 kernel decodes it once per
// dimension, with an 8-step parity loop each time).
//
// E8P layout (see mlx_vq_decode_e8p_value in common_e8.metal): codeword bits
// 0-7 are signs, bits 8-15 index the 256-entry abs grid of packed nibbles.
// Dimension d reads nibble shuffle(d) = {0,4,1,5,2,6,3,7}[d], so nibbles 0-3
// pair with the even activations and nibbles 4-7 with the odd ones. Bit p of
// the effective signs negates nibble p, and every value gets +-0.25 by parity.
//
// Each lane loads CHUNK (4 or 8) codewords at once; 2-byte loads leave the
// matvec latency-bound.
//
// PER_ROUTE=0: one activation row for every route (gate/up).
// PER_ROUTE=1: route r reads activation row r (down).
uint lane = thread_position_in_threadgroup.x;
uint row_tile = threadgroup_position_in_grid.y;
uint route = threadgroup_position_in_grid.z;

uint top_k = uint(rhs_indices_shape[1]);
uint expert = uint(rhs_indices[route % top_k]);

uint out_dim = uint(codes_shape[1]);
uint codewords = uint(codes_shape[2]);
uint groups = uint(scales_shape[2]);
uint codewords_per_group = codewords / groups;
uint x_row = uint(PER_ROUTE) != 0u ? route * codewords * 8u : 0u;

uint row_slot = lane / uint(LANES_PER_ROW);
uint row_lane = lane - row_slot * uint(LANES_PER_ROW);
uint row = row_tile * uint(ROWS_PER_TG) + row_slot;

threadgroup uint local_codebook[256];
if (uint(USE_THREADGROUP_CODEBOOK) != 0u) {
for (uint idx = lane; idx < 256u; idx += threads_per_threadgroup.x) {
local_codebook[idx] = codebook[idx];
}
threadgroup_barrier(mem_flags::mem_threadgroup);
}

float acc = 0.0f;
if (row_slot < uint(ROWS_PER_TG) && row < out_dim) {
uint code_base = (expert * out_dim + row) * codewords;
uint scale_base = (expert * out_dim + row) * groups;
// One wide load of CHUNK codewords per lane per step; the host checks
// that codewords per group is a multiple of CHUNK.
uint chunks = codewords / uint(CHUNK);
for (uint chunk = row_lane; chunk < chunks; chunk += uint(LANES_PER_ROW)) {
uint cw0 = chunk * uint(CHUNK);
uint4 words;
if (uint(CHUNK) == 8u) {
words = ((const device uint4*)(codes + code_base))[chunk];
} else {
words.xy = ((const device uint2*)(codes + code_base))[chunk];
}
float chunk_acc = 0.0f;
for (uint i = 0; i < uint(CHUNK); ++i) {
uint codeword = (words[i >> 1u] >> ((i & 1u) * 16u)) & 0xFFFFu;
uint signs = codeword & 0xFFu;
uint parity = popcount(signs) & 1u;
uint effective = signs ^ parity;
uint abs_code = uint(USE_THREADGROUP_CODEBOOK) != 0u
? local_codebook[codeword >> 8u]
: codebook[codeword >> 8u];
float4 v_lo = (float4((uint4(abs_code) >> uint4(0u, 4u, 8u, 12u)) & 0xFu) - 8.0f) * 0.5f;
float4 v_hi = (float4((uint4(abs_code) >> uint4(16u, 20u, 24u, 28u)) & 0xFu) - 8.0f) * 0.5f;
v_lo *= 1.0f - 2.0f * float4((uint4(effective) >> uint4(0u, 1u, 2u, 3u)) & 1u);
v_hi *= 1.0f - 2.0f * float4((uint4(effective) >> uint4(4u, 5u, 6u, 7u)) & 1u);
float offset = parity != 0u ? -0.25f : 0.25f;
uint xb = x_row + (cw0 + i) * 8u;
float4 x_even = float4(float(x[xb]), float(x[xb + 2u]), float(x[xb + 4u]), float(x[xb + 6u]));
float4 x_odd = float4(float(x[xb + 1u]), float(x[xb + 3u]), float(x[xb + 5u]), float(x[xb + 7u]));
chunk_acc += dot(v_lo + offset, x_even) + dot(v_hi + offset, x_odd);
}
acc += chunk_acc * float(scales[scale_base + cw0 / codewords_per_group]);
}
}

if (uint(LANES_PER_ROW) <= 32u) {
float total = acc;
for (uint stride = uint(LANES_PER_ROW) >> 1; stride > 0; stride >>= 1) {
total += simd_shuffle_down(total, stride);
}
if (row_lane == 0 && row_slot < uint(ROWS_PER_TG) && row < out_dim) {
out[(route * out_dim) + row] = OUT_T(total);
}
} else {
threadgroup float partials[256];
partials[lane] = acc;
threadgroup_barrier(mem_flags::mem_threadgroup);
for (uint stride = uint(LANES_PER_ROW) >> 1; stride > 0; stride >>= 1) {
if (row_lane < stride) {
partials[lane] += partials[lane + stride];
}
threadgroup_barrier(mem_flags::mem_threadgroup);
}
if (row_lane == 0 && row_slot < uint(ROWS_PER_TG) && row < out_dim) {
out[(route * out_dim) + row] = OUT_T(partials[lane]);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
import time, statistics, sys
import numpy as np, mlx.core as mx
sys.path.insert(0, ".")
from benchmarks.bench_e8p_m1 import synthetic_projection
from ramp.kernels import e8p_m1
from ramp.kernels.gather_vqmm import gather_vqmm_m1_kernel_unchecked

L = synthetic_projection(experts=64, out=2048, inp=4096, group_size=512, seed=1)
rng = np.random.default_rng(0)
x = mx.array(rng.normal(size=(1, 4096)).astype(np.float16))
routes = [mx.array(np.sort(rng.choice(64, 6, replace=False))[None].astype(np.uint32)) for _ in range(64)]
nbytes = 6 * (L.codes.nbytes + L.scales.nbytes) // 64
sc = L.scales

def old(r, rows, tg):
return gather_vqmm_m1_kernel_unchecked(x, L.codes, sc, L.codebook, r, output_dims=2048, code_bits=16,
rows_per_threadgroup=rows, use_threadgroup_codebook=tg, use_decoded_codebook=False)
def new(r, rows, tg):
return e8p_m1.e8p_m1_token_layout(x, L.codes, sc, L.codebook, r, output_dims=2048,
rows_per_threadgroup=rows, use_threadgroup_codebook=tg)
def prod(r, rows, tg):
return L(x, r)

def once(fn, rows, tg):
a = time.perf_counter(); mx.eval([fn(r, rows, tg) for r in routes * 4]); return (time.perf_counter() - a) / (len(routes) * 4)

cases = [("prod", prod, 0)] + [(n, f, r) for r in (4, 8, 16, 32) for n, f in (("old", old), ("new", new))]
for n, f, r in cases:
for _ in range(3): once(f, r, True)
best = {c[0] + str(c[2]): 1e9 for c in cases}
for _ in range(20):
for n, f, r in cases:
best[n + str(r)] = min(best[n + str(r)], once(f, r, True))
ref = np.array(prod(routes[0], 0, 0).astype(mx.float32))
for n, f, r in cases:
ms = best[n + str(r)] * 1e3
d = np.max(np.abs(np.array(f(routes[0], r, True).astype(mx.float32)) - ref)) / np.max(np.abs(ref))
print("%s rows=%2d %.4f ms %.1f GB/s diff %.1e" % (n, r, ms, nbytes / (ms / 1e3) / 1e9, d))
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
{
"best": {
"effective_gb_per_s": 126.24687513292753,
"max_relative_diff_vs_production": 0.000638977624475956,
"median_ms_per_ffn": 0.30367927887032975,
"rows_per_threadgroup": 16,
"speedup_over_production": 2.4872253552301857,
"threadgroup_codebook": true
},
"configs": [
{
"effective_gb_per_s": 125.61180414014768,
"max_relative_diff_vs_production": 0.000643500650767237,
"median_ms_per_ffn": 0.3052146274184938,
"rows_per_threadgroup": 8,
"speedup_over_production": 2.4747136421762974,
"threadgroup_codebook": true
},
{
"effective_gb_per_s": 126.24687513292753,
"max_relative_diff_vs_production": 0.000638977624475956,
"median_ms_per_ffn": 0.30367927887032975,
"rows_per_threadgroup": 16,
"speedup_over_production": 2.4872253552301857,
"threadgroup_codebook": true
},
{
"effective_gb_per_s": 124.18555893060979,
"max_relative_diff_vs_production": 0.000643500650767237,
"median_ms_per_ffn": 0.3087199536736968,
"rows_per_threadgroup": 32,
"speedup_over_production": 2.446614782349445,
"threadgroup_codebook": true
},
{
"effective_gb_per_s": 114.7250308046974,
"max_relative_diff_vs_production": 0.000643500650767237,
"median_ms_per_ffn": 0.334177813952962,
"rows_per_threadgroup": 64,
"speedup_over_production": 2.260230244879809,
"threadgroup_codebook": true
},
{
"effective_gb_per_s": 120.24603723202925,
"max_relative_diff_vs_production": 0.000643500650767237,
"median_ms_per_ffn": 0.31883429078017034,
"rows_per_threadgroup": 32,
"speedup_over_production": 2.369001152341795,
"threadgroup_codebook": false
}
],
"device": "Device(gpu, 0)",
"ffn_bytes": 38338560,
"ffns_per_sync": 43,
"mlx_version": "0.31.2",
"outputs_agree": true,
"platform": "macOS-26.7.1-arm64-arm-64bit-Mach-O",
"production_effective_gb_per_s": 50.758116817783794,
"production_median_ms_per_ffn": 0.7553188022643025,
"record_type": "ramp_e8p_m1_kill_test_v2",
"source": "synthetic",
"verdict": "TUNE"
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
{
"best": {
"effective_gb_per_s": 123.71473313984096,
"max_relative_diff_vs_production": 0.000643500650767237,
"median_ms_per_ffn": 0.30989486075731987,
"rows_per_threadgroup": 32,
"speedup_over_production": 2.4497149387742128,
"threadgroup_codebook": true
},
"configs": [
{
"effective_gb_per_s": 122.3088833198184,
"max_relative_diff_vs_production": 0.000643500650767237,
"median_ms_per_ffn": 0.3134568721370035,
"rows_per_threadgroup": 8,
"speedup_over_production": 2.421877257534667,
"threadgroup_codebook": true
},
{
"effective_gb_per_s": 121.26227485943866,
"max_relative_diff_vs_production": 0.000638977624475956,
"median_ms_per_ffn": 0.3161623022860176,
"rows_per_threadgroup": 16,
"speedup_over_production": 2.4011530291798957,
"threadgroup_codebook": true
},
{
"effective_gb_per_s": 123.71473313984096,
"max_relative_diff_vs_production": 0.000643500650767237,
"median_ms_per_ffn": 0.30989486075731987,
"rows_per_threadgroup": 32,
"speedup_over_production": 2.4497149387742128,
"threadgroup_codebook": true
},
{
"effective_gb_per_s": 114.24601252337658,
"max_relative_diff_vs_production": 0.000643500650767237,
"median_ms_per_ffn": 0.33557897692188876,
"rows_per_threadgroup": 64,
"speedup_over_production": 2.2622217780444154,
"threadgroup_codebook": true
},
{
"effective_gb_per_s": 120.92889489763162,
"max_relative_diff_vs_production": 0.000643500650767237,
"median_ms_per_ffn": 0.3170339068462856,
"rows_per_threadgroup": 32,
"speedup_over_production": 2.394551666092416,
"threadgroup_codebook": false
}
],
"device": "Device(gpu, 0)",
"ffn_bytes": 38338560,
"ffns_per_sync": 43,
"mlx_version": "0.31.2",
"outputs_agree": true,
"platform": "macOS-26.7.1-arm64-arm-64bit-Mach-O",
"production_effective_gb_per_s": 50.50168539272789,
"production_median_ms_per_ffn": 0.759154069846561,
"record_type": "ramp_e8p_m1_kill_test_v2",
"source": "synthetic",
"verdict": "TUNE"
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
{
"best": {
"effective_gb_per_s": 205.49661679791186,
"max_relative_diff_vs_production": 0.000643500650767237,
"median_ms_per_ffn": 0.1865654072431891,
"rows_per_simdgroup": 4,
"simdgroups": 1,
"speedup_over_production": 3.969571859025884
},
"configs": [
{
"effective_gb_per_s": 200.36558927025263,
"max_relative_diff_vs_production": 0.000643500650767237,
"median_ms_per_ffn": 0.1913430351969721,
"rows_per_simdgroup": 8,
"simdgroups": 1,
"speedup_over_production": 3.870455957270122
},
{
"effective_gb_per_s": 205.49661679791186,
"max_relative_diff_vs_production": 0.000643500650767237,
"median_ms_per_ffn": 0.1865654072431891,
"rows_per_simdgroup": 4,
"simdgroups": 1,
"speedup_over_production": 3.969571859025884
},
{
"effective_gb_per_s": 201.96111349692686,
"max_relative_diff_vs_production": 0.000643500650767237,
"median_ms_per_ffn": 0.18983139544129807,
"rows_per_simdgroup": 4,
"simdgroups": 4,
"speedup_over_production": 3.901276649937917
},
{
"effective_gb_per_s": 201.68983785241895,
"max_relative_diff_vs_production": 0.000643500650767237,
"median_ms_per_ffn": 0.19008672131539517,
"rows_per_simdgroup": 2,
"simdgroups": 4,
"speedup_over_production": 3.8960364266132834
},
{
"effective_gb_per_s": 192.8922985262998,
"max_relative_diff_vs_production": 0.000643500650767237,
"median_ms_per_ffn": 0.19875630231433397,
"rows_per_simdgroup": 16,
"simdgroups": 1,
"speedup_over_production": 3.7260946286323495
}
],
"device": "Device(gpu, 0)",
"ffn_bytes": 38338560,
"ffns_per_sync": 43,
"mlx_version": "0.31.2",
"outputs_agree": true,
"platform": "macOS-26.7.1-arm64-arm-64bit-Mach-O",
"production_effective_gb_per_s": 51.76795485655721,
"production_median_ms_per_ffn": 0.7405847904602673,
"record_type": "ramp_e8p_m1_kill_test_v2",
"source": "synthetic",
"verdict": "PASS"
}
Loading
Loading