From 47f3cab964a4ca05a35b6fe8cfc1baad7d4a0ee2 Mon Sep 17 00:00:00 2001 From: Oseltamivir <58582368+Oseltamivir@users.noreply.github.com> Date: Sun, 25 Oct 2026 17:40:35 +0800 Subject: [PATCH 1/2] fix(i18n): correct Chinese dashboard metrics and explanations MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 中文:修正中文仪表板中的指标与说明文案,明确倍数关系、设施级建模功耗和日期边界,并统一相关控件术语。新增倍数显示的回归测试,保留英文文案与数据计算行为。 --- packages/app/src/app/zh/chips/[slug]/page.tsx | 2 +- .../app/src/app/zh/rankings/[slug]/page.tsx | 4 ++-- .../app/src/components/about/agentx-faq.tsx | 4 ++-- .../agentic-workload-explorer/error-reach.tsx | 4 ++-- .../session-reuse-view.tsx | 6 +++--- .../snapshot-stamp.tsx | 2 +- .../tool-os-error-rates.tsx | 2 +- .../views/cache-view.tsx | 2 +- .../views/graphs-view.tsx | 14 +++++++------- .../views/latency-view.tsx | 4 ++-- .../views/overview-view.tsx | 8 ++++---- .../views/proxy-health-view.tsx | 2 +- .../views/sessions-view.tsx | 2 +- .../views/tool-analytics-view.tsx | 18 +++++++++--------- .../components/ai-chart/example-prompts.ts | 2 +- .../components/calculator/CostTargetPanel.tsx | 4 ++-- .../calculator/FirstTokenLimitsDisplay.tsx | 8 ++++---- .../components/calculator/FleetLifecycle.tsx | 6 +++--- .../calculator/FleetLifecycleDisplay.tsx | 6 +++--- .../calculator/ProfitEstimatorDisplay.tsx | 6 +++--- .../ThroughputCalculatorDisplay.test.ts | 19 +++++++++++++++++++ .../ThroughputCalculatorDisplay.tsx | 17 +++++++++++++---- .../collectivex/CollectiveXDisplay.tsx | 4 ++-- .../components/collectivex/known-support.ts | 2 +- .../inference/axis-metric-explanations.ts | 8 ++++---- .../inference/ui/AgenticOptimizationNote.tsx | 2 +- .../inference/ui/model-architecture-ced.ts | 2 +- .../src/components/ubenchx/SmL2Heatmap.tsx | 2 +- .../app/src/components/ui/share-buttons.tsx | 2 +- .../ui/unofficial-domain-notice.tsx | 8 +++++--- .../agentic-workload-explorer/page-meta.ts | 4 ++-- packages/app/src/lib/agentx/quickstart.ts | 4 ++-- .../app/src/lib/hardware/hardware-copy.ts | 4 ++-- packages/app/src/lib/nudges/registry.tsx | 2 +- packages/app/src/lib/routing/tab-meta-zh.ts | 2 +- 35 files changed, 109 insertions(+), 79 deletions(-) diff --git a/packages/app/src/app/zh/chips/[slug]/page.tsx b/packages/app/src/app/zh/chips/[slug]/page.tsx index cd9455691..0b9452860 100644 --- a/packages/app/src/app/zh/chips/[slug]/page.tsx +++ b/packages/app/src/app/zh/chips/[slug]/page.tsx @@ -29,7 +29,7 @@ export function generateStaticParams() { } function vsDescriptionZh(page: ChipVsPage): string { - return `${page.a.title} 对比 ${page.b.title}:显存、内存带宽、FP8/FP4 算力、TDP 与云端价格并列呈现,并附相同工作负载上持续测量的 LLM 推理基准测试。${SUPPORTERS_LINE_ZH}`; + return `${page.a.title} 对比 ${page.b.title}:显存容量、显存带宽、FP8/FP4 算力、TDP 与云端价格并列呈现,并附相同工作负载上持续测量的 LLM 推理基准测试。${SUPPORTERS_LINE_ZH}`; } function vsKeywordsZh(page: ChipVsPage): string[] { diff --git a/packages/app/src/app/zh/rankings/[slug]/page.tsx b/packages/app/src/app/zh/rankings/[slug]/page.tsx index 78d1c21ad..1e1120055 100644 --- a/packages/app/src/app/zh/rankings/[slug]/page.tsx +++ b/packages/app/src/app/zh/rankings/[slug]/page.tsx @@ -87,7 +87,7 @@ function buildFaqZh( }, { question: `“最快”是如何衡量的?`, - answer: `所有平台都在相同的交互速度档位(每用户每秒 ${data.tier} token)和${workload}下读取,再按实测单 GPU 吞吐排名。推导方式与 InferenceX 总览排行榜完全一致,因此本页排名不会与仪表盘出现分歧。`, + answer: `所有平台都在相同的交互速度档位(每用户每秒 ${data.tier} token)和${workload}下取值,再按实测单 GPU 吞吐排名。推导方式与 InferenceX 总览排行榜完全一致,因此本页排名不会与仪表盘出现分歧。`, }, ] : [ @@ -185,7 +185,7 @@ export default async function ZhRankingPage({ params }: Props) { methodologyHeading: '测试方法', methodologyBody: [ `本页所有数字都来自实测,而非纸面规格估算。InferenceX 集群使用社区推理引擎在真实硬件上部署 ${entry.model.seoName},通过扫描并发数绘制每个平台的吞吐与交互速度前沿曲线。`, - `各平台均在同一工作点(每用户每秒 ${data.tier} token)读取数据,确保在相同交互速度下进行比较。单用户速度低到无法正常使用时,即使吞吐量很高,也不能据此获得更高排名。每百万 token(输入加输出)的成本由实测吞吐量和 SemiAnalysis AI Cloud TCO 模型提供的 $/GPU/hr 费率换算得出。`, + `各平台均在同一工作点(每用户每秒 ${data.tier} token)取值,确保在相同交互速度下进行比较。单用户速度低到无法正常使用时,即使吞吐量很高,也不能据此获得更高排名。每百万 token(输入加输出)的成本由实测吞吐量和 SemiAnalysis AI Cloud TCO 模型提供的 $/GPU/hr 费率换算得出。`, `推导逻辑与 InferenceX 总览排行榜共用,基准测试持续重跑,新引擎版本和新配置落地后排行会自动更新。`, ], faqHeading: '常见问题', diff --git a/packages/app/src/components/about/agentx-faq.tsx b/packages/app/src/components/about/agentx-faq.tsx index ec9ac40f2..df20cb7a3 100644 --- a/packages/app/src/components/about/agentx-faq.tsx +++ b/packages/app/src/components/about/agentx-faq.tsx @@ -188,7 +188,7 @@ export AIPERF_SERVICE_PROFILE_CONFIGURE_TIMEOUT=1800`, bullets: [ '开启 streaming,以便测量首 token 延迟(TTFT)和 token 间延迟(ITL)。', 'ignore_eos:true 要求服务器生成指定长度的输出,而不是提前停止。', - '保留原始轮次间延迟;仅将整个系统的全局空闲时间限制在 10 秒以内。', + '保留原始轮次间延迟;仅将全局空闲时间限制在 10 秒以内。', 'first_turn_prefix cache busting 为每次回放的会话加入唯一首轮标记,避免虚假的跨会话 cache hit,同时保留会话内部的 cache 复用。', '有效测试至少运行 900 秒,默认运行 1,800 秒。', '正式测量前通过 warmup 建立深层 prefix。', @@ -228,7 +228,7 @@ export AIPERF_SERVICE_PROFILE_CONFIGURE_TIMEOUT=1800`, { title: '如何确认负载生成器(load generator)不是瓶颈?', paragraphs: [ - 'AIPerf 会将工作分配到多个 worker 进程,并每两秒上报 worker 健康状态。应将高 CPU 警告视为客户端饱和信号;在信任结果前,需要增加客户端 CPU 核心数或负载生成器主机。', + 'AIPerf 会将工作分配到多个 worker 进程,并每两秒上报 worker 健康状态。应将高 CPU 警告视为客户端饱和信号;在信任结果前,需要增加客户端 CPU 核心数,或再加一台负载生成器主机。', '--show-trace-timing 可以区分等待连接池中空闲连接的时间与等待服务器返回首字节的时间。worker 的 CPU 使用率正常且连接池阻塞很少,才有充分依据认为瓶颈位于服务器端。', ], }, diff --git a/packages/app/src/components/agentic-workload-explorer/error-reach.tsx b/packages/app/src/components/agentic-workload-explorer/error-reach.tsx index c619cc9b2..971cbf001 100644 --- a/packages/app/src/components/agentic-workload-explorer/error-reach.tsx +++ b/packages/app/src/components/agentic-workload-explorer/error-reach.tsx @@ -41,7 +41,7 @@ const STRINGS = { reachDescription: (days: number) => `滚动 ${days} 天统计。受影响 session 至少有一次 HTTP 请求失败;重复出错 session 有两次及以上。错误包含 HTTP 4xx/5xx 及记录的代理失败。`, requestErrorRate: '请求错误率', - sessionsAffected: '受影响 Session', + sessionsAffected: '受影响 session', repeatSessionShare: '重复出错占比', topTenConcentration: 'Top 10 集中度', requestsDetail: (errors: string, total: string) => `${errors} / ${total} 个请求`, @@ -53,7 +53,7 @@ const STRINGS = { colRequests: '请求数', colErrors: '错误数', colReqRate: '请求错误率', - colSessionsHit: '受影响 Session', + colSessionsHit: '受影响 session', colReach: '覆盖率', colErrorsPerHit: '错误 / 受影响', colRepeatShare: '重复占比', diff --git a/packages/app/src/components/agentic-workload-explorer/session-reuse-view.tsx b/packages/app/src/components/agentic-workload-explorer/session-reuse-view.tsx index f05927fb0..71d2bed6e 100644 --- a/packages/app/src/components/agentic-workload-explorer/session-reuse-view.tsx +++ b/packages/app/src/components/agentic-workload-explorer/session-reuse-view.tsx @@ -102,7 +102,7 @@ const STRINGS = { exportCsv: '导出 CSV', exportJson: '导出 JSON', windowDesc: (start: string, end: string, asOf: string, days: number) => - `首次观测 ${start}–${end}(不含末日),跟踪至 ${asOf}(UTC,不含末日)。最短跟踪期:${days} 天。`, + `首次观测 ${start}–${end}(不含结束日),跟踪至 ${asOf}(UTC,不含结束日)。最短跟踪期:${days} 天。`, eligibleDesc: (sessions: string, calls: string, traceVersion: number | null) => `${sessions} 个符合条件的 session · ${calls} 次调用。含短 session 及辅助/分类调用。全部模型;trace version ${traceVersion ?? 'all'}。`, lookbackDesc: (days: number) => @@ -116,7 +116,7 @@ const STRINGS = { coverageCohort: '覆盖群组', cutoffsError: '请输入 1 到 28 的逗号分隔整数天数。', noEligible: - '当前 trace version 范围内没有足够跟踪期的 session。请尝试选择"全部版本",或等待更多历史数据积累后再查看。', + '当前 trace version 范围内没有足够跟踪期的 session。请尝试选择“全部版本”,或等待更多历史数据积累后再查看。', chartCoverageTitle: '对话时长与调用量', chartCoverageSubtitle: 'Session 计数与调用计数的分母不同。', legendSessionSpan: 'Session 跨度(窗口内)', @@ -136,7 +136,7 @@ const STRINGS = { callsPerActiveCredentialDay: '调用 / 活跃凭证日', callsPerCredentialCalendarDay: '调用 / 凭证 / 日历日', activityDesc: (start: string, asOf: string, credDays: string, median: string, p90: string) => - `${start}–${asOf}(不含末日):${credDays} 活跃凭证日。每活跃凭证日中位调用 ${median} 次;p90 ${p90} 次。凭证可轮换或共享,此处并非已验证的用户数。`, + `${start}–${asOf}(不含结束日):${credDays} 活跃凭证日。每活跃凭证日中位调用 ${median} 次;p90 ${p90} 次。凭证可轮换或共享,此处并非已验证的用户数。`, dataTableSummary: '数据表与定义', thCohort: '群组', thDays: '天数', diff --git a/packages/app/src/components/agentic-workload-explorer/snapshot-stamp.tsx b/packages/app/src/components/agentic-workload-explorer/snapshot-stamp.tsx index 77a573d05..efbe600da 100644 --- a/packages/app/src/components/agentic-workload-explorer/snapshot-stamp.tsx +++ b/packages/app/src/components/agentic-workload-explorer/snapshot-stamp.tsx @@ -18,7 +18,7 @@ const STRINGS = { zh: { stamp: '冻结快照', dataEnds: '数据截至', - title: `冻结的只读快照,不再有新数据写入;所有”最后 24 小时””最后一天””最后 30 天”窗口均截止于 ${LAST_DAY_LABEL} ${SNAPSHOT_END_CLOCK}。实验性仪表板:除已发布的 HuggingFace 数据集外,不保证数据质量。`, + title: `冻结的只读快照,不再有新数据写入;所有“最后 24 小时”、“最后一天”、“最后 30 天”窗口均截止于 ${LAST_DAY_LABEL} ${SNAPSHOT_END_CLOCK}。实验性仪表板:除已发布的 HuggingFace 数据集外,不保证数据质量。`, }, }; diff --git a/packages/app/src/components/agentic-workload-explorer/tool-os-error-rates.tsx b/packages/app/src/components/agentic-workload-explorer/tool-os-error-rates.tsx index 2d3e64ce1..2ca0c9faa 100644 --- a/packages/app/src/components/agentic-workload-explorer/tool-os-error-rates.tsx +++ b/packages/app/src/components/agentic-workload-explorer/tool-os-error-rates.tsx @@ -54,7 +54,7 @@ const STRINGS = { title: '按操作系统分组的工具结果错误率', comparableResults: (n: string) => `(${n} 个可比较结果)`, description: - '错误率使用 Anthropic 匹配结果计算,因为该协议携带显式错误信号。OpenAI 和 Codex 仅参与总调用量和流量占比统计,不被默认计为成功。OS 指请求发送端,不一定是工具执行主机。Coverage 为 matched/comparable 调用比;Signal Share 为 comparable/全部 matched 结果比。', + '错误率使用 Anthropic 匹配结果计算,因为该协议携带显式错误信号。OpenAI 和 Codex 仅参与总调用量和流量占比统计,不被默认计为成功。OS 指请求发送端,不一定是工具执行主机。覆盖率为 matched/comparable 调用比;信号占比为 comparable/全部 matched 结果比。', caption: '按请求发送端操作系统分组的 Anthropic 工具结果错误数及百分比,附全 provider 流量构成。', emptyState: '暂无按操作系统分组的结果数据', diff --git a/packages/app/src/components/agentic-workload-explorer/views/cache-view.tsx b/packages/app/src/components/agentic-workload-explorer/views/cache-view.tsx index 6b19ec772..1919a0962 100644 --- a/packages/app/src/components/agentic-workload-explorer/views/cache-view.tsx +++ b/packages/app/src/components/agentic-workload-explorer/views/cache-view.tsx @@ -74,7 +74,7 @@ const STRINGS = { cacheByClient: '各客户端缓存', cacheEfficiencyPerDev: '各开发者缓存效率', cacheEfficiencyPerDevDetail: '最后 90 天 · cache_read / (cache_read + input)', - loading: '加载中...', + loading: '加载中…', lastNDays: (n: number) => `最后 ${n} 天`, nModels: (n: number) => `${n} 个模型`, nClients: (n: number) => `${n} 个客户端`, diff --git a/packages/app/src/components/agentic-workload-explorer/views/graphs-view.tsx b/packages/app/src/components/agentic-workload-explorer/views/graphs-view.tsx index ca28a7e46..267f483da 100644 --- a/packages/app/src/components/agentic-workload-explorer/views/graphs-view.tsx +++ b/packages/app/src/components/agentic-workload-explorer/views/graphs-view.tsx @@ -166,7 +166,7 @@ const STRINGS = { cacheWrite: '缓存写入', output: '输出', weeklySessionsByHarness: '每周会话数(按 Harness)', - noSessionsInSnapshot: (v: number) => `当前快照中无超过 20 次请求且 trace v${v} 的会话`, + noSessionsInSnapshot: (v: number) => `当前快照中没有请求数超过 20 次且 trace 为 v${v} 的会话`, weekOf: (label: string) => `${label} 当周`, estimatedCostPerHour: '每小时预估成本', hourlyCost: '每小时成本', @@ -189,11 +189,11 @@ const STRINGS = { totalRequests: '总请求数', bucketMinutes: (min: number) => `${min} 分钟分桶`, bucketHours: (h: number) => `${h} 小时分桶`, - wallClockTitle: '时钟时间:Tool/CPU vs LLM/GPU vs 空闲', + wallClockTitle: '墙钟时间:Tool/CPU vs LLM/GPU vs 空闲', wallClockFinal: (days: number) => `(最后 ${days} 天,UTC)`, - wallClockComposition: '时钟时间构成', - shareOfWallClock: '时钟时间占比', - wallClockHoursYAxis: '时钟时间(小时)', + wallClockComposition: '墙钟时间构成', + shareOfWallClock: '墙钟时间占比', + wallClockHoursYAxis: '墙钟时间(小时)', llmGpuLegend: 'LLM / GPU(E2E 延迟)', toolCpuLegend: 'Tool / CPU(客户端)', userIdleLegend: '用户空闲(对话间隔)', @@ -203,7 +203,7 @@ const STRINGS = { traffic: '流量', hourlyActivity: '每小时活跃度', weeklySessions: '每周会话', - wallClock: '时钟时间', + wallClock: '墙钟时间', islTotalDist: 'ISL Total 分布', islTotalAxis: 'ISL 总 Token(Cache Read + Cache Write + Input)', cacheReadDist: 'Cache Read 分布', @@ -234,7 +234,7 @@ const STRINGS = { tokensPerChunkAxis: '输出 Token / SSE Event(tok/chunk)', prefillShareTitle: 'Prefill 占 E2E 延迟比例(TTFT / E2E)', prefillShareAxis: 'TTFT / E2E(prefill 占延迟比例)', - interactivityDist: 'Interactivity 分布', + interactivityDist: '交互性分布', interactivityAxis: 'Interactivity(output tok/s/user)', sessionDurationTitle: (v: number) => `会话时长(> 20 次请求,trace v${v})`, sessionDurationAxis: '会话时长(小时)', diff --git a/packages/app/src/components/agentic-workload-explorer/views/latency-view.tsx b/packages/app/src/components/agentic-workload-explorer/views/latency-view.tsx index a879a0bc5..5a23799d0 100644 --- a/packages/app/src/components/agentic-workload-explorer/views/latency-view.tsx +++ b/packages/app/src/components/agentic-workload-explorer/views/latency-view.tsx @@ -206,9 +206,9 @@ const STRINGS = { ttftDistLabel: 'TTFT 分布', streamingSamples: (n: string) => `${n} 个流式样本`, tpotDistLabel: 'TPOT 分布', - prefillDistLabel: 'Prefill Speed 分布', + prefillDistLabel: 'Prefill 速度分布', prefillDistDetail: (n: string) => `${n} 个流式样本 · input tok/s/query`, - interactDistLabel: 'Interactivity 分布', + interactDistLabel: '交互性分布', interactDistDetail: (n: string) => `${n} 个流式样本 · output tok/s/user`, hourlyLabel: '端到端延迟趋势', hourlyDetail: '最后 48 小时,按小时', diff --git a/packages/app/src/components/agentic-workload-explorer/views/overview-view.tsx b/packages/app/src/components/agentic-workload-explorer/views/overview-view.tsx index 3835ac03f..8c23ccd74 100644 --- a/packages/app/src/components/agentic-workload-explorer/views/overview-view.tsx +++ b/packages/app/src/components/agentic-workload-explorer/views/overview-view.tsx @@ -100,13 +100,13 @@ const STRINGS = { cacheHitRateTooltip: 'cacheRead / (cacheRead + input) — 由缓存提供的输入 token 百分比', turnsPerSession: '每会话轮数', gapSeconds: '间隔(秒)', - ttftP90: 'TTFT (p90)', + ttftP90: 'TTFT(p90)', ttftTooltip: '首 token 延迟(流式请求)', - tpotP90: 'TPOT (p90)', + tpotP90: 'TPOT(p90)', tpotTooltip: '每输出 token 耗时(流式请求)', - prefillSpeedP50: 'Prefill 速度 (p50)', + prefillSpeedP50: 'Prefill 速度(p50)', prefillSpeedTooltip: 'Prefill 速度:(cacheRead + cacheWrite) / TTFT(带缓存的流式请求)', - interactivityP90: '交互性 (p90)', + interactivityP90: '交互性(p90)', interactivityTooltip: '每客户端每秒 token 数 (1000 / TPOT)', tokenDetail: (inp: string, cr: string, cw: string, out: string) => `${inp} 输入 · ${cr} 缓存读 · ${cw} 缓存写 · ${out} 输出`, diff --git a/packages/app/src/components/agentic-workload-explorer/views/proxy-health-view.tsx b/packages/app/src/components/agentic-workload-explorer/views/proxy-health-view.tsx index ed8ee4457..b675a4d49 100644 --- a/packages/app/src/components/agentic-workload-explorer/views/proxy-health-view.tsx +++ b/packages/app/src/components/agentic-workload-explorer/views/proxy-health-view.tsx @@ -49,7 +49,7 @@ const STRINGS = { totalRequests: '总请求数', errorRate: '错误率', routes: '路由', - errorsFinal24h: '错误(最后 24h)', + errorsFinal24h: '错误(最后 24 小时)', final7days: '最后 7 天', errors: (n: string) => `${n} 个错误`, uniqueEndpoints: '独立端点', diff --git a/packages/app/src/components/agentic-workload-explorer/views/sessions-view.tsx b/packages/app/src/components/agentic-workload-explorer/views/sessions-view.tsx index f1d0db3e4..8d832389d 100644 --- a/packages/app/src/components/agentic-workload-explorer/views/sessions-view.tsx +++ b/packages/app/src/components/agentic-workload-explorer/views/sessions-view.tsx @@ -64,7 +64,7 @@ const STRINGS = { zh: { sessions: '会话列表', total: '总计', - searchPlaceholder: '搜索会话...', + searchPlaceholder: '搜索会话…', minReqs: { '20': '> 20 请求', '100': '> 100 请求', '0': '全部' } as Record, allVersions: '所有版本', allHarnesses: '全部 harness', diff --git a/packages/app/src/components/agentic-workload-explorer/views/tool-analytics-view.tsx b/packages/app/src/components/agentic-workload-explorer/views/tool-analytics-view.tsx index c387c4916..a96da012e 100644 --- a/packages/app/src/components/agentic-workload-explorer/views/tool-analytics-view.tsx +++ b/packages/app/src/components/agentic-workload-explorer/views/tool-analytics-view.tsx @@ -455,7 +455,7 @@ const STRINGS = { repeatShareDetail: '连续重复调用同一工具的比例', longestStreak: '最长连续调用', longestStreakDetail: '单会话中同一工具的最大连续调用次数', - sessionsMined: '已分析会话数', + sessionsMined: '已挖掘会话数', sessionsMinedDetail: (calls: string, steps: string) => `${calls} 次工具调用 → ${steps} 步(合并后)`, recurringMotifs: '常见模式', @@ -475,22 +475,22 @@ const STRINGS = { '交替 A→B→A→B 的 2+ 完整周期片段——编辑/验证和读取/调整反馈循环。Cycles = 每段 A→B 往返次数。', noRecurringLoops: '未发现循环模式', toolWallTime: '工具耗时', - turnaroundByTool: '按工具分组的响应时间', + turnaroundByTool: '按工具分组的周转时间', clientSideWallTime: '(客户端耗时)', turnaroundByToolDescription: (single: string, total: string, pct: string, batchLabel: string) => `从 tool_use 响应结束到同一会话 lane 的下一条 tool_result 请求之间的时间——包含工具执行和 harness 开销。仅统计单工具 turn(${single} / ${total} 个 tool turns,${pct}%);并行 tool call 的 turn 归入${batchLabel};超过 30 分钟的间隔视为空闲已排除。`, - turnaroundDistribution: '响应时间分布', + turnaroundDistribution: '周转时间分布', colSamples: '样本数', colMean: '均值', - turnaroundShapeByOs: '按操作系统的响应时间分布', + turnaroundShapeByOs: '按操作系统的周转时间分布', splitByArch: '按架构拆分', turnaroundShapeDescription: - '按对数间隔 bin 统计的样本占比,各系列独立归一化。会话的 OS/arch 来自客户端元数据(SDK headers,或 Codex user-agent)。虚线为中位数;样本不足 200 的平台已隐藏。', + '按对数间隔 bin 统计的样本占比,各系列独立归一化。会话的 OS/arch 来自客户端元数据(SDK headers;无 headers 时使用 Codex user-agent)。虚线为中位数;样本不足 200 的平台已隐藏。', agent: 'Agent', tool: '工具', - turnaroundAxisLabel: '响应时间(对数坐标)', + turnaroundAxisLabel: '周转时间(对数坐标)', medianTurnaroundByOs: (splitArch: boolean) => - `按${splitArch ? '平台' : '操作系统'}的中位响应时间`, + `按${splitArch ? '平台' : '操作系统'}的中位周转时间`, medianTurnaroundDescription: (splitArch: boolean) => `p50 及下方 p90,按工具和${splitArch ? 'OS/arch' : 'OS'}分组。与图表使用相同的客户端耗时样本——差异来自 OS + 机器 + harness 开销,而非模型延迟。`, bashBreakdown: 'Bash 分类统计', @@ -522,7 +522,7 @@ const STRINGS = { explicitToolErrorRate: '显式工具错误率', errorRateDetail: (errors: string, matched: string) => `${errors} 个错误 / ${matched} 个 Anthropic 匹配结果`, - verifiedEdited: '已验证已编辑', + verifiedEdited: '编辑后已验证', verifiedEditedDetail: (verified: string, edited: string) => `${verified} / ${edited} 个已编辑会话`, finalVerifiedPass: '最终验证通过', @@ -530,7 +530,7 @@ const STRINGS = { uniqueToolTypes: '工具类型数', sessionsAnalyzed: '已分析会话数', avgToolsPerSession: '平均每会话工具数', - recoveredFailures: '已恢复失败', + recoveredFailures: '失败后恢复', recoveredFailuresDetail: (recovered: string, total: string) => `${recovered} 个已恢复 / ${total} 个含最终失败信号的会话`, distribution: '分布', diff --git a/packages/app/src/components/ai-chart/example-prompts.ts b/packages/app/src/components/ai-chart/example-prompts.ts index 75e8c1f08..85827e43e 100644 --- a/packages/app/src/components/ai-chart/example-prompts.ts +++ b/packages/app/src/components/ai-chart/example-prompts.ts @@ -12,7 +12,7 @@ export const EXAMPLE_PROMPTS = { '用条形图对比 DeepSeek R1 在 H100、B200 和 GB200 上每百万 token 的 hyperscaler 成本', '对比 Kimi K2.5 与 DeepSeek R1 在 8k/1k 下的单芯片吞吐量', 'DeepSeek R1 在哪种芯片上的 GSM8K 准确率最高?', - '对比各类芯片的可靠性和运行成功率', + '对比各类芯片的可靠性(运行成功率)', '绘制 DeepSeek R1 在 8k/1k 下所有芯片配置的散点图,纵轴为单芯片吞吐量', ], } as const; diff --git a/packages/app/src/components/calculator/CostTargetPanel.tsx b/packages/app/src/components/calculator/CostTargetPanel.tsx index f63b6932c..690c6e473 100644 --- a/packages/app/src/components/calculator/CostTargetPanel.tsx +++ b/packages/app/src/components/calculator/CostTargetPanel.tsx @@ -86,9 +86,9 @@ const STRINGS = { costCapNoGpus: '当前无可见芯片可评估。请在图表图例中启用硬件。', note: '注:', disaggFleet: - ' 解耦推理配置(如 MoRI SGLang、Dynamo TRTLLM)的输入与输出吞吐量分别按预填充芯片与解码芯片报告,而非按芯片总数,因此在「输入」与「输出」token 类型下,成本上限所允许的交互性沿用了上述按池计的口径。在「总计」口径下,两种部署方式均按芯片总数计。', + ' 分离式推理配置(如 MoRI SGLang、Dynamo TRTLLM)的输入与输出吞吐量分别按预填充芯片与解码芯片报告,而非按芯片总数,因此在「输入」与「输出」token 类型下,成本上限所允许的交互性沿用了上述按池计的口径。在「总计」口径下,两种部署方式均按芯片总数计。', assumptions: (tier: string) => - `假设结果操作点下 100% 利用率,并采用 ${tier} 层级的自有数据中心经济模型。如显示并发用户数,则已改按芯片总数计。`, + `假设在给出结果的运行点上利用率为 100%,并采用 ${tier} 层级的自有数据中心经济模型。如显示并发用户数,则已改按芯片总数计。`, source: '来源:', }, } as const; diff --git a/packages/app/src/components/calculator/FirstTokenLimitsDisplay.tsx b/packages/app/src/components/calculator/FirstTokenLimitsDisplay.tsx index 0d279284f..4bf717b90 100644 --- a/packages/app/src/components/calculator/FirstTokenLimitsDisplay.tsx +++ b/packages/app/src/components/calculator/FirstTokenLimitsDisplay.tsx @@ -160,10 +160,10 @@ const STRINGS = { '哪款芯片最优,取决于用户能接受多长的首 token 等待。本页面按每一档首 token 延迟(TTFT)上限,从同时满足交互性下限的实测配置中,逐厂商选出成本最低的一个。仅使用实测数据,不做插值,每个柱形都可追溯到对应的运行记录。', benchmarkGroup: '基准测试配置', chartGroup: '图表配置', - costProviderLabel: '成本供应商', + costProviderLabel: '计价方式', costProviderTooltip: - '柱形成本采用的定价层级。按超大规模云厂商大批量采购价自有(如 AWS/GCP)或 3 年承诺租赁。带锁的租赁期限(按需至 2 年承诺)收录于 SemiAnalysis AI Cloud TCO 模型。', - costProviderPlaceholder: '成本供应商', + '柱形成本采用的定价层级。按超大规模云厂商的大批量采购价格自购(如 AWS/GCP)或 3 年承诺租赁。带锁的租赁期限(按需至 2 年承诺)收录于 SemiAnalysis AI Cloud TCO 模型。', + costProviderPlaceholder: '计价方式', tokenTypeLabel: 'Token 类型', tokenTypeTooltip: '成本按每百万总 token、输入 token 还是输出 token 计。分离式配置的输入、输出吞吐量分别按 prefill 芯片和 decode 芯片统计,因此其输入、输出口径的成本并非按全部芯片计。', @@ -183,7 +183,7 @@ const STRINGS = { noTtft: (stat: string) => `${zhStatPhrase('首 token 延迟', stat, '当前选择的实测数据行未报告')},无法施加上限。请尝试其他工作负载或运行日期。`, noneUnderCaps: (cap: string, stat: string) => - `${zhStatPhrase('首 token 延迟', stat, '实测配置达到了交互性下限,但没有任何配置的')}落在本梯度最大上限(≤${cap}s)之内。请提高或新增上限后再比较首 token 延迟约束。`, + `${zhStatPhrase('首 token 延迟', stat, '实测配置达到了交互性下限,但没有任何配置的')}落在本阶梯的最大上限(≤${cap}s)之内。请提高或新增上限后再比较首 token 延迟约束。`, captionFloor: (min: number, stat: string) => `${zhStatPhrase('交互性', stat)} ≥${min} tok/s/user`, captionRows: (qualifying: number, measured: number) => diff --git a/packages/app/src/components/calculator/FleetLifecycle.tsx b/packages/app/src/components/calculator/FleetLifecycle.tsx index 4472175b2..34c6950bd 100644 --- a/packages/app/src/components/calculator/FleetLifecycle.tsx +++ b/packages/app/src/components/calculator/FleetLifecycle.tsx @@ -252,7 +252,7 @@ const STRINGS = { captionPrices: (input: string, output: string, cachedPct: string | null) => `输入 $${input} / 输出 $${output} 每百万 token${cachedPct === null ? '' : `,缓存 ${cachedPct}%`}`, description: - '固定集群自模型发布之日起的表现。芯片始终不变,变化的是为其提供服务的软件。每次推广采用的配置都优于此前所有配置,并从集群当前服务水平逐步爬升至新配置水平。曲线与成本线之间的差距,就是这些优化工作的回报。', + '固定集群自模型发布之日起的表现。芯片始终不变,变化的是为其提供服务的软件。每次部署采用的配置都优于此前所有配置,并从集群当前服务水平逐步爬升至新配置水平。曲线与成本线之间的差距,就是这些优化工作的回报。', tooSmall: '该功率预算不足以为所示任一芯片供电。请尝试更大的数值。', mwLabel: '设施功率 (MW)', mwTooltip: @@ -332,9 +332,9 @@ const STRINGS = { `在该功率预算下无法为 ${chips} 组建集群。该芯片缺少已登记的功耗数据,或其实测吞吐无法组成任何规模。此处列出而非直接剔除,以免图表静默遗漏芯片。`, note: '注意:', disagg: - '台阶可以由解耦配置取得,且该次交接是同类比较:两种部署方式的总 tok/s/chip 均按芯片总数报告,且预填充与解码使用的是同一种硅片,因此切换时集群规模与成本线均不发生变化。当本模块需要输入或输出 token 的单独数值时(用于台阶排序,或将两类 token 分别计价),它由该总量与该次运行实测的 token 构成比推导得出,而非直接读取每芯片的输入/输出速率。在解耦部署下,这两个速率分别按预填充芯片与解码芯片计算,这也正是别处吞吐图表标注其不可直接比较的原因;改为推导可使本模块的所有比较统一在同一分母上。真正改变的是集群形态。自该配置开始推广起,其预填充:解码比例被假定应用于整个集群。实际部署中,这相当于一次重新部署,由爬坡期窗口代为体现,并非实测值。每一级台阶标注的配置即说明其类型。', + '台阶可以由分离式配置取得,且该次交接是同类比较:两种部署方式的总 tok/s/chip 均按芯片总数报告,且预填充与解码使用的是同一款芯片,因此切换时集群规模与成本线均不发生变化。当本模块需要输入或输出 token 的单独数值时(用于台阶排序,或将两类 token 分别计价),它由该总量与该次运行实测的 token 构成比推导得出,而非直接读取每芯片的输入/输出速率。在分离式部署下,这两个速率分别按预填充芯片与解码芯片计算,这也正是别处吞吐图表标注其不可直接比较的原因;改为推导可使本模块的所有比较统一在同一分母上。真正改变的是集群形态。自该配置开始部署起,其预填充:解码比例被假定应用于整个集群。实际部署中,这相当于一次重新部署,由爬坡期窗口代为体现,并非实测值。每一级台阶标注的配置即说明其类型。', hybrid: - '每款芯片一条曲线,而非每个软件配置一条:曲线在任一时刻都跟随当时领先的框架、精度与投机解码组合,因此服务集群的配置会沿曲线变化,每一级台阶都标注接管的配置。图例项仍可筛选配置,被隐藏的配置将不参与竞争。每一级台阶都是一个实测运行日期,其在目标交互性下的插值吞吐量优于此前所有日期;未能超越现有配置的扫描不构成台阶,因为集群仍在运行原有配置。配置不会在扫描发现的瞬间生效,因此每个配置都会在推广期内从集群当前已提供的水平爬升至其自身水平。功率与 $/chip/hr 为 TCO 模型的当前值,成本在整个期间保持水平,因为任何配置都不会改变这两项。两种情况下都是同一款芯片。超出某次运行实测交互性区间的结果会被排除而非钳制。', + '每款芯片一条曲线,而非每个软件配置一条:曲线在任一时刻都跟随当时领先的框架、精度与投机解码组合,因此服务集群的配置会沿曲线变化,每一级台阶都标注接管的配置。图例项仍可筛选配置,被隐藏的配置将不参与竞争。每一级台阶都是一个实测运行日期,其在目标交互性下的插值吞吐量优于此前所有日期;未能超越现有配置的扫描不构成台阶,因为集群仍在运行原有配置。配置不会在扫描发现的瞬间生效,因此每个配置都会在爬坡期内从集群当前已提供的水平爬升至其自身水平。功率与 $/chip/hr 为 TCO 模型的当前值,成本在整个期间保持水平,因为任何配置都不会改变这两项。两种情况下都是同一款芯片。超出某次运行实测交互性区间的结果会被排除而非钳制。', overlayExempt: '通过运行链接加载的非官方运行不会显示在此,因为运行历史 API 仅提供已入库的官方结果。', metricLabel: 'Y 轴', diff --git a/packages/app/src/components/calculator/FleetLifecycleDisplay.tsx b/packages/app/src/components/calculator/FleetLifecycleDisplay.tsx index d4345da6c..a6e080d73 100644 --- a/packages/app/src/components/calculator/FleetLifecycleDisplay.tsx +++ b/packages/app/src/components/calculator/FleetLifecycleDisplay.tsx @@ -103,10 +103,10 @@ const STRINGS = { '选择模型、工作负载和目标交互性。下方会根据设施功率预算,分别确定各款芯片的固定集群规模,并按目标交互性读取历次运行的数据。各条曲线的含义见下方说明。', benchmarkGroup: '基准测试配置', chartGroup: '图表配置', - costProviderLabel: '成本供应商', + costProviderLabel: '计价方式', costProviderTooltip: - '集群成本线采用的定价层级。按超大规模云厂商大批量采购价自有(如 AWS/GCP)或 3 年承诺租赁。带锁的租赁期限(按需至 2 年承诺)收录于 SemiAnalysis AI Cloud TCO 模型。', - costProviderPlaceholder: '成本供应商', + '集群成本线采用的定价层级。按超大规模云厂商的大批量采购价格自购(如 AWS/GCP)或 3 年承诺租赁。带锁的租赁期限(按需至 2 年承诺)收录于 SemiAnalysis AI Cloud TCO 模型。', + costProviderPlaceholder: '计价方式', tokenTypeLabel: 'Token 类型', tokenTypeTooltip: '表格中每芯片指标按总 token、仅输入 token 还是仅输出 token 计。收入始终同时计入两类 token。', diff --git a/packages/app/src/components/calculator/ProfitEstimatorDisplay.tsx b/packages/app/src/components/calculator/ProfitEstimatorDisplay.tsx index efc696836..1a7260d07 100644 --- a/packages/app/src/components/calculator/ProfitEstimatorDisplay.tsx +++ b/packages/app/src/components/calculator/ProfitEstimatorDisplay.tsx @@ -323,11 +323,11 @@ const STRINGS = { powerDetails: `GPU 功耗在相同的吞吐量数据点间插值,计入 PUE(风冷机箱为 ${AIR_COOLED_SYSTEM_PUE},液冷 NVL72 为 ${LIQUID_COOLED_RACK_PUE})和 10% 功耗余量。聚合多节点按部署平均功耗估算各台服务器。NVL72 tray 平均分摊同一个建模机架的功耗;运行带有已验证的 Grace socket 遥测时使用实测功耗,否则使用 Grace 功耗估算值,两者不会相互插值。整机外推假设八卡服务器部署多个相同的实测单卡、双卡或四卡实例,每卡功耗和吞吐量保持不变;它不代表部分 GPU 闲置时的整机实测功耗。`, csvPowerHeaders: ['功耗口径', '功耗模型版本'], pricingGroup: '定价配置', - costProviderLabel: '成本供应商', + costProviderLabel: '计价方式', costProviderTooltip: - '算力支出分段采用的 TCO 层级:按超大规模云厂商大批量采购价自有(如 AWS/GCP)或 3 年承诺租赁,单位为 $/GPU/hr,来自 SemiAnalysis AI Cloud TCO 模型。选择自定义可为每种芯片输入自己的 $/GPU/hr。带锁的租赁期限(按需至 2 年承诺)收录于 TCO 模型。', + '算力支出分段采用的 TCO 层级:按超大规模云厂商的大批量采购价格自购(如 AWS/GCP)或 3 年承诺租赁,单位为 $/GPU/hr,来自 SemiAnalysis AI Cloud TCO 模型。选择自定义可为每种芯片输入自己的 $/GPU/hr。带锁的租赁期限(按需至 2 年承诺)收录于 TCO 模型。', customCostLabel: (gpu: string) => `${gpu} $/GPU/hr`, - costProviderPlaceholder: '成本供应商', + costProviderPlaceholder: '计价方式', priceSourceLabel: 'Token 售价', priceSourceTooltip: '每百万 token 售价的来源。OpenRouter 读取该模型的公开目录价格;官方定价为模型厂商公布的 API 价格,在第三方托管方报价低于官方时提供;自定义则可自行输入输入/输出价格。', diff --git a/packages/app/src/components/calculator/ThroughputCalculatorDisplay.test.ts b/packages/app/src/components/calculator/ThroughputCalculatorDisplay.test.ts index 8f614e028..465f8cdea 100644 --- a/packages/app/src/components/calculator/ThroughputCalculatorDisplay.test.ts +++ b/packages/app/src/components/calculator/ThroughputCalculatorDisplay.test.ts @@ -2,6 +2,7 @@ import { describe, expect, it } from 'vitest'; import { getChartTitleZh, + formatCalculatorRatioZh, resolveCalculatorBarSelection, resolveCalculatorTarget, resolveCalculatorTargetInputValue, @@ -67,3 +68,21 @@ describe('calculator effective state selectors', () => { expect(resolveCalculatorBarSelection(intent, 'old', new Set(['b']))).toEqual(new Set(['b'])); }); }); + +describe('calculator Chinese ratio comparisons', () => { + it.each([ + [150, 100, '1.5'], + [100, 100, '1.0'], + [200, 100, '2.0'], + ])('expresses %s / %s as a multiple of the baseline', (higher, lower, multiple) => { + expect(formatCalculatorRatioZh('B200', 'H100', '吞吐量', higher / lower)).toBe( + `B200 的吞吐量是 H100 的 ${multiple} 倍`, + ); + }); + + it('also formats cost multiples without implying a percentage increase', () => { + expect(formatCalculatorRatioZh('H100', 'B200', '成本', 3 / 2)).toBe( + 'H100 的成本是 B200 的 1.5 倍', + ); + }); +}); diff --git a/packages/app/src/components/calculator/ThroughputCalculatorDisplay.tsx b/packages/app/src/components/calculator/ThroughputCalculatorDisplay.tsx index b5eb6f087..e1e5b73b8 100644 --- a/packages/app/src/components/calculator/ThroughputCalculatorDisplay.tsx +++ b/packages/app/src/components/calculator/ThroughputCalculatorDisplay.tsx @@ -259,7 +259,7 @@ const STRINGS = { '设定目标交互性(tokens/sec/user),比较所有芯片的吞吐量和成本。数值基于真实基准测试数据插值计算。', costProviderLabel: '计价方式', costProviderTooltip: - '用于计算每百万 token 成本的定价层级。按超大规模云厂商大批量采购价自有(如 AWS/GCP)或 3 年承诺租赁。带锁的租赁期限(按需至 2 年承诺)收录于 SemiAnalysis AI Cloud TCO 模型。', + '用于计算每百万 token 成本的定价层级。按超大规模云厂商的大批量采购价格自购(如 AWS/GCP)或 3 年承诺租赁。带锁的租赁期限(按需至 2 年承诺)收录于 SemiAnalysis AI Cloud TCO 模型。', costProviderPlaceholder: '计价方式', tokenTypeLabel: 'token 类型', tokenTypeTooltip: '选择显示总 token、仅输入 token 还是仅输出 token 的成本。', @@ -296,9 +296,9 @@ const STRINGS = { updated: ' • 更新于:', note: '注意:', disaggCost: - '分离式推理配置(如 MoRI SGLang、Dynamo TRTLLM)的输入与输出吞吐量分别按预填充芯片与解码芯片报告,而非按芯片总数,而 $/M tok 由这些速率推导。因此在「输入」与「输出」token 类型下,分离式配置显示的成本低于实际,中位数偏低 2 倍,在运行历史中最高达 18 倍。总计口径的成本不受影响:它来自按芯片总数计的吞吐量,两种部署方式在该口径上一致。「集群生命周期」页面与此有意不同:它由该总量推导各 token 类型的数值,因此那里的所有数字都在同一分母上。', + '分离式推理配置(如 MoRI SGLang、Dynamo TRTLLM)的输入与输出吞吐量分别按预填充芯片与解码芯片报告,而非按芯片总数,而 $/M tok 由这些速率推导。因此在「输入」与「输出」token 类型下,分离式配置显示的成本低于实际,中位数仅为实际值的 1/2,在运行历史中最低可至 1/18。总计口径的成本不受影响:它来自按芯片总数计的吞吐量,两种部署方式在该口径上一致。「集群生命周期」页面与此有意不同:它由该总量推导各 token 类型的数值,因此那里的所有数字都在同一分母上。', disaggThroughput: - '分离式推理配置(如 MoRI SGLang、Dynamo TRTLLM)的输入与输出吞吐量分别按预填充芯片与解码芯片报告,而非按芯片总数。由于除以的芯片数更少,在「输入」与「输出」token 类型下,分离式配置显示的每芯片吞吐量高于实际,中位数偏高 2 倍,输入最高达 18 倍、输出最高达 7 倍。总计口径的吞吐量不受影响:两种部署方式均按芯片总数报告。「集群生命周期」页面与此有意不同:它由该总量推导各 token 类型的数值,因此那里的所有数字都在同一分母上。', + '分离式推理配置(如 MoRI SGLang、Dynamo TRTLLM)的输入与输出吞吐量分别按预填充芯片与解码芯片报告,而非按芯片总数。由于除以的芯片数更少,在「输入」与「输出」token 类型下,分离式配置显示的每芯片吞吐量高于实际,中位数为实际值的 2 倍,输入最高达 18 倍、输出最高达 7 倍。总计口径的吞吐量不受影响:两种部署方式均按芯片总数报告。「集群生命周期」页面与此有意不同:它由该总量推导各 token 类型的数值,因此那里的所有数字都在同一分母上。', fleetMoved: '「集群生命周期」已移至独立页面:按功率预算确定固定集群的规模,结合每次实测配置改进,测算其整个生命周期的经济性。', fleetMovedLink: '打开集群生命周期', @@ -314,6 +314,15 @@ const STRINGS = { }, } as const; +export function formatCalculatorRatioZh( + higherLabel: string, + lowerLabel: string, + metricName: string, + ratio: number, +): string { + return `${higherLabel} 的${metricName}是 ${lowerLabel} 的 ${ratio.toFixed(1)} 倍`; +} + export function getChartTitleZh( barMetric: BarMetric, mode: CalculatorMode, @@ -788,7 +797,7 @@ function ThroughputCalculatorInner({ initialPercentile }: { initialPercentile: P const ratio = higherVal / lowerVal; if (locale === 'zh') { comparisons.push( - `${getLabel(higher)} 的${metricName}比 ${getLabel(lower)} 高 ${ratio.toFixed(1)} 倍`, + formatCalculatorRatioZh(getLabel(higher), getLabel(lower), metricName, ratio), ); } else { comparisons.push( diff --git a/packages/app/src/components/collectivex/CollectiveXDisplay.tsx b/packages/app/src/components/collectivex/CollectiveXDisplay.tsx index 68f8db70a..4f8902acf 100644 --- a/packages/app/src/components/collectivex/CollectiveXDisplay.tsx +++ b/packages/app/src/components/collectivex/CollectiveXDisplay.tsx @@ -214,8 +214,8 @@ const STRINGS = { loadRuns: '加载运行', loadingRuns: '正在加载运行……', latestPublished: '最新运行', - modeControl: '模式', - modeAria: 'CollectiveX 模式', + modeControl: 'Kernel 模式', + modeAria: 'CollectiveX Kernel 模式', epControl: 'EP 并行度', operationControl: '操作', phaseControl: '阶段', diff --git a/packages/app/src/components/collectivex/known-support.ts b/packages/app/src/components/collectivex/known-support.ts index 307da7b46..16ec04eab 100644 --- a/packages/app/src/components/collectivex/known-support.ts +++ b/packages/app/src/components/collectivex/known-support.ts @@ -85,7 +85,7 @@ export const COLLECTIVEX_KNOWN_FOOTNOTES: Record = { 'Supports eight-GPU HGX/OAM chassis and GB200/GB300 NVL72, where measured Grace-socket power ' + 'is a second input and every compute tray takes an equal share of a modeled rack.', zh: - '每已分配加速器的整体实测功耗:InferenceX 功耗模型根据该次运行的工作负载状态和 scale-out 设置,将 GPU 实测功耗换算为 IT 功耗,再乘以一次 PUE。' + + '每个已分配加速器的设施级建模功耗:InferenceX 功耗模型根据该次运行的工作负载状态和 scale-out 设置,将 GPU 实测功耗换算为 IT 功耗,再乘以一次 PUE。' + '支持八卡 HGX/OAM 机箱和 GB200/GB300 NVL72;NVL72 另以 Grace socket 实测功耗为输入,每个计算 tray 平均分摊建模机架的功耗。', }, formula: { @@ -471,12 +471,12 @@ export const METRIC_EXPLANATIONS: Record = { 'measured GPU energy equals the ratio of modeled facility power to measured GPU power. ' + 'Missing where the system power model or validated measured power is unavailable.', zh: - '将实测每输出 token 能耗按整体实测功耗边界缩放,其与 GPU 实测能耗之比等于整体实测功耗与 GPU 实测功耗之比。' + + '将实测每输出 token 能耗按设施级建模功耗边界缩放,其与 GPU 实测能耗之比等于设施级建模功耗与 GPU 实测功耗之比。' + '系统功耗模型或通过验证的实测功耗缺失时不显示。', }, formula: { en: 'J/tok = measured J per output token × modeled facility W per GPU ÷ measured W per GPU', - zh: 'J/tok = 实测每输出 token 能耗 × 每 GPU 整体实测功耗(W)÷ 每 GPU 实测功耗(W)', + zh: 'J/tok = 实测每输出 token 能耗 × 每 GPU 设施级建模功耗(W)÷ 每 GPU 实测功耗(W)', }, }, }; diff --git a/packages/app/src/components/inference/ui/AgenticOptimizationNote.tsx b/packages/app/src/components/inference/ui/AgenticOptimizationNote.tsx index ba9823e7b..10082a08a 100644 --- a/packages/app/src/components/inference/ui/AgenticOptimizationNote.tsx +++ b/packages/app/src/components/inference/ui/AgenticOptimizationNote.tsx @@ -11,7 +11,7 @@ const STRINGS = { zh: { label: '已启用推理优化', aria: '关于推理优化', - details: '每项配置可能使用推测解码等推理优化。将鼠标悬停在数据点上可查看其具体设置。', + details: '每项配置可能使用投机解码等推理优化。将鼠标悬停在数据点上可查看其具体设置。', }, } as const; diff --git a/packages/app/src/components/inference/ui/model-architecture-ced.ts b/packages/app/src/components/inference/ui/model-architecture-ced.ts index 78fd72ec3..98c8da100 100644 --- a/packages/app/src/components/inference/ui/model-architecture-ced.ts +++ b/packages/app/src/components/inference/ui/model-architecture-ced.ts @@ -45,7 +45,7 @@ export function renderCausalEncoderDecoder( const attentionDetail = { 'joint-local-swa-and-shared-global-kv': { en: 'Over local SWA + shared global KV', - zh: '共同关注局部 SWA 与共享全局 KV', + zh: '作用于局部 SWA 与共享全局 KV', }, }[decoderAttention][locale]; const width = Math.min(svgEl.clientWidth || svgEl.parentElement?.clientWidth || 600, 640); diff --git a/packages/app/src/components/ubenchx/SmL2Heatmap.tsx b/packages/app/src/components/ubenchx/SmL2Heatmap.tsx index 57089ffa5..3ba7449cc 100644 --- a/packages/app/src/components/ubenchx/SmL2Heatmap.tsx +++ b/packages/app/src/components/ubenchx/SmL2Heatmap.tsx @@ -48,7 +48,7 @@ const STRINGS = { tooltipCol: '列', methodology: '测试方法', methodologyText: - 'L2 指针追踪基准测试:每个 SM 沿链表遍历 L2 缓存行,通过 clock64() 记录每跳延迟。矩阵展示每对 SM 的逐地址延迟向量的平均绝对差,揭示 L2 分区的共享亲和度。', + 'L2 指针追踪基准测试:每个 SM 沿链表遍历 L2 缓存行,通过 clock64() 记录每跳延迟。矩阵展示每对 SM 的逐地址延迟向量的平均绝对差,揭示共享 L2 分区的远近关系。', statsIntraGpc: 'GPC 内平均', statsInterGpc: '跨 GPC(同 die)平均', statsCrossDie: '跨 die 平均', diff --git a/packages/app/src/components/ui/share-buttons.tsx b/packages/app/src/components/ui/share-buttons.tsx index 1d8d9c09b..c93aa8535 100644 --- a/packages/app/src/components/ui/share-buttons.tsx +++ b/packages/app/src/components/ui/share-buttons.tsx @@ -15,7 +15,7 @@ const STRINGS = { }, zh: { shareText: - '探索 InferenceX:开源测试智能体推理与固定序列 AI 推理,并提供来自公开芯片运行的 AgentX 结果。', + '探索 InferenceX:开源智能体推理与固定序列 AI 推理基准测试,并提供来自公开芯片运行的 AgentX 结果。', twitter: '分享到 X(推特)', linkedin: '分享到 LinkedIn', }, diff --git a/packages/app/src/components/ui/unofficial-domain-notice.tsx b/packages/app/src/components/ui/unofficial-domain-notice.tsx index c598b9407..159292d4f 100644 --- a/packages/app/src/components/ui/unofficial-domain-notice.tsx +++ b/packages/app/src/components/ui/unofficial-domain-notice.tsx @@ -14,14 +14,15 @@ const STRINGS = { }, zh: { note: '注意:', - text: '与 SemiAnalysis 无关联或背书。此处显示的数据可能为非官方、已修改或过期数据——请访问官方网站获取权威的 InferenceX™ 结果。', + text: '上,且与 SemiAnalysis 无关联,也未获其背书。此处显示的数据可能为非官方、已修改或过期数据——请访问官方网站获取权威的 InferenceX™ 结果。', notHosted: '此部署未托管在', }, } as const; export function UnofficialDomainNotice() { const isUnofficial = useUnofficialDomain(); - const t = STRINGS[useLocale()]; + const locale = useLocale(); + const t = STRINGS[locale]; if (!isUnofficial) return null; @@ -35,7 +36,8 @@ export function UnofficialDomainNotice() { className="underline hover:text-foreground" > {OFFICIAL_HOSTNAME} - {' '} + + {locale === 'zh' ? '' : ' '} {t.text}

); diff --git a/packages/app/src/lib/agentic-workload-explorer/page-meta.ts b/packages/app/src/lib/agentic-workload-explorer/page-meta.ts index 137f9dacb..57517169c 100644 --- a/packages/app/src/lib/agentic-workload-explorer/page-meta.ts +++ b/packages/app/src/lib/agentic-workload-explorer/page-meta.ts @@ -73,7 +73,7 @@ export const EXPLORER_SECTION_META = { title: 'Costs', description: 'List-price cost of the snapshot traffic by model and token type.', }, - zh: { title: '成本', description: '按模型与 token 类型统计的快照流量标价成本。' }, + zh: { title: '成本', description: '按模型与 token 类型统计的快照流量成本,按标价计算。' }, }, '/fast-mode': { en: { @@ -155,7 +155,7 @@ export const EXPLORER_SESSION_TAB_META = { statistics: { en: 'Statistics', zh: '统计' }, 'prefill-vs-decode': { en: 'Prefill vs Decode', zh: 'Prefill 与 Decode' }, flamegraph: { en: 'Flamegraph', zh: '火焰图' }, - 'tokens-over-time': { en: 'Tokens Over Time', zh: 'Token 时间分布' }, + 'tokens-over-time': { en: 'Tokens Over Time', zh: 'Token 随时间变化' }, timeline: { en: 'Timeline', zh: '时间线' }, flow: { en: 'Flow', zh: '流程图' }, 'radix-tree': { en: 'Radix Tree', zh: 'Radix Tree' }, diff --git a/packages/app/src/lib/agentx/quickstart.ts b/packages/app/src/lib/agentx/quickstart.ts index b756bf6df..92c5e8bb2 100644 --- a/packages/app/src/lib/agentx/quickstart.ts +++ b/packages/app/src/lib/agentx/quickstart.ts @@ -46,7 +46,7 @@ export const AGENTX_QUICKSTART = { 'Set your model, server URL, and session concurrency, then run this with Python 3.11–3.13. The full guide includes optional routing headers.', }, zh: { - title: '用 AgentX 测试自己的芯片', + title: '用 AgentX 对自己的芯片做基准测试', description: '安装 agentx-harness,连接推理服务器,即可在自己的硬件上回放公开的智能体工作负载。', run: '运行 AgentX', @@ -64,7 +64,7 @@ export const AGENTX_QUICKSTART = { guide: '查看完整快速入门指南', back: 'AgentX 数据集', methodology: '基准测试方法', - repository: '测试工具文档', + repository: 'Harness 文档', summary: '设置模型、服务器 URL 和并发会话数,然后使用 Python 3.11–3.13 运行以下命令。完整指南包含可选路由 header。', }, diff --git a/packages/app/src/lib/hardware/hardware-copy.ts b/packages/app/src/lib/hardware/hardware-copy.ts index 0e2a2b036..0f1bb427d 100644 --- a/packages/app/src/lib/hardware/hardware-copy.ts +++ b/packages/app/src/lib/hardware/hardware-copy.ts @@ -16,8 +16,8 @@ export const HARDWARE_COPY = { indexEyebrow: 'InferenceX 研究', indexTitle: '硬件结果', indexIntro: - '新一代加速器系统的 AgentX 对比结果:在相同交互性下,比较每美元 TCO、每 MW 与每颗芯片的 token 数。', - indexDescription: `${SITE_NAME} 发布的新一代加速器系统 AgentX 对比结果,在相同交互性下比较每美元 TCO、每 MW 与每颗芯片的 token 数。`, + '新一代加速器系统的 AgentX 对比结果:在相同交互性下,比较每美元 TCO、每 MW 和每颗芯片分别产出的 token 数。', + indexDescription: `${SITE_NAME} 发布的新一代加速器系统 AgentX 对比结果,在相同交互性下比较每美元 TCO、每 MW 和每颗芯片分别产出的 token 数。`, indexEmpty: '即将上线。', readResults: '查看结果', }, diff --git a/packages/app/src/lib/nudges/registry.tsx b/packages/app/src/lib/nudges/registry.tsx index 634a2a592..8f301a8dc 100644 --- a/packages/app/src/lib/nudges/registry.tsx +++ b/packages/app/src/lib/nudges/registry.tsx @@ -158,7 +158,7 @@ export const NUDGE_REGISTRY: NudgeDefinition[] = [ titleZh: '试试渐变标签', description: 'Gradient labels color-code data points by parallelism level, making it easier to spot performance patterns at a glance.', - descriptionZh: '渐变标签按并发级别对数据点进行颜色编码,让您一目了然地发现性能模式。', + descriptionZh: '渐变标签按并行度对数据点进行颜色编码,让您一目了然地发现性能模式。', action: { label: 'Enable Gradient Labels', labelZh: '启用渐变标签', diff --git a/packages/app/src/lib/routing/tab-meta-zh.ts b/packages/app/src/lib/routing/tab-meta-zh.ts index 206b78bb2..5999f28f1 100644 --- a/packages/app/src/lib/routing/tab-meta-zh.ts +++ b/packages/app/src/lib/routing/tab-meta-zh.ts @@ -128,7 +128,7 @@ export const TAB_INTRO_ZH: Record = { 'profit-estimator': '本页面提供推理利润估算器:在选定的交互性与利用率下,按每芯片每小时计算各芯片的收入,并以堆叠柱形拆分为算力支出(TCO $/chip/hr)、模型实验室从收入中抽取的许可费,以及运营方所剩利润。', 'profit-estimator-per-gigawatt': - '本页面提供每吉瓦推理利润估算器:在选定的交互性与利用率下,按每全电源配置吉瓦每年计算各芯片的收入,并以堆叠柱形拆分为算力支出(TCO)、模型实验室从收入中抽取的许可费,以及运营方所剩利润。', + '本页面提供每吉瓦推理利润估算器:在选定的交互性与利用率下,按每吉瓦全电源配置功率预算计算各芯片的年收入,并以堆叠柱形拆分为算力支出(TCO)、模型实验室从收入中抽取的许可费,以及运营方所剩利润。', reliability: '本页面展示基准测试基础设施的可靠性指标:各芯片集群与服务商的运行成功率、错误率与可用性。', 'gpu-specs': From c4c3f323f74dc1a254a8efd280d4d23afe5e5544 Mon Sep 17 00:00:00 2001 From: Oseltamivir <58582368+Oseltamivir@users.noreply.github.com> Date: Sun, 25 Oct 2026 17:43:58 +0800 Subject: [PATCH 2/2] test(i18n): align Chinese copy assertions MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 中文:同步散点图投机解码说明与集群生命周期计价方式的 Cypress 断言,保留现有测试行为与英文预期。 --- packages/app/cypress/component/scatter-graph.cy.tsx | 2 +- packages/app/cypress/e2e/fleet-lifecycle.cy.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/app/cypress/component/scatter-graph.cy.tsx b/packages/app/cypress/component/scatter-graph.cy.tsx index 39c67e353..d62ec19ff 100644 --- a/packages/app/cypress/component/scatter-graph.cy.tsx +++ b/packages/app/cypress/component/scatter-graph.cy.tsx @@ -1890,7 +1890,7 @@ describe('ChartDisplay responsive status notes', () => { cy.get('[data-testid="option-help-content-agentic-optimizations"]').should( 'contain.text', locale === 'zh' - ? '每项配置可能使用推测解码等推理优化。将鼠标悬停在数据点上可查看其具体设置。' + ? '每项配置可能使用投机解码等推理优化。将鼠标悬停在数据点上可查看其具体设置。' : 'Each configuration may use inference optimizations such as speculative decoding. Hover over a point to see its exact settings.', ); }); diff --git a/packages/app/cypress/e2e/fleet-lifecycle.cy.ts b/packages/app/cypress/e2e/fleet-lifecycle.cy.ts index c7c3755a9..caf9d6dba 100644 --- a/packages/app/cypress/e2e/fleet-lifecycle.cy.ts +++ b/packages/app/cypress/e2e/fleet-lifecycle.cy.ts @@ -36,7 +36,7 @@ const showChart = () => cy.get('[data-testid="calculator-lifecycle-chart-view-bt function assertFleetControlLabels(locale: 'en' | 'zh' = 'en') { for (const [id, label] of [ - ['fleet-cost', locale === 'zh' ? '成本供应商' : 'Cost Provider'], + ['fleet-cost', locale === 'zh' ? '计价方式' : 'Cost Provider'], ['fleet-cost-type', locale === 'zh' ? 'Token 类型' : 'Token Type'], ]) { cy.get(`label[for="${id}"]`).should('have.text', label).click();