Skip to content

Commit 8f6c1f3

Browse files
barretodavidclaude
andcommitted
Drop the wash, split quant from cost, restore Context
Three fixes to the per-machine table: No background on the cells. The Q6-or-better signal now rides on the quant name alone, ink against muted, so the tier still reads without a shaded ground. FITS_BG and the .swatch rule go with it, both unused after. The quant and the memory it costs were one run of text ("Q8_0 30"), which made them hard to tell apart. They are two spans now: the quant in mono and bold, because it is a filename, and the cost muted, smaller and carrying its unit beside it. Context comes back. It was dropped to get the budget columns onto a phone screen, which was not mine to decide. It sits after the budget columns instead of before, so the answer still leads on a 390px screen. The audit reads the two spans separately rather than splitting cell text on a space, so a cell that loses its size fails instead of reparsing the quant name as one. Both that and a doctored size were confirmed to fail. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
1 parent 20cbb92 commit 8f6c1f3

3 files changed

Lines changed: 57 additions & 29 deletions

File tree

bench/audit.py

Lines changed: 19 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -407,19 +407,31 @@ def chart_labels(svg):
407407
bad_cell.append(f"{label}: not a leaderboard row")
408408
continue
409409
files = (_mm.get(spec.partition("@")[0], {}).get("gguf") or {}).get("files") or {}
410-
# the budget columns are the trailing cells, in VRAM_BUDGETS order
411-
tds = re.findall(r'<td class="r[^"]*"[^>]*>(.*?)</td>', rest, re.S)[-len(VRAM_BUDGETS):]
410+
# SCI leads and Context trails, so the budget columns are the cells between,
411+
# in VRAM_BUDGETS order. Sliced from both ends rather than counted from one,
412+
# so adding a trailing column cannot silently shift which cells are read.
413+
tds = re.findall(r'<td class="r[^"]*"[^>]*>(.*?)</td>', rest, re.S)[1:-1]
414+
if len(tds) != len(VRAM_BUDGETS):
415+
bad_cell.append(f"{label}: {len(tds)} budget cells, expected {len(VRAM_BUDGETS)}")
416+
continue
412417
for budget, td in zip(VRAM_BUDGETS, tds):
413418
want = best_quant_for(spec, budget)
414-
got = re.sub(r"<[^>]+>", "", td).strip()
415-
if not got:
419+
# the quant and its cost are separate spans now; read them separately so a
420+
# cell that loses one of them fails rather than reparsing as the other
421+
qm = re.search(r'<span class="q">(.*?)</span>', td, re.S)
422+
gm = re.search(r'<span class="gb">([\d,]+) GB</span>', td, re.S)
423+
if not qm:
416424
if want:
417425
bad_cell.append(f"{label} at {budget} GB: blank, expected {want[0]}")
418426
continue
419427
n_cell += 1
420-
name, _, size = got.rpartition(" ")
421-
if not want or name != want[0] or round(want[1]) != int(size.replace(",", "")):
422-
bad_cell.append(f"{label} at {budget} GB: prints {got!r}, picker says {want}")
428+
if not gm:
429+
bad_cell.append(f"{label} at {budget} GB: names a quant with no size")
430+
continue
431+
name, size = qm.group(1).strip(), int(gm.group(1).replace(",", ""))
432+
if not want or name != want[0] or round(want[1]) != size:
433+
bad_cell.append(f"{label} at {budget} GB: prints {name} {size}, "
434+
f"picker says {want}")
423435
elif name not in files:
424436
bad_cell.append(f"{label} at {budget} GB: {name} is not in the published ladder")
425437
elif files[name] > budget - BUDGET_RESERVE[budget]:

bench/html_report.py

Lines changed: 26 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -465,7 +465,6 @@ def head_to_head_chart(metrics, w=760):
465465

