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

Update index.html

Browse files
Files changed (1) hide show
  1. index.html +162 -154
index.html CHANGED
@@ -8,18 +8,17 @@
8
  <style>
9
  :root {
10
  --bg: #09090b;
11
- --bg2: #111114;
12
  --surface: #141418;
13
- --surface2: #18181d;
14
- --border: #24242b;
15
- --border2: #30303a;
16
- --text: #f2f2f2;
17
- --muted: #8a8a96;
18
- --muted2: #5f5f6b;
19
- --silver: #d8d8de;
20
- --silver2: #aeb0ba;
21
- --glass: rgba(255,255,255,0.04);
22
- --shadow: 0 18px 50px rgba(0,0,0,0.40);
23
  --radius: 22px;
24
  }
25
 
@@ -27,14 +26,14 @@
27
  html { scroll-behavior: smooth; }
28
  body {
29
  margin: 0;
30
- font-family: Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
31
- background:
32
- radial-gradient(circle at top left, rgba(255,255,255,0.06), transparent 28%),
33
- radial-gradient(circle at bottom right, rgba(255,255,255,0.04), transparent 24%),
34
- linear-gradient(180deg, var(--bg), #070708 60%, #050506);
35
- color: var(--text);
36
  min-height: 100vh;
37
  padding: 28px;
 
 
 
 
 
 
38
  }
39
 
40
  .app {
@@ -44,12 +43,15 @@
44
  gap: 18px;
45
  }
46
 
 
 
 
 
 
 
47
  .hero {
48
- background: linear-gradient(180deg, rgba(255,255,255,0.05), rgba(255,255,255,0.02));
49
- border: 1px solid rgba(255,255,255,0.08);
50
  border-radius: calc(var(--radius) + 4px);
51
- padding: 24px 24px 18px;
52
- box-shadow: var(--shadow);
53
  position: relative;
54
  overflow: hidden;
55
  }
@@ -58,32 +60,33 @@
58
  content: "";
59
  position: absolute;
60
  inset: 0;
61
- background: linear-gradient(90deg, rgba(255,255,255,0.03), transparent 40%, rgba(255,255,255,0.02));
62
  pointer-events: none;
63
  }
64
 
65
  .eyebrow {
 
66
  text-transform: uppercase;
67
  letter-spacing: 0.22em;
68
- color: var(--silver2);
69
  font-size: 11px;
70
  margin-bottom: 10px;
71
  }
72
 
73
  h1 {
74
  margin: 0;
75
- font-size: clamp(34px, 5vw, 64px);
76
  line-height: 0.96;
77
  letter-spacing: -0.06em;
78
- font-weight: 800;
79
  }
80
 
81
- .title-silver { color: var(--silver); text-shadow: 0 0 18px rgba(255,255,255,0.08); }
82
  .sub {
83
  margin: 14px 0 0;
84
  color: var(--muted);
85
- max-width: 760px;
86
  line-height: 1.7;
 
87
  }
88
 
89
  .layout {
@@ -93,14 +96,13 @@
93
  align-items: start;
94
  }
95
 
96
- .panel, .chart-card, .list-card {
97
- background: linear-gradient(180deg, rgba(255,255,255,0.035), rgba(255,255,255,0.015));
98
- border: 1px solid rgba(255,255,255,0.08);
99
  border-radius: var(--radius);
100
- box-shadow: var(--shadow);
 
 
101
  }
102
 
103
- .panel { padding: 18px; position: sticky; top: 18px; }
104
  .panel h2, .chart-card h2, .list-card h2 {
105
  margin: 0 0 14px;
106
  font-size: 14px;
@@ -128,7 +130,7 @@
128
  }
129
 
130
  button {
131
- border: 1px solid rgba(255,255,255,0.09);
132
  background: rgba(255,255,255,0.03);
133
  color: var(--muted);
134
  padding: 10px 12px;
@@ -139,11 +141,16 @@
139
  font-size: 13px;
140
  }
141
 
142
- button:hover { border-color: rgba(255,255,255,0.22); color: var(--text); transform: translateY(-1px); }
 
 
 
 
 
143
  button.active {
144
- color: #f6f6f7;
145
- border-color: rgba(216,216,222,0.45);
146
- background: linear-gradient(180deg, rgba(216,216,222,0.18), rgba(216,216,222,0.08));
147
  box-shadow: 0 0 0 1px rgba(255,255,255,0.03) inset;
148
  }
149
 
@@ -161,10 +168,30 @@
161
  padding: 14px;
162
  }
163
 
