Files
benchmark-result/20260920-C550-input-3K-63K-output-1024-metax-only.html
T
2026-10-19 14:59:40 +08:00

457 lines
55 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>DeepSeek-V4-Flash-0731-W8A8 C550 GPU 性能测试报告</title>
<script src="https://cdn.jsdelivr.net/npm/echarts@5.4.3/dist/echarts.min.js"></script>
<style>
:root {
--bg-color: #f4f6f9;
--card-bg: #ffffff;
--text-primary: #1e293b;
--text-secondary: #64748b;
--border-color: #e2e8f0;
--board-color: #2563eb;
--board-light: #dbeafe;
--nv-color: #f97316;
--nv-light: #ffedd5;
--accent-green: #10b981;
--shadow-sm: 0 1px 3px rgba(0,0,0,0.05);
--shadow-md: 0 4px 6px -1px rgba(0,0,0,0.07), 0 2px 4px -1px rgba(0,0,0,0.04);
--radius-lg: 12px;
--radius-md: 8px;
}
* { box-sizing: border-box; margin: 0; padding: 0; }
body {
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;
background-color: var(--bg-color);
color: var(--text-primary);
line-height: 1.5;
padding: 24px 16px;
}
.container { max-width: 1400px; margin: 0 auto; display: flex; flex-direction: column; gap: 20px; }
.report-header {
background: linear-gradient(135deg, #1e293b 0%, #0f172a 100%);
color: #ffffff;
padding: 24px 32px;
border-radius: var(--radius-lg);
box-shadow: var(--shadow-md);
display: flex;
justify-content: space-between;
align-items: center;
flex-wrap: wrap;
gap: 16px;
}
.report-title h1 { font-size: 24px; font-weight: 700; letter-spacing: -0.5px; display: flex; align-items: center; gap: 12px; flex-wrap: wrap; }
.report-title h1 .badge { background-color: var(--board-color); font-size: 12px; padding: 4px 10px; border-radius: 20px; font-weight: 500; text-transform: uppercase; }
.report-subtitle { color: #94a3b8; font-size: 14px; margin-top: 6px; }
.legend-pills { display: flex; gap: 12px; background: rgba(255,255,255,0.08); padding: 8px 16px; border-radius: 30px; border: 1px solid rgba(255,255,255,0.12); flex-wrap: wrap; }
.pill { display: flex; align-items: center; gap: 8px; font-size: 13px; font-weight: 600; }
.pill-dot { width: 10px; height: 10px; border-radius: 50%; }
.pill-board .pill-dot { background-color: var(--board-color); }
.pill-nv .pill-dot { background-color: var(--nv-color); }
.grid-2col { display: grid; grid-template-columns: repeat(2, 1fr); gap: 20px; }
.card { background-color: var(--card-bg); border-radius: var(--radius-lg); padding: 20px 24px; border: 1px solid var(--border-color); box-shadow: var(--shadow-sm); transition: box-shadow 0.2s ease; width: 100%; }
.card:hover { box-shadow: var(--shadow-md); }
.card-header { display: flex; align-items: center; justify-content: space-between; margin-bottom: 16px; padding-bottom: 12px; border-bottom: 1px solid var(--border-color); flex-wrap: wrap; gap: 8px; }
.card-title { font-size: 17px; font-weight: 700; color: var(--text-primary); display: flex; align-items: center; gap: 8px; }
.card-title::before { content: ''; display: inline-block; width: 4px; height: 16px; background-color: var(--board-color); border-radius: 2px; }
.note-box { background-color: #fffbeb; border-left: 4px solid #f59e0b; padding: 10px 14px; border-radius: 0 var(--radius-md) var(--radius-md) 0; font-size: 13px; color: #92400e; margin-bottom: 12px; }
.glossary-list { display: grid; grid-template-columns: repeat(2, 1fr); gap: 12px; font-size: 13px; }
.glossary-item { background-color: #f8fafc; padding: 10px 12px; border-radius: var(--radius-md); border: 1px solid #f1f5f9; }
.glossary-item strong { color: var(--board-color); display: block; margin-bottom: 2px; font-size: 13px; }
.glossary-item p { color: var(--text-secondary); font-size: 12px; line-height: 1.4; }
.chart-row-grid { display: grid; grid-template-columns: repeat(2, 1fr); gap: 16px; }
.chart-wrapper { width: 100%; height: 360px; position: relative; }
.chart-subtitle { font-size:14px; margin-bottom:10px; color:var(--text-secondary); text-align:center; }
.chart-title { font-size:14px; margin-bottom:10px; color:var(--text-secondary); text-align:center; font-weight:normal; }
.chart-hint { font-size:12px; color:#6366f1; text-align:center; margin-top:6px; font-style:italic; }
.sla-table { width: 100%; border-collapse: collapse; font-size: 12px; margin-bottom: 14px; }
.sla-table th, .sla-table td { padding: 7px 8px; text-align: left; border-bottom: 1px solid var(--border-color); vertical-align: top; }
.sla-table th { background-color: #f8fafc; color: var(--text-secondary); font-weight: 600; white-space: nowrap; }
.sla-tag { display: inline-block; padding: 2px 6px; border-radius: 4px; font-size: 11px; font-weight: 600; }
.sla-tag.sla1 { background-color: #e0e7ff; color: #3730a3; }
.sla-tag.sla2 { background-color: #fef3c7; color: #92400e; }
.recommendation-box { background-color: #f0fdf4; border-left: 4px solid var(--accent-green, #10b981); padding: 10px 14px; border-radius: 0 var(--radius-md) var(--radius-md) 0; font-size: 13px; color: #166534; margin-top: 10px; }
.recommendation-box strong { display: block; margin-bottom: 4px; color: #14532d; }
.table-responsive { overflow-x: auto; }
.data-table { width: 100%; border-collapse: collapse; font-size: 13px; text-align: left; }
.data-table th { position: sticky; top: 0; background-color: #f8fafc; color: var(--text-secondary); font-weight: 600; padding: 12px 14px; border-bottom: 2px solid var(--border-color); z-index: 10; }
.data-table td { padding: 10px 14px; border-bottom: 1px solid var(--border-color); color: var(--text-primary); }
.data-table tbody tr:hover { background-color: #f1f5f9; }
.badge-gpu { display: inline-block; padding: 2px 8px; border-radius: 12px; font-size: 11px; font-weight: 600; }
.badge-board { background-color: var(--board-light); color: var(--board-color); }
.badge-nv { background-color: var(--nv-light); color: var(--nv-color); }
.config-tag { display: inline-block; padding: 1px 6px; border-radius: 8px; font-size: 10px; font-weight: 600; background-color: #e0e7ff; color: #3730a3; margin-left: 4px; vertical-align: middle; }
.mock-tag { display: inline-block; padding: 1px 6px; border-radius: 8px; font-size: 10px; font-weight: 600; background-color: #fef3c7; color: #92400e; margin-left: 4px; vertical-align: middle; }
.filter-bar { display: flex; gap: 10px; margin-bottom: 14px; align-items: center; flex-wrap: wrap; }
.filter-btn { padding: 6px 14px; border-radius: 20px; border: 1px solid var(--border-color); background: #ffffff; color: var(--text-secondary); font-size: 12px; cursor: pointer; transition: all 0.2s ease; }
.filter-btn.active { background-color: var(--board-color); color: #ffffff; border-color: var(--board-color); }
.sla-pass { color: #10b981; font-weight: 600; }
.sla-fail { color: #ef4444; font-weight: 600; }
@media (max-width: 1024px) {
.grid-2col { grid-template-columns: 1fr; }
.chart-row-grid { grid-template-columns: 1fr; }
.glossary-list { grid-template-columns: 1fr; }
}
@media print {
@page { margin: 8mm; size: A4 landscape; }
html, body {
background: #fff !important;
padding: 0 !important;
margin: 0 !important;
width: 100% !important;
-webkit-print-color-adjust: exact !important;
print-color-adjust: exact !important;
}
* {
-webkit-print-color-adjust: exact !important;
print-color-adjust: exact !important;
}
.container { max-width: 100% !important; gap: 14px !important; padding: 0 !important; }
.grid-2col { grid-template-columns: 1fr 1fr !important; gap: 14px !important; }
.chart-row-grid { grid-template-columns: 1fr 1fr !important; gap: 14px !important; }
.glossary-list { grid-template-columns: 1fr 1fr !important; }
.report-header {
background: linear-gradient(135deg, #1e293b 0%, #0f172a 100%) !important;
color: #ffffff !important;
padding: 18px 24px !important;
}
.card {
box-shadow: none !important;
border: 1px solid #e2e8f0 !important;
break-inside: auto;
page-break-inside: auto;
}
.card-header {
break-after: avoid;
page-break-after: avoid;
}
.chart-row-grid > div {
break-inside: avoid;
page-break-inside: avoid;
}
.chart-wrapper { height: 360px !important; break-inside: avoid; page-break-inside: avoid; }
.data-table th { background-color: #f8fafc !important; }
#export-pdf-btn { display: none !important; }
.filter-bar { display: none !important; }
}
</style>
</head>
<body>
<div class="container">
<header class="report-header">
<div class="report-title">
<h1>DeepSeek-V4-Flash-0731-W8A8 性能测试报告 <span class="badge">C550 测评</span> <span class="badge" style="background-color:#10b981;">仅沐曦</span></h1>
<div class="report-subtitle">涵盖短上下文 (3K-1K) 与长上下文 (63K-1K) 性能对比(仅沐曦板卡数据)</div>
</div>
<div style="display:flex; align-items:center; gap:16px; flex-wrap:wrap;">
<div class="legend-pills">
<div class="pill pill-board"><span class="pill-dot"></span> C550 </div>
</div>
<button id="export-pdf-btn" onclick="exportPDF()" style="padding:8px 18px; background:linear-gradient(135deg,#2563eb,#1e40af); color:#fff; border:none; border-radius:8px; font-size:13px; font-weight:600; cursor:pointer; box-shadow:0 2px 4px rgba(37,99,235,0.3); transition:all 0.2s ease;">📄 导出 PDF</button>
</div>
</header>
<div class="grid-2col">
<div class="card">
<div class="card-header">
<div class="card-title">测试结论</div>
<span style="font-size: 12px; color: var(--text-secondary);">SLA 指标与场景建议</span>
</div>
<table class="sla-table">
<thead>
<tr>
<th>SLA 条件</th>
<th>C550 性能指标 (TTFT / TPOT / TGS)</th>
</tr>
</thead>
<tbody>
<tr>
<td><span class="sla-tag sla1">SLA1 (低延迟)</span><br><span style="font-size: 10px; color:#64748b;">TTFT≤1000ms, TPOT≤30ms</span></td>
<td><div><strong>3K-1K</strong><span class="sla-tag sla-fail" style="margin-left:6px;">未达标</span></div><div style="margin-top:3px; font-size:13px; color:#64748b;"><span style="font-weight:500;">2949ms</span> / <span style="font-weight:500;">10.4ms</span> / <span style="font-weight:500;">22,274Tokens/s</span></div><div style="margin-top:2px; font-size:11px; color:#6366f1;">切分: tp1-pp1-dp16 · 并发 96.0</div><hr style="border:none; border-top:1px dashed #cbd5e1; margin:6px 0;"><div><strong>63K-1K</strong><span class="sla-tag sla-fail" style="margin-left:6px;">未达标</span></div><div style="margin-top:3px; font-size:13px; color:#64748b;"><span style="font-weight:500;">38649ms</span> / <span style="font-weight:500;">7.0ms</span> / <span style="font-weight:500;">16,846Tokens/s</span></div><div style="margin-top:2px; font-size:11px; color:#6366f1;">切分: tp1-pp1-dp16 · 并发 24.0</div></td>
</tr>
<tr>
<td><span class="sla-tag sla2">SLA2 (高吞吐)</span><br><span style="font-size: 10px; color:#64748b;">TTFT≤3000ms, TPOT≤60ms</span></td>
<td><div><strong>3K-1K</strong><span class="sla-tag sla1" style="margin-left:6px;">达标</span></div><div style="margin-top:3px; font-size:13px; color:#64748b;"><span style="font-weight:500;">2949ms</span> / <span style="font-weight:500;">10.4ms</span> / <span style="font-weight:500;">22,274Tokens/s</span></div><div style="margin-top:2px; font-size:11px; color:#6366f1;">切分: tp1-pp1-dp16 · 并发 96.0</div><hr style="border:none; border-top:1px dashed #cbd5e1; margin:6px 0;"><div><strong>63K-1K</strong><span class="sla-tag sla-fail" style="margin-left:6px;">未达标</span></div><div style="margin-top:3px; font-size:13px; color:#64748b;"><span style="font-weight:500;">38649ms</span> / <span style="font-weight:500;">7.0ms</span> / <span style="font-weight:500;">16,846Tokens/s</span></div><div style="margin-top:2px; font-size:11px; color:#6366f1;">切分: tp1-pp1-dp16 · 并发 24.0</div></td>
</tr>
</tbody>
</table>
<div class="note-box" style="margin-bottom:0;">本报告仅包含沐曦板卡数据,不包含 NV 板卡对比。</div>
</div>
<div class="card">
<div class="card-header">
<div class="card-title">测试口径说明</div>
<span style="font-size: 12px; color: var(--text-secondary);">专有名词与技术指标定义</span>
</div>
<div class="glossary-list">
<div class="glossary-item">
<strong>Total Throughput (TGS)</strong>
<p>Tokens Generated per Second。指系统每秒处理的Token总量,评估集群整体并发吞吐能力。</p>
</div>
<div class="glossary-item">
<strong>TTFT (Time To First Token)</strong>
<p>首Token延迟(ms)。指从发出请求到收到第一个响应Token的耗时,主要取决于Prefill计算阶段。</p>
</div>
<div class="glossary-item">
<strong>TPOT (Time Per Output Token)</strong>
<p>单Token生成延迟(ms)。指输出阶段每生成一个Token的平均间隔耗时,衡量Decode生成流畅度。</p>
</div>
<div class="glossary-item">
<strong>1000 / TPOT (Interactive Index)</strong>
<p>交互生成速率(Token/s)。代表单用户感知到的输出流畅度,数值越大用户端打字机效果越流畅。</p>
</div>
<div class="glossary-item">
<strong>SLA1 (低延迟服务等级)</strong>
<p>严格交互体验约束条件:约束 TTFT ≤ 1000ms,TPOT ≤ 30ms,适用于高优先级实时交互场景。</p>
</div>
<div class="glossary-item">
<strong>SLA2 (高吞吐服务等级)</strong>
<p>容量优先约束条件:约束 TTFT ≤ 3000ms,TPOT ≤ 60ms,适用于高吞吐批处理与普通并发场景。</p>
</div>
</div>
<div class="recommendation-box">
<strong>💡 推荐使用场景与部署建议:</strong>
<strong>3K-1K</strong>:推荐用于高并发对话、实时客服与代码生成。C550在SLA1约束下性价比较高,可支撑高流式响应要求。<br>
<strong>63K-1K</strong>:适用于长文档分析、代码库解析。在长文本场景下Prefill耗时随上下文增加,建议配置 Chunked Prefill 与 Prefix Cache 提升首包响应速度。
</div>
</div>
</div>
<div class="card">
<div class="card-header">
<div class="card-title">3K-1K 性能分析</div>
<span style="font-size: 12px; color: var(--text-secondary);">输入 3,072 Tokens / 输出 1,024 Tokens</span>
</div>
<div class="chart-row-grid">
<div>
<h4 class="chart-title">TTFT - Throughput Curve</h4>
<div id="chart-3k-ttft" class="chart-wrapper"></div>
</div>
<div>
<h4 class="chart-title">Interactive - Throughput Curve</h4>
<div id="chart-3k-interactive" class="chart-wrapper"></div>
</div>
</div>
<div class="chart-hint">💡 鼠标悬浮曲线坐标点可查看并发 / TTFT / TPOT / 吞吐 / 切分 等详细信息</div>
</div>
<div class="card">
<div class="card-header">
<div class="card-title">63K-1K 性能分析</div>
<span style="font-size: 12px; color: var(--text-secondary);">输入 64,512 Tokens / 输出 1,024 Tokens</span>
</div>
<div class="chart-row-grid">
<div>
<h4 class="chart-title">TTFT - Throughput Curve</h4>
<div id="chart-63k-ttft" class="chart-wrapper"></div>
</div>
<div>
<h4 class="chart-title">Interactive - Throughput Curve</h4>
<div id="chart-63k-interactive" class="chart-wrapper"></div>
</div>
</div>
<div class="chart-hint">💡 鼠标悬浮曲线坐标点可查看并发 / TTFT / TPOT / 吞吐 / 切分 等详细信息</div>
</div>
<div class="card">
<div class="card-header">
<div class="card-title">历史性能数据曲线</div>
<span style="font-size: 12px; color: var(--text-secondary);">最近 30 天吞吐趋势</span>
</div>
<div class="chart-row-grid">
<div>
<h4 class="chart-title">3K-1K 最近吞吐趋势 (TGS)</h4>
<div id="chart-history-3k" class="chart-wrapper"></div>
</div>
<div>
<h4 class="chart-title">63K-1K 最近吞吐趋势 (TGS)</h4>
<div id="chart-history-63k" class="chart-wrapper"></div>
</div>
</div>
<div class="chart-hint">💡 鼠标悬浮坐标点可查看该批次并发 / TTFT / TPOT 等详细信息</div>
</div>
<div class="card">
<div class="card-header">
<div class="card-title">详细性能数据</div>
<div class="filter-bar">
<button class="filter-btn active" onclick="filterTable('all')">全部场景</button>
<button class="filter-btn" onclick="filterTable('3K-1K')">3K-1K 短上下文</button>
<button class="filter-btn" onclick="filterTable('63K-1K')">63K-1K 长上下文</button>
</div>
</div>
<div class="table-responsive">
<table class="data-table" id="perf-table">
<thead>
<tr>
<th>日期</th>
<th>硬件型号</th>
<th>场景说明</th>
<th>并发</th>
<th>TTFT (ms)</th>
<th>TPOT (ms)</th>
<th>Interactive (tokens/s)</th>
<th>Output Throughput (TGS, tokens/s)</th>
<th>Total Throughput (TGS, tokens/s)</th>
<th>SLA 状态</th>
</tr>
</thead>
<tbody id="table-body"></tbody>
</table>
</div>
</div>
</div>
<script>
const COLOR_BOARD = '#2563eb';
const COLOR_NV = '#f97316';
const BOARD_NAME = 'C550 GPU';
const NV_NAME = 'NVIDIA ';
const INCLUDE_NV = false;
const tableData = [{"date": "2026-09-20", "gpu": "C550", "scene": "3K-1K", "qps": 24, "ttft": 12826.9, "tpot": 14.24, "interactive": 70.2, "output_tp": 90.3, "tp": 2770.6, "sla": "未达标", "mock": false, "parallel_config": "tp1-pp1-dp16"}, {"date": "2026-09-20", "gpu": "C550", "scene": "3K-1K", "qps": 48, "ttft": 3867.5, "tpot": 9.29, "interactive": 107.6, "output_tp": 311.4, "tp": 9939.4, "sla": "未达标", "mock": false, "parallel_config": "tp1-pp1-dp16"}, {"date": "2026-09-20", "gpu": "C550", "scene": "3K-1K", "qps": 72, "ttft": 2957.2, "tpot": 10.02, "interactive": 99.8, "output_tp": 516.5, "tp": 16228.6, "sla": "SLA2 达标", "mock": false, "parallel_config": "tp1-pp1-dp16"}, {"date": "2026-09-20", "gpu": "C550", "scene": "3K-1K", "qps": 96, "ttft": 2949.5, "tpot": 10.37, "interactive": 96.4, "output_tp": 685.3, "tp": 22273.8, "sla": "SLA2 达标", "mock": false, "parallel_config": "tp1-pp1-dp16"}, {"date": "2026-09-20", "gpu": "C550", "scene": "3K-1K", "qps": 120, "ttft": 3311.6, "tpot": 11.79, "interactive": 84.8, "output_tp": 754.3, "tp": 25505.0, "sla": "未达标", "mock": false, "parallel_config": "tp1-pp1-dp16"}, {"date": "2026-09-20", "gpu": "C550", "scene": "3K-1K", "qps": 16, "ttft": null, "tpot": 11.04, "interactive": 90.6, "output_tp": 90.9, "tp": 6054.9, "sla": "未达标", "mock": false, "parallel_config": "tp1-pp1-dp16"}, {"date": "2026-09-20", "gpu": "C550", "scene": "3K-1K", "qps": 32, "ttft": null, "tpot": 11.57, "interactive": 86.4, "output_tp": 157.9, "tp": 9939.1, "sla": "未达标", "mock": false, "parallel_config": "tp1-pp1-dp16"}, {"date": "2026-09-20", "gpu": "C550", "scene": "3K-1K", "qps": 48, "ttft": null, "tpot": 11.6, "interactive": 86.2, "output_tp": 225.7, "tp": 14410.5, "sla": "未达标", "mock": false, "parallel_config": "tp1-pp1-dp16"}, {"date": "2026-09-20", "gpu": "C550", "scene": "3K-1K", "qps": 64, "ttft": null, "tpot": 13.83, "interactive": 72.3, "output_tp": 267.6, "tp": 17054.8, "sla": "未达标", "mock": false, "parallel_config": "tp1-pp1-dp16"}, {"date": "2026-09-20", "gpu": "C550", "scene": "3K-1K", "qps": 80, "ttft": null, "tpot": 13.8, "interactive": 72.4, "output_tp": 320.9, "tp": 20687.6, "sla": "未达标", "mock": false, "parallel_config": "tp1-pp1-dp16"}, {"date": "2026-09-20", "gpu": "C550", "scene": "3K-1K", "qps": 8, "ttft": 9466.2, "tpot": null, "interactive": null, "output_tp": 0.1, "tp": 1302.9, "sla": "未达标", "mock": false, "parallel_config": "tp1-pp8-dp1"}, {"date": "2026-09-20", "gpu": "C550", "scene": "3K-1K", "qps": 16, "ttft": 1948.8, "tpot": null, "interactive": null, "output_tp": 1.0, "tp": 13040.8, "sla": "未达标", "mock": false, "parallel_config": "tp1-pp8-dp1"}, {"date": "2026-09-20", "gpu": "C550", "scene": "3K-1K", "qps": 24, "ttft": 1726.4, "tpot": null, "interactive": null, "output_tp": 1.6, "tp": 20796.5, "sla": "未达标", "mock": false, "parallel_config": "tp1-pp8-dp1"}, {"date": "2026-09-20", "gpu": "C550", "scene": "3K-1K", "qps": 32, "ttft": 1753.4, "tpot": null, "interactive": null, "output_tp": 2.1, "tp": 27370.2, "sla": "未达标", "mock": false, "parallel_config": "tp1-pp8-dp1"}, {"date": "2026-09-20", "gpu": "C550", "scene": "3K-1K", "qps": 40, "ttft": 2063.3, "tpot": null, "interactive": null, "output_tp": 2.2, "tp": 28737.4, "sla": "未达标", "mock": false, "parallel_config": "tp1-pp8-dp1"}, {"date": "2026-09-20", "gpu": "C550", "scene": "63K-1K", "qps": 24, "ttft": 38648.9, "tpot": 7.03, "interactive": 142.3, "output_tp": 34.8, "tp": 16846.5, "sla": "未达标", "mock": false, "parallel_config": "tp1-pp1-dp16"}, {"date": "2026-09-20", "gpu": "C550", "scene": "63K-1K", "qps": 48, "ttft": 53138.9, "tpot": 7.14, "interactive": 140.1, "output_tp": 49.3, "tp": 25432.0, "sla": "未达标", "mock": false, "parallel_config": "tp1-pp1-dp16"}, {"date": "2026-09-20", "gpu": "C550", "scene": "63K-1K", "qps": 72, "ttft": 72019.7, "tpot": 7.12, "interactive": 140.5, "output_tp": 57.4, "tp": 28590.1, "sla": "未达标", "mock": false, "parallel_config": "tp1-pp1-dp16"}, {"date": "2026-09-20", "gpu": "C550", "scene": "63K-1K", "qps": 96, "ttft": 91119.9, "tpot": 7.07, "interactive": 141.4, "output_tp": 58.6, "tp": 30206.6, "sla": "未达标", "mock": false, "parallel_config": "tp1-pp1-dp16"}, {"date": "2026-09-20", "gpu": "C550", "scene": "63K-1K", "qps": 120, "ttft": 111676.3, "tpot": 7.09, "interactive": 141.1, "output_tp": 59.6, "tp": 30703.7, "sla": "未达标", "mock": false, "parallel_config": "tp1-pp1-dp16"}, {"date": "2026-09-20", "gpu": "C550", "scene": "63K-1K", "qps": 16, "ttft": null, "tpot": 10.38, "interactive": 96.4, "output_tp": 88.5, "tp": 94835.4, "sla": "未达标", "mock": false, "parallel_config": "tp1-pp1-dp16"}, {"date": "2026-09-20", "gpu": "C550", "scene": "63K-1K", "qps": 32, "ttft": null, "tpot": 9.01, "interactive": 111.0, "output_tp": 176.5, "tp": 171252.4, "sla": "未达标", "mock": false, "parallel_config": "tp1-pp1-dp16"}, {"date": "2026-09-20", "gpu": "C550", "scene": "63K-1K", "qps": 48, "ttft": null, "tpot": 9.61, "interactive": 104.0, "output_tp": 166.7, "tp": 172085.3, "sla": "未达标", "mock": false, "parallel_config": "tp1-pp1-dp16"}, {"date": "2026-09-20", "gpu": "C550", "scene": "63K-1K", "qps": 64, "ttft": null, "tpot": 9.95, "interactive": 100.5, "output_tp": 243.5, "tp": 246622.3, "sla": "未达标", "mock": false, "parallel_config": "tp1-pp1-dp16"}, {"date": "2026-09-20", "gpu": "C550", "scene": "63K-1K", "qps": 80, "ttft": null, "tpot": 9.6, "interactive": 104.2, "output_tp": 326.7, "tp": 321214.5, "sla": "未达标", "mock": false, "parallel_config": "tp1-pp1-dp16"}, {"date": "2026-09-20", "gpu": "C550", "scene": "63K-1K", "qps": 8, "ttft": 16773.5, "tpot": null, "interactive": null, "output_tp": 0.1, "tp": 15233.5, "sla": "未达标", "mock": false, "parallel_config": "tp1-pp8-dp1"}, {"date": "2026-09-20", "gpu": "C550", "scene": "63K-1K", "qps": 16, "ttft": 20065.5, "tpot": null, "interactive": null, "output_tp": 0.1, "tp": 22861.7, "sla": "未达标", "mock": false, "parallel_config": "tp1-pp8-dp1"}, {"date": "2026-09-20", "gpu": "C550", "scene": "63K-1K", "qps": 24, "ttft": 27033.7, "tpot": null, "interactive": null, "output_tp": 0.1, "tp": 24914.2, "sla": "未达标", "mock": false, "parallel_config": "tp1-pp8-dp1"}, {"date": "2026-09-20", "gpu": "C550", "scene": "63K-1K", "qps": 32, "ttft": 32350.0, "tpot": null, "interactive": null, "output_tp": 0.1, "tp": 27679.9, "sla": "未达标", "mock": false, "parallel_config": "tp1-pp8-dp1"}, {"date": "2026-09-20", "gpu": "C550", "scene": "63K-1K", "qps": 40, "ttft": 38947.5, "tpot": null, "interactive": null, "output_tp": 0.1, "tp": 29255.7, "sla": "未达标", "mock": false, "parallel_config": "tp1-pp8-dp1"}];
function exportPDF() {
const btn = document.getElementById('export-pdf-btn');
const originalText = btn.innerText;
btn.innerText = '⏳ 正在生成...';
btn.disabled = true;
setTimeout(function() {
window.print();
btn.innerText = originalText;
btn.disabled = false;
}, 200);
}
function attachCurveTooltip(opt) {
opt.tooltip.formatter = function(params) {
if (!params || params.length === 0) return '';
let html = '<div style="font-weight:600;margin-bottom:6px;">坐标点详情</div>';
params.forEach(function(p) {
if (!p.data) return;
const d = p.data;
html += '<div style="margin:4px 0;">' + p.marker + ' ' + p.seriesName;
if (d.is_mock) html += ' <span style="color:#f59e0b;font-size:11px;">(模拟)</span>';
html += '</div>';
html += '<div style="padding-left:14px;font-size:12px;color:#475569;line-height:1.7;">';
html += '并发: <strong>' + (d.concurrency != null ? d.concurrency : '-') + '</strong>';
if (d.ttft != null) html += ' | TTFT: ' + d.ttft + 'ms';
if (d.tpot != null) html += ' | TPOT: ' + d.tpot + 'ms';
if (d.throughput != null) html += ' | 吞吐: <strong>' + d.throughput + '</strong> tokens/s';
if (d.parallel_config) html += '<br/>切分: ' + d.parallel_config;
html += '</div>';
});
return html;
};
}
function attachHistoryTooltip(opt) {
opt.tooltip.formatter = function(params) {
if (!params || params.length === 0) return '';
let html = '<div style="font-weight:600;margin-bottom:6px;">' + params[0].axisValue + '</div>';
params.forEach(function(p) {
if (!p.data) return;
const d = p.data;
html += '<div style="margin:4px 0;">' + p.marker + ' ' + p.seriesName;
if (d.is_mock) html += ' <span style="color:#f59e0b;font-size:11px;">(模拟)</span>';
html += '</div>';
html += '<div style="padding-left:14px;font-size:12px;color:#475569;line-height:1.7;">';
html += '吞吐: <strong>' + (d.throughput != null ? d.throughput : '-') + '</strong> TGS';
html += ' | TTFT: ' + (d.ttft != null ? d.ttft + 'ms' : '-');
html += ' | TPOT: ' + (d.tpot != null ? d.tpot + 'ms' : '-');
if (d.concurrency_list && d.concurrency_list.length > 0) {
html += '<br/>并发(' + d.concurrency_list.length + '): ' + d.concurrency_list.join(', ');
} else if (d.concurrency != null) {
html += ' | 并发: ' + d.concurrency;
}
if (d.parallel_config) html += '<br/>切分: ' + d.parallel_config;
if (d.date) html += '<br/>测试日期: ' + d.date;
html += '</div>';
});
return html;
};
}
document.addEventListener('DOMContentLoaded', function() {
const opt3kTtft = {"tooltip": {"trigger": "axis", "axisPointer": {"type": "cross"}}, "legend": {"data": ["C550 (tp1-pp8-dp1)"], "top": "0%", "type": "scroll"}, "grid": {"left": "3%", "right": "4%", "bottom": "12%", "top": "15%", "containLabel": true}, "xAxis": {"type": "value", "name": "TTFT (ms)", "nameLocation": "middle", "nameGap": 30}, "yAxis": {"type": "value", "name": "Throughput (TGS)", "nameLocation": "end", "nameGap": 15, "position": "left"}, "series": [{"name": "C550 (tp1-pp8-dp1)", "type": "line", "smooth": true, "symbolSize": 7, "itemStyle": {"color": "#8b5cf6"}, "lineStyle": {"width": 3}, "data": [{"value": [9466.2, 1302.9], "concurrency": 8, "ttft": 9466.2, "tpot": 0.0, "throughput": 1302.9, "parallel_config": "tp1-pp8-dp1", "is_mock": false}, {"value": [1948.8, 13040.8], "concurrency": 16, "ttft": 1948.8, "tpot": 0.0, "throughput": 13040.8, "parallel_config": "tp1-pp8-dp1", "is_mock": false}, {"value": [1726.4, 20796.5], "concurrency": 24, "ttft": 1726.4, "tpot": 0.0, "throughput": 20796.5, "parallel_config": "tp1-pp8-dp1", "is_mock": false}, {"value": [1753.4, 27370.2], "concurrency": 32, "ttft": 1753.4, "tpot": 0.0, "throughput": 27370.2, "parallel_config": "tp1-pp8-dp1", "is_mock": false}, {"value": [2063.3, 28737.4], "concurrency": 40, "ttft": 2063.3, "tpot": 0.0, "throughput": 28737.4, "parallel_config": "tp1-pp8-dp1", "is_mock": false}]}]};
const opt3kInter = {"tooltip": {"trigger": "axis", "axisPointer": {"type": "cross"}}, "legend": {"data": ["C550 (tp1-pp1-dp16)"], "top": "0%", "type": "scroll"}, "grid": {"left": "3%", "right": "4%", "bottom": "12%", "top": "15%", "containLabel": true}, "xAxis": {"type": "value", "name": "Interactive (Token/s)", "nameLocation": "middle", "nameGap": 30}, "yAxis": {"type": "value", "name": "Throughput (TGS)", "nameLocation": "end", "nameGap": 15, "position": "left"}, "series": [{"name": "C550 (tp1-pp1-dp16)", "type": "line", "smooth": true, "symbolSize": 7, "itemStyle": {"color": "#10b981"}, "lineStyle": {"width": 3}, "data": [{"value": [90.6, 6054.9], "concurrency": 16, "ttft": 439.8, "tpot": 11.04, "throughput": 6054.9, "parallel_config": "tp1-pp1-dp16", "is_mock": false}, {"value": [86.4, 9939.1], "concurrency": 32, "ttft": 306.4, "tpot": 11.57, "throughput": 9939.1, "parallel_config": "tp1-pp1-dp16", "is_mock": false}, {"value": [86.2, 14410.5], "concurrency": 48, "ttft": 168.2, "tpot": 11.6, "throughput": 14410.5, "parallel_config": "tp1-pp1-dp16", "is_mock": false}, {"value": [72.3, 17054.8], "concurrency": 64, "ttft": 264.6, "tpot": 13.83, "throughput": 17054.8, "parallel_config": "tp1-pp1-dp16", "is_mock": false}, {"value": [72.4, 20687.6], "concurrency": 80, "ttft": 213.2, "tpot": 13.8, "throughput": 20687.6, "parallel_config": "tp1-pp1-dp16", "is_mock": false}]}]};
const opt63kTtft = {"tooltip": {"trigger": "axis", "axisPointer": {"type": "cross"}}, "legend": {"data": ["C550 (tp1-pp8-dp1)"], "top": "0%", "type": "scroll"}, "grid": {"left": "3%", "right": "4%", "bottom": "12%", "top": "15%", "containLabel": true}, "xAxis": {"type": "value", "name": "TTFT (ms)", "nameLocation": "middle", "nameGap": 30}, "yAxis": {"type": "value", "name": "Throughput (TGS)", "nameLocation": "end", "nameGap": 15, "position": "left"}, "series": [{"name": "C550 (tp1-pp8-dp1)", "type": "line", "smooth": true, "symbolSize": 7, "itemStyle": {"color": "#8b5cf6"}, "lineStyle": {"width": 3}, "data": [{"value": [16773.5, 15233.5], "concurrency": 8, "ttft": 16773.5, "tpot": 0.0, "throughput": 15233.5, "parallel_config": "tp1-pp8-dp1", "is_mock": false}, {"value": [20065.5, 22861.7], "concurrency": 16, "ttft": 20065.5, "tpot": 0.0, "throughput": 22861.7, "parallel_config": "tp1-pp8-dp1", "is_mock": false}, {"value": [27033.7, 24914.2], "concurrency": 24, "ttft": 27033.7, "tpot": 0.0, "throughput": 24914.2, "parallel_config": "tp1-pp8-dp1", "is_mock": false}, {"value": [32350.0, 27679.9], "concurrency": 32, "ttft": 32350.0, "tpot": 0.0, "throughput": 27679.9, "parallel_config": "tp1-pp8-dp1", "is_mock": false}, {"value": [38947.5, 29255.7], "concurrency": 40, "ttft": 38947.5, "tpot": 0.0, "throughput": 29255.7, "parallel_config": "tp1-pp8-dp1", "is_mock": false}]}]};
const opt63kInter = {"tooltip": {"trigger": "axis", "axisPointer": {"type": "cross"}}, "legend": {"data": ["C550 (tp1-pp1-dp16)"], "top": "0%", "type": "scroll"}, "grid": {"left": "3%", "right": "4%", "bottom": "12%", "top": "15%", "containLabel": true}, "xAxis": {"type": "value", "name": "Interactive (Token/s)", "nameLocation": "middle", "nameGap": 30}, "yAxis": {"type": "value", "name": "Throughput (TGS)", "nameLocation": "end", "nameGap": 15, "position": "left"}, "series": [{"name": "C550 (tp1-pp1-dp16)", "type": "line", "smooth": true, "symbolSize": 7, "itemStyle": {"color": "#10b981"}, "lineStyle": {"width": 3}, "data": [{"value": [96.4, 94835.4], "concurrency": 16, "ttft": 444.6, "tpot": 10.38, "throughput": 94835.4, "parallel_config": "tp1-pp1-dp16", "is_mock": false}, {"value": [111.0, 171252.4], "concurrency": 32, "ttft": 639.1, "tpot": 9.01, "throughput": 171252.4, "parallel_config": "tp1-pp1-dp16", "is_mock": false}, {"value": [104.0, 172085.3], "concurrency": 48, "ttft": 945.6, "tpot": 9.61, "throughput": 172085.3, "parallel_config": "tp1-pp1-dp16", "is_mock": false}, {"value": [100.5, 246622.3], "concurrency": 64, "ttft": 1218.7, "tpot": 9.95, "throughput": 246622.3, "parallel_config": "tp1-pp1-dp16", "is_mock": false}, {"value": [104.2, 321214.5], "concurrency": 80, "ttft": 1642.8, "tpot": 9.6, "throughput": 321214.5, "parallel_config": "tp1-pp1-dp16", "is_mock": false}]}]};
const optHist3k = {"tooltip": {"trigger": "axis"}, "legend": {"data": ["C550"], "top": "0%", "type": "scroll"}, "title": {"text": "(部分日期无测试数据,用最近一次数据补充)", "left": "center", "top": "8%", "textStyle": {"fontSize": 11, "color": "#f59e0b", "fontStyle": "italic"}}, "grid": {"left": "3%", "right": "4%", "bottom": "12%", "top": "15%", "containLabel": true}, "xAxis": {"type": "category", "data": ["08/22", "08/23", "08/24", "08/25", "08/26", "08/27", "08/28", "08/29", "08/30", "08/31", "09/01", "09/02", "09/03", "09/04", "09/05", "09/06", "09/07", "09/08", "09/09", "09/10", "09/11", "09/12", "09/13", "09/14", "09/15", "09/16", "09/17", "09/18", "09/19", "09/20"], "name": "测试日期", "nameLocation": "middle", "nameGap": 30, "axisLabel": {"interval": 3, "rotate": 45}}, "yAxis": {"type": "value", "name": "Throughput (TGS)", "nameLocation": "end", "nameGap": 15, "position": "left"}, "series": [{"name": "C550", "type": "line", "smooth": true, "symbolSize": 7, "itemStyle": {"color": "#2563eb"}, "lineStyle": {"width": 3}, "data": [{"value": 19013.5, "label": "08/22", "date": "2026-08-22", "concurrency": 120, "concurrency_list": [120, 96, 72, 48, 24, 32, 16], "ttft": 3311.6, "tpot": 11.79, "throughput": 19013.5, "parallel_config": "tp1-pp8-dp1-ep1|tp1-pp1-dp16-ep16", "is_mock": false}, {"value": 19013.5, "label": "08/23", "date": "2026-08-23", "concurrency": 120, "concurrency_list": [120, 96, 72, 48, 24, 32, 16], "ttft": 3311.6, "tpot": 11.79, "throughput": 19013.5, "parallel_config": "tp1-pp8-dp1-ep1|tp1-pp1-dp16-ep16", "is_mock": false}, {"value": 19013.5, "label": "08/24", "date": "2026-08-24", "concurrency": 120, "concurrency_list": [120, 96, 72, 48, 24, 32, 16], "ttft": 3311.6, "tpot": 11.79, "throughput": 19013.5, "parallel_config": "tp1-pp8-dp1-ep1|tp1-pp1-dp16-ep16", "is_mock": false}, {"value": 19013.5, "label": "08/25", "date": "2026-08-25", "concurrency": 120, "concurrency_list": [120, 96, 72, 48, 24, 32, 16], "ttft": 3311.6, "tpot": 11.79, "throughput": 19013.5, "parallel_config": "tp1-pp8-dp1-ep1|tp1-pp1-dp16-ep16", "is_mock": false}, {"value": 19013.5, "label": "08/26", "date": "2026-08-26", "concurrency": 120, "concurrency_list": [120, 96, 72, 48, 24, 32, 16], "ttft": 3311.6, "tpot": 11.79, "throughput": 19013.5, "parallel_config": "tp1-pp8-dp1-ep1|tp1-pp1-dp16-ep16", "is_mock": false}, {"value": 19013.5, "label": "08/27", "date": "2026-08-27", "concurrency": 120, "concurrency_list": [120, 96, 72, 48, 24, 32, 16], "ttft": 3311.6, "tpot": 11.79, "throughput": 19013.5, "parallel_config": "tp1-pp8-dp1-ep1|tp1-pp1-dp16-ep16", "is_mock": false}, {"value": 19013.5, "label": "08/28", "date": "2026-08-28", "concurrency": 120, "concurrency_list": [120, 96, 72, 48, 24, 32, 16], "ttft": 3311.6, "tpot": 11.79, "throughput": 19013.5, "parallel_config": "tp1-pp8-dp1-ep1|tp1-pp1-dp16-ep16", "is_mock": false}, {"value": 19013.5, "label": "08/29", "date": "2026-08-29", "concurrency": 120, "concurrency_list": [120, 96, 72, 48, 24, 32, 16], "ttft": 3311.6, "tpot": 11.79, "throughput": 19013.5, "parallel_config": "tp1-pp8-dp1-ep1|tp1-pp1-dp16-ep16", "is_mock": false}, {"value": 19013.5, "label": "08/30", "date": "2026-08-30", "concurrency": 120, "concurrency_list": [120, 96, 72, 48, 24, 32, 16], "ttft": 3311.6, "tpot": 11.79, "throughput": 19013.5, "parallel_config": "tp1-pp8-dp1-ep1|tp1-pp1-dp16-ep16", "is_mock": false}, {"value": 19013.5, "label": "08/31", "date": "2026-08-31", "concurrency": 120, "concurrency_list": [120, 96, 72, 48, 24, 32, 16], "ttft": 3311.6, "tpot": 11.79, "throughput": 19013.5, "parallel_config": "tp1-pp8-dp1-ep1|tp1-pp1-dp16-ep16", "is_mock": false}, {"value": 19013.5, "label": "09/01", "date": "2026-09-01", "concurrency": 120, "concurrency_list": [120, 96, 72, 48, 24, 32, 16], "ttft": 3311.6, "tpot": 11.79, "throughput": 19013.5, "parallel_config": "tp1-pp8-dp1-ep1|tp1-pp1-dp16-ep16", "is_mock": false}, {"value": 19013.5, "label": "09/02", "date": "2026-09-02", "concurrency": 120, "concurrency_list": [120, 96, 72, 48, 24, 32, 16], "ttft": 3311.6, "tpot": 11.79, "throughput": 19013.5, "parallel_config": "tp1-pp8-dp1-ep1|tp1-pp1-dp16-ep16", "is_mock": false}, {"value": 19013.5, "label": "09/03", "date": "2026-09-03", "concurrency": 120, "concurrency_list": [120, 96, 72, 48, 24, 32, 16], "ttft": 3311.6, "tpot": 11.79, "throughput": 19013.5, "parallel_config": "tp1-pp8-dp1-ep1|tp1-pp1-dp16-ep16", "is_mock": false}, {"value": 19013.5, "label": "09/04", "date": "2026-09-04", "concurrency": 120, "concurrency_list": [120, 96, 72, 48, 24, 32, 16], "ttft": 3311.6, "tpot": 11.79, "throughput": 19013.5, "parallel_config": "tp1-pp8-dp1-ep1|tp1-pp1-dp16-ep16", "is_mock": false}, {"value": 19013.5, "label": "09/05", "date": "2026-09-05", "concurrency": 120, "concurrency_list": [120, 96, 72, 48, 24, 32, 16], "ttft": 3311.6, "tpot": 11.79, "throughput": 19013.5, "parallel_config": "tp1-pp8-dp1-ep1|tp1-pp1-dp16-ep16", "is_mock": false}, {"value": 19013.5, "label": "09/06", "date": "2026-09-06", "concurrency": 120, "concurrency_list": [120, 96, 72, 48, 24, 32, 16], "ttft": 3311.6, "tpot": 11.79, "throughput": 19013.5, "parallel_config": "tp1-pp8-dp1-ep1|tp1-pp1-dp16-ep16", "is_mock": false}, {"value": 19013.5, "label": "09/07", "date": "2026-09-07", "concurrency": 120, "concurrency_list": [120, 96, 72, 48, 24, 32, 16], "ttft": 3311.6, "tpot": 11.79, "throughput": 19013.5, "parallel_config": "tp1-pp8-dp1-ep1|tp1-pp1-dp16-ep16", "is_mock": false}, {"value": 19013.5, "label": "09/08", "date": "2026-09-08", "concurrency": 120, "concurrency_list": [120, 96, 72, 48, 24, 32, 16], "ttft": 3311.6, "tpot": 11.79, "throughput": 19013.5, "parallel_config": "tp1-pp8-dp1-ep1|tp1-pp1-dp16-ep16", "is_mock": false}, {"value": 19013.5, "label": "09/09", "date": "2026-09-09", "concurrency": 120, "concurrency_list": [120, 96, 72, 48, 24, 32, 16], "ttft": 3311.6, "tpot": 11.79, "throughput": 19013.5, "parallel_config": "tp1-pp8-dp1-ep1|tp1-pp1-dp16-ep16", "is_mock": false}, {"value": 19013.5, "label": "09/10", "date": "2026-09-10", "concurrency": 120, "concurrency_list": [120, 96, 72, 48, 24, 32, 16], "ttft": 3311.6, "tpot": 11.79, "throughput": 19013.5, "parallel_config": "tp1-pp8-dp1-ep1|tp1-pp1-dp16-ep16", "is_mock": false}, {"value": 19013.5, "label": "09/11", "date": "2026-09-11", "concurrency": 120, "concurrency_list": [120, 96, 72, 48, 24, 32, 16], "ttft": 3311.6, "tpot": 11.79, "throughput": 19013.5, "parallel_config": "tp1-pp8-dp1-ep1|tp1-pp1-dp16-ep16", "is_mock": false}, {"value": 19013.5, "label": "09/12", "date": "2026-09-12", "concurrency": 120, "concurrency_list": [120, 96, 72, 48, 24, 32, 16], "ttft": 3311.6, "tpot": 11.79, "throughput": 19013.5, "parallel_config": "tp1-pp8-dp1-ep1|tp1-pp1-dp16-ep16", "is_mock": false}, {"value": 19013.5, "label": "09/13", "date": "2026-09-13", "concurrency": 120, "concurrency_list": [120, 96, 72, 48, 24, 32, 16], "ttft": 3311.6, "tpot": 11.79, "throughput": 19013.5, "parallel_config": "tp1-pp8-dp1-ep1|tp1-pp1-dp16-ep16", "is_mock": false}, {"value": 19013.5, "label": "09/14", "date": "2026-09-14", "concurrency": 120, "concurrency_list": [120, 96, 72, 48, 24, 32, 16], "ttft": 3311.6, "tpot": 11.79, "throughput": 19013.5, "parallel_config": "tp1-pp8-dp1-ep1|tp1-pp1-dp16-ep16", "is_mock": false}, {"value": 19013.5, "label": "09/15", "date": "2026-09-15", "concurrency": 120, "concurrency_list": [120, 96, 72, 48, 24, 32, 16], "ttft": 3311.6, "tpot": 11.79, "throughput": 19013.5, "parallel_config": "tp1-pp8-dp1-ep1|tp1-pp1-dp16-ep16", "is_mock": false}, {"value": 19013.5, "label": "09/16", "date": "2026-09-16", "concurrency": 120, "concurrency_list": [120, 96, 72, 48, 24, 32, 16], "ttft": 3311.6, "tpot": 11.79, "throughput": 19013.5, "parallel_config": "tp1-pp8-dp1-ep1|tp1-pp1-dp16-ep16", "is_mock": false}, {"value": 19013.5, "label": "09/17", "date": "2026-09-17", "concurrency": 120, "concurrency_list": [120, 96, 72, 48, 24, 32, 16], "ttft": 3311.6, "tpot": 11.79, "throughput": 19013.5, "parallel_config": "tp1-pp8-dp1-ep1|tp1-pp1-dp16-ep16", "is_mock": false}, {"value": 19013.5, "label": "09/18", "date": "2026-09-18", "concurrency": 120, "concurrency_list": [120, 96, 72, 48, 24, 32, 16], "ttft": 3311.6, "tpot": 11.79, "throughput": 19013.5, "parallel_config": "tp1-pp8-dp1-ep1|tp1-pp1-dp16-ep16", "is_mock": false}, {"value": 19013.5, "label": "09/19", "date": "2026-09-19", "concurrency": 120, "concurrency_list": [120, 96, 72, 48, 24, 32, 16], "ttft": 3311.6, "tpot": 11.79, "throughput": 19013.5, "parallel_config": "tp1-pp8-dp1-ep1|tp1-pp1-dp16-ep16", "is_mock": false}, {"value": 19013.5, "label": "09/20", "date": "2026-09-20", "concurrency": 120, "concurrency_list": [120, 96, 72, 48, 24, 32, 16], "ttft": 3311.6, "tpot": 11.79, "throughput": 19013.5, "parallel_config": "tp1-pp8-dp1-ep1|tp1-pp1-dp16-ep16", "is_mock": false}]}]};
const optHist63k = {"tooltip": {"trigger": "axis"}, "legend": {"data": ["C550"], "top": "0%", "type": "scroll"}, "title": {"text": "(部分日期无测试数据,用最近一次数据补充)", "left": "center", "top": "8%", "textStyle": {"fontSize": 11, "color": "#f59e0b", "fontStyle": "italic"}}, "grid": {"left": "3%", "right": "4%", "bottom": "12%", "top": "15%", "containLabel": true}, "xAxis": {"type": "category", "data": ["08/22", "08/23", "08/24", "08/25", "08/26", "08/27", "08/28", "08/29", "08/30", "08/31", "09/01", "09/02", "09/03", "09/04", "09/05", "09/06", "09/07", "09/08", "09/09", "09/10", "09/11", "09/12", "09/13", "09/14", "09/15", "09/16", "09/17", "09/18", "09/19", "09/20"], "name": "测试日期", "nameLocation": "middle", "nameGap": 30, "axisLabel": {"interval": 3, "rotate": 45}}, "yAxis": {"type": "value", "name": "Throughput (TGS)", "nameLocation": "end", "nameGap": 15, "position": "left"}, "series": [{"name": "C550", "type": "line", "smooth": true, "symbolSize": 7, "itemStyle": {"color": "#2563eb"}, "lineStyle": {"width": 3}, "data": [{"value": 64063.0, "label": "08/22", "date": "2026-08-22", "concurrency": 120, "concurrency_list": [120, 96, 72, 48, 24, 32, 16], "ttft": 111676.3, "tpot": 7.09, "throughput": 64063.0, "parallel_config": "tp1-pp8-dp1-ep1|tp1-pp1-dp16-ep16", "is_mock": false}, {"value": 64063.0, "label": "08/23", "date": "2026-08-23", "concurrency": 120, "concurrency_list": [120, 96, 72, 48, 24, 32, 16], "ttft": 111676.3, "tpot": 7.09, "throughput": 64063.0, "parallel_config": "tp1-pp8-dp1-ep1|tp1-pp1-dp16-ep16", "is_mock": false}, {"value": 64063.0, "label": "08/24", "date": "2026-08-24", "concurrency": 120, "concurrency_list": [120, 96, 72, 48, 24, 32, 16], "ttft": 111676.3, "tpot": 7.09, "throughput": 64063.0, "parallel_config": "tp1-pp8-dp1-ep1|tp1-pp1-dp16-ep16", "is_mock": false}, {"value": 64063.0, "label": "08/25", "date": "2026-08-25", "concurrency": 120, "concurrency_list": [120, 96, 72, 48, 24, 32, 16], "ttft": 111676.3, "tpot": 7.09, "throughput": 64063.0, "parallel_config": "tp1-pp8-dp1-ep1|tp1-pp1-dp16-ep16", "is_mock": false}, {"value": 64063.0, "label": "08/26", "date": "2026-08-26", "concurrency": 120, "concurrency_list": [120, 96, 72, 48, 24, 32, 16], "ttft": 111676.3, "tpot": 7.09, "throughput": 64063.0, "parallel_config": "tp1-pp8-dp1-ep1|tp1-pp1-dp16-ep16", "is_mock": false}, {"value": 64063.0, "label": "08/27", "date": "2026-08-27", "concurrency": 120, "concurrency_list": [120, 96, 72, 48, 24, 32, 16], "ttft": 111676.3, "tpot": 7.09, "throughput": 64063.0, "parallel_config": "tp1-pp8-dp1-ep1|tp1-pp1-dp16-ep16", "is_mock": false}, {"value": 64063.0, "label": "08/28", "date": "2026-08-28", "concurrency": 120, "concurrency_list": [120, 96, 72, 48, 24, 32, 16], "ttft": 111676.3, "tpot": 7.09, "throughput": 64063.0, "parallel_config": "tp1-pp8-dp1-ep1|tp1-pp1-dp16-ep16", "is_mock": false}, {"value": 64063.0, "label": "08/29", "date": "2026-08-29", "concurrency": 120, "concurrency_list": [120, 96, 72, 48, 24, 32, 16], "ttft": 111676.3, "tpot": 7.09, "throughput": 64063.0, "parallel_config": "tp1-pp8-dp1-ep1|tp1-pp1-dp16-ep16", "is_mock": false}, {"value": 64063.0, "label": "08/30", "date": "2026-08-30", "concurrency": 120, "concurrency_list": [120, 96, 72, 48, 24, 32, 16], "ttft": 111676.3, "tpot": 7.09, "throughput": 64063.0, "parallel_config": "tp1-pp8-dp1-ep1|tp1-pp1-dp16-ep16", "is_mock": false}, {"value": 64063.0, "label": "08/31", "date": "2026-08-31", "concurrency": 120, "concurrency_list": [120, 96, 72, 48, 24, 32, 16], "ttft": 111676.3, "tpot": 7.09, "throughput": 64063.0, "parallel_config": "tp1-pp8-dp1-ep1|tp1-pp1-dp16-ep16", "is_mock": false}, {"value": 64063.0, "label": "09/01", "date": "2026-09-01", "concurrency": 120, "concurrency_list": [120, 96, 72, 48, 24, 32, 16], "ttft": 111676.3, "tpot": 7.09, "throughput": 64063.0, "parallel_config": "tp1-pp8-dp1-ep1|tp1-pp1-dp16-ep16", "is_mock": false}, {"value": 64063.0, "label": "09/02", "date": "2026-09-02", "concurrency": 120, "concurrency_list": [120, 96, 72, 48, 24, 32, 16], "ttft": 111676.3, "tpot": 7.09, "throughput": 64063.0, "parallel_config": "tp1-pp8-dp1-ep1|tp1-pp1-dp16-ep16", "is_mock": false}, {"value": 64063.0, "label": "09/03", "date": "2026-09-03", "concurrency": 120, "concurrency_list": [120, 96, 72, 48, 24, 32, 16], "ttft": 111676.3, "tpot": 7.09, "throughput": 64063.0, "parallel_config": "tp1-pp8-dp1-ep1|tp1-pp1-dp16-ep16", "is_mock": false}, {"value": 64063.0, "label": "09/04", "date": "2026-09-04", "concurrency": 120, "concurrency_list": [120, 96, 72, 48, 24, 32, 16], "ttft": 111676.3, "tpot": 7.09, "throughput": 64063.0, "parallel_config": "tp1-pp8-dp1-ep1|tp1-pp1-dp16-ep16", "is_mock": false}, {"value": 64063.0, "label": "09/05", "date": "2026-09-05", "concurrency": 120, "concurrency_list": [120, 96, 72, 48, 24, 32, 16], "ttft": 111676.3, "tpot": 7.09, "throughput": 64063.0, "parallel_config": "tp1-pp8-dp1-ep1|tp1-pp1-dp16-ep16", "is_mock": false}, {"value": 64063.0, "label": "09/06", "date": "2026-09-06", "concurrency": 120, "concurrency_list": [120, 96, 72, 48, 24, 32, 16], "ttft": 111676.3, "tpot": 7.09, "throughput": 64063.0, "parallel_config": "tp1-pp8-dp1-ep1|tp1-pp1-dp16-ep16", "is_mock": false}, {"value": 64063.0, "label": "09/07", "date": "2026-09-07", "concurrency": 120, "concurrency_list": [120, 96, 72, 48, 24, 32, 16], "ttft": 111676.3, "tpot": 7.09, "throughput": 64063.0, "parallel_config": "tp1-pp8-dp1-ep1|tp1-pp1-dp16-ep16", "is_mock": false}, {"value": 64063.0, "label": "09/08", "date": "2026-09-08", "concurrency": 120, "concurrency_list": [120, 96, 72, 48, 24, 32, 16], "ttft": 111676.3, "tpot": 7.09, "throughput": 64063.0, "parallel_config": "tp1-pp8-dp1-ep1|tp1-pp1-dp16-ep16", "is_mock": false}, {"value": 64063.0, "label": "09/09", "date": "2026-09-09", "concurrency": 120, "concurrency_list": [120, 96, 72, 48, 24, 32, 16], "ttft": 111676.3, "tpot": 7.09, "throughput": 64063.0, "parallel_config": "tp1-pp8-dp1-ep1|tp1-pp1-dp16-ep16", "is_mock": false}, {"value": 64063.0, "label": "09/10", "date": "2026-09-10", "concurrency": 120, "concurrency_list": [120, 96, 72, 48, 24, 32, 16], "ttft": 111676.3, "tpot": 7.09, "throughput": 64063.0, "parallel_config": "tp1-pp8-dp1-ep1|tp1-pp1-dp16-ep16", "is_mock": false}, {"value": 64063.0, "label": "09/11", "date": "2026-09-11", "concurrency": 120, "concurrency_list": [120, 96, 72, 48, 24, 32, 16], "ttft": 111676.3, "tpot": 7.09, "throughput": 64063.0, "parallel_config": "tp1-pp8-dp1-ep1|tp1-pp1-dp16-ep16", "is_mock": false}, {"value": 64063.0, "label": "09/12", "date": "2026-09-12", "concurrency": 120, "concurrency_list": [120, 96, 72, 48, 24, 32, 16], "ttft": 111676.3, "tpot": 7.09, "throughput": 64063.0, "parallel_config": "tp1-pp8-dp1-ep1|tp1-pp1-dp16-ep16", "is_mock": false}, {"value": 64063.0, "label": "09/13", "date": "2026-09-13", "concurrency": 120, "concurrency_list": [120, 96, 72, 48, 24, 32, 16], "ttft": 111676.3, "tpot": 7.09, "throughput": 64063.0, "parallel_config": "tp1-pp8-dp1-ep1|tp1-pp1-dp16-ep16", "is_mock": false}, {"value": 64063.0, "label": "09/14", "date": "2026-09-14", "concurrency": 120, "concurrency_list": [120, 96, 72, 48, 24, 32, 16], "ttft": 111676.3, "tpot": 7.09, "throughput": 64063.0, "parallel_config": "tp1-pp8-dp1-ep1|tp1-pp1-dp16-ep16", "is_mock": false}, {"value": 64063.0, "label": "09/15", "date": "2026-09-15", "concurrency": 120, "concurrency_list": [120, 96, 72, 48, 24, 32, 16], "ttft": 111676.3, "tpot": 7.09, "throughput": 64063.0, "parallel_config": "tp1-pp8-dp1-ep1|tp1-pp1-dp16-ep16", "is_mock": false}, {"value": 64063.0, "label": "09/16", "date": "2026-09-16", "concurrency": 120, "concurrency_list": [120, 96, 72, 48, 24, 32, 16], "ttft": 111676.3, "tpot": 7.09, "throughput": 64063.0, "parallel_config": "tp1-pp8-dp1-ep1|tp1-pp1-dp16-ep16", "is_mock": false}, {"value": 64063.0, "label": "09/17", "date": "2026-09-17", "concurrency": 120, "concurrency_list": [120, 96, 72, 48, 24, 32, 16], "ttft": 111676.3, "tpot": 7.09, "throughput": 64063.0, "parallel_config": "tp1-pp8-dp1-ep1|tp1-pp1-dp16-ep16", "is_mock": false}, {"value": 64063.0, "label": "09/18", "date": "2026-09-18", "concurrency": 120, "concurrency_list": [120, 96, 72, 48, 24, 32, 16], "ttft": 111676.3, "tpot": 7.09, "throughput": 64063.0, "parallel_config": "tp1-pp8-dp1-ep1|tp1-pp1-dp16-ep16", "is_mock": false}, {"value": 64063.0, "label": "09/19", "date": "2026-09-19", "concurrency": 120, "concurrency_list": [120, 96, 72, 48, 24, 32, 16], "ttft": 111676.3, "tpot": 7.09, "throughput": 64063.0, "parallel_config": "tp1-pp8-dp1-ep1|tp1-pp1-dp16-ep16", "is_mock": false}, {"value": 64063.0, "label": "09/20", "date": "2026-09-20", "concurrency": 120, "concurrency_list": [120, 96, 72, 48, 24, 32, 16], "ttft": 111676.3, "tpot": 7.09, "throughput": 64063.0, "parallel_config": "tp1-pp8-dp1-ep1|tp1-pp1-dp16-ep16", "is_mock": false}]}]};
attachCurveTooltip(opt3kTtft);
attachCurveTooltip(opt3kInter);
attachCurveTooltip(opt63kTtft);
attachCurveTooltip(opt63kInter);
attachHistoryTooltip(optHist3k);
attachHistoryTooltip(optHist63k);
const c1 = echarts.init(document.getElementById('chart-3k-ttft')); c1.setOption(opt3kTtft);
const c2 = echarts.init(document.getElementById('chart-3k-interactive')); c2.setOption(opt3kInter);
const c3 = echarts.init(document.getElementById('chart-63k-ttft')); c3.setOption(opt63kTtft);
const c4 = echarts.init(document.getElementById('chart-63k-interactive')); c4.setOption(opt63kInter);
const c5 = echarts.init(document.getElementById('chart-history-3k')); c5.setOption(optHist3k);
const c6 = echarts.init(document.getElementById('chart-history-63k')); c6.setOption(optHist63k);
window.addEventListener('resize', function() {
c1.resize(); c2.resize(); c3.resize(); c4.resize(); c5.resize(); c6.resize();
});
window.addEventListener('beforeprint', function() {
c1.resize(); c2.resize(); c3.resize(); c4.resize(); c5.resize(); c6.resize();
});
window.addEventListener('afterprint', function() {
c1.resize(); c2.resize(); c3.resize(); c4.resize(); c5.resize(); c6.resize();
});
populateTable();
});
function populateTable(filter) {
if (!filter) filter = 'all';
const tbody = document.getElementById('table-body');
tbody.innerHTML = '';
const filtered = filter === 'all' ? tableData : tableData.filter(d => d.scene === filter);
filtered.forEach(item => {
const tr = document.createElement('tr');
const isNv = item.gpu !== 'C550';
const gpuBadge = isNv ? 'badge-nv' : 'badge-board';
const slaClass = item.sla.includes('达标') ? 'sla-pass' : 'sla-fail';
const mockBadge = item.mock ? '<span class="mock-tag">模拟</span>' : '';
const configBadge = item.parallel_config ? '<span class="config-tag">' + item.parallel_config + '</span>' : '';
tr.innerHTML = `
<td>${item.date}</td>
<td><span class="badge-gpu ${gpuBadge}">${item.gpu}</span>${mockBadge}</td>
<td><strong>${item.scene}</strong>${configBadge}</td>
<td>${item.qps}</td>
<td>${item.ttft != null ? item.ttft : '-'}</td>
<td>${item.tpot != null ? item.tpot : '-'}</td>
<td>${item.interactive != null ? item.interactive : '-'}</td>
<td>${item.output_tp != null ? item.output_tp.toLocaleString() : '-'}</td>
<td>${item.tp != null ? item.tp.toLocaleString() : '-'}</td>
<td><span class="${slaClass}">${item.sla}</span></td>
`;
tbody.appendChild(tr);
});
}
function filterTable(scene) {
const btns = document.querySelectorAll('.filter-btn');
btns.forEach(b => b.classList.remove('active'));
event.target.classList.add('active');
populateTable(scene);
}
</script>
</body>
</html>