GitHub Actions commited on
Commit
1f2eb31
·
1 Parent(s): 5047636

sync from abhijitramesh/webgpu-bench@a4fd7c1c6f

Browse files
Files changed (3) hide show
  1. css/style.css +19 -55
  2. data/combined.json +47 -7
  3. js/tables.js +19 -38
css/style.css CHANGED
@@ -1208,73 +1208,37 @@ a:hover { color: var(--info); }
1208
  border-bottom: 1px solid var(--border);
1209
  }
1210
 
1211
- /* Attribution rowstacked avatars + @username for the most-active
1212
- contributor. Sits between the header and the specs grid; collapses
1213
- cleanly when no contributors are known (older records). */
1214
- .machine-card-submitters {
1215
- display: flex;
1216
  align-items: center;
1217
- gap: 10px;
1218
- margin: -8px 0 14px;
1219
- font-family: var(--font-mono);
1220
- font-size: 11.5px;
1221
  color: var(--foreground-secondary);
1222
- min-width: 0;
1223
- }
1224
- .machine-card-submitter-pips {
1225
- display: inline-flex;
1226
- flex-shrink: 0;
1227
- }
1228
- .machine-card-submitter-pip {
1229
- display: inline-flex;
1230
- border-radius: 50%;
1231
- /* 2px ring against the card surface so overlapping circles read clearly. */
1232
- box-shadow: 0 0 0 2px var(--surface-1);
1233
- transition: transform var(--transition-fast);
1234
  text-decoration: none;
 
 
 
1235
  }
1236
- .machine-card-submitter-pip:hover {
1237
- transform: translateY(-1px);
1238
- z-index: 2;
1239
  }
1240
- .machine-card-submitter-avatar {
1241
- width: 22px;
1242
- height: 22px;
 
1243
  border-radius: 50%;
1244
- display: block;
1245
  object-fit: cover;
1246
  background: var(--surface-3);
 
1247
  }
1248
- .machine-card-submitter-avatar--placeholder {
1249
  background: linear-gradient(135deg, var(--signal-bg), var(--accent-violet-bg));
1250
  }
1251
- .machine-card-submitter-more {
1252
- display: inline-flex;
1253
- align-items: center;
1254
- justify-content: center;
1255
- margin-left: -8px;
1256
- width: 22px;
1257
- height: 22px;
1258
- border-radius: 50%;
1259
- background: var(--surface-3);
1260
- color: var(--foreground-secondary);
1261
- box-shadow: 0 0 0 2px var(--surface-1);
1262
- font-size: 10px;
1263
- font-weight: 600;
1264
- cursor: default;
1265
- }
1266
- .machine-card-submitter-name {
1267
  white-space: nowrap;
1268
- overflow: hidden;
1269
- text-overflow: ellipsis;
1270
- color: var(--foreground);
1271
- font-weight: 500;
1272
- min-width: 0;
1273
- }
1274
- .machine-card-submitter-others {
1275
- color: var(--foreground-muted);
1276
- font-weight: 400;
1277
- margin-left: 4px;
1278
  }
1279
  .machine-card-header h3 {
1280
  font-size: 14px;
 
1208
  border-bottom: 1px solid var(--border);
1209
  }
1210
 
1211
+ /* Submitter cell in the Results table small avatar + @username link.
1212
+ Inline so the column hugs its content rather than stretching. */
1213
+ .submitter-link {
1214
+ display: inline-flex;
 
1215
  align-items: center;
1216
+ gap: 6px;
 
 
 
1217
  color: var(--foreground-secondary);
 
 
 
 
 
 
 
 
 
 
 
 
1218
  text-decoration: none;
1219
+ font-family: var(--font-mono);
1220
+ font-size: 12px;
1221
+ transition: color var(--transition-fast);
1222
  }
1223
+ .submitter-link:hover {
1224
+ color: var(--signal-strong);
1225
+ text-decoration: none;
1226
  }
1227
+ [data-theme="dark"] .submitter-link:hover { color: var(--signal); }
1228
+ .submitter-avatar {
1229
+ width: 18px;
1230
+ height: 18px;
1231
  border-radius: 50%;
1232
+ display: inline-block;
1233
  object-fit: cover;
1234
  background: var(--surface-3);
1235
+ flex-shrink: 0;
1236
  }
1237
+ .submitter-avatar--placeholder {
1238
  background: linear-gradient(135deg, var(--signal-bg), var(--accent-violet-bg));
1239
  }
