Spaces:
Running
Running
GitHub Actions commited on
Commit ·
1f2eb31
1
Parent(s): 5047636
sync from abhijitramesh/webgpu-bench@a4fd7c1c6f
Browse files- css/style.css +19 -55
- data/combined.json +47 -7
- 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 |
-
/*
|
| 1212 |
-
|
| 1213 |
-
|
| 1214 |
-
|
| 1215 |
-
display: flex;
|
| 1216 |
align-items: center;
|
| 1217 |
-
gap:
|
| 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 |
-
.
|
| 1237 |
-
|
| 1238 |
-
|
| 1239 |
}
|
| 1240 |
-
|
| 1241 |
-
|
| 1242 |
-
|
|
|
|
| 1243 |
border-radius: 50%;
|
| 1244 |
-
display: block;
|
| 1245 |
object-fit: cover;
|
| 1246 |
background: var(--surface-3);
|
|
|
|
| 1247 |
}
|
| 1248 |
-
.
|
| 1249 |
background: linear-gradient(135deg, var(--signal-bg), var(--accent-violet-bg));
|
| 1250 |
}
|
| 1251 |
-
.
|
| 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:
|
| 11 |
-
"resultCount":
|
| 12 |
-
"passCount":
|
| 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:
|
| 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:
|
| 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>
|
| 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
|
| 276 |
-
|
| 277 |
-
|
| 278 |
-
|
| 279 |
-
|
| 280 |
-
|
| 281 |
-
|
| 282 |
-
|
| 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) {
|