前端仿真洞察工作台设计规格
| 字段 | 值 |
|---|---|
| 版本 | v0.1.0 |
| 状态 | Accepted |
| 日期 | 2026-06-11 |
| 作者 | xiang.li |
| 前置 | G5通信评估观测与结果存储设计规格、2026-06-11 前端功能脑爆 |
变更历史
| 版本 | 日期 | 变更 |
|---|---|---|
| v0.1.0 | 2026-06-11 | 初版草稿 |
概述
本 spec 冻结前端的产品定位与三波功能路线:前端从「配置提交 + 结果表格」升级为「仿真洞察工作台」,以可视化兑现 G5 指令级事件驱动仿真产出的微观数据。同时冻结两项横切技术决策:trace 数据协议(Arrow IPC 为主格式)与前后端实时通道(统一 WebSocket 消息信封)。
背景
后端定位已收敛到 G5 仿真建模,G5 产出事件级微观数据(链路占用、排队、指令执行),但前端只消费汇总指标与 op 级 Gantt,微观数据的分析价值没有兑现。具体落差:
- G5 微观数据无出口:Rust 端 TraceCollector 已记录 6 类事件并可导出 Parquet,但前端无任何事件级视图。
- 任务执行黑盒:G5 分钟级仿真,WebSocket 仅推送任务级 progress 浮点值,无已仿真时间、事件数等过程信息。
- 方案对比靠人肉:评估平台的核心用途是比较部署方案,前端只能开多个标签页逐项对照。
- 横向决策无主:trace 传输格式、实时通道协议等横切设计散落在各功能实现里,无统一契约。
业界仿真器(ASTRA-sim、SimAI)以 CLI 与论文图表为主要交付形态,trace 级交互式可视化是本平台的差异化方向。
名词定义
评估路径
- Math 路径:代数性能模型,秒级出结果,用于设计空间粗筛。
- G5 路径:Rust 指令级事件驱动仿真,分钟级,产出事件级微观数据,用于瓶颈分析。
数据形态
- 汇总指标:任务完成后的标量结果(TTFT/TPOT/MFU/成本等)。
- op 级 Gantt:以算子为粒度的时间区间集合,当前前端 Gantt 图的数据源。
- 事件级 trace:仿真过程的事件记录(时间戳 + 事件类别 + 资源),粒度细于 op,量级可达百万条。
- Arrow IPC:Apache Arrow 的列式二进制序列化格式,支持 RecordBatch 分块流式读取,浏览器端由 Arrow JS 解析。
功能路线
- Wave:功能交付波次。Wave 1 体验止血、Wave 2 G5 价值兑现、Wave 3 工作流闭环。
- 关键路径:端到端时延的决定性事件依赖链,缩短链上事件才能缩短总时延。
- Pareto 前沿:多目标下不被任何其它方案全面支配的方案集合。
目标与非目标
目标
- 冻结前端产品定位:仿真洞察工作台,功能取舍以「是否放大 G5 微观数据的分析价值」为第一判据。
- 冻结三波功能路线及波内顺序,作为后续各功能 plan 的依据。
- 冻结 trace 数据协议:G5 事件级数据以 Arrow IPC 为主格式传输至前端。
- 冻结实时通道契约:任务进度、过程日志统一走单一 WebSocket 消息信封。
- 给出 Wave 1 四个功能的验收口径(不为其单独写 spec)。
非目标
- 不定义各功能的实现方案:组件结构、文件改动属于各功能的 plan。
- 不冻结 Wave 2/3 功能的详细设计:event-trace-timeline、bottleneck-attribution 等到位前需各自的设计决策,届时按需写独立 spec,本 spec 只锁路线与数据协议。
- 不做前端路由架构重构:全挂载 viewMode 模式保留,重构触发条件见局限与后续工作节。
- 不改 G5 引擎建模语义:本 spec 只约定 G5 已有观测数据的出口形态,不新增仿真行为。
- 不覆盖拓扑生成与编辑:归拓扑生成器设计规格。
用例说明
用例 1:跟踪一次 G5 仿真(Wave 1)。用户提交 G5 评估任务,任务面板实时显示已仿真时间、已处理事件数与预计剩余时间;任务异常时用户查看过程日志定位原因,无需到后端终端看输出。
用例 2:判断优化方向(Wave 1)。用户打开某任务的 Gantt 图,关键路径上的 op 被高亮;用户点击关键路径段,看到「该段缩短 1ms 可使端到端缩短 X ms」的敏感度提示,据此决定优化算子还是优化通信。
用例 3:比较候选方案(Wave 1)。用户在结果页勾选 2-4 个任务进入对比视图:KPI 以差值/百分比并排呈现,Gantt 按相同时间尺度对齐,用户据此回答「方案 B 比 A 快在哪一段」。
用例 4:扫参选方案(Wave 1)。扫参实验完成后,用户打开 Pareto 前沿散点图(横轴成本、纵轴性能指标),圈选前沿上的方案跳转对比视图。
用例 5:钻取微观瓶颈(Wave 2)。用户对某 G5 任务打开事件时间线,从 op 级下钻到链路传输与排队事件,缩放定位拥塞时段;切换到 3D 拓扑回放,拖动时间条观察链路热力随仿真时间的演化。
用例 6:两级评估流水(Wave 3)。用户对设计空间先跑 Math 粗筛,在结果中圈选 top-k 候选一键提交 G5 精仿,平台跟踪两级任务的派生关系。
详细设计
产品定位与功能判据
前端是 G5 仿真的洞察界面,不是通用 BI 看板。新功能立项时按以下判据排序取舍:
- 是否让 G5 独有的微观数据(事件、链路、队列)变得可分析——最高优先。
- 是否缩短「提交 → 结果 → 结论」的分析闭环。
- 是否可由既有数据直接驱动(不需要后端新增建模语义)。
三波功能路线
| 波次 | 主题 | 功能(按依赖顺序) | 前置依赖 |
|---|---|---|---|
| Wave 1 | 体验止血 | live-progress-stream → critical-path-highlight → side-by-side-compare → pareto-frontier-view | 无(复用既有数据) |
| Wave 2 | G5 价值兑现 | trace 数据协议落地 → event-trace-timeline → link-utilization-replay | WebSocket 信封(Wave 1 落地) |
| Wave 3 | 工作流闭环 | math-prescreen-pipeline → bottleneck-attribution | Wave 2 trace 协议 |
波内顺序是依赖顺序,不是排期;跨波不并行启动(Wave 2 开工以 Wave 1 验收为前提)。脑爆中 deferred 的候选(拓扑画布编辑器、trace SQL 查询等)不在路线内,重启需修订本 spec 或另立 spec。
trace 数据协议
决策:G5 事件级数据以 Arrow IPC 为主格式,从后端传输至前端;Perfetto/Chrome JSON 作为可选导出目标,不作为前端渲染输入。
设计原理:
- 列式匹配渲染访问模式:时间线渲染按列取数(时间戳列、资源列),Arrow 列式内存零解析开销;JSON 百万级事件解析耗时秒级且内存翻倍。
- 分块匹配流式加载:RecordBatch 分块允许前端按视口窗口懒加载,避免整包传输。
- 写端零摩擦:G5 为 Rust 引擎,
arrowcrate 原生支持;既有 TraceCollector → Parquet 链路与 Arrow 同生态。 - 演化空间:Arrow schema 自带列元数据,新增事件属性列不破坏旧读取方。
协议分层契约:
| 层 | 契约 |
|---|---|
| 事件模型 | 一条事件 = (时间区间或时间点, 事件类别, 资源标识, 类别相关属性)。事件类别沿用 G5 观测框架既有分类(链路占用/空闲、未完成事务变化、线程阻塞/解除、跳到达),新增类别走 schema 演化 |
| 序列化 | Arrow IPC stream format,按 RecordBatch 分块;每块自描述 schema |
| 传输 | HTTP 按块拉取(前端指定时间窗口与资源过滤),不经 WebSocket 传 trace 本体 |
| 存储 | 服务端以任务为单位持久化 trace 文件(沿用 G5 观测框架的 Parquet 落盘,与本协议同属 Arrow 生态),按块拉取时由服务端转为 Arrow IPC stream 下发;汇总指标仍走既有 DB 路径 |
trace 采集默认关闭,由任务提交时显式开启(事件级 trace 量级大,不应成为每次评估的隐性成本)。
实时通道契约
决策:任务进度与过程日志统一走单一 WebSocket 连接,消息采用类型化信封。
消息信封语义:每条消息含消息类型、任务标识、载荷三要素。本 spec 冻结两类消息语义:
| 消息类型 | 载荷语义 |
|---|---|
| 任务进度 | 任务状态 + 完成度 + 过程计量(G5 任务:已仿真时间、已处理事件数、事件处理速率;搜索任务:已评估方案数/可行数) |
| 过程日志 | 日志级别 + 时间戳 + 文本行,支持按任务订阅 |
约束:
- 推送频率服务端节流,约束为:任务状态或过程计量发生变化后 1s 内至少推送一次;客户端不假设固定频率。节流参数本身归实现 plan。
- 结果本体(汇总指标、Gantt、trace)不走 WebSocket,完成通知后由 HTTP 拉取。
- 新增消息类型须向信封注册类型名,禁止复用既有类型塞异构载荷。
Wave 1 功能验收口径
| 功能 | 验收口径 |
|---|---|
| live-progress-stream | G5 任务运行期间,前端每秒级刷新已仿真时间/事件数/预计剩余;任务面板可打开实时日志流 |
| critical-path-highlight | Gantt 图可一键高亮关键路径;点击关键路径段显示该段对端到端时延的敏感度数值;关键路径覆盖时长 = 端到端时长(链不断裂) |
| side-by-side-compare | 支持 2-4 任务并排:KPI 差值/百分比、Gantt 同尺度时间轴对齐;进入对比的操作不超过 2 步(勾选 → 对比) |
| pareto-frontier-view | 扫参实验结果可渲染成本-性能散点图并自动标出 Pareto 前沿;前沿点可多选跳转对比视图 |
关键路径的计算归属:op 级关键路径由后端基于既有 step 依赖计算并随结果下发,前端只做渲染。敏感度 first-cut 口径为「段时长占关键路径总时长的比例」近似,并在界面标注为估计值;基于依赖图重计算的精确敏感度列入局限与后续工作节。
备选方案
| 决策点 | 被否方案 | 否决理由 |
|---|---|---|
| trace 格式 | Perfetto protobuf 作为前端渲染输入 | Perfetto UI 无法作为组件嵌入自有 React 应用(官方仅支持 iframe + postMessage 旁路),两套 UI 并存割裂分析流;WASM trace_processor 受内存上限约束,多 GB 需本地原生进程,部署复杂 |
| trace 格式 | Chakra execution trace | 定位是 workload 描述(仿真输入),非仿真结果 trace,无时间线可视化生态;其价值在未来做业界 workload 导入器,与本决策正交 |
| trace 格式 | 自定义 JSON 分块 | 百万级事件 JSON 解析耗时秒级、内存翻倍;schema 演化靠约定无元数据保障 |
| 路线粒度 | 每个 Wave 各写一份 spec | Wave 1 均为局部增量撑不起 spec;trace 协议横跨 Wave 2/3,拆开导致互相引用 |
| 实时通道 | 进度走 WebSocket、日志另开 SSE | 两套连接生命周期管理重复;信封模型下单连接多类型已覆盖需求 |
完整业界调研对比见附录 A。
非功能性需求
性能
- 事件时间线在 10^6 条事件量级下可交互(缩放/平移帧率不低于 30fps),通过视口懒加载与 LOD 聚合达成,不要求全量事件常驻内存。
- trace 传输按块拉取,单块解析不阻塞主线程渲染。
兼容性
- 既有汇总指标、Gantt、实验管理的 API 契约不变;trace 协议是增量出口,不替代既有结果路径。
- trace 采集关闭时,G5 仿真行为与性能与现状一致。
安全性 / 隐私:N/A(内网自用工具)。
局限与后续工作
- frontend-route-split 未决:全挂载 viewMode 模式在 Wave 2 新增 trace 视图后可能出现内存压力,届时度量决定是否重构为真路由 + 状态持久化,不在本 spec 预判。
- Wave 2/3 功能需后续独立 spec:event-trace-timeline 的交互模型、bottleneck-attribution 的归因算法(含 Rust/Python 分工)各需独立设计决策。
- Math 与 G5 差分解释依赖后端对齐:math-g5-diff-explain 等候选以 G5 守恒断言等后端工作为前提,未排入路线。
- 关键路径敏感度为近似值:first-cut 用段时长占比近似,忽略缩短后关键路径切换的二阶效应;基于依赖图重计算的精确敏感度待后端依赖图分析能力到位后升级。
- trace 量级上限未标定:百万级事件的端到端链路(采集 → 落盘 → 传输 → 渲染)需在 Wave 2 落地时用真实任务标定,超限时的降采样策略届时补充。
验收标准
- 定位判据生效:Wave 1 之后的任何前端功能立项材料(plan/issue)显式回答本 spec 的三条功能判据。
- Wave 1 验收:四个功能各自满足「Wave 1 功能验收口径」表,全部验收后方可启动 Wave 2。
- 路线顺序生效:各 Wave 功能的 plan 显式引用本 spec 的波次表;跨波并行启动视为不合规。
- trace 协议合规:Wave 2 的 trace 出口实现满足协议分层契约表的四层语义;用 Arrow JS 读取服务端 trace 文件可还原全部事件字段。
- 实时通道合规:所有新增实时推送走统一 WebSocket 信封;代码审查中发现绕过信封的旁路推送视为不合规。
- 性能达标:10^6 事件 trace 在前端时间线缩放/平移帧率 ≥ 30fps(以浏览器 performance 面板录制为准)。
附录 A:业界调研
trace 格式与可视化方案对比
| 维度 | Perfetto | Chakra ET | Arrow IPC(选定) |
|---|---|---|---|
| 定位 | 系统级 trace 采集 + 分析平台 | ML workload 标准描述格式 | 通用列式序列化格式 |
| 浏览器渲染百万级事件 | UI 支持多 GB,但 WASM trace_processor 受内存上限,多 GB 需本地原生进程 | 无可视化生态 | Arrow JS 零拷贝列式取数;ECharts 5 增量渲染宣称百万点实时 |
| 嵌入自有 React 应用 | 不支持组件化嵌入,仅 iframe + postMessage(官方 issue #14/#2266 长期未支持) | N/A | 原生(数据层格式,UI 自研) |
| 写端(Rust)成本 | protobuf 编码,schema 庞大 | protobuf,面向 workload 图 | arrow crate 原生支持 |
| schema 演化 | TracePacket 扩展字段 | MLCommons 治理 | 列元数据自描述,加列兼容 |
来源:
- Perfetto deep-linking 与嵌入限制:https://perfetto.dev/docs/visualization/deep-linking-to-perfetto-ui、https://github.com/google/perfetto/issues/2266、https://github.com/google/perfetto/issues/14
- Perfetto 大 trace 方案:https://perfetto.dev/docs/visualization/large-traces
- Chakra 定位(ASTRA-sim workload 层输入):https://astra-sim.github.io/astra-sim-docs/workload-layer/overview.html、https://mlcommons.org/working-groups/research/chakra/
- Arrow JS:https://arrow.apache.org/js/;JSON vs Arrow 大数据加载实测:https://blog.scottlogic.com/2021/10/15/efficiently-loading-massive-d3-datasets-using-apache-arrow.html
- ECharts 5 增量渲染:https://apache.github.io/echarts-handbook/en/basics/release-note/v5-feature/
仿真器交付形态对标
| 工具 | 交付形态 | 借鉴点 |
|---|---|---|
| ASTRA-sim 2.0 | CLI + 论文图表,Chakra workload 输入 | 瓶颈系统性探索方法论;无交互式可视化 → 差异化空间 |
| SimAI(阿里) | CLI,框架/集合通信/网络全链路建模 | 端到端归因思路 |
| Perfetto | 浏览器 trace 工作台 | 时间线交互范式(缩放/钻取/track 分组)是 event-trace-timeline 的交互参照 |
来源:https://astra-sim.github.io/、https://github.com/aliyun/SimAI、https://perfetto.dev/
附录 B:实现说明
实验管理 API 契约的修正(2026-06-12)
正文「集成点」中"既有汇总指标、Gantt、实验管理的 API 契约不变"的"实验管理"部分不再成立:实验结果读取契约(分页行 / 字段投影 / 单行全量三形态)由实验结果展示数据契约设计规格定义并取代。本 spec 其余内容(trace 协议、WebSocket 信封、Wave 路线)不受影响。
Wave 1 执行顺序调整(2026-06-12)
正文「三波功能路线」把 critical-path-highlight 列为 Wave 1 第二项,实现探索发现其前提不成立:当前 convert_to_gantt_chart 把所有 step 串行堆叠(单资源行、无并行),makespan = 各 step 时长之和,关键路径退化为全部任务,高亮无信息量。真实并行调度时间线仅存在于 G5 SimRecords(每 engine 真实 start/end),未进入 Gantt。
决策:critical-path-highlight 依赖「G5 真实并行调度 Gantt」这一 Wave 1 范围外的前提,故延后;Wave 1 此轮先做数据就绪的 side-by-side-compare 与 pareto-frontier-view。critical-path-highlight 重新定位为依赖真实调度 Gantt(与 Wave 2 per-chip-occupancy 同源)就绪后再做。本调整不改变正文波次的依赖语义,仅修正一处被漏看的跨波依赖。
pareto-frontier-view(Wave 1 功能 3,2026-06-12 完成)
- 纯前端。
getExperimentMetrics(experimentId)取实验全部 task,过滤出 cost + tps 两维齐全的完成任务为散点。 - Pareto 前沿:成本越小越优、性能越大越优,非被支配点高亮 + 虚线连线,被支配点淡色。
- 框选跳转:ECharts brush(需注册 BrushComponent/ToolboxComponent)框选 ≥2 点 → 复用 enterComparison 跳对比;>4 点 toast 提示并取前 4。
- 入口:实验详情任务列表卡片头部「Pareto 前沿」按钮,局部状态展开(避开 ExperimentDetailView 受控 activeTab 与预存 WIP 分支)。
- 已知限制:computeParetoFrontier 单测 vitest 格式未接入 CI(逻辑经转译运行验证)。
side-by-side-compare(Wave 1 功能 2,2026-06-12 完成)
- 纯前端,复用既有多标签加载(AnalysisTabsContext)、GanttChart、TaskTable 批选。
- KPI 差值表以第一个方案为基准,延迟/成本越小越优、吞吐/MFU 越大越优;缺失值显示「—」不参与最优。
- Gantt 同尺度:各方案 timeRange.end 取最大值作 fixedTimeRange,dataZoom 初值统一 [0,100]。
- 进入对比 2 步:结果表勾选 ≥2 → 「对比」按钮 → enterComparison(批量建 tab + LRU 回填存活 id + 切 analysis 视图)。
- 已知限制:前端无 vitest runner,computeKpiDiffs 单测以 vitest 格式写就但未接入 CI(逻辑经一次性转译运行验证);缺数据的对比列以提示横幅告知用户而非静默丢弃。
live-progress-stream(Wave 1 功能 1,2026-06-12 完成)
- 进度计量来源:实时
progress_meta(sim_time_ns / event_count / events_per_s / eta_s)仅多芯片通信原语仿真路径产出,在 Rust 回调(frac, sim_time_ns, event_count)上达 Python 后于comm_primitive_pipeline._sim_progress装配。部署 G5 路径走单芯片仿真,无实时计量。ETA 用 Rust 原始未缩放 frac。 - 节流串联:Rust 端 400ms 墙钟或 2% 字节步长触发回调,services 端 0.5s 节流广播,串联最坏推送间隔 0.9s,满足「1s 内至少一次」。
- 日志通道:每任务
deque(maxlen=1000)环形缓冲(C 层原子截断免锁),生命周期 + 10% 里程碑写日志;HTTPGET /evaluation/tasks/{id}/logs回放缓冲,WStask_log消息推增量,前端经共享日志总线(单 WS 连接)分发,实时流允许丢行。
附录 C:数据结构
- trace Arrow schema 与出口端点的字段级定义:由 G5事件trace出口与事件时间线设计规格(Accepted)承接冻结——schema R(原始模式,与落盘 Parquet 同构)、schema G(聚合模式)、活跃区间快照 S、窗口查询端点签名见其附录 C。
- WebSocket 信封的字段级定义:在 Wave 1 live-progress-stream 实现中落地(见附录 B 实现说明),字段级冻结版本待后续回填。