Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 16 additions & 0 deletions leaderboard/generate.py
Original file line number Diff line number Diff line change
Expand Up @@ -617,6 +617,22 @@ def _offline_reliability(rows):
"runtime_metrics": rm if rm else None,
}

if suite == "suite_H":
rows = _offline_rows()
return {
"type": "suite_H",
"offline": {
"labels": _concurrency_labels(rows),
"throughput": [r.get("throughput_tokens_per_sec") for r in rows],
"memory_gb": [r.get("peak_memory_gb") for r in rows],
"throughput_reliability": _offline_reliability(rows),
},
"online": _online_block(),
"interactive": _interactive_block(),
"sustained": _sustained_block(),
"burst": _burst_block(),
}

if metrics.get("sustained"):
sustained = metrics.get("sustained", {})
samples = sustained.get("samples", [])
Expand Down
2 changes: 2 additions & 0 deletions leaderboard/site/assets/css/base.css
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,7 @@
--suite-E: #16a34a; /* emerald — Scaling efficiency */
--suite-F: #db2777; /* rose — Edge / low-power */
--suite-G: #6366f1; /* indigo — Sustained load */
--suite-H: #f59e0b; /* amber — Sliding Window Attention */

/* Vendor colour table now lives in data.js (`VENDOR_COLORS`) and is
* injected at runtime as `[data-vendor="<name>"] { --vendor-color: ... }`
Expand Down Expand Up @@ -113,6 +114,7 @@
--suite-E: #15803d;
--suite-F: #be185d;
--suite-G: #4338ca;
--suite-H: #d97706;

--shadow-card: 0 1px 2px rgba(15, 23, 42, 0.05), 0 1px 3px rgba(15, 23, 42, 0.04);
--shadow-lift: 0 8px 24px -10px rgba(15, 23, 42, 0.14);
Expand Down
5 changes: 5 additions & 0 deletions leaderboard/site/assets/css/chip-detail.css
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,7 @@
.chip-suite-card[data-suite="E"] { --suite-color: var(--suite-E); }
.chip-suite-card[data-suite="F"] { --suite-color: var(--suite-F); }
.chip-suite-card[data-suite="G"] { --suite-color: var(--suite-G); }
.chip-suite-card[data-suite="H"] { --suite-color: var(--suite-H); }

a.chip-suite-card { cursor: pointer; }
a.chip-suite-card:hover {
Expand Down Expand Up @@ -287,6 +288,7 @@ a.chip-suite-card:hover .chip-suite-hint {
.chip-fp-row[data-suite="E"] { --suite-color: var(--suite-E); }
.chip-fp-row[data-suite="F"] { --suite-color: var(--suite-F); }
.chip-fp-row[data-suite="G"] { --suite-color: var(--suite-G); }
.chip-fp-row[data-suite="H"] { --suite-color: var(--suite-H); }
.chip-fp-letter {
width: 22px;
height: 22px;
Expand Down Expand Up @@ -404,6 +406,7 @@ a.chip-suite-card:hover .chip-suite-hint {
.chip-scl-row[data-suite="E"] { --suite-color: var(--suite-E); }
.chip-scl-row[data-suite="F"] { --suite-color: var(--suite-F); }
.chip-scl-row[data-suite="G"] { --suite-color: var(--suite-G); }
.chip-scl-row[data-suite="H"] { --suite-color: var(--suite-H); }
.chip-scl-row-letter {
width: 22px;
height: 22px;
Expand Down Expand Up @@ -501,6 +504,7 @@ a.chip-suite-card:hover .chip-suite-hint {
.chip-runs tbody tr[data-suite="E"] { --suite-color: var(--suite-E); }
.chip-runs tbody tr[data-suite="F"] { --suite-color: var(--suite-F); }
.chip-runs tbody tr[data-suite="G"] { --suite-color: var(--suite-G); }
.chip-runs tbody tr[data-suite="H"] { --suite-color: var(--suite-H); }

.chip-runs-suite {
display: inline-flex;
Expand Down Expand Up @@ -645,6 +649,7 @@ a.chip-suite-card:hover .chip-suite-hint {
.chip-peer-suite[data-suite="E"] { --suite-color: var(--suite-E); }
.chip-peer-suite[data-suite="F"] { --suite-color: var(--suite-F); }
.chip-peer-suite[data-suite="G"] { --suite-color: var(--suite-G); }
.chip-peer-suite[data-suite="H"] { --suite-color: var(--suite-H); }
.chip-peer-runs { font-variant-numeric: tabular-nums; white-space: nowrap; }

/* ── Responsive ───────────────────────────────────────────── */
Expand Down
1 change: 1 addition & 0 deletions leaderboard/site/assets/css/home.css
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
.suite-card[data-suite="E"], .lb-row[data-suite="E"], .vendor-suite-pill[data-suite="E"] { --suite-color: var(--suite-E); }
.suite-card[data-suite="F"], .lb-row[data-suite="F"], .vendor-suite-pill[data-suite="F"] { --suite-color: var(--suite-F); }
.suite-card[data-suite="G"], .lb-row[data-suite="G"], .vendor-suite-pill[data-suite="G"] { --suite-color: var(--suite-G); }
.suite-card[data-suite="H"], .lb-row[data-suite="H"], .vendor-suite-pill[data-suite="H"] { --suite-color: var(--suite-H); }

