Download benchmark_quality_performance.html from ItalianCyberTeam/PRISM-project-Evaluation-functional-request: direct link, hf CLI and curl.
- Browser
- Download file 56.4 kB
-
https://huggingface.co/spaces/ItalianCyberTeam/PRISM-project-Evaluation-functional-request/resolve/main/benchmark_quality_performance.html
- Command line
-
hf download hf://spaces/ItalianCyberTeam/PRISM-project-Evaluation-functional-request/benchmark_quality_performance.html
-
curl -L -o benchmark_quality_performance.html https://huggingface.co/spaces/ItalianCyberTeam/PRISM-project-Evaluation-functional-request/resolve/main/benchmark_quality_performance.html
56.4 kB
| <html lang="it"> | |
| <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.html" style="color:var(--text)">Qualità e throughput</a> | |
| <a href="benchmark_quality_OpenAI_performance.html" style="color:#fb7185">Qualità OpenAI</a> | |
| <a href="benchmark_speed_performance.html" style="color:var(--accent)">Tempi di conclusione</a> | |
| <a href="benchmark_judges_comparison.html" style="color:var(--cyan)">Self‑Judge vs OpenAI</a> | |
| <a href="prism_motti_total_time.html" style="color:#fff">Presentazione PRISM</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 · 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 · 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 < 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> | |
| ; | |
| // 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.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.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.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.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.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.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.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.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.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.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.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> | |
| </body> | |
| </html> | |