PRISM-project-Evaluation-functional-request / benchmark_quality_performance-EN.html
flaviojoshua's picture
Upload 5 files
d10c26e verified
Raw History Blame Contribute Delete
61.8 kB
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Benchmark AI — Tutti i modelli V3</title>
<!-- Google tag (gtag.js) -->
<script async src="https://www.googletagmanager.com/gtag/js?id=G-HMZQ3QVL91"></script>
<script>
window.dataLayer = window.dataLayer || [];
function gtag(){dataLayer.push(arguments);}
gtag('js', new Date());
gtag('config', 'G-HMZQ3QVL91');
</script>
<style>
/* Il foglio stile è incorporato per mantenere la pagina utilizzabile senza rete o build. */
:root {
color-scheme: dark;
--bg: #070a12;
--panel: #101521;
--panel-2: #151c2b;
--line: #2b3447;
--muted: #9aa6bd;
--text: #f5f7fb;
--accent: #a7f3d0;
--cyan: #67e8f9;
}
* { box-sizing: border-box; }
body {
margin: 0;
background:
radial-gradient(circle at 8% 0%, rgba(45, 212, 191, .12), transparent 30rem),
radial-gradient(circle at 95% 20%, rgba(59, 130, 246, .10), transparent 34rem),
var(--bg);
color: var(--text);
font: 15px/1.5 Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
}
.page { width: min(1440px, calc(100% - 32px)); margin: 0 auto; padding: 42px 0 64px; }
header { display: grid; grid-template-columns: 1fr auto; gap: 24px; align-items: end; margin-bottom: 28px; }
.eyebrow { margin: 0 0 8px; color: var(--accent); font-size: 12px; font-weight: 800; letter-spacing: .16em; text-transform: uppercase; }
h1 { max-width: 840px; margin: 0; font-size: clamp(32px, 5vw, 64px); line-height: 1.02; letter-spacing: -.045em; }
.subtitle { max-width: 760px; margin: 18px 0 0; color: var(--muted); font-size: 17px; }
.snapshot { padding: 10px 14px; border: 1px solid var(--line); border-radius: 999px; background: rgba(16,21,33,.78); color: var(--muted); white-space: nowrap; }
.metrics { display: grid; grid-template-columns: repeat(4, 1fr); gap: 12px; margin-bottom: 12px; }
.metric, .card { border: 1px solid var(--line); background: rgba(16,21,33,.9); box-shadow: 0 20px 60px rgba(0,0,0,.18); }
.metric { padding: 17px 20px; border-radius: 14px; }
.metric span { display: block; color: var(--muted); font-size: 12px; text-transform: uppercase; letter-spacing: .08em; }
.metric strong { display: block; margin-top: 4px; font-size: 24px; }
.card { border-radius: 18px; overflow: hidden; }
.toolbar { display: flex; flex-wrap: wrap; gap: 10px; padding: 16px 18px; border-bottom: 1px solid var(--line); background: rgba(21,28,43,.72); }
label { display: grid; gap: 5px; color: var(--muted); font-size: 11px; font-weight: 700; letter-spacing: .08em; text-transform: uppercase; }
select, button { min-height: 38px; border: 1px solid #38435a; border-radius: 9px; background: #0d121d; color: var(--text); font: inherit; }
select { min-width: 160px; padding: 0 34px 0 11px; }
button { align-self: end; padding: 0 14px; cursor: pointer; }
button:hover, select:focus { border-color: var(--cyan); outline: none; }
.chart-layout { display: grid; grid-template-columns: minmax(0, 1fr) 245px; min-height: 650px; }
.chart-wrap { position: relative; min-width: 0; padding: 16px; }
svg { display: block; width: 100%; height: 610px; overflow: visible; }
.grid-line { stroke: #222b3b; stroke-width: 1; }
.threshold-review { stroke: #f59e0b; stroke-width: 1.5; stroke-dasharray: 6 4; }
.threshold-automatic { stroke: #22c55e; stroke-width: 1.5; stroke-dasharray: 6 4; }
.threshold-label { font-size: 11px; font-weight: 700; }
.quality-below { color: #fb7185; font-weight: 800; }
.axis-line { stroke: #71809a; stroke-width: 1.2; }
.tick-label { fill: #95a2b8; font-size: 12px; }
.axis-title { fill: #e7ebf3; font-size: 13px; font-weight: 700; }
.point { cursor: pointer; stroke: rgba(255,255,255,.86); stroke-width: 1.5; transition: opacity .18s, filter .18s; }
.point:hover, .point:focus { filter: brightness(1.25) drop-shadow(0 0 7px currentColor); outline: none; }
.point-label { fill: #dce3ef; font-size: 11px; font-weight: 650; pointer-events: none; paint-order: stroke; stroke: #070a12; stroke-width: 3px; stroke-linejoin: round; }
.legend { padding: 22px 18px; border-left: 1px solid var(--line); background: rgba(10,14,23,.52); }
.legend h2 { margin: 0 0 16px; font-size: 15px; }
.legend-section { margin: 0 0 24px; }
.legend-title { margin: 0 0 9px; color: var(--muted); font-size: 11px; font-weight: 800; letter-spacing: .09em; text-transform: uppercase; }
.legend-row { display: flex; gap: 9px; align-items: center; margin: 8px 0; color: #d9e0ec; font-size: 13px; }
.swatch { width: 11px; height: 11px; border-radius: 50%; flex: 0 0 auto; }
.bubble { display: inline-block; border: 1.5px solid #d8e0ed; border-radius: 50%; background: rgba(148,163,184,.18); }
.bubble.small { width: 10px; height: 10px; }
.quality-stripes { width: 18px; height: 12px; border-radius: 3px; background: repeating-linear-gradient(135deg, transparent 0 4px, #ef4444 4px 6px, transparent 6px 10px); flex: 0 0 auto; }
.bubble.medium { width: 17px; height: 17px; }
.bubble.large { width: 24px; height: 24px; }
.shape { width: 14px; height: 14px; border: 2px solid #d8e0ed; background: transparent; }
.shape.round { border-radius: 50%; }
.shape.triangle { border: 0; background: #d8e0ed; clip-path: polygon(50% 0, 100% 100%, 0 100%); }
.tooltip { position: fixed; z-index: 10; width: min(360px, calc(100vw - 24px)); padding: 14px; border: 1px solid #47536b; border-radius: 12px; background: rgba(7,10,18,.97); box-shadow: 0 16px 50px rgba(0,0,0,.45); pointer-events: none; opacity: 0; transform: translateY(4px); transition: opacity .12s, transform .12s; }
.tooltip.visible { opacity: 1; transform: translateY(0); }
.tooltip strong { display: block; margin-bottom: 8px; font-size: 14px; overflow-wrap: anywhere; }
.tooltip-grid { display: grid; grid-template-columns: auto 1fr; gap: 4px 10px; color: var(--muted); font-size: 12px; }
.tooltip-grid b { color: #eef2f8; font-weight: 650; }
.note { margin-top: 14px; padding: 18px 20px; color: var(--muted); font-size: 13px; }
.note strong { color: var(--text); }
.empty { fill: var(--muted); font-size: 15px; text-anchor: middle; }
@media (max-width: 900px) {
header { grid-template-columns: 1fr; }
.snapshot { justify-self: start; }
.metrics { grid-template-columns: repeat(2, 1fr); }
.chart-layout { grid-template-columns: 1fr; }
.legend { border-top: 1px solid var(--line); border-left: 0; display: grid; grid-template-columns: repeat(2, 1fr); gap: 0 20px; }
}
@media (max-width: 560px) {
.page { width: min(100% - 18px, 1440px); padding-top: 24px; }
.metrics { grid-template-columns: 1fr; }
.chart-wrap { overflow-x: auto; }
svg { min-width: 700px; }
.legend { grid-template-columns: 1fr; }
}
/* Titolo PRISM con spaziatura ampia, come nella presentazione prism_motti_total_time.html */
.prism-mark { display:flex; gap:clamp(14px,3vw,36px); margin:0 0 14px; font-family:Georgia,"Times New Roman",serif; font-size:clamp(2.2rem,5vw,3.6rem); font-weight:400; line-height:1; letter-spacing:.2rem; color:#fff; }
</style>
</head>
<body>
<main class="page">
<nav aria-label="Pagine benchmark" style="display:flex;gap:10px;margin-bottom:22px">
<a href="benchmark_quality_performance-EN.html" style="color:var(--text)">Quality and throughput</a>
<a href="benchmark_quality_OpenAI_performance-EN.html" style="color:#fb7185">OpenAI quality</a>
<a href="benchmark_speed_performance-EN.html" style="color:var(--accent)">Completion times</a>
<a href="benchmark_judges_comparison-EN.html" style="color:var(--cyan)">Self‑Judge vs OpenAI</a>
<a href="prism_EN_motti_total_time.html" style="color:#fff">PRISM presentation</a>
</nav>
<header>
<div>
<div class="prism-mark" aria-label="PRISM"><span>P</span><span>R</span><span>I</span><span>S</span><span>M</span></div>
<p class="eyebrow">Benchmark locale · Tutte le raccolte</p>
<h1>Qualità vs prestazioni V3</h1>
<p class="subtitle">La pagina riunisce i run V3 verificati di models_hf_2, models_hf, Mistral e Qwen. Ogni simbolo rappresenta una configurazione: i triangoli distinguono le esecuzioni A100, mentre l’asse X mostra il throughput V3 e l’asse Y il relativo Asse C.</p>
</div>
<div class="snapshot">Dati README e log verificati · 2026-08-14</div>
</header>
<section class="metrics" aria-label="Riepilogo dei dati visibili">
<div class="metric"><span>Configurazioni visibili</span><strong id="model-count">15</strong></div>
<div class="metric"><span>Qualità massima</span><strong id="best-quality">99,3%</strong></div>
<div class="metric"><span>Velocità massima</span><strong id="best-speed">57,07 tok/s</strong></div>
<div class="metric"><span>Dataset confrontato</span><strong>V3</strong></div>
</section>
<section class="card" aria-label="Grafico interattivo qualità e prestazioni">
<div class="toolbar">
<label>Numero dataset V3
<select id="dataset-number-filter"><option value="3">3</option><option value="4">4</option><option value="5">5</option></select>
</label>
<label>Famiglia
<select id="family-filter"><option value="all">Tutte</option></select>
</label>
<label>Hardware
<select id="hardware-filter"><option value="all">Tutti</option></select>
</label>
<label>Formato
<select id="format-filter"><option value="all">Tutti</option></select>
</label>
<label>Raccolta
<select id="collection-filter"><option value="all">Tutte</option></select>
</label>
<button id="reset-button" type="button">Azzera filtri</button>
</div>
<div class="chart-layout">
<div class="chart-wrap">
<svg id="chart" viewBox="0 0 1050 610" role="img" aria-labelledby="chart-title chart-desc">
<title id="chart-title">Scatter plot qualità e prestazioni dei modelli sul dataset V3</title>
<desc id="chart-desc">Asse X asimmetrico: i valori da 0 a 30 token al secondo occupano quattro quinti dello spazio, mentre quelli da 30 a 60 occupano il quinto restante. Asse Y percentuale di merito, dimensione del simbolo numero di miliardi di parametri, colore famiglia del modello e forma hardware: triangolo per A100, cerchio per gli altri hardware. Le barre diagonali rosse indicano Asse C sotto 60%.</desc>
</svg>
</div>
<aside class="legend" aria-label="Legende complete del grafico">
<h2>Come leggere il grafico</h2>
<div class="legend-section">
<p class="legend-title">Asse X · Prestazioni</p>
<div class="legend-row">Token generati al secondo (tok/s)</div>
<div class="legend-row">Scala asimmetrica: 0–30 = 4/5</div>
<div class="legend-row">← più lento&nbsp;&nbsp;·&nbsp;&nbsp;più veloce →</div>
</div>
<div class="legend-section">
<p class="legend-title">Asse Y · Qualità</p>
<div class="legend-row">Asse C V3, merito (%)</div>
<div class="legend-row">↓ minore&nbsp;&nbsp;·&nbsp;&nbsp;maggiore ↑</div>
<div class="legend-row">Sorgente: Auto‑Judge</div>
</div>
<div class="legend-section">
<p class="legend-title">Dimensione · Parametri</p>
<div class="legend-row"><span class="bubble small"></span> 3B</div>
<div class="legend-row"><span class="bubble medium"></span> 8–9B</div>
<div class="legend-row"><span class="bubble large"></span> 12–20B</div>
</div>
<div class="legend-section">
<p class="legend-title">Forma · Hardware</p>
<div class="legend-row"><span class="shape round"></span> Altri hardware</div>
<div class="legend-row"><span class="shape triangle"></span> A100 80GB</div>
<div class="legend-row">+ = Inference Provider</div>
</div>
<div class="legend-section" id="family-legend">
<p class="legend-title">Colore · Famiglia</p>
</div>
<div class="legend-section">
<p class="legend-title">Segnalazione qualità</p>
<div class="legend-row"><span class="quality-stripes"></span> Barre rosse: Asse C &lt; 60%</div>
</div>
<div class="legend-section">
<p class="legend-title">Hardware</p>
<div class="legend-row"><code>2GPU:0</code>: RTX 5060 Ti 16 GB</div>
<div class="legend-row"><code>2GPU:0,1</code>: RTX 5060 Ti 16 GB + RTX 3060 12 GB</div>
<div class="legend-row"><code>A100 80GB</code>: A100-SXM4 80 GB</div>
</div>
</aside>
</div>
</section>
<section class="card note" aria-label="Confronto Asse C tra 2GPU e A100">
<strong>Evidenza hardware · stesso modello, formato e V3.</strong>
Il delta è <code>Asse C A100 − Asse C 2GPU</code>; l’Auto‑Judge coincide con il modello valutato e non isola causalmente l’hardware.
<div style="overflow-x:auto;margin-top:12px">
<table style="width:100%;border-collapse:collapse;color:var(--text)">
<thead><tr><th style="text-align:left;padding:8px">Modello e formato</th><th>2GPU</th><th>A100</th><th>Delta</th></tr></thead>
<tbody>
<tr><td style="padding:8px"><code>mistralai/Ministral-3-8B-Instruct-2512-BF16 [BF16]</code></td><td style="text-align:center"><span class="quality-below">54,4%</span></td><td style="text-align:center">62,4%</td><td style="text-align:center;color:#34d399"><strong>+8,0 pp</strong></td></tr>
<tr><td style="padding:8px"><code>mistralai/Ministral-3-14B-Instruct-2512-BF16 [GPTQ Int4]</code></td><td style="text-align:center">60,2%</td><td style="text-align:center"><span class="quality-below">49,3%</span></td><td style="text-align:center;color:#fb7185"><strong>−10,9 pp</strong></td></tr>
<tr><td style="padding:8px"><code>mistralai/Mistral-Small-3.2-24B-Instruct-2506 [GPTQ Int4]</code></td><td style="text-align:center"><span class="quality-below">26,7%</span></td><td style="text-align:center"><span class="quality-below">37,8%</span></td><td style="text-align:center;color:#34d399"><strong>+11,1 pp</strong></td></tr>
<tr><td style="padding:8px"><code>Qwen/Qwen2.5-14B-Instruct [GPTQ Int4]</code></td><td style="text-align:center"><span class="quality-below">36,5%</span></td><td style="text-align:center"><span class="quality-below">25,9%</span></td><td style="text-align:center;color:#fb7185"><strong>−10,6 pp</strong></td></tr>
<tr><td style="padding:8px"><code>Qwen/Qwen2.5-14B-Instruct [BitsAndBytes Int8]</code></td><td style="text-align:center"><span class="quality-below">27,0%</span></td><td style="text-align:center"><span class="quality-below">29,8%</span></td><td style="text-align:center;color:#34d399"><strong>+2,8 pp</strong></td></tr>
</tbody>
</table>
</div>
<p style="margin-bottom:0">Le differenze vanno in entrambe le direzioni: possono dipendere da output candidato, Auto‑Judge, kernel, backend, precisione numerica e retry. Servono repliche controllate e un giudice esterno fisso per stimare un effetto dell’hardware.</p>
</section>
<section class="card note">
<strong>Perimetro del test.</strong> Ogni configurazione V3 selezionata è inclusa una sola volta per modalità e formato; la variante ridondante <code>openai/gpt-oss-20b · mode=standard</code> è esclusa e resta soltanto <code>mode=instruct</code>. Il grafico usa esclusivamente throughput e Asse C del dataset V3; i risultati legacy V1/V2 non sono visualizzati. Per <code>gpt-5.6-sol</code> il 99,26% proviene dal giudizio dello stesso modello e il numero di parametri, non pubblicato, resta <code>NA</code>. I valori mancanti restano assenti, senza stime.
</section>
</main>
<div class="tooltip" id="tooltip" role="status" aria-live="polite"></div>
<script>
"use strict";
// Snapshot self-contained trascritto dai README di confronto e dai log V3
// post-hoc conclusi; ogni riga conserva la sorgente verificabile usata.
const BENCHMARKS = [
{ model:"meta-llama/Llama-3.2-3B-Instruct",short:"Llama 3.2 3B",family:"Llama",collection:"models_hf_2",mode:"instruct",format:"BF16",hardware:"2GPU:0",sizeB:3,speeds:{V1:46.79,V2:null,V3:38.96},quality:13.0,openaiQuality:32.78,axisA:"PASS",axisB:"FAIL",source:"README_INFERENCE_COMPARISON_PRISM.md:464" },
{ model:"Qwen/Qwen3-14B-AWQ",short:"Qwen3 14B AWQ",family:"Qwen",collection:"models_hf_2",mode:"instruct",format:"AWQ Int4",hardware:"2GPU:0",sizeB:14,speeds:{V1:31.73,V2:31.38,V3:26.82},quality:73.9,openaiQuality:73.15,axisA:"FAIL",axisB:"FAIL",source:"README_INFERENCE_COMPARISON_PRISM.md:465" },
{ model:"Qwen/Qwen2.5-14B-Instruct-AWQ",short:"Qwen2.5 AWQ",family:"Qwen",collection:"models_hf_2",mode:"instruct",format:"AWQ Int4",hardware:"2GPU:0",sizeB:14,speeds:{V1:29.22,V2:28.12,V3:25.46},quality:32.4,openaiQuality:36.3,axisA:"PASS",axisB:"FAIL",source:"README_INFERENCE_COMPARISON_PRISM.md:466" },
{ model:"nvidia/NVIDIA-Nemotron-Nano-9B-v2",short:"Nemotron 9B",family:"Nemotron",collection:"models_hf",mode:"standard",format:"BF16",hardware:"2GPU:0,1",sizeB:9,speeds:{V1:18.32,V2:19.63,V3:19.11},quality:60.2,openaiQuality:66.11,axisA:"FAIL",axisB:"FAIL",source:"README_INFERENCE_COMPARISON_PRISM.md:467" },
{ model:"meta-llama/Llama-3.1-8B-Instruct",short:"Llama 3.1 8B",family:"Llama",collection:"models_hf_2",mode:"instruct",format:"BF16",hardware:"2GPU:0,1",sizeB:8,speeds:{V1:19.43,V2:null,V3:17.13},quality:13.7,openaiQuality:24.26,axisA:"PASS",axisB:"FAIL",source:"README_INFERENCE_COMPARISON_PRISM.md:468" },
{ model:"cyankiwi/gemma-4-12B-it-AWQ-INT4",short:"Gemma 4 AWQ",family:"Gemma",collection:"models_hf_2",mode:"instruct",format:"AWQ Int4",hardware:"2GPU:0,1",sizeB:12,speeds:{V1:10.39,V2:10.95,V3:10.44},quality:62.6,openaiQuality:63.52,axisA:"FAIL",axisB:"FAIL",source:"logs/posthoc_v3_autojudge_gemma4-awq_20260803_020753.log" },
{ model:"google/gemma-4-12B-it-qat-w4a16-ct",short:"Gemma 4 QAT",family:"Gemma",collection:"models_hf_2",mode:"instruct",format:"QAT W4A16",hardware:"2GPU:0,1",sizeB:12,speeds:{V1:10.36,V2:10.93,V3:10.37},quality:54.1,openaiQuality:50.74,axisA:"FAIL",axisB:"FAIL",source:"logs/posthoc_v3_autojudge_gemma4-qat_20260803_020237.log" },
{ model:"Qwen/Qwen2.5-14B-Instruct",short:"Qwen2.5 GPTQ",family:"Qwen",collection:"Qwen",mode:"instruct",format:"GPTQ Int4",hardware:"2GPU:0",sizeB:14,speeds:{V1:30.19,V2:29.40,V3:25.87},quality:36.5,openaiQuality:48.89,axisA:"PASS",axisB:"FAIL",source:"Qwen/README_INFERENCE_COMPARISON_PRISM.md:39" },
{ model:"Qwen/Qwen2.5-14B-Instruct",short:"Qwen2.5 Int8",family:"Qwen",collection:"Qwen",mode:"instruct",format:"BitsAndBytes Int8",hardware:"2GPU:0,1",sizeB:14,speeds:{V1:9.71,V2:9.87,V3:9.35},quality:27.0,openaiQuality:40.93,axisA:"PASS",axisB:"FAIL",source:"Qwen/README_INFERENCE_COMPARISON_PRISM.md:39" },
{ model:"mistralai/Ministral-3-8B-Instruct-2512-BF16",short:"Ministral 8B",family:"Ministral",collection:"Mistral",mode:"instruct",format:"BF16",hardware:"2GPU:0,1",sizeB:8,speeds:{V1:null,V2:null,V3:17.88},quality:54.4,openaiQuality:60.0,axisA:"FAIL",axisB:"FAIL",source:"Mistral/README_INFERENCE_COMPARISON_PRISM.md:41" },
{ model:"mistralai/Ministral-3-8B-Instruct-2512-BF16",short:"Ministral 8B A100",family:"Ministral",collection:"Mistral",mode:"instruct",format:"BF16",hardware:"A100 80GB",sizeB:8,speeds:{V1:18.84,V2:18.83,V3:19.06},quality:62.4,openaiQuality:68.7,axisA:"FAIL",axisB:"FAIL",source:"Mistral/20260719_Mistral_8B_BF16_A100.log · giudice OpenAI run_id=ff2b334016b402df51d4" },
{ model:"mistralai/Ministral-3-14B-Instruct-2512-BF16",short:"Ministral 14B BF16 A100",family:"Ministral",collection:"Mistral",mode:"instruct",format:"BF16",hardware:"A100 80GB",sizeB:14,speeds:{V1:15.41,V2:15.68,V3:16.15},quality:62.6,openaiQuality:50.19,axisA:"FAIL",axisB:"FAIL",source:"Mistral/20260721_Mistral_14B_BF16_A100.log · giudice OpenAI run_id=e2136d050547e9ebf498" },
{ model:"mistralai/Mistral-Small-3.2-24B-Instruct-2506",short:"Mistral 24B BF16 A100",family:"Mistral",collection:"Mistral",mode:"instruct",format:"BF16",hardware:"A100 80GB",sizeB:24,speeds:{V1:17.23,V2:17.88,V3:18.00},quality:71.9,openaiQuality:79.81,axisA:"FAIL",axisB:"FAIL",source:"Mistral/20260721_Mistral_24B_BF16_A100.log · giudice OpenAI run_id=b6eba98759dcd0904838" },
{ model:"mistralai/Ministral-3-14B-Instruct-2512-BF16",short:"Ministral 14B GPTQ A100",family:"Ministral",collection:"Mistral",mode:"instruct",format:"GPTQ Int4",hardware:"A100 80GB",sizeB:14,speeds:{V1:6.90,V2:7.73,V3:7.75},quality:49.3,openaiQuality:62.04,axisA:"FAIL",axisB:"FAIL",source:"Mistral/20260722_Mistral_14B_Q_GPTQ_Int4_A100.log · giudice OpenAI run_id=2e8c4e8d70f57c645716" },
{ model:"mistralai/Mistral-Small-3.2-24B-Instruct-2506",short:"Mistral 24B GPTQ A100",family:"Mistral",collection:"Mistral",mode:"instruct",format:"GPTQ Int4",hardware:"A100 80GB",sizeB:24,speeds:{V1:7.81,V2:8.00,V3:8.09},quality:37.8,openaiQuality:57.41,axisA:"FAIL",axisB:"FAIL",source:"Mistral/20260722_Mistral_24B_Q_GPTQ_Int4_A100.log · giudice OpenAI run_id=60f62742bb1b9b936ee8" },
{ model:"Qwen/Qwen2.5-14B-Instruct",short:"Qwen2.5 14B BF16 A100",family:"Qwen",collection:"Qwen",mode:"instruct",format:"BF16",hardware:"A100 80GB",sizeB:14,speeds:{V1:14.85,V2:14.67,V3:14.62},quality:44.3,openaiQuality:62.59,axisA:"PASS",axisB:"FAIL",source:"Qwen/20260721_Qwen_14B_BF16_A100.log · giudice OpenAI run_id=27ef3859e684ca074a46" },
{ model:"Qwen/Qwen2.5-14B-Instruct",short:"Qwen2.5 GPTQ A100",family:"Qwen",collection:"Qwen",mode:"instruct",format:"GPTQ Int4",hardware:"A100 80GB",sizeB:14,speeds:{V1:6.55,V2:6.75,V3:6.81},quality:25.9,openaiQuality:42.78,axisA:"PASS",axisB:"FAIL",source:"Qwen/20260722_Qwen_14B_Q_GPTQ_Int4_A100.log · giudice OpenAI run_id=6fe7d24e4e5089e45ee8" },
{ model:"Qwen/Qwen2.5-14B-Instruct",short:"Qwen2.5 Int8 A100",family:"Qwen",collection:"Qwen",mode:"instruct",format:"BitsAndBytes Int8",hardware:"A100 80GB",sizeB:14,speeds:{V1:3.08,V2:3.10,V3:3.09},quality:29.8,openaiQuality:45.93,axisA:"FAIL",axisB:"FAIL",source:"Qwen/20260722_Qwen_14B_Q_Int8_BB_A100.log · giudice OpenAI run_id=c4433f21159917892ee4" },
{ model:"deepseek-ai/DeepSeek-Prover-V2-7B",short:"DeepSeek BF16 A100",family:"DeepSeek",collection:"models_hf",mode:"instruct",format:"BF16",hardware:"A100 80GB",sizeB:7,speeds:{V1:24.76,V2:24.33,V3:20.85},quality:73.0,openaiQuality:41.48,axisA:"FAIL",axisB:"FAIL",source:"models_hf/DeepSeek/20260725_DeepSeek_Prover_7B_BF16_A100.log · giudice OpenAI run_id=8ba80082c0ad4fa71403" },
{ model:"deepseek-ai/DeepSeek-Prover-V2-7B",short:"DeepSeek Int8 A100",family:"DeepSeek",collection:"models_hf",mode:"instruct",format:"BitsAndBytes Int8",hardware:"A100 80GB",sizeB:7,speeds:{V1:6.09,V2:6.09,V3:5.93},quality:51.1,openaiQuality:40.74,axisA:"FAIL",axisB:"FAIL",source:"models_hf/DeepSeek/20260725_DeepSeek_Prover_7B_Q_Int8_BB_A100.log · giudice OpenAI run_id=0206051fb277ad4cdb89" },
{ model:"openai/gpt-oss-20b",short:"GPT-OSS 20B A100",family:"GPT-OSS",reasoning:"medium",collection:"models_hf",mode:"standard",format:"MXFP4",hardware:"A100 80GB",sizeB:20,speeds:{V1:10.78,V2:10.97,V3:10.58},quality:62.2,openaiQuality:64.07,axisA:"PASS",axisB:"PASS",source:"models_hf/GPT_OSS/20260726_GPT_OSS_20B_MXFP4_A100.log · 2026-08-12 15:22:59; giudice OpenAI run_id=8ce1175e2cc57cf7c27d" },
{ model:"nvidia/NVIDIA-Nemotron-Nano-9B-v2",short:"Nemotron 9B A100",family:"Nemotron",collection:"models_hf",mode:"instruct",format:"BF16",hardware:"A100 80GB",sizeB:9,speeds:{V1:11.95,V2:18.62,V3:18.72},quality:72.8,openaiQuality:69.63,axisA:"PASS",axisB:"FAIL",source:"models_hf/Nemotron/20260725_Nemotron_Nano_9B_BF16_A100.log · giudice OpenAI run_id=ee8a6a0b4db4499290d8" },
// Campagna locale 2GPU del 2026-08-12: soltanto run conclusi con
// throughput e Asse C registrati; il BF16 14B OOM resta nel ranking tempi.
{ model:"mistralai/Ministral-3-8B-Instruct-2512-BF16",short:"Ministral 8B BF16 2GPU Aug",family:"Ministral",collection:"Mistral",mode:"instruct",format:"BF16",hardware:"2GPU:0,1",sizeB:8,speeds:{V1:null,V2:null,V3:18.06},quality:54.4,openaiQuality:60.0,axisA:"FAIL",axisB:"FAIL",source:"Mistral/20260719_Mistral_8B_BF16_2GPU.log · giudice OpenAI run_id=878e9fb36f32e1077d50" },
{ model:"mistralai/Ministral-3-14B-Instruct-2512-BF16",short:"Ministral 14B GPTQ 2GPU Aug",family:"Ministral",collection:"Mistral",mode:"instruct",format:"GPTQ Int4",hardware:"2GPU:0",sizeB:14,speeds:{V1:null,V2:null,V3:28.79},quality:60.2,openaiQuality:75.74,axisA:"FAIL",axisB:"FAIL",source:"Mistral/20260722_Mistral_14B_Q_GPTQ_Int4_2GPU.log · giudice OpenAI run_id=eeb1a40117fe0e5cde84" },
{ model:"mistralai/Ministral-3-14B-Instruct-2512-BF16",short:"Ministral 14B Int8 2GPU Aug",family:"Ministral",collection:"Mistral",mode:"instruct",format:"BitsAndBytes Int8",hardware:"2GPU:0,1",sizeB:14,speeds:{V1:null,V2:null,V3:9.71},quality:72.8,openaiQuality:79.26,axisA:"FAIL",axisB:"FAIL",source:"Mistral/20260722_Mistral_14B_Q_Int8_BB_2GPU.log · giudice OpenAI run_id=1ce437d15d8e6131a94b" },
{ model:"mistralai/Mistral-Small-3.2-24B-Instruct-2506",short:"Mistral 24B GPTQ 2GPU Aug",family:"Mistral",collection:"Mistral",mode:"instruct",format:"GPTQ Int4",hardware:"2GPU:0,1",sizeB:24,speeds:{V1:null,V2:null,V3:17.70},quality:26.7,openaiQuality:45.74,axisA:"FAIL",axisB:"FAIL",source:"Mistral/20260722_Mistral_24B_Q_GPTQ_Int4_2GPU.log · giudice OpenAI run_id=f801bc653cca40e37144" },
{ model:"mistralai/Ministral-3-8B-Instruct-2512-BF16",short:"Ministral 8B GPTQ 2GPU Aug",family:"Ministral",collection:"Mistral",mode:"instruct",format:"GPTQ Int4",hardware:"2GPU:0",sizeB:8,speeds:{V1:null,V2:null,V3:41.79},quality:42.0,openaiQuality:51.48,axisA:"FAIL",axisB:"FAIL",source:"Mistral/20260725_Mistral_8B_Q_GPTQ_Int4_2GPU.log · giudice OpenAI run_id=af6fdbe8728a394611d9" },
{ model:"Qwen/Qwen2.5-14B-Instruct",short:"Qwen2.5 GPTQ 2GPU Aug",family:"Qwen",collection:"Qwen",mode:"instruct",format:"GPTQ Int4",hardware:"2GPU:0",sizeB:14,speeds:{V1:null,V2:null,V3:26.34},quality:36.5,openaiQuality:50.37,axisA:"PASS",axisB:"FAIL",source:"Qwen/20260722_Qwen_14B_Q_GPTQ_Int4_2GPU.log · giudice OpenAI run_id=0108f1a07e6d3482384b" },
{ model:"Qwen/Qwen2.5-14B-Instruct",short:"Qwen2.5 Int8 2GPU Aug",family:"Qwen",collection:"Qwen",mode:"instruct",format:"BitsAndBytes Int8",hardware:"2GPU:0,1",sizeB:14,speeds:{V1:null,V2:null,V3:9.24},quality:27.0,openaiQuality:40.93,axisA:"FAIL",axisB:"FAIL",source:"Qwen/20260722_Qwen_14B_Q_Int8_BB_2GPU.log · giudice OpenAI run_id=426acf61aa73abd3ca0d" },
{ model:"openai/gpt-oss-20b",short:"GPT-OSS 20B 2GPU Aug",family:"GPT-OSS",reasoning:"medium",collection:"models_hf",mode:"standard",format:"MXFP4",hardware:"2GPU:0,1",sizeB:20,speeds:{V1:null,V2:null,V3:27.24},quality:88.3,openaiQuality:85.93,axisA:"PASS",axisB:"PASS",source:"models_hf/GPT_OSS/20260726_GPT_OSS_20B_MXFP4_2GPU.log · 2026-08-12 22:38:29; giudice OpenAI run_id=c112b7f8f1c2ab68d02e" },
{ model:"mistralai/Ministral-3-14B-Instruct-2512-BF16",short:"Ministral 14B GPTQ",family:"Ministral",collection:"Mistral",mode:"instruct",format:"GPTQ Int4",hardware:"2GPU:0",sizeB:14,speeds:{V1:null,V2:null,V3:27.36},quality:60.2,openaiQuality:75.74,axisA:"FAIL",axisB:"FAIL",source:"Mistral/README_INFERENCE_COMPARISON_PRISM.md:41" },
{ model:"mistralai/Ministral-3-14B-Instruct-2512-BF16",short:"Ministral 14B Int8",family:"Ministral",collection:"Mistral",mode:"instruct",format:"BitsAndBytes Int8",hardware:"2GPU:0,1",sizeB:14,speeds:{V1:null,V2:null,V3:9.68},quality:72.8,openaiQuality:80.0,axisA:"FAIL",axisB:"FAIL",source:"Mistral/README_INFERENCE_COMPARISON_PRISM.md:41" },
{ model:"deepseek-ai/DeepSeek-Prover-V2-7B",short:"DeepSeek BF16 std",family:"DeepSeek",collection:"models_hf",mode:"standard",format:"BF16",hardware:"2GPU:0,1",sizeB:7,speeds:{V1:18.47,V2:18.24,V3:11.25},quality:0.0,openaiQuality:0.0,axisA:"FAIL",axisB:"FAIL",source:"README_INFERENCE_COMPARISON_PRISM.md:95" },
{ model:"deepseek-ai/DeepSeek-Prover-V2-7B",short:"DeepSeek BF16 inst",family:"DeepSeek",collection:"models_hf",mode:"instruct",format:"BF16",hardware:"2GPU:0,1",sizeB:7,speeds:{V1:18.57,V2:17.74,V3:9.77},quality:47.5,openaiQuality:48.7,axisA:"FAIL",axisB:"FAIL",source:"models_hf/DeepSeek/20260725_DeepSeek_Prover_7B_BF16_2GPU-instruct.log (recupero post-hoc 2026-08-03)" },
{ model:"deepseek-ai/DeepSeek-Prover-V2-7B",short:"DeepSeek Int8 std",family:"DeepSeek",collection:"models_hf",mode:"standard",format:"BitsAndBytes Int8",hardware:"2GPU:0,1",sizeB:7,speeds:{V1:null,V2:null,V3:9.69},quality:0.0,openaiQuality:0.0,axisA:"FAIL",axisB:"FAIL",source:"models_hf/DeepSeek/20260725_DeepSeek_Prover_7B_Q_Int8_BB_2GPU.log" },
{ model:"deepseek-ai/DeepSeek-Prover-V2-7B",short:"DeepSeek Int8 inst",family:"DeepSeek",collection:"models_hf",mode:"instruct",format:"BitsAndBytes Int8",hardware:"2GPU:0,1",sizeB:7,speeds:{V1:null,V2:null,V3:9.70},quality:0.0,openaiQuality:0.0,axisA:"FAIL",axisB:"FAIL",source:"models_hf/DeepSeek/20260725_DeepSeek_Prover_7B_Q_Int8_BB_2GPU-instruct.log" },
{ model:"openai/gpt-oss-20b",short:"GPT-OSS 20B inst",family:"GPT-OSS",reasoning:"medium",collection:"models_hf",mode:"instruct",format:"MXFP4",hardware:"2GPU:0,1",sizeB:20,speeds:{V1:null,V2:null,V3:27.47},quality:87.6,openaiQuality:85.74,axisA:"FAIL",axisB:"PASS",source:"logs/posthoc_v3_autojudge_gpt-oss-instruct_20260803_013547.log" },
// Il giudice OpenAI ha valutato il run Together 20B. DeepInfra resta
// separato: unire i due provider attribuirebbe erroneamente a DeepInfra
// il punteggio terzo misurato solo sull'output Together.
{ model:"openai/gpt-oss-20b",short:"+ GPT-OSS 20B Together",family:"GPT-OSS",reasoning:"low",collection:"Inference Provider",mode:"instruct",format:"Inference Provider",hardware:"Together",sizeB:20,speeds:{V1:null,V2:null,V3:113.05},quality:43.0,openaiQuality:43.33,axisA:"PASS",axisB:"PASS",execution:"inference_provider",source:"Together 2026-08-14 13:44:58 (113,05 tok/s; Asse C Auto-Judge 43,0%); giudice OpenAI run_id=799e04c2fbfc4eb6c363: 43,33%; log: models_hf/GPT_OSS/Inference_Provider/gpt_oss_20B_inference_provider_deepinfra.log" },
{ model:"openai/gpt-oss-120b",short:"+ GPT-OSS 120B Together",family:"GPT-OSS",reasoning:"low",collection:"Inference Provider",mode:"instruct",format:"Inference Provider",hardware:"Together",sizeB:120,speeds:{V1:null,V2:null,V3:120.49},quality:95.9,openaiQuality:94.26,axisA:"PASS",axisB:"FAIL",execution:"inference_provider",source:"Giudice OpenAI Together run_id=44ef5cb03b37c4592e2a: 94,26%; log: models_hf/GPT_OSS/Inference_Provider/gpt_oss_120B_inference_provider_deepinfra.log · 2026-08-14 13:28:30" }
,{ model:"gpt-5.6-sol",short:"GPT-5.6 Sol API",family:"OpenAI",collection:"OpenAI",mode:"instruct",format:"API",hardware:"OpenAI API",sizeB:null,speeds:{V1:null,V2:null,V3:57.07},quality:99.26,openaiQuality:99.26,axisA:"PASS",axisB:"NA",source:"giudice/OpenAI_execute_V3.log · run_id=70ad80d55b99ac8b5d48" }
// Campagna V100 di agosto (rieseguita 2026-08-16/17). [Aggiornato: 2026-08-19]
// Giudizio OpenAI aggiunto per le tre righe FP16/Int8: run_id rispettivamente
// 3f5c33c7ea9cc82d6402, 70b13f68e8e3e3696be9, 2ea1abaa6fca51fc75df. La riga
// DeepSeek mantiene quality:0.0 gia' segnalato come Auto-Judge scartato
// (bug di abbinamento domande, non un fallimento reale del candidato); il
// giudizio OpenAI (0.0%, run_id=a272de4536603fa9f23f) e' comunque coerente
// con un candidato di scarsa qualita', vedi model_comparison_Table.csv.
,{ model:"mistralai/Ministral-3-8B-Instruct-2512-BF16",short:"Ministral 8B V100 Aug",family:"Ministral",collection:"Mistral",mode:"instruct",format:"FP16",hardware:"V100",sizeB:8,speeds:{V1:null,V2:null,V3:19.09},quality:59.3,openaiQuality:65.56,axisA:"PASS",axisB:"FAIL",source:"Mistral/20260719_Mistral_8B_FP16_V100.log · giudice OpenAI run_id=3f5c33c7ea9cc82d6402" }
,{ model:"mistralai/Ministral-3-14B-Instruct-2512-BF16",short:"Ministral 14B V100 Aug",family:"Ministral",collection:"Mistral",mode:"instruct",format:"FP16",hardware:"V100",sizeB:14,speeds:{V1:null,V2:null,V3:13.53},quality:63.1,openaiQuality:64.81,axisA:"PASS",axisB:"FAIL",source:"Mistral/20260721_Mistral_14B_FP16_V100.log · giudice OpenAI run_id=70b13f68e8e3e3696be9" }
,{ model:"mistralai/Ministral-3-14B-Instruct-2512-BF16",short:"Ministral 14B Int8 V100 Aug",family:"Ministral",collection:"Mistral",mode:"instruct",format:"BitsAndBytes Int8",hardware:"V100",sizeB:14,speeds:{V1:null,V2:null,V3:6.50},quality:64.1,openaiQuality:54.44,axisA:"PASS",axisB:"FAIL",source:"Mistral/20260722_Mistral_14B_Q_Int8_BB_V100.log · giudice OpenAI run_id=2ea1abaa6fca51fc75df" }
,{ model:"deepseek-ai/DeepSeek-Prover-V2-7B",short:"DeepSeek FP16 V100 Aug",family:"DeepSeek",collection:"models_hf",mode:"instruct",format:"FP16",hardware:"V100",sizeB:7,speeds:{V1:null,V2:null,V3:8.58},quality:0.0,openaiQuality:0.0,axisA:"FAIL",axisB:"FAIL",source:"models_hf/DeepSeek/20260725_DeepSeek_Prover_7B_FP16_V100.log · giudice OpenAI run_id=a272de4536603fa9f23f" }
// Campagna V100 del 2026-08-19: NF4 4-bit e GPTQ Int4 con backend
// ExLlamaV2 forzato sul 24B, nessun giudizio OpenAI ancora eseguito.
,{ model:"mistralai/Mistral-Small-3.2-24B-Instruct-2506",short:"Mistral 24B NF4 V100",family:"Mistral",collection:"Mistral",mode:"instruct",format:"BitsAndBytes NF4",hardware:"V100",sizeB:24,speeds:{V1:null,V2:null,V3:16.78},quality:78.3,openaiQuality:79.07,axisA:"PASS",axisB:"FAIL",source:"Mistral/20260819_Mistral_24B_Q_NF4_BB_V100.log · giudice OpenAI run_id=58ef777c86aa62128d06" }
,{ model:"mistralai/Mistral-Small-3.2-24B-Instruct-2506",short:"Mistral 24B GPTQ ExLlamaV2 V100 (run 1/3)",family:"Mistral",collection:"Mistral",mode:"instruct",format:"GPTQ Int4",hardware:"V100",sizeB:24,speeds:{V1:null,V2:null,V3:12.57},quality:32.4,axisA:"PASS",axisB:"FAIL",source:"Mistral/20260819_Mistral_24B_Q_GPTQ_Int4_V100.log (run 1/3 nello stesso log; nessun giudizio OpenAI, non estratto dallo script di preparazione)" }
,{ model:"mistralai/Mistral-Small-3.2-24B-Instruct-2506",short:"Mistral 24B GPTQ ExLlamaV2 V100 (run 2/3)",family:"Mistral",collection:"Mistral",mode:"instruct",format:"GPTQ Int4",hardware:"V100",sizeB:24,speeds:{V1:null,V2:null,V3:12.60},quality:40.7,axisA:"PASS",axisB:"FAIL",source:"Mistral/20260819_Mistral_24B_Q_GPTQ_Int4_V100.log (run 2/3 nello stesso log; nessun giudizio OpenAI, non estratto dallo script di preparazione)" }
,{ model:"mistralai/Mistral-Small-3.2-24B-Instruct-2506",short:"Mistral 24B GPTQ ExLlamaV2 V100 (run 3/3)",family:"Mistral",collection:"Mistral",mode:"instruct",format:"GPTQ Int4",hardware:"V100",sizeB:24,speeds:{V1:null,V2:null,V3:12.62},quality:33.3,openaiQuality:45.74,axisA:"PASS",axisB:"FAIL",source:"Mistral/20260819_Mistral_24B_Q_GPTQ_Int4_V100.log (run 3/3, ultimo del log: unico estratto dallo script di preparazione) · giudice OpenAI run_id=4337f6820977d37d0ca6" }
// [Aggiornato: 2026-08-20] I punti V100 dei dataset 4 e 5 restano
// separati dal dataset 3: i rispettivi massimi Asse C sono diversi.
,{model:"meta-models/Muse-Glimmer-30B",short:"Muse 30B NF4 V100 · DS3",family:"Muse",collection:"models_hf",mode:"instruct",format:"BitsAndBytes NF4",hardware:"V100",sizeB:30,datasetNumber:"3",speeds:{V1:null,V2:null,V3:12.38},quality:95.7,axisA:"FAIL",axisB:"PASS",source:"models_hf/meta/20260819_Muse_Glimmer_30B_Q_NF4_BB_V100.log · dataset V3 n. 3 · Asse C=129.25/135=95.7%, retry giudice=3"}
,{model:"google/gemma-4-31B-it",short:"Gemma 4 31B NF4 V100 · DS3",family:"Gemma",collection:"models_hf",mode:"instruct",format:"BitsAndBytes NF4",hardware:"V100",sizeB:31,datasetNumber:"3",speeds:{V1:null,V2:null,V3:10.20},quality:82.2,axisA:"PASS",axisB:"FAIL",source:"models_hf/google/20260819_Gemma_4_31B_it_Q_NF4_BB_V100.log · dataset V3 n. 3 · Asse C=111.00/135=82.2%"}
,{model:"mistralai/Mistral-Small-3.2-24B-Instruct-2506",short:"Mistral 24B NF4 V100 · DS4",family:"Mistral",collection:"Mistral",mode:"instruct",format:"BitsAndBytes NF4",hardware:"V100",sizeB:24,datasetNumber:"4",speeds:{V1:null,V2:null,V3:16.59},quality:54.9,axisA:"PASS",axisB:"FAIL",source:"Mistral/20260819_Mistral_24B_Q_NF4_BB_V100.log · dataset V3 n. 4"}
,{model:"mistralai/Mistral-Small-3.2-24B-Instruct-2506",short:"Mistral 24B NF4 V100 · DS5",family:"Mistral",collection:"Mistral",mode:"instruct",format:"BitsAndBytes NF4",hardware:"V100",sizeB:24,datasetNumber:"5",speeds:{V1:null,V2:null,V3:15.05},quality:52.0,axisA:"PASS",axisB:"FAIL",source:"Mistral/20260819_Mistral_24B_Q_NF4_BB_V100.log · dataset V3 n. 5"}
,{model:"mistralai/Mistral-Small-3.2-24B-Instruct-2506",short:"Mistral 24B GPTQ V100 · DS4",family:"Mistral",collection:"Mistral",mode:"instruct",format:"GPTQ Int4",hardware:"V100",sizeB:24,datasetNumber:"4",speeds:{V1:null,V2:null,V3:20.61},quality:38.5,axisA:"PASS",axisB:"FAIL",source:"Mistral/20260819_Mistral_24B_Q_GPTQ_Int4_V100.log · dataset V3 n. 4"}
,{model:"mistralai/Mistral-Small-3.2-24B-Instruct-2506",short:"Mistral 24B GPTQ V100 · DS5",family:"Mistral",collection:"Mistral",mode:"instruct",format:"GPTQ Int4",hardware:"V100",sizeB:24,datasetNumber:"5",speeds:{V1:null,V2:null,V3:18.38},quality:27.6,axisA:"PASS",axisB:"FAIL",source:"Mistral/20260819_Mistral_24B_Q_GPTQ_Int4_V100.log · dataset V3 n. 5"}
,{model:"google/gemma-4-31B-it",short:"Gemma 4 31B NF4 V100 · DS4",family:"Gemma",collection:"models_hf",mode:"instruct",format:"BitsAndBytes NF4",hardware:"V100",sizeB:31,datasetNumber:"4",speeds:{V1:null,V2:null,V3:10.17},quality:84.4,axisA:"FAIL",axisB:"PASS",source:"models_hf/google/20260819_Gemma_4_31B_it_Q_NF4_BB_V100.log · dataset V3 n. 4"}
,{model:"google/gemma-4-31B-it",short:"Gemma 4 31B NF4 V100 · DS5",family:"Gemma",collection:"models_hf",mode:"instruct",format:"BitsAndBytes NF4",hardware:"V100",sizeB:31,datasetNumber:"5",speeds:{V1:null,V2:null,V3:9.23},quality:90.5,axisA:"FAIL",axisB:"FAIL",source:"models_hf/google/20260819_Gemma_4_31B_it_Q_NF4_BB_V100.log · dataset V3 n. 5"}
,{model:"meta-models/Muse-Glimmer-30B",short:"Muse 30B NF4 V100 · DS4",family:"Muse",collection:"models_hf",mode:"instruct",format:"BitsAndBytes NF4",hardware:"V100",sizeB:30,datasetNumber:"4",speeds:{V1:null,V2:null,V3:12.73},quality:93.5,axisA:"FAIL",axisB:"FAIL",source:"models_hf/meta/20260819_Muse_Glimmer_30B_Q_NF4_BB_V100.log · dataset V3 n. 4"}
,{model:"meta-models/Muse-Glimmer-30B",short:"Muse 30B NF4 V100 · DS5",family:"Muse",collection:"models_hf",mode:"instruct",format:"BitsAndBytes NF4",hardware:"V100",sizeB:30,datasetNumber:"5",speeds:{V1:null,V2:null,V3:12.68},quality:95.4,axisA:"FAIL",axisB:"FAIL",source:"models_hf/meta/20260819_Muse_Glimmer_30B_Q_NF4_BB_V100.log · dataset V3 n. 5"}
];
// [Aggiornato: 2026-08-19] "Mistral" (24B, distinto da "Ministral") non
// aveva una voce: i punti con questa family rendevano con fill non
// definito. Colore scelto con lo script dataviz validate_palette.py
// (--mode dark --pairs all sulla superficie #0d121d di questa pagina):
// la palette esistente fallisce gia' i controlli CVD/lightness anche
// senza aggiunte (coppia peggiore preesistente #c084fc/#60a5fa); tra i
// candidati provati, il ciano #22d3ee e' quello che non peggiora la
// coppia peggiore gia' presente ed e' visivamente distinto da tutti gli
// altri, in particolare da Ministral (viola) sullo stesso confronto.
const COLORS = { Llama:"#60a5fa", Qwen:"#34d399", Nemotron:"#f59e0b", Gemma:"#f472b6", Ministral:"#c084fc", Mistral:"#22d3ee", Muse:"#a3e635", DeepSeek:"#fb7185", "GPT-OSS":"#facc15", OpenAI:"#ef4444" };
const chart = document.getElementById("chart");
const tooltip = document.getElementById("tooltip");
const familyFilter = document.getElementById("family-filter");
const hardwareFilter = document.getElementById("hardware-filter");
const formatFilter = document.getElementById("format-filter");
const collectionFilter = document.getElementById("collection-filter");
const datasetNumberFilter = document.getElementById("dataset-number-filter");
const NS = "http://www.w3.org/2000/svg";
const plot = { left: 76, right: 1018, top: 28, bottom: 538 };
/**
* Crea un elemento SVG e applica gli attributi richiesti.
* @param {string} name Nome SVG valido, per esempio "line", "text" o "circle".
* @param {Record<string, string|number>} attributes Attributi da impostare sull'elemento.
* @returns {SVGElement} Elemento non ancora inserito nel documento.
* @throws {DOMException} Può propagare errori del DOM per nomi o attributi non validi; non è previsto un fallback perché i valori sono costanti locali.
* @sideEffects Alloca un nodo DOM senza modificarne ancora la gerarchia.
*/
function svgElement(name, attributes = {}) {
const element = document.createElementNS(NS, name);
Object.entries(attributes).forEach(([key, value]) => element.setAttribute(key, String(value)));
return element;
}
/**
* Converte un numero nel formato italiano usato nella pagina.
* @param {number} value Numero finito da visualizzare.
* @param {number} decimals Numero massimo di cifre decimali.
* @returns {string} Numero localizzato con virgola decimale.
* @throws {RangeError} Può propagare un errore per un numero di decimali non valido; i chiamanti usano soltanto costanti sicure.
* @sideEffects Nessuno.
*/
function itNumber(value, decimals = 1) {
return value.toLocaleString("it-IT", { maximumFractionDigits: decimals, minimumFractionDigits: decimals });
}
/**
* Popola un filtro con i valori distinti presenti nello snapshot.
* @param {HTMLSelectElement} select Controllo da aggiornare.
* @param {string[]} values Valori grezzi, anche duplicati.
* @returns {void}
* @throws {DOMException} Può propagare errori DOM; in tal caso il grafico resta comunque utilizzabile con l'opzione "Tutti".
* @sideEffects Aggiunge opzioni al controllo select ricevuto.
*/
function populateFilter(select, values) {
[...new Set(values)].sort().forEach((value) => {
const option = document.createElement("option");
option.value = value;
option.textContent = value;
select.appendChild(option);
});
}
/**
* Restituisce i benchmark conformi ai tre filtri della toolbar.
* @returns {typeof BENCHMARKS} Nuovo array contenente soltanto i punti selezionati.
* @throws {Error} Non sono attesi errori; se un controllo mancasse, l'inizializzazione dello script fallirebbe rendendo evidente l'HTML incompleto.
* @sideEffects Nessuno.
*/
function filteredBenchmarks() {
return BENCHMARKS.filter((item) =>
// Le configurazioni con qualità nulla non sono informative nel grafo
// qualità/prestazioni e vengono escluse anche dalle metriche visibili.
item.quality > 0 &&
(familyFilter.value === "all" || item.family === familyFilter.value) &&
(hardwareFilter.value === "all" || item.hardware === hardwareFilter.value) &&
(formatFilter.value === "all" || item.format === formatFilter.value) &&
(collectionFilter.value === "all" || item.collection === collectionFilter.value) &&
// Le righe storiche V3 sono tutte dataset 3; le nuove righe dichiarano il numero esplicitamente.
(item.datasetNumber || "3") === datasetNumberFilter.value
);
}
/**
* Posiziona e mostra la scheda descrittiva di un punto.
* @param {PointerEvent|FocusEvent} event Evento usato per scegliere una posizione accessibile nello schermo.
* @param {(typeof BENCHMARKS)[number]} item Benchmark da descrivere.
* @returns {void}
* @throws {Error} Non sono attesi errori perché i dati sono incorporati e completi; non viene applicato un fallback silenzioso per non nascondere dati corrotti.
* @sideEffects Aggiorna contenuto, posizione e visibilità del tooltip globale.
*/
function showTooltip(event, item) {
const parameterLabel = item.sizeB === null ? "NA (non pubblicati)" : `${itNumber(item.sizeB,1)}B`;
tooltip.innerHTML = `<strong>${item.model} [${item.format}]</strong><div class="tooltip-grid"><span>Parametri</span><b>${parameterLabel}</b><span>Raccolta</span><b>${item.collection}</b><span>Numero dataset V3</span><b>${item.datasetNumber || "3"}</b><span>Prestazioni V3</span><b>${itNumber(item.speeds.V3,2)} tok/s</b><span>Asse C V3</span><b>${itNumber(item.quality,1)}%</b><span>Hardware</span><b>${item.hardware}</b><span>Reasoning candidato</span><b>${item.reasoning||"NA"}</b><span>Asse A / B V3</span><b>${item.axisA} / ${item.axisB}</b><span>Sorgente</span><b>${item.source}</b></div>`;
const pointEvent = /** @type {PointerEvent} */ (event);
const x = Number.isFinite(pointEvent.clientX) ? pointEvent.clientX : window.innerWidth / 2;
const y = Number.isFinite(pointEvent.clientY) ? pointEvent.clientY : window.innerHeight / 2;
tooltip.style.left = `${Math.min(x + 16, window.innerWidth - tooltip.offsetWidth - 12)}px`;
tooltip.style.top = `${Math.min(y + 16, window.innerHeight - tooltip.offsetHeight - 12)}px`;
tooltip.classList.add("visible");
}
/**
* Nasconde la scheda descrittiva senza cancellarne il contenuto.
* @returns {void}
* @throws {Error} Non sono attesi errori.
* @sideEffects Rimuove la classe di visibilità dal tooltip globale.
*/
function hideTooltip() {
tooltip.classList.remove("visible");
}
/**
* Disegna assi, griglia, etichette e bolle usando esclusivamente SVG nativo.
* @returns {void}
* @throws {DOMException} Può propagare errori DOM; non esiste un fallback grafico sicuro, mentre titolo e metodologia restano leggibili nell'HTML.
* @sideEffects Sostituisce il contenuto grafico dello SVG e aggiorna le quattro metriche di riepilogo.
*/
function renderChart() {
chart.querySelectorAll(".generated").forEach((node) => node.remove());
const data = filteredBenchmarks();
// La scala spezzata amplia l'area 0–30, dove si concentra la maggior parte
// dei modelli, e comprime i soli valori superiori nel quinto finale.
const xScale = (value) => {
const width = plot.right - plot.left;
const firstSegmentWidth = width * 0.8;
if (value <= 30) return plot.left + (value / 30) * firstSegmentWidth;
return plot.left + firstSegmentWidth + ((value - 30) / 100) * (width - firstSegmentWidth);
};
// Il dominio qualitativo termina sempre a 100%; il margine inferiore a
// -5 lascia interamente visibili i simboli con Asse C uguale a zero.
const yScale = (value) => plot.bottom - ((value + 5) / 105) * (plot.bottom - plot.top);
const radiusScale = (value) => 7 + Math.sqrt(value / 14) * 19;
for (const value of [0, 5, 10, 15, 20, 25, 30, 50, 75, 100, 125]) {
const x = xScale(value);
chart.append(svgElement("line", { x1: x, x2: x, y1: plot.top, y2: plot.bottom, class: "generated grid-line" }));
const label = svgElement("text", { x, y: plot.bottom + 23, "text-anchor": "middle", class: "generated tick-label" });
label.textContent = String(value);
chart.append(label);
}
for (let value = 0; value <= 100; value += 10) {
const y = yScale(value);
chart.append(svgElement("line", { x1: plot.left, x2: plot.right, y1: y, y2: y, class: "generated grid-line" }));
const label = svgElement("text", { x: plot.left - 13, y: y + 4, "text-anchor": "end", class: "generated tick-label" });
label.textContent = `${value}%`;
chart.append(label);
}
// Le soglie rendono immediata la distinzione tra revisione umana e comprensione consigliata per automazione.
[{ value: 60, label: "Consigliata con revisione · 60%", className: "threshold-review", color: "#f59e0b" }, { value: 80, label: "Consigliata automatica · 80%", className: "threshold-automatic", color: "#22c55e" }].forEach((threshold) => {
const y = yScale(threshold.value);
chart.append(svgElement("line", { x1: plot.left, x2: plot.right, y1: y, y2: y, class: `generated ${threshold.className}` }));
const label = svgElement("text", { x: plot.right - 4, y: y - 5, "text-anchor": "end", fill: threshold.color, class: "generated threshold-label" });
label.textContent = threshold.label;
chart.append(label);
});
chart.append(svgElement("line", { x1: plot.left, x2: plot.right, y1: plot.bottom, y2: plot.bottom, class: "generated axis-line" }));
chart.append(svgElement("line", { x1: plot.left, x2: plot.left, y1: plot.top, y2: plot.bottom, class: "generated axis-line" }));
// Le tacche oblique in corrispondenza di 30 tok/s rendono evidente il cambio di densità.
const xBreak = xScale(30);
chart.append(svgElement("path", { d: `M ${xBreak - 8} ${plot.bottom + 5} l 7 -10 M ${xBreak + 1} ${plot.bottom + 5} l 7 -10`, class: "generated axis-line", fill: "none" }));
const xTitle = svgElement("text", { x: (plot.left + plot.right) / 2, y: 593, "text-anchor": "middle", class: "generated axis-title" });
xTitle.textContent = "PRESTAZIONI — token generati al secondo (tok/s) →";
chart.append(xTitle);
const yTitle = svgElement("text", { x: 20, y: (plot.top + plot.bottom) / 2, transform: `rotate(-90 20 ${(plot.top + plot.bottom) / 2})`, "text-anchor": "middle", class: "generated axis-title" });
yTitle.textContent = "QUALITÀ — Asse C V3, merito Auto-Judge (%) →";
chart.append(yTitle);
/** Disegna due barre rosse sopra un punto sotto soglia senza coprire gli eventi del punto. @param {number} x Coordinata orizzontale del simbolo. @param {number} y Coordinata verticale del simbolo. @param {number} radius Raggio o semilato del simbolo. @returns {void} Non restituisce valori. @sideEffects Aggiunge due linee SVG non interattive al grafico. @throws {DOMException} Se il DOM SVG non accetta l'inserimento; nessun fallback sicuro. */
function drawBelowThresholdStripes(x, y, radius) {
const stripeLength = radius * 0.72;
[-radius * 0.34, radius * 0.34].forEach((offset) => {
chart.append(svgElement("line", { x1: x - stripeLength + offset, y1: y + stripeLength, x2: x + stripeLength + offset, y2: y - stripeLength, stroke: "#ef4444", "stroke-width": "2.2", "stroke-linecap": "round", "pointer-events": "none", class: "generated" }));
});
}
data.forEach((item) => {
const x = xScale(item.speeds.V3);
const y = yScale(item.quality);
const pointRadius = item.sizeB === null ? 14 : radiusScale(item.sizeB);
// Il colore identifica sempre la famiglia, come dichiarato dalla legenda; le soglie sono linee separate.
const pointColor = COLORS[item.family];
// I run A100 usano un triangolo e gli Inference Provider una croce;
// ogni forma usa la stessa scala legata ai parametri e il colore della
// famiglia, così dimensione, forma e colore restano codifiche indipendenti.
const point = item.execution === "inference_provider"
? svgElement("text", { x, y: y + pointRadius * 0.35, "text-anchor":"middle", fill:pointColor, "font-size":pointRadius * 1.7, "font-weight":"800", class:"generated point", tabindex:"0", role:"button", "aria-label":`${item.model}, Inference Provider, V3: ${item.speeds.V3} token al secondo, Asse C ${item.quality}%` })
: item.hardware.startsWith("A100")
? svgElement("polygon", {
points: `${x},${y - pointRadius} ${x + pointRadius},${y + pointRadius * 0.8} ${x - pointRadius},${y + pointRadius * 0.8}`,
fill: pointColor,
class: "generated point",
tabindex: "0",
role: "button",
"aria-label": `${item.model}, hardware A100, V3: ${item.speeds.V3} token al secondo, Asse C ${item.quality}%`
})
: svgElement("circle", { cx:x, cy:y, r:pointRadius, fill:pointColor, class:"generated point", tabindex:"0", role:"button", "aria-label":`${item.model}, V3: ${item.speeds.V3} token al secondo, Asse C ${item.quality}%` });
if (item.execution === "inference_provider") point.textContent = "+";
point.style.color = pointColor;
point.addEventListener("pointerenter", (event) => showTooltip(event,item));
point.addEventListener("pointermove", (event) => showTooltip(event,item));
point.addEventListener("pointerleave", hideTooltip);
point.addEventListener("focus", (event) => showTooltip(event,item));
point.addEventListener("blur", hideTooltip);
chart.append(point);
if (item.quality < 60) drawBelowThresholdStripes(x, y, pointRadius);
});
data.forEach((item) => {
const label=svgElement("text",{x:xScale(item.speeds.V3),y:yScale(item.quality)-radiusScale(item.sizeB)-7,"text-anchor":"middle",class:"generated point-label"});
// Ogni punto espone sempre i parametri anche quando il nome breve del
// modello non contiene già la stessa indicazione in miliardi.
const parameterLabel = `${item.sizeB}B`;
label.textContent = item.short.includes(parameterLabel)
? item.short
: `${item.short} · ${parameterLabel}`;
chart.append(label);
});
if (data.length === 0) {
const empty = svgElement("text", { x: 550, y: 285, class: "generated empty" });
empty.textContent = "Nessun modello corrisponde ai filtri selezionati.";
chart.append(empty);
}
document.getElementById("model-count").textContent = String(data.length);
document.getElementById("best-quality").textContent = data.length ? `${itNumber(Math.max(...data.map((item) => item.quality)), 1)}%` : "—";
document.getElementById("best-speed").textContent = data.length ? `${itNumber(Math.max(...data.map((item) => item.speeds.V3)), 2)} tok/s` : "—";
}
/**
* Inizializza filtri, legenda e primo rendering della dashboard.
* @returns {void}
* @throws {DOMException} Propaga errori DOM strutturali; la pagina testuale resta comunque disponibile come fallback informativo.
* @sideEffects Popola controlli e legenda, registra listener e disegna il grafico.
*/
function initializeDashboard() {
populateFilter(familyFilter, BENCHMARKS.map((item) => item.family));
populateFilter(hardwareFilter, BENCHMARKS.map((item) => item.hardware));
populateFilter(formatFilter, BENCHMARKS.map((item) => item.format));
populateFilter(collectionFilter, BENCHMARKS.map((item) => item.collection));
const familyLegend = document.getElementById("family-legend");
Object.entries(COLORS).forEach(([family, color]) => {
const row = document.createElement("div");
row.className = "legend-row";
row.innerHTML = `<span class="swatch" style="background:${color}"></span>${family}`;
familyLegend.append(row);
});
[familyFilter, hardwareFilter, formatFilter, collectionFilter, datasetNumberFilter].forEach((filter) => filter.addEventListener("change", renderChart));
document.getElementById("reset-button").addEventListener("click", () => {
familyFilter.value = "all";
hardwareFilter.value = "all";
formatFilter.value = "all";
collectionFilter.value = "all";
datasetNumberFilter.value = "3";
renderChart();
});
renderChart();
}
initializeDashboard();
</script>
<script>
/* Translates static text and graph content generated after page load without altering benchmark data or controls. */
(() => {
const terms = [["Pagine benchmark","Benchmark pages"],["Benchmark locale","Local benchmark"],["Tutte le raccolte","All collections"],["Qualità vs prestazioni V3","Quality vs V3 performance"],["La pagina riunisce i run V3 verificati di models_hf_2, models_hf, Mistral e Qwen. Ogni simbolo rappresenta una configurazione: i triangoli distinguono le esecuzioni A100, mentre l’asse X mostra il throughput V3 e l’asse Y il relativo Asse C.","This page brings together verified V3 runs from models_hf_2, models_hf, Mistral and Qwen. Each symbol represents a configuration: triangles identify A100 runs, while the X axis shows V3 throughput and the Y axis its corresponding Axis C."],["Dati README e log verificati","Verified README and log data"],["Riepilogo dei dati visibili","Visible-data summary"],["Configurazioni visibili","Visible configurations"],["Qualità massima","Highest quality"],["Velocità massima","Highest speed"],["Dataset confrontato","Compared dataset"],["Grafico interattivo qualità e prestazioni","Interactive quality and performance chart"],["Numero dataset V3","V3 dataset number"],["Famiglia","Family"],["Hardware","Hardware"],["Formato","Format"],["Raccolta","Collection"],["Tutte","All"],["Tutti","All"],["Azzera filtri","Reset filters"],["Legende complete del grafico","Full chart legends"],["Come leggere il grafico","How to read the chart"],["Asse X · Prestazioni","X axis · Performance"],["Token generati al secondo (tok/s)","Tokens generated per second (tok/s)"],["Scala asimmetrica","Asymmetric scale"],["più lento","slower"],["più veloce","faster"],["Asse Y · Qualità","Y axis · Quality"],["Asse C V3, merito (%)","V3 Axis C, merit (%)"],["minore","lower"],["maggiore","higher"],["Sorgente:","Source:"],["Dimensione · Parametri","Size · Parameters"],["Forma · Hardware","Shape · Hardware"],["Altri hardware","Other hardware"],["Colore · Famiglia","Color · Family"],["Segnalazione qualità","Quality marker"],["Barre rosse: Asse C","Red stripes: Axis C"],["Confronto Asse C tra 2GPU e A100","Axis C comparison between 2GPU and A100"],["Evidenza hardware · stesso modello, formato e V3.","Hardware evidence · same model, format and V3."],["Modello e formato","Model and format"],["Le differenze vanno in entrambe le direzioni: possono dipendere da output candidato, Auto‑Judge, kernel, backend, precisione numerica e retry. Servono repliche controllate e un giudice esterno fisso per stimare un effetto dell’hardware.","Differences go in both directions: they may depend on candidate output, Auto-Judge, kernel, backend, numerical precision and retries. Controlled replications and a fixed external judge are needed to estimate a hardware effect."],["Perimetro del test.","Test scope."],["Parametri","Parameters"],["Prestazioni V3","V3 performance"],["Asse C V3","V3 Axis C"],["Reasoning candidato","Candidate reasoning"],["Sorgente","Source"],["Consigliata con revisione","Recommended with review"],["Consigliata automatica","Recommended for automation"],["PRESTAZIONI — token generati al secondo (tok/s) →","PERFORMANCE — tokens generated per second (tok/s) →"],["QUALITÀ — Asse C V3, merito Auto-Judge (%) →","QUALITY — V3 Axis C, Auto-Judge merit (%) →"],["token al secondo","tokens per second"],["hardware A100","A100 hardware"],["Nessun modello corrisponde ai filtri selezionati.","No models match the selected filters."],["Ogni configurazione V3 selezionata è inclusa una sola volta per modalità e formato; la variante ridondante ","Each selected V3 configuration is included only once per mode and format; the redundant variant "],[" è esclusa e resta soltanto "," is excluded and only "],[". Il grafico usa esclusivamente throughput e Asse C del dataset V3; i risultati legacy V1/V2 non sono visualizzati. Per "," remains. The chart uses only V3-dataset throughput and Axis C; legacy V1/V2 results are not shown. For "],[" il 99,26% proviene dal giudizio dello stesso modello e il numero di parametri, non pubblicato, resta "," the 99.26% comes from that same model's judgment, and its unpublished parameter count remains "],[". I valori mancanti restano assenti, senza stime.",". Missing values remain absent, without estimates."]];
const translate = (value) => terms.reduce((text, [italian, english]) => text.split(italian).join(english), value);
const translateNode = (node) => { if (node.nodeType === Node.TEXT_NODE && node.parentElement && !["SCRIPT", "STYLE"].includes(node.parentElement.tagName)) node.nodeValue = translate(node.nodeValue); if (node.nodeType === Node.ELEMENT_NODE) ["aria-label", "title"].forEach((name) => { if (node.hasAttribute(name)) node.setAttribute(name, translate(node.getAttribute(name))); }); };
const translateTree = (root) => { translateNode(root); const walker = document.createTreeWalker(root, NodeFilter.SHOW_ELEMENT | NodeFilter.SHOW_TEXT); while (walker.nextNode()) translateNode(walker.currentNode); };
translateTree(document.body);
new MutationObserver((records) => records.forEach((record) => record.addedNodes.forEach(translateTree))).observe(document.body, { childList: true, subtree: true });
})();
</script>
</body>
</html>