/* Default fallback color */
.suite-card,
Expand Down
1 change: 1 addition & 0 deletions leaderboard/site/assets/css/modal.css
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
.modal-shell[data-suite="E"] { --suite-color: var(--suite-E); }
.modal-shell[data-suite="F"] { --suite-color: var(--suite-F); }
.modal-shell[data-suite="G"] { --suite-color: var(--suite-G); }
.modal-shell[data-suite="H"] { --suite-color: var(--suite-H); }
.modal-shell { --suite-color: var(--accent-2); }

/* ── Backdrop ──────────────────────────────────────────────── */
Expand Down
2 changes: 2 additions & 0 deletions leaderboard/site/assets/css/rankings.css
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
.rk-hero[data-suite="E"], .data-table[data-suite="E"], .rk-chip-focus[data-suite="E"] { --suite-color: var(--suite-E); }
.rk-hero[data-suite="F"], .data-table[data-suite="F"], .rk-chip-focus[data-suite="F"] { --suite-color: var(--suite-F); }
.rk-hero[data-suite="G"], .data-table[data-suite="G"], .rk-chip-focus[data-suite="G"] { --suite-color: var(--suite-G); }
.rk-hero[data-suite="H"], .data-table[data-suite="H"], .rk-chip-focus[data-suite="H"] { --suite-color: var(--suite-H); }

.rk-suite-pill[data-suite="suite_A"] { --suite-color: var(--suite-A); }
.rk-suite-pill[data-suite="suite_B"] { --suite-color: var(--suite-B); }
Expand Down Expand Up @@ -803,6 +804,7 @@
.cmp-table[data-suite="E"] { --suite-color: var(--suite-E); }
.cmp-table[data-suite="F"] { --suite-color: var(--suite-F); }
.cmp-table[data-suite="G"] { --suite-color: var(--suite-G); }
.cmp-table[data-suite="H"] { --suite-color: var(--suite-H); }