164
- .stat .k { color: var(--muted2); font-size: 11px; text-transform: uppercase; letter-spacing: 0.12em; }
165
- .stat .v { margin-top: 6px; font-size: 20px; font-weight: 700; color: var(--silver); }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
166
 
167
  .chart-card {
 
168
  padding: 16px 16px 10px;
169
  min-height: 640px;
170
  }
@@ -179,10 +206,10 @@
179
  }
180
 
181
  .chart-title {
 
182
  font-size: 18px;
183
- font-weight: 700;
184
  letter-spacing: -0.03em;
185
- margin: 0;
186
  }
187
 
188
  .chart-sub {
@@ -191,19 +218,23 @@
191
  font-size: 13px;
192
  }
193
 
194
- canvas { width: 100% !important; height: 540px !important; }
195
-
196
  .badge {
197
  padding: 8px 12px;
198
  border-radius: 999px;
199
- background: rgba(216,216,222,0.08);
200
- border: 1px solid rgba(216,216,222,0.15);
201
  color: var(--silver);
202
  font-size: 13px;
203
  white-space: nowrap;
204
  }
205
 
206
- .list-card { padding: 16px; }
 
 
 
 
 
 
207
  .model-list {
208
  display: grid;
209
  gap: 10px;
@@ -221,25 +252,20 @@
221
  border-radius: 16px;
222
  background: rgba(255,255,255,0.025);
223
  border: 1px solid rgba(255,255,255,0.06);
 
 
224
  }
225
 
226
- .model-name { font-weight: 650; }
227
- .model-meta { color: var(--muted); font-size: 12px; }
228
- .model-score { color: var(--silver); font-variant-numeric: tabular-nums; }
229
-
230
- .small-note { color: var(--muted2); font-size: 12px; line-height: 1.6; margin-top: 10px; }
231
- .codebox {
232
- background: rgba(0,0,0,0.24);
233
- border: 1px solid rgba(255,255,255,0.08);
234
- border-radius: 16px;
235
- padding: 14px;
236
- color: #d9d9df;
237
- font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace;
238
- font-size: 12px;
239
- line-height: 1.6;
240
- overflow: auto;
241
  }
242
 
 
 
 
 
243
  @media (max-width: 1050px) {
244
  .layout { grid-template-columns: 1fr; }
245
  .panel { position: static; }
@@ -261,8 +287,8 @@
261
  <div class="eyebrow">Regression explorer</div>
262
  <h1><span class="title-silver">Silver</span> benchmark fit line</h1>
263
  <p class="sub">
264
- Pick a benchmark, fit a linear regression on <b>log10(parameters)</b>, and see how each model lands against the line.
265
- Hover any dot to view the model, parameter count, score, and residual.
266
  </p>
267
  </section>
268
 
@@ -278,40 +304,12 @@
278
  <div class="section">
279
  <span class="section-label">Regression stats</span>
280
  <div class="stat-grid">
281
- <div class="stat">
282
- <div class="k">Slope</div>
283
- <div class="v" id="statSlope">—</div>
284
- </div>
285
- <div class="stat">
286
- <div class="k">Intercept</div>
287
- <div class="v" id="statIntercept">—</div>
288
- </div>
289
- <div class="stat">
290
- <div class="k">MSE</div>
291
- <div class="v" id="statLoss">—</div>
292
- </div>
293
- <div class="stat">
294
- <div class="k">RMSE</div>
295
- <div class="v" id="statRmse">—</div>
296
- </div>
297
  </div>
298
- <div class="small-note" id="fitNote">The regression line updates instantly when you switch benchmarks.</div>
299
- </div>
300
-
301
- <div class="section">
302
- <span class="section-label">Add models easily</span>
303
- <div class="codebox">{
304
- name: "MyModel-12M",
305
- params: 12000000,
306
- org: "me",
307
- avg: 0.361,
308
- arc: 0.35,
309
- hellaswag: 0.28,
310
- piqa: 0.57,
311
- arcChall: 0.21,
312
- arithmark2: 0.30
313
- }</div>
314
- <div class="small-note">Just add another object to <b>MODELS</b>. If a field is missing, it will be ignored for that benchmark.</div>
315
  </div>
316
  </aside>
317
 
@@ -320,7 +318,7 @@
320
  <div class="chart-top">
321
  <div>
322
  <h2 class="chart-title" id="chartTitle">Average score vs log parameters</h2>
323
- <p class="chart-sub" id="chartSub">Silver regression line over all featured models.</p>
324
  </div>
325
  <div class="badge" id="countBadge">0 models</div>
326
  </div>
@@ -336,24 +334,23 @@
336
  </div>
337
 
338
  <script>
339
- // Edit this list to add or remove models.
340
- // score values are in percent form (0-100) for easier reading.
341
  const MODELS = [
342
- { 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 },
343
- { 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 },
344
- { 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 },
345
- { 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 },
346
- { 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 },
347
- { 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 },
348
- { 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 },
349
- { 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 },
350
- { 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 },
351
- { 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 },
352
- { 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 },
353
- { 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 },
354
- { 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 },
355
- { 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 },
356
- { 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 }
357
  ];
358
 
359
  const BENCHMARKS = [
@@ -362,19 +359,22 @@
362
  { key: 'arcChall', label: 'ARC-Challenge' },
363
  { key: 'hellaswag', label: 'HellaSwag' },
364
  { key: 'piqa', label: 'PIQA' },
365
- { key: 'arithmark2', label: 'ArithMark-2' },
366
  ];
367
 
368
  let activeBenchmark = 'avg';
369
- let chart;
370
 
371
- function getScore(model, benchmark) {
372
- return model[benchmark] ?? null;
373
- }
 
 
 
374
 
375
- function mean(arr) {
376
- return arr.reduce((a, b) => a + b, 0) / arr.length;
377
- }
378
 
379
  function linearRegression(points) {
380
  const n = points.length;
@@ -391,11 +391,10 @@
391
  return { slope, intercept };
392
  }
393
 
394
- function computeLoss(models, benchmark, slope, intercept) {
395
- const residuals = models.map(m => {
396
- const x = Math.log10(m.params);
397
- const y = getScore(m, benchmark);
398
- return y - (slope * x + intercept);
399
  });
400
  const mse = mean(residuals.map(r => r * r));
401
  const rmse = Math.sqrt(mse);
@@ -410,19 +409,13 @@
410
  org: m.org,
411
  params: m.params,
412
  paramsDisplay: formatParams(m.params),
 
413
  x: Math.log10(m.params),
414
  y: getScore(m, activeBenchmark)
415
  }))