1240
+ .submitter-name {
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1241
  white-space: nowrap;
 
 
 
 
 
 
 
 
 
 
1242
  }
1243
  .machine-card-header h3 {
1244
  font-size: 14px;
data/combined.json CHANGED
@@ -7,11 +7,19 @@
7
  "platform": "darwin",
8
  "arch": "arm",
9
  "totalMemoryGB": 4,
10
- "submittedAt": "2026-04-25T04:41:33.272Z",
11
- "resultCount": 3,
12
- "passCount": 3,
13
  "llamaCppCommit": null,
14
- "submitters": []
 
 
 
 
 
 
 
 
15
  },
16
  {
17
  "slug": "apple-metal-3-8gb-darwin",
@@ -19,7 +27,7 @@
19
  "platform": "darwin",
20
  "arch": "arm",
21
  "totalMemoryGB": 8,
22
- "submittedAt": "2026-04-25T04:41:33.272Z",
23
  "resultCount": 1,
24
  "passCount": 1,
25
  "llamaCppCommit": null,
@@ -27,12 +35,13 @@
27
  }
28
  ],
29
  "models": [
30
- "Llama-3.2-1B-Instruct"
 
31
  ],
32
  "browsers": [
33
  "chromium-147"
34
  ],
35
- "generatedAt": "2026-04-25T04:41:33.327Z"
36
  },
37
  "results": [
38
  {
@@ -116,6 +125,37 @@
116
  "submittedBy": null,
117
  "iterations": 5
118
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
119
  {
120
  "machineSlug": "apple-metal-3-8gb-darwin",
121
  "timestamp": "2026-04-24T07:21:54.498Z",
 
7
  "platform": "darwin",
8
  "arch": "arm",
9
  "totalMemoryGB": 4,
10
+ "submittedAt": "2026-04-25T04:56:50.572Z",
11
+ "resultCount": 4,
12
+ "passCount": 4,
13
  "llamaCppCommit": null,
14
+ "submitters": [
15
+ {
16
+ "name": "abhijitramesh",
17
+ "hubId": null,
18
+ "avatarUrl": null,
19
+ "count": 1,
20
+ "latestAt": "2026-04-25T04:50:36.488Z"
21
+ }
22
+ ]
23
  },
24
  {
25
  "slug": "apple-metal-3-8gb-darwin",
 
27
  "platform": "darwin",
28
  "arch": "arm",
29
  "totalMemoryGB": 8,
30
+ "submittedAt": "2026-04-25T04:56:50.572Z",
31
  "resultCount": 1,
32
  "passCount": 1,
33
  "llamaCppCommit": null,
 
35
  }
36
  ],
37
  "models": [
38
+ "Llama-3.2-1B-Instruct",
39
+ "Qwen3.5-2B"
40
  ],
41
  "browsers": [
42
  "chromium-147"
43
  ],
44
+ "generatedAt": "2026-04-25T04:56:50.620Z"
45
  },