.cmp-table thead th {
background: var(--bg-elev);
Expand Down
4 changes: 4 additions & 0 deletions leaderboard/site/assets/css/suites.css
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,10 @@
.inversion-card[data-suite="G"],
.scn-card .scn-suite-letter[data-suite="G"],
.rfl-dot[data-suite="G"] { --suite-color: var(--suite-G); }
.suite-spec[data-suite="H"],
.inversion-card[data-suite="H"],
.scn-card .scn-suite-letter[data-suite="H"],
.rfl-dot[data-suite="H"] { --suite-color: var(--suite-H); }
.suite-spec,
.inversion-card,
.scn-card .scn-suite-letter,
Expand Down
33 changes: 33 additions & 0 deletions leaderboard/site/assets/data/suite-meta.js
Original file line number Diff line number Diff line change
Expand Up @@ -234,4 +234,37 @@ export const SUITE_META = {
metric: { key: "sustained_throughput", label: "sustained throughput", direction: "desc", unit: "tokens/sec" } },
],
},
suite_H: {
letter: "H",
chartPurpose: "Sliding Window Attention (SWA)",
title: "Sliding Window Attention (SWA)",
tagline: "Long context, capped KV cache — architecture-driven intensity shift.",
description:
"SWA as the architectural variable. Mistral-7B runs every layer with a sliding window (4,096 tokens), so at 10K-context prompts the KV cache is bounded by the window rather than the sequence length — moving long-context decode off the KV-capacity cliff. Frameworks vary in whether they honor SWA-aware KV allocation, which makes the suite a check on how much of the theoretical memory win the software stack actually delivers.",
primary: { key: "offline_throughput", label: "tokens/sec", direction: "desc", unit: "tokens/sec" },
workload: {
model: "mistralai/Mistral-7B-Instruct-v0.1",
chips: "1",
precision: "BF16",
dataset: "sharegpt_swa_v1",
inputTokens: "~10K",
outputTokens: "~256",
},
scenarios: [
{ name: "accuracy", isExtra: false,
desc: "MMLU gate against the Mistral-7B baseline." },
{ name: "offline", isExtra: false,
desc: "Throughput at 10K-token prompts (window = 4,096), where SWA bounds KV growth.",
metric: { key: "offline_throughput", label: "tokens/sec", direction: "desc", unit: "tokens/sec" } },
{ name: "online", isExtra: false,
desc: "Max QPS under the 500 ms p99 TTFT SLA on long-context SWA serving.",
metric: { key: "online_max_qps", label: "queries/sec", direction: "desc", unit: "queries/sec" } },
{ name: "interactive", isExtra: true,
desc: "Single-stream TTFT at 10K-context prefill." },
{ name: "sustained", isExtra: true,
desc: "30 min sustained SWA load." },
{ name: "burst", isExtra: true,
desc: "Burst tolerance on long-context KV pressure." },
],
},
};
7 changes: 6 additions & 1 deletion leaderboard/site/assets/js/data.js
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,7 @@ export function formatPrimary(value, suiteId) {
return p.unit ? `${num} ${p.unit}` : num;
}

export const SUITE_ORDER = ["suite_A", "suite_B", "suite_C", "suite_D", "suite_E", "suite_F", "suite_G"];
export const SUITE_ORDER = ["suite_A", "suite_B", "suite_C", "suite_D", "suite_E", "suite_F", "suite_G", "suite_H"];

/** Line 1 for charts: "Suite A" */
export function suiteChartHead(suiteId) {
Expand Down Expand Up @@ -207,6 +207,11 @@ export const SUITE_COLUMNS = {
{ key: "sustained_throughput", label: "Sustained", unit: "tok/s", direction: "desc", primary: true },
{ key: "offline_throughput", label: "Offline", unit: "tok/s", direction: "desc" },
],
suite_H: [
{ key: "offline_throughput", label: "Offline", unit: "tok/s", direction: "desc", primary: true },
{ key: "online_max_qps", label: "Online QPS", unit: "qps", direction: "desc" },
{ key: "interactive_ttft_p99", label: "TTFT p99", unit: "ms", direction: "asc", decimals: 0 },
],
};