416
  .sort((a, b) => a.x - b.x);
417
  }
418
 
419
- function formatParams(n) {
420
- if (n >= 1e9) return `${(n / 1e9).toFixed(2)}B`;
421
- if (n >= 1e6) return `${(n / 1e6).toFixed(2)}M`;
422
- if (n >= 1e3) return `${(n / 1e3).toFixed(2)}K`;
423
- return String(n);
424
- }
425
-
426
  function renderBenchmarkButtons() {
427
  const box = document.getElementById('benchmarkButtons');
428
  box.innerHTML = BENCHMARKS.map(b => `
@@ -439,7 +432,7 @@
439
  function renderModelList(data) {
440
  const list = document.getElementById('modelList');
441
  list.innerHTML = data.map(m => `
442
- <div class="model-row">
443
  <div>
444
  <div class="model-name">${m.name}</div>
445
  <div class="model-meta">${m.org} · ${m.paramsDisplay}</div>
@@ -448,6 +441,13 @@
448
  <div class="model-score">y=${m.y.toFixed(2)}%</div>
449
  </div>
450
  `).join('');
 
 
 
 
 
 
 
451
  }
452
 
453
  function updateStats(slope, intercept, mse, rmse, count) {
@@ -467,8 +467,8 @@
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
 
471
- data.forEach((d, i) => d.residual = residuals[i]);
472
  updateStats(slope, intercept, mse, rmse, data.length);
473
  renderModelList(data);
474
 
@@ -492,8 +492,8 @@
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}. Beautiful silver line, hover for model details.`;
496
- document.getElementById('fitNote').textContent = `Regression loss for ${BENCHMARKS.find(b => b.key === activeBenchmark)?.label || activeBenchmark}: MSE ${mse.toFixed(4)} · RMSE ${rmse.toFixed(2)}.`;
497
 
498
  const ctx = document.getElementById('scatterChart').getContext('2d');
499
  if (chart) chart.destroy();
@@ -509,8 +509,8 @@
509
  { x: xLow, y: yLow },
510
  { x: xHigh, y: yHigh }
511
  ],
512
- borderColor: 'rgba(220, 220, 224, 0.98)',
513
- borderWidth: 2.8,
514
  pointRadius: 0,
515
  tension: 0,
516
  fill: false,
@@ -522,8 +522,10 @@
522
  pointRadius: 7,
523
  pointHoverRadius: 10,
524
  borderWidth: 1.5,
525
- backgroundColor: 'rgba(201, 203, 210, 0.78)',
526
- borderColor: 'rgba(255,255,255,0.65)',
 
 
527
  order: 2
528
  }
