Harley-ml commited on
Commit
0f7927b
·
verified ·
1 Parent(s): 5c2f78a

Update index.html

Browse files
Files changed (1) hide show
  1. index.html +513 -184
index.html CHANGED
@@ -7,19 +7,20 @@
7
  <script src="https://cdn.jsdelivr.net/npm/chart.js@4"></script>
8
  <style>
9
  :root {
10
- --bg: #09090b;
11
- --bg2: #111115;
12
- --surface: #141418;
13
- --surface2: #17171c;
14
  --border: rgba(255,255,255,0.08);
15
- --border2: rgba(255,255,255,0.12);
16
- --text: #f3f3f4;
17
- --muted: #9a9aa4;
18
- --muted2: #6e6e78;
19
- --silver: #dde0e6;
20
- --silver2: #bcc0ca;
21
- --shadow: 0 18px 50px rgba(0,0,0,0.42);
22
- --radius: 22px;
 
23
  }
24
 
25
  * { box-sizing: border-box; }
@@ -31,27 +32,32 @@
31
  font-family: Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
32
  color: var(--text);
33
  background:
34
- radial-gradient(circle at top left, rgba(255,255,255,0.07), transparent 28%),
35
  radial-gradient(circle at bottom right, rgba(255,255,255,0.05), transparent 24%),
36
- linear-gradient(180deg, #09090b 0%, #060607 100%);
37
  }
38
 
39
  .app {
40
- max-width: 1280px;
41
  margin: 0 auto;
42
  display: grid;
43
  gap: 18px;
44
  }
45
 
46
- .hero, .panel, .chart-card, .list-card {
47
- background: linear-gradient(180deg, rgba(255,255,255,0.035), rgba(255,255,255,0.015));
 
 
 
 
48
  border: 1px solid var(--border);
49
  box-shadow: var(--shadow);
 
50
  }
51
 
52
  .hero {
53
- border-radius: calc(var(--radius) + 4px);
54
- padding: 24px;
55
  position: relative;
56
  overflow: hidden;
57
  }
@@ -60,12 +66,12 @@
60
  content: "";
61
  position: absolute;
62
  inset: 0;
63
- background: linear-gradient(90deg, rgba(255,255,255,0.03), transparent 36%, rgba(255,255,255,0.02));
64
  pointer-events: none;
65
  }
66
 
67
  .eyebrow {
68
- color: var(--silver2);
69
  text-transform: uppercase;
70
  letter-spacing: 0.22em;
71
  font-size: 11px;
@@ -74,24 +80,28 @@
74
 
75
  h1 {
76
  margin: 0;
77
- font-size: clamp(34px, 5vw, 66px);
78
  line-height: 0.96;
79
  letter-spacing: -0.06em;
80
  font-weight: 850;
81
  }
82
 
83
- .title-silver { color: var(--silver); }
 
 
 
 
84
  .sub {
85
  margin: 14px 0 0;
86
  color: var(--muted);
87
- max-width: 860px;
88
  line-height: 1.7;
89
  font-size: 14px;
90
  }
91
 
92
  .layout {
93
  display: grid;
94
- grid-template-columns: 320px minmax(0, 1fr);
95
  gap: 18px;
96
  align-items: start;
97
  }
@@ -103,7 +113,10 @@
103
  top: 18px;
104
  }
105
 
106
- .panel h2, .chart-card h2, .list-card h2 {
 
 
 
107
  margin: 0 0 14px;
108
  font-size: 14px;
109
  letter-spacing: 0.12em;
@@ -117,7 +130,7 @@
117
  .section-label {
118
  display: block;
119
  margin-bottom: 10px;
120
- color: var(--silver2);
121
  font-size: 12px;
122
  text-transform: uppercase;
123
  letter-spacing: 0.12em;
@@ -129,7 +142,8 @@
129
  gap: 8px;
130
  }
131
 
132
- button {
 
133
  border: 1px solid rgba(255,255,255,0.10);
134
  background: rgba(255,255,255,0.03);
135
  color: var(--muted);
@@ -139,18 +153,21 @@
139
  transition: all 0.15s ease;
140
  font: inherit;
141
  font-size: 13px;
 
142
  }
143
 
144
- button:hover {
 
145
  border-color: rgba(255,255,255,0.24);
146
  color: var(--text);
147
  transform: translateY(-1px);
148
  }
149
 
150
- button.active {
 
151
  color: #fafafa;
152
- border-color: rgba(221,224,230,0.45);
153
- background: linear-gradient(180deg, rgba(221,224,230,0.18), rgba(221,224,230,0.08));
154
  box-shadow: 0 0 0 1px rgba(255,255,255,0.03) inset;
155
  }
156
 
@@ -169,7 +186,7 @@
169
  }
170
 