466466
ATTEMPT_COLORS = [SNF_BLUE, "#7c7ba2", "#bab7df", "#cecde7"] # 1, 2, 3, 4+ submissions
467467
UNSOLVED_COLOR = "#bdb5ad" # never solved: the band that tops every column
468-
FITS_BG = "#dbe7fc" # blue-05 wash: a quant that fits one local machine
469468
# Warm neutral on purpose. It has to be legible in a band 2% tall (DeepSeek
470469
# fails 1 run in 52), which ruled out the diagonal hatch tried first: at that
471470
# height it was invisible. It also has to stay off the lavender ramp, so it
@@ -1157,19 +1156,28 @@ def h2h_stats(spec):
11571156
cells += '<td class="r"></td>'
11581157
continue
11591158
name, gb = pick
1160-
# Two channels rather than lightness alone, as before, but pointed at
1161-
# what varies now: every filled cell fits by construction, so the wash
1162-
# marks the QUALITY tier instead. Q6 and up keeps the waterline
1163-
# readable without comparing any two numbers.
1159+
# The file name and the memory it costs are two different kinds of
1160+
# thing, so they are set as two: the quant in mono, which is what it
1161+
# is, a filename, and the cost muted and smaller beside it. Reading
1162+
# one without the other was the complaint about "Q8_0 30".
1163+
#
1164+
# Tier still shows, in ink versus muted on the name alone. Q6 and up
1165+
# is where quantization stops being what holds the model back.
11641166
tier = "fits" if gb * 8e9 / param_count(mm["params_total"]) >= 5.9 else "nofit"
11651167
cells += (f'<td class="r {tier}" data-s="{gb:.1f}">'
1166-
f'<b>{name}</b> {gb:,.0f}</td>')
1168+
f'<span class="q">{name}</span> '
1169+
f'<span class="gb">{gb:,.0f} GB</span></td>')
11671170
open_rows_html.append(
11681171
f'<tr><td>{r["label"]}</td>'
11691172
# the index rides along so this table can be read in score order too,
11701173
# which is the order it ships in; the models table above has the rest
11711174
+ num_td(r["sci"], f'{r["sci"]:.1f}')
1172-
+ cells + "</tr>"
1175+
# Context sits after the budget columns rather than before them: it is
1176+
# reference, not the answer, and in front it pushed every budget column
1177+
# off a 390px screen.
1178+
+ cells
1179+
+ num_td(mm["context_length"], fmt_ctx(mm["context_length"]))
1180+
+ "</tr>"
11731181
)
11741182