529
  ]
@@ -533,26 +535,32 @@
533
  maintainAspectRatio: false,
534
  animation: { duration: 0 },
535
  interaction: { mode: 'nearest', intersect: true },
 
 
 
 
 
 
 
536
  plugins: {
537
  legend: { display: false },
538
  tooltip: {
539
- backgroundColor: 'rgba(15,15,18,0.96)',
540
- borderColor: 'rgba(220,220,224,0.22)',
541
  borderWidth: 1,
542
  titleColor: '#ffffff',
543
- bodyColor: '#cfcfd5',
544
  padding: 12,
545
  displayColors: false,
546
  callbacks: {
547
  title: (items) => items[0]?.raw?.name || '',
548
  label: (item) => {
549
  const d = item.raw;
550
- const y = d.y;
551
  const pred = slope * d.x + intercept;
552
- const resid = y - pred;
553
  return [
554
  `Params: ${formatParams(d.params)} (${d.params.toLocaleString()})`,
555
- `Score: ${y.toFixed(2)}%`,
556
  `Residual: ${resid >= 0 ? '+' : ''}${resid.toFixed(2)} pts`,
557
  `Prediction: ${pred.toFixed(2)}%`
558
  ];
@@ -567,13 +575,13 @@
567
  max: xHigh,
568
  grid: { color: 'rgba(255,255,255,0.045)' },
569
  ticks: {
570
- color: '#7d7d87',
571
  callback: v => `10^${Number(v).toFixed(1)}`
572
  },
573
  title: {
574
  display: true,
575
  text: 'Log₁₀(parameters)',
576
- color: '#7d7d87',
577
  font: { weight: '600' }
578
  }
579
  },
@@ -582,13 +590,13 @@
582
  max: yMax,
583
  grid: { color: 'rgba(255,255,255,0.045)' },
584
  ticks: {
585
- color: '#7d7d87',
586
- callback: v => `${v.toFixed(0)}%`
587
  },
588
  title: {
589
  display: true,
590
  text: 'Score (%)',
591
- color: '#7d7d87',
592
  font: { weight: '600' }
593
  }
594
  }
@@ -600,4 +608,4 @@
600
  render();
601
  </script>
602
  </body>
603
- </html>
 
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
 
 
26
  html { scroll-behavior: smooth; }
27
  body {
28
  margin: 0;
 
 
 
 
 
 
29
  min-height: 100vh;
30
  padding: 28px;
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 {
 
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
  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;
72
  margin-bottom: 10px;
73
  }
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 {
 
96
  align-items: start;
97
  }
98
 
99
+ .panel {
 
 
100
  border-radius: var(--radius);
101
+ padding: 18px;
102
+ position: sticky;
103
+ top: 18px;
104
  }
105
 
 
106
  .panel h2, .chart-card h2, .list-card h2 {
107
  margin: 0 0 14px;
108
  font-size: 14px;
 
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);
136
  padding: 10px 12px;
 
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
 
 
168
  padding: 14px;
169
  }
170
 
171
+ .stat .k {
172
+ color: var(--muted2);
173
+ font-size: 11px;
174
+ text-transform: uppercase;
175
+ letter-spacing: 0.12em;
176
+ }
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;
191
+ }
192
 
193
  .chart-card {
194
+ border-radius: var(--radius);
195
  padding: 16px 16px 10px;
196
  min-height: 640px;
197
  }
 
206
  }
207
 
208
  .chart-title {
209
+ margin: 0;
210
  font-size: 18px;
211
+ font-weight: 750;
212
  letter-spacing: -0.03em;
 
213
  }
214
 
215
  .chart-sub {
 
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;
 
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; }
 
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
 
 
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
 
 
318
  <div class="chart-top">
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>
 
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 = [
 
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;
 
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);
 
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 => `
 
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>
 
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) {
 
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
 
 
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();
 
509
  { x: xLow, y: yLow },
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,
 
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
  }
531
  ]
 
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];
541
+ if (hit.datasetIndex !== 1) return;
542
+ const item = chart.data.datasets[hit.datasetIndex].data[hit.index];
543
+ if (item?.url) window.open(item.url, '_blank', 'noopener,noreferrer');
544
+ },
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: {
556
  title: (items) => items[0]?.raw?.name || '',
557
  label: (item) => {
558
  const d = item.raw;
 
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
  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
  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
  }
 
608
  render();
609
  </script>
610
  </body>
611
+ </html>"}]}