171
  .stat .k {
172
- color: var(--muted2);
173
  font-size: 11px;
174
  text-transform: uppercase;
175
  letter-spacing: 0.12em;
@@ -177,14 +194,14 @@
177
 
178
  .stat .v {
179
  margin-top: 6px;
180
- font-size: 20px;
181
- font-weight: 750;
182
  color: var(--silver);
183
  font-variant-numeric: tabular-nums;
184
  }
185
 
186
  .small-note {
187
- color: var(--muted2);
188
  font-size: 12px;
189
  line-height: 1.6;
190
  margin-top: 10px;
@@ -192,13 +209,15 @@
192
 
193
  .chart-card {
194
  border-radius: var(--radius);
195
- padding: 16px 16px 10px;
196
- min-height: 640px;
 
 
197
  }
198
 
199
  .chart-top {
200
  display: flex;
201
- align-items: center;
202
  justify-content: space-between;
203
  gap: 12px;
204
  margin-bottom: 12px;
@@ -207,8 +226,8 @@
207
 
208
  .chart-title {
209
  margin: 0;
210
- font-size: 18px;
211
- font-weight: 750;
212
  letter-spacing: -0.03em;
213
  }
214
 
@@ -216,68 +235,219 @@
216
  margin: 4px 0 0;
217
  color: var(--muted);
218
  font-size: 13px;
 
219
  }
220
 
221
  .badge {
222
- padding: 8px 12px;
223
  border-radius: 999px;
224
- background: rgba(221,224,230,0.08);
225
- border: 1px solid rgba(221,224,230,0.16);
226
  color: var(--silver);
227
  font-size: 13px;
228
  white-space: nowrap;
 
229
  }
230
 
231
- canvas { width: 100% !important; height: 540px !important; }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
232
 
233
  .list-card {
234
  border-radius: var(--radius);
235
  padding: 16px;
236
  }
237
 
238
- .model-list {
239
- display: grid;
240
- gap: 10px;
241
- max-height: 360px;
242
  overflow: auto;
243
- padding-right: 4px;
 
 
244
  }
245
 
246
- .model-row {
247
- display: grid;
248
- grid-template-columns: 1fr auto auto;
249
- gap: 12px;
250
- align-items: center;
251
- padding: 12px 14px;
252
- border-radius: 16px;
253
- background: rgba(255,255,255,0.025);
254
- border: 1px solid rgba(255,255,255,0.06);
255
- transition: transform 0.12s ease, border-color 0.12s ease, background 0.12s ease;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
256
  cursor: pointer;
257
  }
258
 
259
- .model-row:hover {
260
- transform: translateY(-1px);
261
- border-color: rgba(221,224,230,0.20);
262
- background: rgba(221,224,230,0.045);
263
  }
264
 
265
- .model-name { font-weight: 700; }
266
- .model-meta, .model-score { color: var(--muted); font-size: 12px; }
267
- .model-score { color: var(--silver); font-variant-numeric: tabular-nums; }
 
 
 
268
 
269
- @media (max-width: 1050px) {
270
- .layout { grid-template-columns: 1fr; }
271
- .panel { position: static; }
272
- canvas { height: 500px !important; }
273
  }
274
 
275
- @media (max-width: 720px) {
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
276
  body { padding: 16px; }
277
- .hero, .panel, .chart-card, .list-card { border-radius: 18px; }
278
  .stat-grid { grid-template-columns: 1fr; }
279
- .model-row { grid-template-columns: 1fr; gap: 8px; }
280
  canvas { height: 420px !important; }
 
281
  }
282
  </style>
283
  </head>
@@ -287,8 +457,8 @@
287
  <div class="eyebrow">Regression explorer</div>
288
  <h1><span class="title-silver">Silver</span> benchmark fit line</h1>
289
  <p class="sub">
290
- Pick a benchmark, fit a linear regression on <b>log10(parameters)</b>, and inspect each model against the line.
291
- Hover any dot to see the model name, and click the dot to open its model page.
292
  </p>
293
  </section>
294
 
@@ -301,16 +471,29 @@
301
  <div class="btn-grid" id="benchmarkButtons"></div>
302
  </div>
303
 
 
 
 
 
 
 
304
  <div class="section">
305
  <span class="section-label">Regression stats</span>
306
  <div class="stat-grid">
307
  <div class="stat"><div class="k">Slope</div><div class="v" id="statSlope">—</div></div>
308
  <div class="stat"><div class="k">Intercept</div><div class="v" id="statIntercept">—</div></div>
309
- <div class="stat"><div class="k">MSE</div><div class="v" id="statLoss">—</div></div>
310
- <div class="stat"><div class="k">RMSE</div><div class="v" id="statRmse">—</div></div>
311
  </div>
312
  <div class="small-note" id="fitNote">The fit updates instantly when you switch benchmarks.</div>
313
  </div>
 
 
 
 
 
 
 
314
  </aside>
315
 
316
  <main style="display:grid; gap:18px;">
@@ -319,64 +502,147 @@
319
  <div>
320
  <h2 class="chart-title" id="chartTitle">Average score vs log parameters</h2>
321
  <p class="chart-sub" id="chartSub">Beautiful silver regression line over all featured models.</p>
 
 
 
 
322
  </div>
323
  <div class="badge" id="countBadge">0 models</div>
324
  </div>
325
  <canvas id="scatterChart"></canvas>
326
  </section>
327
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
328
  <section class="list-card">
329
  <h2>Featured models</h2>
330
- <div class="model-list" id="modelList"></div>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
331
  </section>
332
  </main>
333
  </div>
334
  </div>
335
 
336
  <script>
337
- // Edit this array privately whenever you want to add or remove models.
338
  const MODELS = [
339
- { name: 'SmolLM2-135M', org: 'HuggingFace', params: 135000000, avg: 51.78, arc: 58.63, hellaswag: 43.22, piqa: 68.44, arcChall: 29.69, arithmark2: 32.68, url: 'https://huggingface.co/HuggingFaceTB/SmolLM2-135M' },
340
- { name: 'GPT-X2-125M', org: 'AxiomicLabs', params: 125081664, avg: 48.98, arc: 51.47, hellaswag: 40.41, piqa: 67.30, arcChall: 27.82, arithmark2: 30.68, url: 'https://huggingface.co/AxiomicLabs/GPT-X2-125M' },
341
- { name: 'GPT-X-125M', org: 'AxiomicLabs', params: 124561728, avg: 46.41, arc: 50.76, hellaswag: 36.57, piqa: 64.96, arcChall: 26.62, arithmark2: 30.24, url: 'https://huggingface.co/AxiomicLabs/GPT-X-125M' },
342
- { name: 'MobileLLM-R1-140M', org: 'Facebook', params: 140000000, avg: 43.56, arc: 49.92, hellaswag: 33.84, piqa: 63.22, arcChall: 24.74, arithmark2: 53.56, url: 'https://huggingface.co/facebook/MobileLLM-R1-140M-base' },
343
- { name: 'Supra-50M-Base', org: 'SupraLabs', params: 51786240, avg: 42.52, arc: 45.88, hellaswag: 31.83, piqa: 62.51, arcChall: 25.00, arithmark2: 27.04, url: 'https://huggingface.co/SupraLabs/Supra-50M-Base' },
344
- { name: 'Quark-135M', org: 'ThingAI', params: 134561088, avg: 41.61, arc: 47.73, hellaswag: 31.33, piqa: 58.32, arcChall: 28.24, arithmark2: 40.32, url: 'https://huggingface.co/ThingAI/Quark-135m' },
345
- { name: 'OdinNext-138M', org: 'joelhenwang', params: 138449696, avg: 39.87, arc: 45.08, hellaswag: 28.09, piqa: 59.52, arcChall: 23.81, arithmark2: 36.84, url: 'https://huggingface.co/joelhenwang/OdinNext-138M-Base' },
346
- { name: 'KeyLM-75M', org: 'Eclipse-Senpai', params: 75251200, avg: 38.86, arc: 35.73, hellaswag: 29.66, piqa: 60.50, arcChall: 23.98, arithmark2: 25.80, url: 'https://huggingface.co/Eclipse-Senpai/KeyLM-75M' },
347
- { name: 'michel-micro', org: 'finnianx', params: 28355072, avg: 38.03, arc: 38.51, hellaswag: 28.16, piqa: 57.62, arcChall: 23.29, arithmark2: 26.04, url: 'https://huggingface.co/finnianx/michel-micro' },
348
- { name: 'Veyra-30M-Base', org: 'veyra-ai', params: 34611712, avg: 36.92, arc: 35.90, hellaswag: 27.92, piqa: 58.92, arcChall: 24.15, arithmark2: 26.76, url: 'https://huggingface.co/veyra-ai/veyra-30m-base-5b-tokens' },
349
- { name: 'Er-Medium-12.5M', org: 'FromZero', params: 12497520, avg: 36.68, arc: 35.10, hellaswag: 28.50, piqa: 57.51, arcChall: 20.73, arithmark2: 30.88, url: 'https://huggingface.co/fromziro/Er-Medium-12.5M' },
350
- { name: 'GPT-S-1.4M', org: 'AxiomicLabs', params: 1426000, avg: 33.41, arc: 31.57, hellaswag: 26.89, piqa: 55.17, arcChall: 21.93, arithmark2: 25.16, url: 'https://huggingface.co/AxiomicLabs/GPT-S-1.4M' },
351
- { name: 'Dillionv2-1.3M', org: 'Harley-ml', params: 1285200, avg: 32.92, arc: 29.71, hellaswag: 27.27, piqa: 53.05, arcChall: 22.44, arithmark2: 27.00, url: 'https://huggingface.co/Harley-ml/Dillionv2-1.3M' },
352
- { name: 'Tenete-8M', org: 'Harley-ml', params: 8293120, avg: 33.85, arc: 31.69, hellaswag: 26.75, piqa: 55.66, arcChall: 21.84, arithmark2: 26.72, url: 'https://huggingface.co/Harley-ml/Tenete-8M' },
353
- { name: 'Syn-2.6M', org: 'FromZero', params: 2604210, avg: 33.31, arc: 32.03, hellaswag: 26.96, piqa: 53.65, arcChall: 20.39, arithmark2: 26.68, url: 'https://huggingface.co/fromziro/Syn-2.6M' }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
354
  ];
355
 
356
  const BENCHMARKS = [
357
- { key: 'avg', label: 'Avg' },
358
- { key: 'arc', label: 'ARC-Easy' },
359
- { key: 'arcChall', label: 'ARC-Challenge' },
360
  { key: 'hellaswag', label: 'HellaSwag' },
361
- { key: 'piqa', label: 'PIQA' },
362
- { key: 'arithmark2', label: 'ArithMark-2' }
363
  ];
364
 
365
- let activeBenchmark = 'avg';
 
 
 
 
 
 
 
 
 
 
366
  let chart = null;
367
 
368
- const formatParams = (n) => {
369
  if (n >= 1e9) return `${(n / 1e9).toFixed(2)}B`;
370
  if (n >= 1e6) return `${(n / 1e6).toFixed(2)}M`;
371
  if (n >= 1e3) return `${(n / 1e3).toFixed(2)}K`;
372
  return String(n);
373
  };
374
 
375
- const getScore = (m, key) => m[key] ?? null;
376
 
377
- const mean = (arr) => arr.reduce((a, b) => a + b, 0) / arr.length;
378
-
379
- function linearRegression(points) {
380
  const n = points.length;
381
  let sumX = 0, sumY = 0, sumXY = 0, sumXX = 0;
382
  for (const p of points) {
@@ -389,111 +655,143 @@
389
  const slope = Math.abs(denom) < 1e-12 ? 0 : (n * sumXY - sumX * sumY) / denom;
390
  const intercept = n ? (sumY - slope * sumX) / n : 0;
391
  return { slope, intercept };
392
- }
393
 
394
- function computeLoss(data, benchmark, slope, intercept) {
395
- const residuals = data.map(m => {
396
- const pred = slope * m.x + intercept;
397
- return m.y - pred;
 
 
 
 
 
 
 
 
398
  });
399
- const mse = mean(residuals.map(r => r * r));
 
 
 
 
400
  const rmse = Math.sqrt(mse);
401
  return { mse, rmse, residuals };
402
- }
403
-
404
- function getChartData() {
405
- return MODELS
406
- .filter(m => Number.isFinite(m.params) && getScore(m, activeBenchmark) !== null)
407
- .map(m => ({
408
- name: m.name,
409
- org: m.org,
410
- params: m.params,
411
- paramsDisplay: formatParams(m.params),
412
- url: m.url,
413
- x: Math.log10(m.params),
414
- y: getScore(m, activeBenchmark)
415
- }))
416
- .sort((a, b) => a.x - b.x);
417
- }
418
 
419
- function renderBenchmarkButtons() {
420
  const box = document.getElementById('benchmarkButtons');
421
- box.innerHTML = BENCHMARKS.map(b => `
422
- <button class="${b.key === activeBenchmark ? 'active' : ''}" data-key="${b.key}">${b.label}</button>
423
- `).join('');
424
  box.querySelectorAll('button').forEach(btn => {
425
  btn.addEventListener('click', () => {
426
  activeBenchmark = btn.dataset.key;
427
  render();
428
  });
429
  });
430
- }
431
 
432
- function renderModelList(data) {
433
- const list = document.getElementById('modelList');
434
- list.innerHTML = data.map(m => `
435
- <div class="model-row" data-url="${m.url}">
436
- <div>
437
- <div class="model-name">${m.name}</div>
438
- <div class="model-meta">${m.org} · ${m.paramsDisplay}</div>
439
- </div>
440
- <div class="model-score">x=${m.x.toFixed(3)}</div>
441
- <div class="model-score">y=${m.y.toFixed(2)}%</div>
442
- </div>
443
- `).join('');
444
 
445
- list.querySelectorAll('.model-row').forEach(row => {
 
 
 
 
 
 
 
 
 
 
 
 
 
 
446
  row.addEventListener('click', () => {
447
  const url = row.dataset.url;
448
  if (url) window.open(url, '_blank', 'noopener,noreferrer');
449
  });
450
  });
451
- }
452
 
453
- function updateStats(slope, intercept, mse, rmse, count) {
454
  document.getElementById('statSlope').textContent = slope.toFixed(4);
455
  document.getElementById('statIntercept').textContent = intercept.toFixed(2);
456
- document.getElementById('statLoss').textContent = mse.toFixed(4);
457
- document.getElementById('statRmse').textContent = rmse.toFixed(2);
458
  document.getElementById('countBadge').textContent = `${count} models`;
459
- }
 
 
 
460
 
461
  function render() {
462
  renderBenchmarkButtons();
463
 
464
- const data = getChartData();
465
- if (data.length < 2) return;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
466
 
467
- const points = data.map(d => ({ x: d.x, y: d.y }));
468
  const { slope, intercept } = linearRegression(points);
469
- const { mse, rmse, residuals } = computeLoss(data, activeBenchmark, slope, intercept);
470
- data.forEach((d, i) => { d.residual = residuals[i]; });
 
 
 
471
 
472
  updateStats(slope, intercept, mse, rmse, data.length);
473
- renderModelList(data);
474
 
475
  const xMin = Math.min(...data.map(d => d.x));
476
  const xMax = Math.max(...data.map(d => d.x));
477
- const pad = Math.max(0.2, (xMax - xMin) * 0.09);
478
- const xLow = xMin - pad;
479
- const xHigh = xMax + pad;
480
  const yLow = slope * xLow + intercept;
481
  const yHigh = slope * xHigh + intercept;
482
- const yMin = Math.min(...data.map(d => d.y), yLow) - 1.5;
483
- const yMax = Math.max(...data.map(d => d.y), yHigh) + 1.8;
 
484
 
485
  const titleMap = {
486
- avg: 'Average score vs log parameters',
487
- arc: 'ARC-Easy vs log parameters',
488
- arcChall: 'ARC-Challenge vs log parameters',
489
  hellaswag: 'HellaSwag vs log parameters',
490
- piqa: 'PIQA vs log parameters',
491
- arithmark2: 'ArithMark-2 vs log parameters'
492
  };
493
 
494
- document.getElementById('chartTitle').textContent = titleMap[activeBenchmark] || activeBenchmark;
495
- document.getElementById('chartSub').textContent = `Linear fit on ${BENCHMARKS.find(b => b.key === activeBenchmark)?.label || activeBenchmark}. Silver, clean, and clickable.`;
496
- document.getElementById('fitNote').textContent = `Regression loss: MSE ${mse.toFixed(4)} · RMSE ${rmse.toFixed(2)}.`;
 
 
497
 
498
  const ctx = document.getElementById('scatterChart').getContext('2d');
499
  if (chart) chart.destroy();
@@ -510,7 +808,9 @@
510
  { x: xHigh, y: yHigh }
511
  ],
512
  borderColor: 'rgba(236, 236, 241, 0.98)',
513
- borderWidth: 3.2,
 
 
514
  pointRadius: 0,
515
  tension: 0,
516
  fill: false,
@@ -519,12 +819,26 @@
519
  {
520
  label: 'Models',
521
  data: data.map(d => ({ ...d })),
 
522
  pointRadius: 7,
523
  pointHoverRadius: 10,
 
524
  borderWidth: 1.5,
525
- backgroundColor: 'rgba(225, 226, 232, 0.86)',
526
- borderColor: 'rgba(255,255,255,0.92)',
527
- hoverBackgroundColor: 'rgba(245, 245, 248, 0.98)',
 
 
 
 
 
 
 
 
 
 
 
 
528
  hoverBorderColor: 'rgba(255,255,255,0.98)',
529
  order: 2
530
  }
@@ -535,6 +849,9 @@
535
  maintainAspectRatio: false,
536
  animation: { duration: 0 },
537
  interaction: { mode: 'nearest', intersect: true },
 
 
 
538
  onClick: (event, elements) => {
539
  if (!elements.length) return;
540
  const hit = elements[0];
@@ -545,11 +862,11 @@
545
  plugins: {
546
  legend: { display: false },
547
  tooltip: {
548
- backgroundColor: 'rgba(15,15,18,0.97)',
549
- borderColor: 'rgba(236,236,241,0.22)',
550
  borderWidth: 1,
551
  titleColor: '#ffffff',
552
- bodyColor: '#d4d4da',
553
  padding: 12,
554
  displayColors: false,
555
  callbacks: {
@@ -559,8 +876,8 @@
559
  const pred = slope * d.x + intercept;
560
  const resid = d.y - pred;
561
  return [
562
- `Params: ${formatParams(d.params)} (${d.params.toLocaleString()})`,
563
- `Score: ${d.y.toFixed(2)}%`,
564
  `Residual: ${resid >= 0 ? '+' : ''}${resid.toFixed(2)} pts`,
565
  `Prediction: ${pred.toFixed(2)}%`
566
  ];
@@ -575,13 +892,13 @@
575
  max: xHigh,
576
  grid: { color: 'rgba(255,255,255,0.045)' },
577
  ticks: {
578
- color: '#7f7f88',
579
  callback: v => `10^${Number(v).toFixed(1)}`
580
  },
581
  title: {
582
  display: true,
583
  text: 'Log₁₀(parameters)',
584
- color: '#7f7f88',
585
  font: { weight: '600' }
586
  }
587
  },
@@ -590,13 +907,13 @@
590
  max: yMax,
591
  grid: { color: 'rgba(255,255,255,0.045)' },
592
  ticks: {
593
- color: '#7f7f88',
594
  callback: v => `${Number(v).toFixed(0)}%`
595
  },
596
  title: {
597
  display: true,
598
  text: 'Score (%)',
599
- color: '#7f7f88',
600
  font: { weight: '600' }
601
  }
602
  }
@@ -605,7 +922,19 @@
605
  });
606
  }
607
 
 
 
 
 
 
 
 
 
 
 
 
 
608
  render();
609
  </script>
610
  </body>
611
- </html>"}]}
 
7
  <script src="https://cdn.jsdelivr.net/npm/chart.js@4"></script>
8
  <style>
9
  :root {
10
+ --bg: #08080a;
11
+ --bg2: #101014;
12
+ --surface: rgba(255,255,255,0.035);
13
+ --surface-2: rgba(255,255,255,0.05);
14
  --border: rgba(255,255,255,0.08);
15
+ --border-2: rgba(255,255,255,0.13);
16
+ --text: #f3f3f5;
17
+ --muted: #a0a0aa;
18
+ --muted-2: #73737d;
19
+ --silver: #e0e2e8;
20
+ --silver-2: #c2c6cf;
21
+ --silver-3: #8f949f;
22
+ --shadow: 0 24px 70px rgba(0,0,0,0.48);
23
+ --radius: 24px;
24
  }
25
 
26
  * { box-sizing: border-box; }
 
32
  font-family: Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
33
  color: var(--text);
34
  background:
35
+ radial-gradient(circle at top left, rgba(255,255,255,0.08), transparent 27%),
36
  radial-gradient(circle at bottom right, rgba(255,255,255,0.05), transparent 24%),
37
+ linear-gradient(180deg, #08080a 0%, #060607 100%);
38
  }
39
 
40
  .app {
41
+ max-width: 1440px;
42
  margin: 0 auto;
43
  display: grid;
44
  gap: 18px;
45
  }
46
 
47
+ .hero,
48
+ .panel,
49
+ .chart-card,
50
+ .list-card,
51
+ .info-card {
52
+ background: linear-gradient(180deg, rgba(255,255,255,0.04), rgba(255,255,255,0.02));
53
  border: 1px solid var(--border);
54
  box-shadow: var(--shadow);
55
+ backdrop-filter: blur(12px);
56
  }
57
 
58
  .hero {
59
+ border-radius: calc(var(--radius) + 6px);
60
+ padding: 26px;
61
  position: relative;
62
  overflow: hidden;
63
  }
 
66
  content: "";
67
  position: absolute;
68
  inset: 0;
69
+ background: linear-gradient(90deg, rgba(255,255,255,0.03), transparent 38%, rgba(255,255,255,0.02));
70
  pointer-events: none;
71
  }
72
 
73
  .eyebrow {
74
+ color: var(--silver-2);
75
  text-transform: uppercase;
76
  letter-spacing: 0.22em;
77
  font-size: 11px;
 
80
 
81
  h1 {
82
  margin: 0;
83
+ font-size: clamp(34px, 5vw, 68px);
84
  line-height: 0.96;
85
  letter-spacing: -0.06em;
86
  font-weight: 850;
87
  }
88
 
89
+ .title-silver {
90
+ color: var(--silver);
91
+ text-shadow: 0 0 22px rgba(255,255,255,0.10);
92
+ }
93
+
94
  .sub {
95
  margin: 14px 0 0;
96
  color: var(--muted);
97
+ max-width: 980px;
98
  line-height: 1.7;
99
  font-size: 14px;
100
  }
101
 
102
  .layout {
103
  display: grid;
104
+ grid-template-columns: 330px minmax(0, 1fr);
105
  gap: 18px;
106
  align-items: start;
107
  }
 
113
  top: 18px;
114
  }
115
 
116
+ .panel h2,
117
+ .chart-card h2,
118
+ .list-card h2,
119
+ .info-card h2 {
120
  margin: 0 0 14px;
121
  font-size: 14px;
122
  letter-spacing: 0.12em;
 
130
  .section-label {
131
  display: block;
132
  margin-bottom: 10px;
133
+ color: var(--silver-2);
134
  font-size: 12px;
135
  text-transform: uppercase;
136
  letter-spacing: 0.12em;
 
142
  gap: 8px;
143
  }
144
 
145
+ button,
146
+ .chip {
147
  border: 1px solid rgba(255,255,255,0.10);
148
  background: rgba(255,255,255,0.03);
149
  color: var(--muted);
 
153
  transition: all 0.15s ease;
154
  font: inherit;
155
  font-size: 13px;
156
+ user-select: none;
157
  }
158
 
159
+ button:hover,
160
+ .chip:hover {
161
  border-color: rgba(255,255,255,0.24);
162
  color: var(--text);
163
  transform: translateY(-1px);
164
  }
165
 
166
+ button.active,
167
+ .chip.active {
168
  color: #fafafa;
169
+ border-color: rgba(224,226,232,0.48);
170
+ background: linear-gradient(180deg, rgba(224,226,232,0.18), rgba(224,226,232,0.08));
171
  box-shadow: 0 0 0 1px rgba(255,255,255,0.03) inset;
172
  }
173
 
 
186
  }
187
 
188
  .stat .k {
189
+ color: var(--muted-2);
190
  font-size: 11px;
191
  text-transform: uppercase;
192
  letter-spacing: 0.12em;
 
194
 
195
  .stat .v {
196
  margin-top: 6px;
197
+ font-size: 19px;
198
+ font-weight: 760;
199
  color: var(--silver);
200
  font-variant-numeric: tabular-nums;
201
  }
202
 
203
  .small-note {
204
+ color: var(--muted-2);
205
  font-size: 12px;
206
  line-height: 1.6;
207
  margin-top: 10px;
 
209
 
210
  .chart-card {
211
  border-radius: var(--radius);
212
+ padding: 18px 18px 12px;
213
+ min-height: 690px;
214
+ position: relative;
215
+ overflow: hidden;
216
  }
217
 
218
  .chart-top {
219
  display: flex;
220
+ align-items: flex-start;
221
  justify-content: space-between;
222
  gap: 12px;
223
  margin-bottom: 12px;
 
226
 
227
  .chart-title {
228
  margin: 0;
229
+ font-size: 19px;
230
+ font-weight: 760;
231
  letter-spacing: -0.03em;
232
  }
233
 
 
235
  margin: 4px 0 0;
236
  color: var(--muted);
237
  font-size: 13px;
238
+ line-height: 1.5;
239
  }
240
 
241
  .badge {
242
+ padding: 9px 12px;
243
  border-radius: 999px;
244
+ background: rgba(224,226,232,0.08);
245
+ border: 1px solid rgba(224,226,232,0.16);
246
  color: var(--silver);
247
  font-size: 13px;
248
  white-space: nowrap;
249
+ font-variant-numeric: tabular-nums;
250
  }
251
 
252
+ .callout {
253
+ margin-top: 10px;
254
+ display: inline-flex;
255
+ align-items: center;
256
+ gap: 10px;
257
+ padding: 9px 12px;
258
+ border-radius: 999px;
259
+ border: 1px solid rgba(224,226,232,0.16);
260
+ background: rgba(224,226,232,0.06);
261
+ color: #efeff2;
262
+ font-size: 12px;
263
+ letter-spacing: 0.01em;
264
+ }
265
+
266
+ .callout .dot {
267
+ width: 9px;
268
+ height: 9px;
269
+ border-radius: 50%;
270
+ background: linear-gradient(180deg, #f7f7f9, #b9bec8);
271
+ box-shadow: 0 0 14px rgba(255,255,255,0.22);
272
+ flex: 0 0 auto;
273
+ }
274
+
275
+ .filters {
276
+ display: flex;
277
+ flex-wrap: wrap;
278
+ gap: 8px;
279
+ margin: 10px 0 16px;
280
+ }
281
+
282
+ .search {
283
+ width: min(100%, 420px);
284
+ border: 1px solid rgba(255,255,255,0.10);
285
+ background: rgba(255,255,255,0.03);
286
+ color: var(--text);
287
+ border-radius: 16px;
288
+ padding: 12px 14px;
289
+ outline: none;
290
+ font: inherit;
291
+ transition: border-color 0.15s ease, background 0.15s ease;
292
+ }
293
+
294
+ .search::placeholder { color: var(--muted-2); }
295
+
296
+ .search:focus {
297
+ border-color: rgba(224,226,232,0.28);
298
+ background: rgba(255,255,255,0.05);
299
+ }
300
+
301
+ canvas {
302
+ width: 100% !important;
303
+ height: 560px !important;
304
+ }
305
+
306
+ .info-grid {
307
+ display: grid;
308
+ grid-template-columns: repeat(3, minmax(0, 1fr));
309
+ gap: 14px;
310
+ }
311
+
312
+ .info-card {
313
+ border-radius: 20px;
314
+ padding: 16px;
315
+ }
316
+
317
+ .info-card .big {
318
+ font-size: 22px;
319
+ font-weight: 800;
320
+ color: var(--silver);
321
+ margin-top: 6px;
322
+ font-variant-numeric: tabular-nums;
323
+ }
324
+
325
+ .info-card .label {
326
+ color: var(--muted-2);
327
+ font-size: 11px;
328
+ text-transform: uppercase;
329
+ letter-spacing: 0.12em;
330
+ }
331
 
332
  .list-card {
333
  border-radius: var(--radius);
334
  padding: 16px;
335
  }
336
 
337
+ .table-wrap {
 
 
 
338
  overflow: auto;
339
+ border-radius: 18px;
340
+ border: 1px solid rgba(255,255,255,0.08);
341
+ background: rgba(255,255,255,0.02);
342
  }
343
 
344
+ table {
345
+ width: 100%;
346
+ border-collapse: collapse;
347
+ min-width: 900px;
348
+ }
349
+
350
+ thead th {
351
+ position: sticky;
352
+ top: 0;
353
+ background: rgba(12,12,14,0.96);
354
+ backdrop-filter: blur(8px);
355
+ color: var(--muted);
356
+ text-align: left;
357
+ font-size: 10px;
358
+ text-transform: uppercase;
359
+ letter-spacing: 0.12em;
360
+ padding: 14px 14px;
361
+ border-bottom: 1px solid rgba(255,255,255,0.08);
362
+ cursor: pointer;
363
+ user-select: none;
364
+ white-space: nowrap;
365
+ }
366
+
367
+ thead th:hover { color: var(--silver); }
368
+
369
+ tbody tr {
370
+ border-bottom: 1px solid rgba(255,255,255,0.06);
371
+ transition: background 0.12s ease, transform 0.12s ease;
372
  cursor: pointer;
373
  }
374
 
375
+ tbody tr:hover {
376
+ background: rgba(224,226,232,0.05);
 
 
377
  }
378
 
379
+ tbody td {
380
+ padding: 13px 14px;
381
+ color: var(--text);
382
+ font-size: 13px;
383
+ vertical-align: middle;
384
+ }
385
 
386
+ tbody td.muted {
387
+ color: var(--muted);
 
 
388
  }
389
 
390
+ .above {
391
+ color: #f2f2f6;
392
+ text-shadow: 0 0 10px rgba(255,255,255,0.08);
393
+ }
394
+
395
+ .below {
396
+ color: #8f949d;
397
+ }
398
+
399
+ .pill-up {
400
+ display: inline-flex;
401
+ align-items: center;
402
+ gap: 6px;
403
+ padding: 5px 10px;
404
+ border-radius: 999px;
405
+ border: 1px solid rgba(224,226,232,0.18);
406
+ background: rgba(224,226,232,0.08);
407
+ color: var(--silver);
408
+ font-size: 11px;
409
+ font-weight: 700;
410
+ letter-spacing: 0.03em;
411
+ }
412
+
413
+ .pill-down {
414
+ display: inline-flex;
415
+ align-items: center;
416
+ gap: 6px;
417
+ padding: 5px 10px;
418
+ border-radius: 999px;
419
+ border: 1px solid rgba(255,255,255,0.08);
420
+ background: rgba(255,255,255,0.03);
421
+ color: var(--muted);
422
+ font-size: 11px;
423
+ font-weight: 700;
424
+ letter-spacing: 0.03em;
425
+ }
426
+
427
+ .footer-note {
428
+ color: var(--muted-2);
429
+ font-size: 12px;
430
+ line-height: 1.6;
431
+ padding-top: 2px;
432
+ }
433
+
434
+ @media (max-width: 1120px) {
435
+ .layout {
436
+ grid-template-columns: 1fr;
437
+ }
438
+ .panel {
439
+ position: static;
440
+ }
441
+ canvas { height: 520px !important; }
442
+ .info-grid { grid-template-columns: 1fr; }
443
+ }
444
+
445
+ @media (max-width: 760px) {
446
  body { padding: 16px; }
447
+ .hero, .panel, .chart-card, .list-card, .info-card { border-radius: 18px; }
448
  .stat-grid { grid-template-columns: 1fr; }
 
449
  canvas { height: 420px !important; }
450
+ table { min-width: 760px; }
451
  }
452
  </style>
453
  </head>
 
457
  <div class="eyebrow">Regression explorer</div>
458
  <h1><span class="title-silver">Silver</span> benchmark fit line</h1>
459
  <p class="sub">
460
+ Pick a benchmark, fit a linear regression on <b>log10(parameters)</b>, and inspect how every model sits against the size trend.
461
+ Hover any dot to see the model name. Click a dot to open the model page.
462
  </p>
463
  </section>
464
 
 
471
  <div class="btn-grid" id="benchmarkButtons"></div>
472
  </div>
473
 
474
+ <div class="section">
475
+ <span class="section-label">Search models</span>
476
+ <input id="searchBox" class="search" type="text" placeholder="Type a model or org name..." />
477
+ <div class="small-note">Filters the chart and the table at once.</div>
478
+ </div>
479
+
480
  <div class="section">
481
  <span class="section-label">Regression stats</span>
482
  <div class="stat-grid">
483
  <div class="stat"><div class="k">Slope</div><div class="v" id="statSlope">—</div></div>
484
  <div class="stat"><div class="k">Intercept</div><div class="v" id="statIntercept">—</div></div>
485
+ <div class="stat"><div class="k">MSE</div><div class="v" id="statMSE">—</div></div>
486
+ <div class="stat"><div class="k">RMSE</div><div class="v" id="statRMSE">—</div></div>
487
  </div>
488
  <div class="small-note" id="fitNote">The fit updates instantly when you switch benchmarks.</div>
489
  </div>
490
+
491
+ <div class="section">
492
+ <span class="section-label">Legend</span>
493
+ <div class="small-note">
494
+ Silver points above the line are outperforming the size trend. Gray points are below it.
495
+ </div>
496
+ </div>
497
  </aside>
498
 
499
  <main style="display:grid; gap:18px;">
 
502
  <div>
503
  <h2 class="chart-title" id="chartTitle">Average score vs log parameters</h2>
504
  <p class="chart-sub" id="chartSub">Beautiful silver regression line over all featured models.</p>
505
+ <div class="callout">
506
+ <span class="dot"></span>
507
+ <span>Above the dotted line = above expected for that parameter scale.</span>
508
+ </div>
509
  </div>
510
  <div class="badge" id="countBadge">0 models</div>
511
  </div>
512
  <canvas id="scatterChart"></canvas>
513
  </section>
514
 
515
+ <section class="info-grid">
516
+ <div class="info-card">
517
+ <div class="label">Selected benchmark</div>
518
+ <div class="big" id="infoBenchmark">Avg</div>
519
+ </div>
520
+ <div class="info-card">
521
+ <div class="label">Visible models</div>
522
+ <div class="big" id="infoCount">0</div>
523
+ </div>
524
+ <div class="info-card">
525
+ <div class="label">Regression loss</div>
526
+ <div class="big" id="infoLoss">—</div>
527
+ </div>
528
+ </section>
529
+
530
  <section class="list-card">
531
  <h2>Featured models</h2>
532
+ <div class="table-wrap">
533
+ <table>
534
+ <thead>
535
+ <tr>
536
+ <th data-sort="name">Model</th>
537
+ <th data-sort="org">Org</th>
538
+ <th data-sort="params">Params</th>
539
+ <th data-sort="score">Score</th>
540
+ <th data-sort="residual">Residual</th>
541
+ <th data-sort="side">Relation</th>
542
+ </tr>
543
+ </thead>
544
+ <tbody id="modelTable"></tbody>
545
+ </table>
546
+ </div>
547
+ <div class="footer-note">
548
+ Clicking a row opens the model page.
549
+ </div>
550
  </section>
551
  </main>
552
  </div>
553
  </div>
554
 
555
  <script>
 
556
  const MODELS = [
557
+ { name: 'SmolLM2-135M', org: 'HuggingFace', params: 135000000, arc_easy: 0.5858585858585859, arc_challenge: 0.2960750853242321, piqa: 0.6849836779107725, hellaswag: 0.43108942441744674, avg_4: 0.5177858993388165, url: 'https://huggingface.co/HuggingFaceTB/SmolLM2-135M' },
558
+ { name: 'GPT-X2-125M', org: 'AxiomicLabs', params: 125081664, arc_easy: 0.5151515151515151, arc_challenge: 0.2764505119453925, piqa: 0.6751904243743199, hellaswag: 0.40529774945230035, avg_4: 0.4898234185711896, url: 'https://huggingface.co/AxiomicLabs/GPT-X2-125M' },
559
+ { name: 'GPT-X-125M', org: 'AxiomicLabs', params: 124561728, arc_easy: 0.5075757575757576, arc_challenge: 0.2687713310580205, piqa: 0.6517954298150164, hellaswag: 0.36496713802031466, avg_4: 0.464060299783275, url: 'https://huggingface.co/AxiomicLabs/GPT-X-125M' },
560
+ { name: 'MobileLLM-R1-140M-base', org: 'Facebook', params: 140000000, arc_easy: 0.4992424242424242, arc_challenge: 0.24744027303754265, piqa: 0.6322089227421109, hellaswag: 0.3384379853648824, avg_4: 0.443830, url: 'https://huggingface.co/facebook/MobileLLM-R1-140M-base' },
561
+ { name: 'Supra-50M-Base', org: 'SupraLabs', params: 51786240, arc_easy: 0.460016835016835, arc_challenge: 0.25, piqa: 0.6207834602829162, hellaswag: 0.31776538538139815, avg_4: 0.4252144857313513, url: 'https://huggingface.co/SupraLabs/Supra-50M-Base' },
562
+ { name: 'Shards-1', org: 'CompactAI', params: 54500000, arc_easy: 0.4112, arc_challenge: 0.2099, piqa: 0.5822, hellaswag: 0.2920, avg_4: 0.3698, url: 'https://huggingface.co/CompactAI-O/Shard-1' },
563
+
564
+ { name: 'Supra-50M-Instruct', org: 'SupraLabs', params: 51786240, arc_easy: 0.4440, arc_challenge: 0.2730, piqa: 0.5947, hellaswag: 0.2909, avg_4: 0.4030, url: 'https://huggingface.co/SupraLabs/Supra-50M-Instruct' },
565
+ { name: 'Supra-50M-Reasoning', org: 'SupraLabs', params: 51786240, arc_easy: 0.4444, arc_challenge: 0.2739, piqa: 0.5930, hellaswag: 0.2910, avg_4: 0.4006, url: 'https://huggingface.co/SupraLabs/Supra-50M-Reasoning' },
566
+ { name: 'SmolLM-135M', org: 'HuggingFace', params: 135000000, arc_easy: 0.5631, arc_challenge: 0.2901, piqa: 0.6828, hellaswag: 0.4270, avg_4: 0.4908, url: 'https://huggingface.co/HuggingFaceTB/SmolLM-135M' },
567
+ { name: 'OPT-125M', org: 'Facebook', params: 125000000, arc_easy: 0.4028, arc_challenge: 0.2270, piqa: 0.6224, hellaswag: 0.3131, avg_4: 0.3913, url: 'https://huggingface.co/facebook/opt-125m' },
568
+ { name: 'GPT-2', org: 'OpenAI', params: 124000000, arc_easy: 0.3935, arc_challenge: 0.2235, piqa: 0.6208, hellaswag: 0.3126, avg_4: 0.3892, url: 'https://huggingface.co/openai-community/gpt2' },
569
+ { name: 'Spark-5M-Base-v4', org: 'LH-Tech-AI', params: 5000000, arc_easy: 0.3316, arc_challenge: 0.2150, piqa: 0.5332, hellaswag: 0.2703, avg_4: 0.3250, url: 'https://huggingface.co/LH-Tech-AI/Spark-5M-Base-v4' },
570
+
571
+ { name: 'Supra-Mini-v5-8M', org: 'SupraLabs', params: 7870000, arc_easy: 0.3321, arc_challenge: 0.2116, piqa: 0.5403, hellaswag: 0.2637, avg_4: 0.3219, url: 'https://huggingface.co/SupraLabs/Supra-Mini-v5-8M' },
572
+ { name: 'Pythia-70M', org: 'EleutherAI', params: 70000000, arc_easy: 0.3165, arc_challenge: 0.2363, piqa: 0.5348, hellaswag: 0.2749, avg_4: 0.3657, url: 'https://huggingface.co/EleutherAI/pythia-70m' },
573
+ { name: 'Supra-Mini-v4-2M', org: 'SupraLabs', params: 2620000, arc_easy: 0.3098, arc_challenge: 0.2150, piqa: 0.5190, hellaswag: 0.2552, avg_4: 0.3188, url: 'https://huggingface.co/SupraLabs/Supra-Mini-v4-2M' },
574
+ { name: 'Pythia-31M', org: 'EleutherAI', params: 31000000, arc_easy: 0.3388, arc_challenge: 0.2167, piqa: 0.5626, hellaswag: 0.2714, avg_4: 0.3474, url: 'https://huggingface.co/EleutherAI/pythia-31m' },
575
+ { name: 'Stentor3-50M', org: 'StentorLabs', params: 50000000, arc_easy: 0.2967, arc_challenge: 0.2167, piqa: 0.5375, hellaswag: 0.2710, avg_4: 0.3335, url: 'https://huggingface.co/StentorLabs/Stentor3-50M' },
576
+ { name: 'Stentor3-20M', org: 'StentorLabs', params: 20000000, arc_easy: 0.2950, arc_challenge: 0.2312, piqa: 0.5506, hellaswag: 0.2706, avg_4: 0.3394, url: 'https://huggingface.co/StentorLabs/Stentor3-20M' },
577
+ { name: 'Portimbria-150M', org: 'StentorLabs', params: 151026432, arc_easy: 0.3582, arc_challenge: 0.1877, piqa: 0.5827, hellaswag: 0.2709, avg_4: 0.3499, url: 'https://huggingface.co/StentorLabs/Portimbria-150M' },
578
+ { name: 'nanowhale-100m-base', org: 'HuggingFace', params: 100000000, arc_easy: 0.2879, arc_challenge: 0.2483, piqa: 0.5180, hellaswag: 0.2631, avg_4: 0.3293, url: 'https://huggingface.co/HuggingFaceTB/nanowhale-100m-base' },
579
+ { name: 'Pythia-14M', org: 'EleutherAI', params: 14000000, arc_easy: 0.3228, arc_challenge: 0.2100, piqa: 0.5588, hellaswag: 0.2620, avg_4: 0.3384, url: 'https://huggingface.co/EleutherAI/pythia-14m' },
580
+ { name: 'Tenete-8M', org: 'Harley-ml', params: 8000000, arc_easy: 0.3169, arc_challenge: 0.2184, piqa: 0.5566, hellaswag: 0.2675, avg_4: 0.3409, url: 'https://huggingface.co/Harley-ml/Tenete-8M' },
581
+ { name: 'Dillion-1.2M', org: 'Harley-ml', params: 1281384, arc_easy: 0.3119, arc_challenge: 0.2278, piqa: 0.5305, hellaswag: 0.2665, avg_4: 0.3338, url: 'https://huggingface.co/Harley-ml/Dillion-1.2M' },
582
+ { name: 'CinnabarLM-1.4M-Base', org: 'MihaiPopa-1', params: 1510000, arc_easy: 0.2854, arc_challenge: 0.2338, piqa: 0.5250, hellaswag: 0.2708, avg_4: 0.3416, url: 'https://huggingface.co/MihaiPopa-1/CinnabarLM-1.4M-Base' },
583
+ { name: 'CinnabarLM-4M-Base', org: 'MihaiPopa-1', params: 4230000, arc_easy: 0.2828, arc_challenge: 0.2270, piqa: 0.5229, hellaswag: 0.2771, avg_4: 0.3302, url: 'https://huggingface.co/MihaiPopa-1/CinnabarLM-4M-Base' },
584
+ { name: 'CinnabarLM-1.5M-Base', org: 'MihaiPopa-1', params: 1710000, arc_easy: 0.2811, arc_challenge: 0.2193, piqa: 0.5294, hellaswag: 0.2708, avg_4: 0.3338, url: 'https://huggingface.co/MihaiPopa-1/CinnabarLM-1.5M-Base' },
585
+ { name: 'Dillionv2-1.3M', org: 'Harley-ml', params: 1285200, arc_easy: 0.2963, arc_challenge: 0.2224, piqa: 0.5305, hellaswag: 0.2738, avg_4: 0.3292, url: 'https://huggingface.co/Harley-ml/Dillionv2-1.3M' },
586
+ { name: 'KeyLM-75M', org: 'Eclipse-Senpai', params: 75251200, arc_easy: 0.3573, arc_challenge: 0.2398, piqa: 0.6050, hellaswag: 0.2966, avg_4: 0.3947, url: 'https://huggingface.co/Eclipse-Senpai/KeyLM-75M' },
587
+ { name: 'Supra-Mini-v6-1M', org: 'SupraLabs', params: 1410688, arc_easy: 0.3068, arc_challenge: 0.2048, piqa: 0.5370, hellaswag: 0.2722, avg_4: 0.3322, url: 'https://huggingface.co/SupraLabs/Supra-Mini-v6-1M' },
588
+ { name: 'GPT-S-1.4M', org: 'AxiomicLabs', params: 1426000, arc_easy: 0.3186, arc_challenge: 0.2210, piqa: 0.5511, hellaswag: 0.2686, avg_4: 0.3341, url: 'https://huggingface.co/AxiomicLabs/GPT-S-1.4M' },
589
+ { name: 'Archaea-74M', org: 'GODELEV', params: 74016256, arc_easy: 0.3906, arc_challenge: 0.2270, piqa: 0.5827, hellaswag: 0.2727, avg_4: 0.3812, url: 'https://huggingface.co/GODELEV/Archaea-74M' },
590
+ { name: 'Cali-0.1B', org: 'Sandroeth', params: 123782400, arc_easy: 0.2753, arc_challenge: 0.2449, piqa: 0.5212, hellaswag: 0.2684, avg_4: 0.3274, url: 'https://huggingface.co/Sandroeth/cali-0.1B' },
591
+ { name: 'Quark-50M', org: 'ThingAI', params: 56666496, arc_easy: 0.3678, arc_challenge: 0.2526, piqa: 0.5783, hellaswag: 0.2848, avg_4: 0.3717, url: 'https://huggingface.co/ThingAI/Quark-50m' },
592
+ { name: 'Quark-135M', org: 'ThingAI', params: 134561088, arc_easy: 0.4789, arc_challenge: 0.2824, piqa: 0.5865, hellaswag: 0.3137, avg_4: 0.4143, url: 'https://huggingface.co/ThingAI/Quark-135m' },
593
+ { name: 'Veyra-30M-Base', org: 'veyra-ai', params: 34611712, arc_easy: 0.3594, arc_challenge: 0.2389, piqa: 0.5903, hellaswag: 0.2787, avg_4: 0.3692, url: 'https://huggingface.co/veyra-ai/veyra-30m-base-5b-tokens' },
594
+ { name: 'Syn-2.6M', org: 'FromZero', params: 2604210, arc_easy: 0.3211, arc_challenge: 0.2039, piqa: 0.5365, hellaswag: 0.2702, avg_4: 0.3331, url: 'https://huggingface.co/fromziro/Syn-2.6M' },
595
+ { name: 'Ant-5M', org: 'GODELEV', params: 4713344, arc_easy: 0.2639, arc_challenge: 0.2577, piqa: 0.4864, hellaswag: 0.2599, avg_4: 0.3195, url: 'https://huggingface.co/GODELEV/Ant-5m' },
596
+ { name: 'Er-Medium-12.5M', org: 'FromZero', params: 12497520, arc_easy: 0.3476, arc_challenge: 0.2082, piqa: 0.5783, hellaswag: 0.2841, avg_4: 0.3668, url: 'https://huggingface.co/fromziro/Er-Medium-12.5M' },
597
+ { name: 'michel-tiny', org: 'finnianx', params: 55719040, arc_easy: 0.3737, arc_challenge: 0.2176, piqa: 0.5734, hellaswag: 0.2815, avg_4: 0.3502, url: 'https://huggingface.co/finnianx/michel-tiny' },
598
+ { name: 'OdinNext-138M-Base', org: 'joelhenwang', params: 138449696, arc_easy: 0.4508, arc_challenge: 0.2381, piqa: 0.5952, hellaswag: 0.2809, avg_4: 0.3920, url: 'https://huggingface.co/joelhenwang/OdinNext-138M-Base' },
599
+ { name: 'OdinNext-138M-Instruct', org: 'joelhenwang', params: 138451232, arc_easy: 0.4440, arc_challenge: 0.2312, piqa: 0.5865, hellaswag: 0.2886, avg_4: 0.3888, url: 'https://huggingface.co/joelhenwang/OdinNext-138M-Instruct' },
600
+ { name: 'michel-micro', org: 'finnianx', params: 28355072, arc_easy: 0.3859, arc_challenge: 0.2312, piqa: 0.5762, hellaswag: 0.2823, avg_4: 0.3803, url: 'https://huggingface.co/finnianx/michel-micro' },
601
+ { name: 'kirk-tung', org: 'RTC', params: 53111296, arc_easy: 0.3043, arc_challenge: 0.2201, piqa: 0.5261, hellaswag: 0.2632, avg_4: 0.3184, url: 'https://huggingface.co/rtc2022/kirk-tung' },
602
+ { name: 'ettin-decoder-32m', org: 'JHU CLSP', params: 32081344, arc_easy: 0.3173, arc_challenge: 0.2201, piqa: 0.5229, hellaswag: 0.2779, avg_4: 0.3348, url: 'https://huggingface.co/jhu-clsp/ettin-decoder-32m' },
603
+ { name: 'ettin-decoder-17m', org: 'JHU CLSP', params: 16913600, arc_easy: 0.3165, arc_challenge: 0.2227, piqa: 0.5337, hellaswag: 0.2739, avg_4: 0.3438, url: 'https://huggingface.co/jhu-clsp/ettin-decoder-17m' },
604
+ { name: 'Er-Tiny-1.3M', org: 'FromZero', params: 1332744, arc_easy: 0.3009, arc_challenge: 0.2235, piqa: 0.5272, hellaswag: 0.2767, avg_4: 0.3292, url: 'https://huggingface.co/fromziro/Er-Tiny-1.3M' },
605
+ { name: 'michel-nano', org: 'finnianx', params: 5963008, arc_easy: 0.3329, arc_challenge: 0.2270, piqa: 0.5479, hellaswag: 0.2712, avg_4: 0.3464, url: 'https://huggingface.co/finnianx/michel-nano' },
606
+ { name: 'Supra-1.5-50M-base-exp', org: 'SupraLabs', params: 51786240, arc_easy: 0.4840, arc_challenge: 0.2551, piqa: 0.6001, hellaswag: 0.2978, avg_4: 0.4288, url: 'https://huggingface.co/SupraLabs/Supra-1.5-50M-base-exp' },
607
+ { name: 'ettin-decoder-68m', org: 'JHU CLSP', params: 68457664, arc_easy: 0.3274, arc_challenge: 0.2304, piqa: 0.5218, hellaswag: 0.2781, avg_4: 0.3394, url: 'https://huggingface.co/jhu-clsp/ettin-decoder-68m' },
608
+ { name: 'ettin-decoder-150m', org: 'JHU CLSP', params: 149655232, arc_easy: 0.2997, arc_challenge: 0.2423, piqa: 0.5125, hellaswag: 0.2595, avg_4: 0.3189, url: 'https://huggingface.co/jhu-clsp/ettin-decoder-150m' },
609
+ { name: 'Ant-10M', org: 'GODELEV', params: 9902336, arc_easy: 0.2753, arc_challenge: 0.2824, piqa: 0.5065, hellaswag: 0.2696, avg_4: 0.3302, url: 'https://huggingface.co/GODELEV/Ant-19m' },
610
+ { name: 'Supra-1.5-50M-Instruct-exp', org: 'SupraLabs', params: 51786240, arc_easy: 0.4394, arc_challenge: 0.2611, piqa: 0.5941, hellaswag: 0.2926, avg_4: 0.4077, url: 'https://huggingface.co/SupraLabs/Supra-1.5-50M-Instruct-exp' },
611
+ { name: 'SLM-10M', org: 'Liodon AI', params: 9968640, arc_easy: 0.3552, arc_challenge: 0.2346, piqa: 0.5707, hellaswag: 0.2740, avg_4: 0.3401, url: 'https://huggingface.co/liodon-ai/slm-10m' },
612
+ { name: 'Doge-20M', org: 'SmallDoge', params: 13118728, arc_easy: 0.3338, arc_challenge: 0.2073, piqa: 0.5430, hellaswag: 0.2661, avg_4: 0.3236, url: 'https://huggingface.co/SmallDoge/Doge-20M' }
613
  ];
614
 
615
  const BENCHMARKS = [
616
+ { key: 'avg_4', label: 'Avg' },
617
+ { key: 'arc_easy', label: 'ARC-Easy' },
618
+ { key: 'arc_challenge', label: 'ARC-Challenge' },
619
  { key: 'hellaswag', label: 'HellaSwag' },
620
+ { key: 'piqa', label: 'PIQA' }
 
621
  ];
622
 
623
+ const BENCHMARK_NAMES = {
624
+ avg_4: 'Average',
625
+ arc_easy: 'ARC-Easy',
626
+ arc_challenge: 'ARC-Challenge',
627
+ hellaswag: 'HellaSwag',
628
+ piqa: 'PIQA'
629
+ };
630
+
631
+ let activeBenchmark = 'avg_4';
632
+ let activeSearch = '';
633
+ let sortKey = 'score';
634
  let chart = null;
635
 
636
+ const fmtParams = (n) => {
637
  if (n >= 1e9) return `${(n / 1e9).toFixed(2)}B`;
638
  if (n >= 1e6) return `${(n / 1e6).toFixed(2)}M`;
639
  if (n >= 1e3) return `${(n / 1e3).toFixed(2)}K`;
640
  return String(n);
641
  };
642
 
643
+ const toPct = (v) => (v * 100);
644
 
645
+ const linearRegression = (points) => {
 
 
646
  const n = points.length;
647
  let sumX = 0, sumY = 0, sumXY = 0, sumXX = 0;
648
  for (const p of points) {
 
655
  const slope = Math.abs(denom) < 1e-12 ? 0 : (n * sumXY - sumX * sumY) / denom;
656
  const intercept = n ? (sumY - slope * sumX) / n : 0;
657
  return { slope, intercept };
658
+ };
659
 
660
+ const getScore = (m, key) => (m[key] ?? null);
661
+
662
+ const getVisibleModels = () => {
663
+ const q = activeSearch.trim().toLowerCase();
664
+ return MODELS.filter(m => {
665
+ const s = getScore(m, activeBenchmark);
666
+ if (s === null || !Number.isFinite(m.params)) return false;
667
+ if (!q) return true;
668
+ return (
669
+ m.name.toLowerCase().includes(q) ||
670
+ m.org.toLowerCase().includes(q)
671
+ );
672
  });
673
+ };
674
+
675
+ const computeLoss = (data, slope, intercept) => {
676
+ const residuals = data.map(d => d.y - (slope * d.x + intercept));
677
+ const mse = residuals.reduce((a, b) => a + b * b, 0) / residuals.length;
678
  const rmse = Math.sqrt(mse);
679
  return { mse, rmse, residuals };
680
+ };
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
681
 
682
+ const renderBenchmarkButtons = () => {
683
  const box = document.getElementById('benchmarkButtons');
684
+ box.innerHTML = BENCHMARKS.map(b =>
685
+ `<button class="${b.key === activeBenchmark ? 'active' : ''}" data-key="${b.key}">${b.label}</button>`
686
+ ).join('');
687
  box.querySelectorAll('button').forEach(btn => {
688
  btn.addEventListener('click', () => {
689
  activeBenchmark = btn.dataset.key;
690
  render();
691
  });
692
  });
693
+ };
694
 
695
+ const renderTable = (data) => {
696
+ const tbody = document.getElementById('modelTable');
697
+ const rows = [...data].sort((a, b) => {
698
+ if (sortKey === 'name') return a.name.localeCompare(b.name);
699
+ if (sortKey === 'org') return a.org.localeCompare(b.org);
700
+ if (sortKey === 'params') return a.params - b.params;
701
+ if (sortKey === 'score') return b.score - a.score;
702
+ if (sortKey === 'residual') return b.residual - a.residual;
703
+ if (sortKey === 'side') return b.residual - a.residual;
704
+ return 0;
705
+ });
 
706
 
707
+ tbody.innerHTML = rows.map(m => {
708
+ const above = m.residual >= 0;
709
+ return `
710
+ <tr data-url="${m.url}">
711
+ <td>${m.name}</td>
712
+ <td class="muted">${m.org}</td>
713
+ <td class="muted">${fmtParams(m.params)} <span style="color:#6f737d;">(${m.params.toLocaleString()})</span></td>
714
+ <td>${m.score.toFixed(2)}%</td>
715
+ <td class="${above ? 'above' : 'below'}">${above ? '+' : ''}${m.residual.toFixed(2)} pts</td>
716
+ <td>${above ? '<span class="pill-up">Above line</span>' : '<span class="pill-down">Below line</span>'}</td>
717
+ </tr>
718
+ `;
719
+ }).join('');
720
+
721
+ tbody.querySelectorAll('tr').forEach(row => {
722
  row.addEventListener('click', () => {
723
  const url = row.dataset.url;
724
  if (url) window.open(url, '_blank', 'noopener,noreferrer');
725
  });
726
  });
727
+ };
728
 
729
+ const updateStats = (slope, intercept, mse, rmse, count) => {
730
  document.getElementById('statSlope').textContent = slope.toFixed(4);
731
  document.getElementById('statIntercept').textContent = intercept.toFixed(2);
732
+ document.getElementById('statMSE').textContent = mse.toFixed(4);
733
+ document.getElementById('statRMSE').textContent = rmse.toFixed(2);
734
  document.getElementById('countBadge').textContent = `${count} models`;
735
+ document.getElementById('infoBenchmark').textContent = BENCHMARK_NAMES[activeBenchmark] || activeBenchmark;
736
+ document.getElementById('infoCount').textContent = String(count);
737
+ document.getElementById('infoLoss').textContent = `MSE ${mse.toFixed(4)} · RMSE ${rmse.toFixed(2)}`;
738
+ };
739
 
740
  function render() {
741
  renderBenchmarkButtons();
742
 
743
+ const data = getVisibleModels().map(m => ({
744
+ name: m.name,
745
+ org: m.org,
746
+ params: m.params,
747
+ score: toPct(m[activeBenchmark]),
748
+ url: m.url,
749
+ x: Math.log10(m.params)
750
+ }));
751
+
752
+ if (data.length < 2) {
753
+ document.getElementById('chartTitle').textContent = 'Not enough models';
754
+ document.getElementById('chartSub').textContent = 'Add more models or clear the search filter.';
755
+ document.getElementById('fitNote').textContent = 'Need at least 2 visible models to fit a line.';
756
+ document.getElementById('modelTable').innerHTML = '';
757
+ if (chart) chart.destroy();
758
+ return;
759
+ }
760
 
761
+ const points = data.map(d => ({ x: d.x, y: d.score }));
762
  const { slope, intercept } = linearRegression(points);
763
+ const { mse, rmse, residuals } = computeLoss(data, slope, intercept);
764
+
765
+ data.forEach((d, i) => {
766
+ d.residual = residuals[i];
767
+ });
768
 
769
  updateStats(slope, intercept, mse, rmse, data.length);
 
770
 
771
  const xMin = Math.min(...data.map(d => d.x));
772
  const xMax = Math.max(...data.map(d => d.x));
773
+ const xPad = Math.max(0.2, (xMax - xMin) * 0.09);
774
+ const xLow = xMin - xPad;
775
+ const xHigh = xMax + xPad;
776
  const yLow = slope * xLow + intercept;
777
  const yHigh = slope * xHigh + intercept;
778
+
779
+ const yMin = Math.min(...data.map(d => d.score), yLow) - 1.8;
780
+ const yMax = Math.max(...data.map(d => d.score), yHigh) + 1.8;
781
 
782
  const titleMap = {
783
+ avg_4: 'Average score vs log parameters',
784
+ arc_easy: 'ARC-Easy vs log parameters',
785
+ arc_challenge: 'ARC-Challenge vs log parameters',
786
  hellaswag: 'HellaSwag vs log parameters',
787
+ piqa: 'PIQA vs log parameters'
 
788
  };
789
 
790
+ document.getElementById('chartTitle').textContent = titleMap[activeBenchmark] || 'Regression vs log parameters';
791
+ document.getElementById('chartSub').textContent = `Silver dotted regression line on ${BENCHMARK_NAMES[activeBenchmark] || activeBenchmark}. Hover for model names, click to open model pages.`;
792
+ document.getElementById('fitNote').textContent = `Regression loss for ${BENCHMARK_NAMES[activeBenchmark] || activeBenchmark}: MSE ${mse.toFixed(4)} · RMSE ${rmse.toFixed(2)}.`;
793
+
794
+ renderTable(data);
795
 
796
  const ctx = document.getElementById('scatterChart').getContext('2d');
797
  if (chart) chart.destroy();
 
808
  { x: xHigh, y: yHigh }
809
  ],
810
  borderColor: 'rgba(236, 236, 241, 0.98)',
811
+ borderWidth: 3,
812
+ borderDash: [2, 7],
813
+ borderCapStyle: 'round',
814
  pointRadius: 0,
815
  tension: 0,
816
  fill: false,
 
819
  {
820
  label: 'Models',
821
  data: data.map(d => ({ ...d })),
822
+ parsing: false,
823
  pointRadius: 7,
824
  pointHoverRadius: 10,
825
+ pointHitRadius: 12,
826
  borderWidth: 1.5,
827
+ backgroundColor: (ctx) => {
828
+ const raw = ctx.raw;
829
+ if (!raw) return 'rgba(225, 226, 232, 0.86)';
830
+ return raw.residual >= 0
831
+ ? 'rgba(241, 242, 247, 0.96)'
832
+ : 'rgba(146, 151, 160, 0.93)';
833
+ },
834
+ borderColor: (ctx) => {
835
+ const raw = ctx.raw;
836
+ if (!raw) return 'rgba(255,255,255,0.92)';
837
+ return raw.residual >= 0
838
+ ? 'rgba(255,255,255,0.98)'
839
+ : 'rgba(220,220,224,0.55)';
840
+ },
841
+ hoverBackgroundColor: 'rgba(247, 247, 250, 0.99)',
842
  hoverBorderColor: 'rgba(255,255,255,0.98)',
843
  order: 2
844
  }
 
849
  maintainAspectRatio: false,
850
  animation: { duration: 0 },
851
  interaction: { mode: 'nearest', intersect: true },
852
+ onHover: (event, elements) => {
853
+ event.native.target.style.cursor = elements.length ? 'pointer' : 'default';
854
+ },
855
  onClick: (event, elements) => {
856
  if (!elements.length) return;
857
  const hit = elements[0];
 
862
  plugins: {
863
  legend: { display: false },
864
  tooltip: {
865
+ backgroundColor: 'rgba(12,12,15,0.97)',
866
+ borderColor: 'rgba(236,236,241,0.24)',
867
  borderWidth: 1,
868
  titleColor: '#ffffff',
869
+ bodyColor: '#d7d7de',
870
  padding: 12,
871
  displayColors: false,
872
  callbacks: {
 
876
  const pred = slope * d.x + intercept;
877
  const resid = d.y - pred;
878
  return [
879
+ `Params: ${fmtParams(d.params)} (${d.params.toLocaleString()})`,
880
+ `Score: ${d.score.toFixed(2)}%`,
881
  `Residual: ${resid >= 0 ? '+' : ''}${resid.toFixed(2)} pts`,
882
  `Prediction: ${pred.toFixed(2)}%`
883
  ];
 
892
  max: xHigh,
893
  grid: { color: 'rgba(255,255,255,0.045)' },
894
  ticks: {
895
+ color: '#84848d',
896
  callback: v => `10^${Number(v).toFixed(1)}`
897
  },
898
  title: {
899
  display: true,
900
  text: 'Log₁₀(parameters)',
901
+ color: '#84848d',
902
  font: { weight: '600' }
903
  }
904
  },
 
907
  max: yMax,
908
  grid: { color: 'rgba(255,255,255,0.045)' },
909
  ticks: {
910
+ color: '#84848d',
911
  callback: v => `${Number(v).toFixed(0)}%`
912
  },
913
  title: {
914
  display: true,
915
  text: 'Score (%)',
916
+ color: '#84848d',
917
  font: { weight: '600' }
918
  }
919
  }
 
922
  });
923
  }
924
 
925
+ document.getElementById('searchBox').addEventListener('input', (e) => {
926
+ activeSearch = e.target.value || '';
927
+ render();
928
+ });
929
+
930
+ document.querySelectorAll('thead th[data-sort]').forEach(th => {
931
+ th.addEventListener('click', () => {
932
+ sortKey = th.dataset.sort;
933
+ render();
934
+ });
935
+ });
936
+
937
  render();
938
  </script>
939
  </body>
940
+ </html>