46
  "results": [
47
  {
 
125
  "submittedBy": null,
126
  "iterations": 5
127
  },
128
+ {
129
+ "machineSlug": "apple-metal-3-4gb-darwin",
130
+ "timestamp": "2026-04-25T04:50:36.488Z",
131
+ "browser": "chromium-147",
132
+ "model": "Qwen3.5-2B",
133
+ "repo": "unsloth/Qwen3.5-2B-GGUF",
134
+ "variant": "IQ4_XS",
135
+ "filename": "Qwen3.5-2B-IQ4_XS.gguf",
136
+ "sizeMB": 1118.66,
137
+ "status": "done",
138
+ "error": null,
139
+ "buildType": "jspi",
140
+ "webgpuAvailable": true,
141
+ "nGpuLayers": 999,
142
+ "wallTimeMs": 137132.30000001192,
143
+ "prefill_tok_s": 61.42,
144
+ "decode_tok_s": 28.23,
145
+ "n_p_eval": 30,
146
+ "t_p_eval_ms": 1043.3,
147
+ "n_eval": 127,
148
+ "t_eval_ms": 4552.3,
149
+ "consistency_rate": 0.9922,
150
+ "consistency_first_disagree": 33,
151
+ "llamaCppCommit": null,
152
+ "submittedBy": {
153
+ "name": "abhijitramesh",
154
+ "hubId": null,
155
+ "avatarUrl": null
156
+ },
157
+ "iterations": 5
158
+ },
159
  {
160
  "machineSlug": "apple-metal-3-8gb-darwin",
161
  "timestamp": "2026-04-24T07:21:54.498Z",
js/tables.js CHANGED
@@ -12,6 +12,12 @@ function sortResults(results, key, dir) {
12
  const isNum = NUM_KEYS.has(key);
13
  return [...results].sort((a, b) => {
14
  let va = a[key], vb = b[key];
 
 
 
 
 
 
15
  if (va == null && vb == null) return 0;
16
  if (va == null) return 1;
17
  if (vb == null) return -1;
@@ -62,6 +68,7 @@ export function renderResultsTable(results) {
62
  { key: 'variant', label: 'Quant', priority: 1 },
63
  { key: 'sizeMB', label: 'Size (MB)', priority: 3 },
64
  { key: 'browser', label: 'Browser', priority: 2 },
 
65
  { key: 'nGpuLayers', label: 'Backend', priority: 2 },
66
  { key: 'status', label: 'Status', priority: 1 },
67
  { key: 'buildType', label: 'Build', priority: 3 },
@@ -139,6 +146,9 @@ export function renderResultsTable(results) {
139
  html += '<span class="text-muted">\u2014</span>';
140
  }
141
  break;
 
 
 
142
  case 'llamaCppCommit':
143
  if (r.llamaCppCommit) {
144
  const short = r.llamaCppCommit.slice(0, 10);
@@ -233,23 +243,15 @@ export function renderMachineInfo(machines) {
233
  return;
234
  }
235
 
236
- // Show up to this many avatars before collapsing the rest into "+N".
237
- // Three keeps the row visually balanced with the card width on mobile.
238
- const MAX_VISIBLE_SUBMITTERS = 3;
239
-
240
  let html = '<div class="machine-grid">';
241
  for (const m of machines) {
242
  const failCount = m.resultCount - m.passCount;
243
- const submitters = Array.isArray(m.submitters) ? m.submitters : [];
244
- const submitterRow = submitters.length > 0
245
- ? renderSubmitterStack(submitters, MAX_VISIBLE_SUBMITTERS)
246
- : '';
247
  html += `
248
  <div class="machine-card">
249
  <div class="machine-card-header">
250
  <svg class="machine-card-icon" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><rect x="2" y="2" width="20" height="8" rx="2" ry="2"/><rect x="2" y="14" width="20" height="8" rx="2" ry="2"/><line x1="6" y1="6" x2="6.01" y2="6"/><line x1="6" y1="18" x2="6.01" y2="18"/></svg>
251
  <h3>${escapeHtml(m.cpus)}</h3>
252
- </div>${submitterRow}
253
  <div class="machine-card-specs">
254
  <div class="spec-row"><span class="spec-label">Platform</span><span class="spec-value">${m.platform}</span></div>
255
  <div class="spec-row"><span class="spec-label">Arch</span><span class="spec-value">${m.arch}</span></div>
@@ -272,35 +274,14 @@ function escapeHtml(str) {
272
  return div.innerHTML;
273
  }
274
 
275
- /* Render a stack of contributor avatars on a machine card. The first avatar
276
- doubles as a profile link with the @username next to it; additional
277
- contributors stack as overlapping circles, with any over MAX_VISIBLE
278
- collapsing to a "+N" chip. The full list is preserved in the title
279
- attribute as a tooltip. */
280
- function renderSubmitterStack(submitters, maxVisible) {
281
- const visible = submitters.slice(0, maxVisible);
282
- const overflow = submitters.length - visible.length;
283
- const fullList = submitters.map(s => `@${s.name}${s.count ? ` (${s.count})` : ''}`).join(', ');
284
- const lead = visible[0];
285
-
286
- const avatarStack = visible.map((s, i) => {
287
- const offset = i * -8; // overlap by 8px
288
- const img = s.avatarUrl
289
- ? `<img class="machine-card-submitter-avatar" src="${escapeHtml(s.avatarUrl)}" alt="" width="22" height="22" loading="lazy">`
290
- : '<span class="machine-card-submitter-avatar machine-card-submitter-avatar--placeholder" aria-hidden="true"></span>';
291
- return `<a href="https://huggingface.co/${escapeHtml(s.name)}" target="_blank" rel="noopener" class="machine-card-submitter-pip" style="margin-left: ${offset}px;" title="@${escapeHtml(s.name)}${s.count ? ` · ${s.count} submissions` : ''}">${img}</a>`;
292
- }).join('');
293
-
294
- const overflowChip = overflow > 0
295
- ? `<span class="machine-card-submitter-more" title="${escapeHtml(fullList)}">+${overflow}</span>`
296
- : '';
297
- const leadName = `<span class="machine-card-submitter-name">@${escapeHtml(lead.name)}${overflow > 0 || submitters.length > 1 ? ` <span class="machine-card-submitter-others">+${submitters.length - 1} other${submitters.length - 1 === 1 ? '' : 's'}</span>` : ''}</span>`;
298
-
299
- return `
300
- <div class="machine-card-submitters" title="${escapeHtml(fullList)}">
301
- <div class="machine-card-submitter-pips">${avatarStack}${overflowChip}</div>
302
- ${leadName}
303
- </div>`;
304
  }
305
 
306
  export function renderCpuGpuTable(results) {
 
12
  const isNum = NUM_KEYS.has(key);
13
  return [...results].sort((a, b) => {
14
  let va = a[key], vb = b[key];
15
+ // Submitter is an object — collapse to its name for comparison and let
16
+ // the null-handling below treat unattributed rows as the lowest.
17
+ if (key === 'submittedBy') {
18
+ va = va?.name || null;
19
+ vb = vb?.name || null;
20
+ }
21
  if (va == null && vb == null) return 0;
22
  if (va == null) return 1;
23
  if (vb == null) return -1;
 
68
  { key: 'variant', label: 'Quant', priority: 1 },
69
  { key: 'sizeMB', label: 'Size (MB)', priority: 3 },
70
  { key: 'browser', label: 'Browser', priority: 2 },
71
+ { key: 'submittedBy', label: 'Submitter', priority: 2 },
72
  { key: 'nGpuLayers', label: 'Backend', priority: 2 },
73
  { key: 'status', label: 'Status', priority: 1 },
74
  { key: 'buildType', label: 'Build', priority: 3 },
 
146
  html += '<span class="text-muted">\u2014</span>';
147
  }
148
  break;
149
+ case 'submittedBy':
150
+ html += renderSubmitterCell(r.submittedBy);
151
+ break;
152
  case 'llamaCppCommit':
153
  if (r.llamaCppCommit) {
154
  const short = r.llamaCppCommit.slice(0, 10);
 
243
  return;
244
  }
245
 
 
 
 
 
246
  let html = '<div class="machine-grid">';
247
  for (const m of machines) {
248
  const failCount = m.resultCount - m.passCount;
 
 
 
 
249
  html += `
250
  <div class="machine-card">
251
  <div class="machine-card-header">
252
  <svg class="machine-card-icon" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><rect x="2" y="2" width="20" height="8" rx="2" ry="2"/><rect x="2" y="14" width="20" height="8" rx="2" ry="2"/><line x1="6" y1="6" x2="6.01" y2="6"/><line x1="6" y1="18" x2="6.01" y2="18"/></svg>
253
  <h3>${escapeHtml(m.cpus)}</h3>
254
+ </div>
255
  <div class="machine-card-specs">
256
  <div class="spec-row"><span class="spec-label">Platform</span><span class="spec-value">${m.platform}</span></div>
257
  <div class="spec-row"><span class="spec-label">Arch</span><span class="spec-value">${m.arch}</span></div>
 
274
  return div.innerHTML;
275
  }
276
 
277
+ /* Render a single submitter's avatar + @username link for the Results
278
+ table column. Falls back to an em-dash if attribution is unknown. */
279
+ function renderSubmitterCell(sb) {
280
+ if (!sb?.name) return '<span class="text-muted">\u2014</span>';
281
+ const avatar = sb.avatarUrl
282
+ ? `<img class="submitter-avatar" src="${escapeHtml(sb.avatarUrl)}" alt="" width="18" height="18" loading="lazy">`
283
+ : '<span class="submitter-avatar submitter-avatar--placeholder" aria-hidden="true"></span>';
284
+ return `<a class="submitter-link" href="https://huggingface.co/${escapeHtml(sb.name)}" target="_blank" rel="noopener" title="View @${escapeHtml(sb.name)} on Hugging Face">${avatar}<span class="submitter-name">@${escapeHtml(sb.name)}</span></a>`;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
285
  }
286
 
287
  export function renderCpuGpuTable(results) {