11751183
# every sortable table on the page, not one by id: the open-weight table
@@ -1224,10 +1232,10 @@ def h2h_stats(spec):
12241232
<section>
12251233
<h2>Which quantization for my machine</h2>
12261234
<p class="takeaway" style="margin:0 0 10px"><b>Pick your memory, read across.</b> Each cell is the <b>best quantization that fits</b>, named as the file you would download from the {gguf_sources} GGUF repos, and what it weighs in GB. Every figure is a real published file, not arithmetic.</p>
1227-
<p class="takeaway" style="margin:0 0 10px">The weights do not get the whole machine, so each column reserves room for the OS, the KV cache and activations: {budget_reserve_note}. <span class="swatch" style="background:{FITS_BG}"></span> marks a pick at <b>Q6 or better</b>, where quantization is not the thing holding the model back.</p>
1235+
<p class="takeaway" style="margin:0 0 10px">The weights do not get the whole machine, so each column reserves room for the OS, the KV cache and activations: {budget_reserve_note}. A quant in <b>full black</b> is <b>Q6 or better</b>, where quantization is not the thing holding the model back; a greyed one is a 4-to-5-bit compromise.</p>
12281236
<p class="takeaway" style="margin:0 0 10px">A blank means <b>nothing 4-bit or better fits</b>, which is a real answer rather than a missing one: below 4-bit degradation stops being minor and coding feels it first, so no cell recommends going lower. {too_big_note}</p>
12291237
<div class="tablewrap"><table id="opentable" class="sortable">
1230-
<tr><th>Model</th><th class="r desc" data-num aria-sort="descending">SCI</th>{"".join(f'<th class="r" data-num>{b} GB</th>' for b in VRAM_BUDGETS)}</tr>
1238+
<tr><th>Model</th><th class="r desc" data-num aria-sort="descending">SCI</th>{"".join(f'<th class="r" data-num>{b} GB</th>' for b in VRAM_BUDGETS)}<th class="r" data-num>Context</th></tr>
12311239
{"".join(open_rows_html)}
12321240
</table></div>
12331241
</section>"""
@@ -1331,10 +1339,15 @@ def h2h_stats(spec):
13311339
table.sortable th:hover,table.sortable th:focus-visible{{color:var(--ink)}}
13321340
table.sortable th.asc::after{{content:" \\25B2";font-size:9px}}
13331341
table.sortable th.desc::after{{content:" \\25BC";font-size:9px}}
1334-
/* Q6-or-better vs a 4-to-5-bit compromise: shaded ground plus ink, against no
1335-
ground and muted text. Colour alone was too close to read at this size. */
1336-
#opentable td.fits{{background:{FITS_BG};color:var(--ink);font-weight:600}}
1337-
#opentable td.nofit{{color:var(--muted)}}
1342+
/* Two kinds of thing in one cell, set as two: the quant is a filename, so it
1343+
is mono and carries the ink, and the memory it costs is muted and smaller
1344+
beside it. No background wash on either. */
1345+
#opentable td.r .q{{font-family:var(--mono);font-weight:700;font-size:12.5px}}
1346+
#opentable td.r .gb{{color:var(--muted);font-size:11px;white-space:nowrap}}
1347+
#opentable td.fits .q{{color:var(--ink)}}
1348+
/* a 4-to-5-bit pick: still the best that fits, but quantization is now part of
1349+
what holds the model back, so the name drops to muted */
1350+
#opentable td.nofit .q{{color:var(--muted)}}
13381351
/* Six narrow columns, not ten, so this one does not need the 900px floor the
13391352
wide tables do. Lowering it is what puts the ANSWER columns on screen at
13401353
390px: at 900 the phone showed Model and SCI and scrolled every budget
@@ -1344,7 +1357,6 @@ def h2h_stats(spec):
13441357
across two lines and left the rows at uneven heights; the table scrolls, so
13451358
there is no reason to break the cell instead. */
13461359
#opentable td.r{{white-space:nowrap}}
1347-
.swatch{{display:inline-block;width:22px;height:12px;border-radius:2px;vertical-align:-1px}}
13481360
td{{padding:7px 8px;border-bottom:1px solid var(--line);font-size:13px;vertical-align:middle}}
13491361
th.r,td.r{{text-align:right}}
13501362
.ci{{color:var(--muted);font-size:11px}}

results/report.html

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -57,10 +57,15 @@
5757
table.sortable th:hover,table.sortable th:focus-visible{color:var(--ink)}
5858
table.sortable th.asc::after{content:" \25B2";font-size:9px}
5959
table.sortable th.desc::after{content:" \25BC";font-size:9px}
60-
/* Q6-or-better vs a 4-to-5-bit compromise: shaded ground plus ink, against no
61-
ground and muted text. Colour alone was too close to read at this size. */
62-
#opentable td.fits{background:#dbe7fc;color:var(--ink);font-weight:600}
63-
#opentable td.nofit{color:var(--muted)}
60+
/* Two kinds of thing in one cell, set as two: the quant is a filename, so it
61+
is mono and carries the ink, and the memory it costs is muted and smaller
62+
beside it. No background wash on either. */
63+
#opentable td.r .q{font-family:var(--mono);font-weight:700;font-size:12.5px}
64+
#opentable td.r .gb{color:var(--muted);font-size:11px;white-space:nowrap}
65+
#opentable td.fits .q{color:var(--ink)}
66+
/* a 4-to-5-bit pick: still the best that fits, but quantization is now part of
67+
what holds the model back, so the name drops to muted */
68+
#opentable td.nofit .q{color:var(--muted)}
6469
/* Six narrow columns, not ten, so this one does not need the 900px floor the
6570
wide tables do. Lowering it is what puts the ANSWER columns on screen at
6671
390px: at 900 the phone showed Model and SCI and scrolled every budget
@@ -70,7 +75,6 @@
7075
across two lines and left the rows at uneven heights; the table scrolls, so
7176
there is no reason to break the cell instead. */
7277
#opentable td.r{white-space:nowrap}
73-
.swatch{display:inline-block;width:22px;height:12px;border-radius:2px;vertical-align:-1px}
7478
td{padding:7px 8px;border-bottom:1px solid var(--line);font-size:13px;vertical-align:middle}
7579
th.r,td.r{text-align:right}
7680
.ci{color:var(--muted);font-size:11px}
@@ -365,11 +369,11 @@ <h2 id="the-models"><a class="anchor" href="#the-models">The models</a></h2>
365369
<section>
366370
<h2 id="which-quantization-for-my-machine"><a class="anchor" href="#which-quantization-for-my-machine">Which quantization for my machine</a></h2>
367371
<p class="takeaway" style="margin:0 0 10px"><b>Pick your memory, read across.</b> Each cell is the <b>best quantization that fits</b>, named as the file you would download from the <a href="https://huggingface.co/bartowski">bartowski</a> and <a href="https://huggingface.co/unsloth">unsloth</a> GGUF repos, and what it weighs in GB. Every figure is a real published file, not arithmetic.</p>
368-
<p class="takeaway" style="margin:0 0 10px">The weights do not get the whole machine, so each column reserves room for the OS, the KV cache and activations: 16 GB at 128, 8 GB at 64, 4 GB at 32, 4 GB at 24. <span class="swatch" style="background:#dbe7fc"></span> marks a pick at <b>Q6 or better</b>, where quantization is not the thing holding the model back.</p>
372+
<p class="takeaway" style="margin:0 0 10px">The weights do not get the whole machine, so each column reserves room for the OS, the KV cache and activations: 16 GB at 128, 8 GB at 64, 4 GB at 32, 4 GB at 24. A quant in <b>full black</b> is <b>Q6 or better</b>, where quantization is not the thing holding the model back; a greyed one is a 4-to-5-bit compromise.</p>
369373
<p class="takeaway" style="margin:0 0 10px">A blank means <b>nothing 4-bit or better fits</b>, which is a real answer rather than a missing one: below 4-bit degradation stops being minor and coding feels it first, so no cell recommends going lower. The nine open models not listed need more than 128 GB even at 4-bit: Kimi K3, MiMo-V2.5-Pro, MiniMax M3, DeepSeek V4 Flash, Qwen3.8 Max, DeepSeek V4-Pro, Hy3, Inkling and GLM 5.2.</p>
370374
<div class="tablewrap"><table id="opentable" class="sortable">
371-
<tr><th>Model</th><th class="r desc" data-num aria-sort="descending">SCI</th><th class="r" data-num>128 GB</th><th class="r" data-num>64 GB</th><th class="r" data-num>32 GB</th><th class="r" data-num>24 GB</th></tr>
372-
<tr><td>Muse Glimmer 30B</td><td class="r" data-s="53.54335822195509">53.5</td><td class="r fits" data-s="29.6"><b>Q8_0</b> 30</td><td class="r fits" data-s="29.6"><b>Q8_0</b> 30</td><td class="r fits" data-s="24.1"><b>Q6_K_L</b> 24</td><td class="r nofit" data-s="19.4"><b>Q5_K_S</b> 19</td></tr><tr><td>gpt-oss-120b</td><td class="r" data-s="17.741231416968965">17.7</td><td class="r nofit" data-s="62.8"><b>Q4_K_M</b> 63</td><td class="r"></td><td class="r"></td><td class="r"></td></tr><tr><td>Qwen3.6-35B-A3B</td><td class="r" data-s="16.19082483091965">16.2</td><td class="r fits" data-s="36.9"><b>Q8_0</b> 37</td><td class="r fits" data-s="36.9"><b>Q8_0</b> 37</td><td class="r fits" data-s="26.6"><b>UD-Q5_K_XL</b> 27</td><td class="r nofit" data-s="19.5"><b>UD-IQ4_NL_XL</b> 20</td></tr><tr><td>Gemma 4 31B</td><td class="r" data-s="15.806948103252044">15.8</td><td class="r fits" data-s="32.6"><b>Q8_0</b> 33</td><td class="r fits" data-s="32.6"><b>Q8_0</b> 33</td><td class="r fits" data-s="27.5"><b>UD-Q6_K_XL</b> 28</td><td class="r nofit" data-s="18.3"><b>Q4_K_M</b> 18</td></tr><tr><td>Qwen3 Coder Next</td><td class="r" data-s="14.283251268776736">14.3</td><td class="r fits" data-s="84.8"><b>Q8_0</b> 85</td><td class="r nofit" data-s="55.8"><b>UD-Q5_K_S</b> 56</td><td class="r"></td><td class="r"></td></tr><tr><td>Qwen3.6-27B</td><td class="r" data-s="13.317904173386546">13.3</td><td class="r fits" data-s="28.6"><b>Q8_0</b> 29</td><td class="r fits" data-s="28.6"><b>Q8_0</b> 29</td><td class="r fits" data-s="25.6"><b>UD-Q6_K_XL</b> 26</td><td class="r fits" data-s="20.0"><b>UD-Q5_K_XL</b> 20</td></tr>
375+
<tr><th>Model</th><th class="r desc" data-num aria-sort="descending">SCI</th><th class="r" data-num>128 GB</th><th class="r" data-num>64 GB</th><th class="r" data-num>32 GB</th><th class="r" data-num>24 GB</th><th class="r" data-num>Context</th></tr>
376+
<tr><td>Muse Glimmer 30B</td><td class="r" data-s="53.54335822195509">53.5</td><td class="r fits" data-s="29.6"><span class="q">Q8_0</span> <span class="gb">30 GB</span></td><td class="r fits" data-s="29.6"><span class="q">Q8_0</span> <span class="gb">30 GB</span></td><td class="r fits" data-s="24.1"><span class="q">Q6_K_L</span> <span class="gb">24 GB</span></td><td class="r nofit" data-s="19.4"><span class="q">Q5_K_S</span> <span class="gb">19 GB</span></td><td class="r" data-s="131072">131k</td></tr><tr><td>gpt-oss-120b</td><td class="r" data-s="17.741231416968965">17.7</td><td class="r nofit" data-s="62.8"><span class="q">Q4_K_M</span> <span class="gb">63 GB</span></td><td class="r"></td><td class="r"></td><td class="r"></td><td class="r" data-s="131072">131k</td></tr><tr><td>Qwen3.6-35B-A3B</td><td class="r" data-s="16.19082483091965">16.2</td><td class="r fits" data-s="36.9"><span class="q">Q8_0</span> <span class="gb">37 GB</span></td><td class="r fits" data-s="36.9"><span class="q">Q8_0</span> <span class="gb">37 GB</span></td><td class="r fits" data-s="26.6"><span class="q">UD-Q5_K_XL</span> <span class="gb">27 GB</span></td><td class="r nofit" data-s="19.5"><span class="q">UD-IQ4_NL_XL</span> <span class="gb">20 GB</span></td><td class="r" data-s="262144">262k</td></tr><tr><td>Gemma 4 31B</td><td class="r" data-s="15.806948103252044">15.8</td><td class="r fits" data-s="32.6"><span class="q">Q8_0</span> <span class="gb">33 GB</span></td><td class="r fits" data-s="32.6"><span class="q">Q8_0</span> <span class="gb">33 GB</span></td><td class="r fits" data-s="27.5"><span class="q">UD-Q6_K_XL</span> <span class="gb">28 GB</span></td><td class="r nofit" data-s="18.3"><span class="q">Q4_K_M</span> <span class="gb">18 GB</span></td><td class="r" data-s="262144">262k</td></tr><tr><td>Qwen3 Coder Next</td><td class="r" data-s="14.283251268776736">14.3</td><td class="r fits" data-s="84.8"><span class="q">Q8_0</span> <span class="gb">85 GB</span></td><td class="r nofit" data-s="55.8"><span class="q">UD-Q5_K_S</span> <span class="gb">56 GB</span></td><td class="r"></td><td class="r"></td><td class="r" data-s="262144">262k</td></tr><tr><td>Qwen3.6-27B</td><td class="r" data-s="13.317904173386546">13.3</td><td class="r fits" data-s="28.6"><span class="q">Q8_0</span> <span class="gb">29 GB</span></td><td class="r fits" data-s="28.6"><span class="q">Q8_0</span> <span class="gb">29 GB</span></td><td class="r fits" data-s="25.6"><span class="q">UD-Q6_K_XL</span> <span class="gb">26 GB</span></td><td class="r fits" data-s="20.0"><span class="q">UD-Q5_K_XL</span> <span class="gb">20 GB</span></td><td class="r" data-s="262144">262k</td></tr>
373377
</table></div>
374378
</section>
375379

0 commit comments

Comments
 (0)