// Format a numeric value against a column spec. Returns null for
Expand Down
2 changes: 1 addition & 1 deletion leaderboard/site/assets/js/hardware-catalog.js
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ export const CHIPS_BY_VENDOR = {
{ name: "H800 80GB", memoryGb: 80, tier: "datacenter", suites: ["suite_A", "suite_B"] },
{ name: "A100 80GB", memoryGb: 80, tier: "datacenter", suites: ["suite_A", "suite_B"] },
{ name: "A100 40GB", memoryGb: 40, tier: "datacenter", suites: ["suite_A"] },
{ name: "A800 80GB", memoryGb: 80, tier: "datacenter", suites: ["suite_A"] },
{ name: "A800 80GB", memoryGb: 80, tier: "datacenter", suites: ["suite_A", "suite_H"] },
{ name: "L40S", memoryGb: 48, tier: "datacenter", badge: "Cost-efficient inference", suites: ["suite_A", "suite_F"] },
{ name: "L4", memoryGb: 24, tier: "datacenter", badge: "Edge inference", suites: ["suite_F"] },
{ name: "A10", memoryGb: 24, tier: "datacenter", suites: ["suite_F"] },
Expand Down
24 changes: 23 additions & 1 deletion leaderboard/site/assets/js/modal.js
Original file line number Diff line number Diff line change
Expand Up @@ -887,6 +887,7 @@ function _renderViz(row, panel) {
case "suite_E": _renderSuiteE (panel, row, viz); break;
case "suite_F": _renderSuiteAB(panel, row, viz, "purple"); break;
case "suite_G": _renderSuiteG (panel, row, viz); break;
case "suite_H": _renderSuiteH (panel, row, viz); break;
case "sustained": _renderSustained(panel, row, viz); break;
default:
panel.innerHTML = `<div class="viz-empty">Visualization for type "${esc(viz.type || "unknown")}" is not yet supported.</div>`;
Expand Down Expand Up @@ -1035,7 +1036,9 @@ function _fmtKMs(v) {
// Used for suite_A and suite_F (just changes the accent color).
function _renderSuiteAB(el, row, viz, accent) {
const C = chartColors();
const accentHex = accent === "purple" ? C.purple : C.blue;
const accentHex = accent === "purple" ? C.purple
: accent === "amber" ? C.amber
: C.blue;

if (viz.offline && viz.offline.labels && viz.offline.labels.length) {
el.appendChild(_section("Offline — throughput by concurrency"));
Expand Down Expand Up @@ -1486,6 +1489,25 @@ function _renderSuiteG(el, row, viz) {
}
}

function _renderSuiteH(el, row, viz) {
// SWA long-context suite: reuse the single-chip AB layout
// (offline / online / interactive / burst), then surface the
// sliding-window angle explicitly.
_renderSuiteAB(el, row, viz, "amber");

el.appendChild(_section("Sliding Window Attention"));
el.appendChild(_statChips([
{ label: "Window size", value: "4,096 tokens" },
{ label: "Prompt length", value: row.offline_throughput != null ? "10K tokens" : null },
{ label: "KV cache bound", value: "window, not context" },
]));
el.appendChild(document.createElement("p").appendChild(
document.createTextNode(
"Mistral-7B applies a 4,096-token sliding window on every layer, so at 10K-context prompts the KV cache is capped by the window. Whether a framework actually honors SWA-aware KV allocation determines how much of that memory win shows up in the concurrency ceiling."
)
).parentNode);
}

function _renderSustained(el, row, viz) {
const C = chartColors();
const dur = viz.duration_minutes != null ? viz.duration_minutes : "?";
Expand Down
2 changes: 1 addition & 1 deletion leaderboard/site/assets/js/views/home.js
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ const DIST_METRICS = {
speculative: {label:'Speculative Throughput',unit:'tok/s',get:function(s){var o=s.scenarios&&s.scenarios.speculative;return o&&o.is_valid?o.throughput:null;}},
};
const DIST_VCOLS = {'NVIDIA':'#1b7a3d','Huawei':'#c2410c','AMD':'#be185d','Google':'#1d4ed8','Apple':'#78716c','Moore Threads':'#7c3aed'};
const DIST_SUITES = ['suite_A','suite_B','suite_C','suite_D','suite_E','suite_F','suite_G'];
const DIST_SUITES = ['suite_A','suite_B','suite_C','suite_D','suite_E','suite_F','suite_G','suite_H'];
function distVc(v){return DIST_VCOLS[v]||'#7c3aed';}
function distFm(v){if(v===null||v===undefined)return'—';if(v>=10000)return(v/1000).toFixed(0)+'k';if(v>=1000)return(v/1000).toFixed(1)+'k';if(v>=1)return v.toFixed(1);return v.toFixed(4);}
function distHs(s){var h=5381;for(var i=0;i<s.length;i++){h=((h<<5)+h)+s.charCodeAt(i);h=h&h;}return Math.abs(h);}
Expand Down
2 changes: 1 addition & 1 deletion leaderboard/site/assets/js/views/rankings.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
// Page anatomy:
// • Compact hero with the active suite's eyebrow + title + tagline.
// • Sticky toolbar:
// row 1 — 7 suite filter pills (color-bound to --suite-X).
// row 1 — 8 suite filter pills (color-bound to --suite-X).
// row 2 — multi-select vendor / precision / framework facet pills,
// populated from the rows in the active suite (filters that
// would empty the set get hidden, not greyed).
Expand Down
33 changes: 26 additions & 7 deletions leaderboard/site/assets/js/views/suites.js
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,16 @@ const SUITE_FINDINGS = {
"17% on Suite G; its 4,000 GB/s aggregate bandwidth pays off more " +
"than its compute.",
},
suite_H: {
headline: "SWA's memory win depends on the software stack",
body:
"Mistral-7B's 4,096-token sliding window caps KV-cache growth at 10K " +
"context, but only if the serving framework honors SWA-aware KV " +
"allocation. vLLM 0.7.3 applies the window in attention while sizing " +
"the KV cache as if it were full attention — the theoretical memory " +
"advantage never reaches the concurrency ceiling. Suite H makes the " +
"architecture-to-software gap measurable.",
},
};

// Three cross-suite ranking inversions distilled from the paper.
Expand Down Expand Up @@ -125,7 +135,7 @@ const SCENARIO_CATALOG = [
{ k: "Threshold", v: "Suite-specific baseline" },
{ k: "Cost", v: "~5 min / chip" },
],
appliesTo: { default: ["A", "B", "C", "D", "F", "G"], extra: [] },
appliesTo: { default: ["A", "B", "C", "D", "F", "G", "H"], extra: [] },
},
{
name: "offline",
Expand All @@ -139,7 +149,7 @@ const SCENARIO_CATALOG = [
{ k: "Concurrency", v: "Unbounded (vendor-tuned)" },
{ k: "Cost", v: "~10 to 15 min / chip" },
],
appliesTo: { default: ["A", "B", "C", "D", "E", "F", "G"], extra: [] },
appliesTo: { default: ["A", "B", "C", "D", "E", "F", "G", "H"], extra: [] },
},
{
name: "online",
Expand All @@ -153,7 +163,7 @@ const SCENARIO_CATALOG = [
{ k: "SLA", v: "p99 TTFT ≤ 500 ms" },
{ k: "Arrivals", v: "Poisson, vendor sweep" },
],
appliesTo: { default: ["A", "B", "F", "G"], extra: ["C", "D"] },
appliesTo: { default: ["A", "B", "F", "G", "H"], extra: ["C", "D"] },
},
{
name: "interactive",
Expand All @@ -167,7 +177,7 @@ const SCENARIO_CATALOG = [
{ k: "Concurrency", v: "1 stream" },
{ k: "Streams", v: "Many short conversations" },
],
appliesTo: { default: ["F"], extra: ["A", "B", "D", "G"] },
appliesTo: { default: ["F"], extra: ["A", "B", "D", "G", "H"] },
},
{
name: "sustained",
Expand All @@ -181,7 +191,7 @@ const SCENARIO_CATALOG = [
{ k: "Duration", v: "15 to 30 minutes" },
{ k: "Load", v: "Fixed concurrency" },
],
appliesTo: { default: [], extra: ["A", "B", "C", "D", "F", "G"] },
appliesTo: { default: [], extra: ["A", "B", "C", "D", "F", "G", "H"] },
},
{
name: "speculative",
Expand Down Expand Up @@ -209,7 +219,7 @@ const SCENARIO_CATALOG = [
{ k: "Burst", v: "5× steady traffic" },
{ k: "Window", v: "Short pulses + recovery" },
],
appliesTo: { default: [], extra: ["A", "B"] },
appliesTo: { default: [], extra: ["A", "B", "H"] },
},
];

Expand Down Expand Up @@ -238,6 +248,14 @@ const DATASETS = [
outputP50: "~150 tok",
notes: "Short single-turn prompts; keeps the edge suite bandwidth-isolated.",
},
{
name: "sharegpt_swa_v1",
used: "H",
prompts: "100",
inputP50: "~10,000 tok",
outputP50: "≤256 tok",
notes: "Tail 10K tokens of long dialogues — long enough to exceed the 4,096-token SWA window and trigger windowed attention.",
},
];

// Tiny SVG icons keyed by scenario.icon — drawn with currentColor so they
Expand Down Expand Up @@ -297,7 +315,7 @@ const SCN_ICONS = {
</svg>`,
};

// Roofline mini-diagram. Coordinates are hand-tuned so the seven dots
// Roofline mini-diagram. Coordinates are hand-tuned so the eight dots
// land at roughly the right region of the spectrum for each suite.
const ROOFLINE_POINTS = [
{ letter: "F", x: 68, y: 168, label: "right" }, // far left, bandwidth-bound, smallest model
Expand All @@ -306,6 +324,7 @@ const ROOFLINE_POINTS = [
{ letter: "B", x: 138, y: 96, label: "left" }, // 70B multi-chip
{ letter: "C", x: 168, y: 68, label: "left" }, // quantization, transition
{ letter: "E", x: 192, y: 56, label: "right" }, // scaling, near the knee
{ letter: "H", x: 220, y: 62, label: "right" }, // SWA long-context, KV capped
{ letter: "D", x: 268, y: 56, label: "left" }, // compute-bound long context
];

Expand Down
Loading