Skip to content

Releases

v1.7.0 — 算子工程一键导出

Choose a tag to compare

@nutsDad nutsDad released this 04 Oct 12:00

v1.7.0 — 算子工程一键导出(导出按钮在「执行」右侧)

生成的算子工程以前只能到工作区里翻文件。这一版把导出做进界面:每条建议行、「执行」右侧多了一个「导出算子」控件。

交互

  • 执行前:按钮是禁用的(灰态),悬停提示「先点『执行』生成算子工程,然后才能导出」——没生成就下载只会 404;
  • 执行完成后:同一位置变成下载链接(download="<算子名>.zip"),一次拿到整个工程:op_kernel/*.cpp、op_host/*.cpp、design.md、test/*-test-cases.md、README.md、register-patch.md;
  • 面板里原来的重复按钮已移除,只有一处可点。

实现

  • GET /api/operator-work/<算子名>/archive:流式返回 ZIP。算子名白名单校验 + 解析后路径必须落在工作区的 operator-work/ 内,越界尝试得到 400/404,而不是文件系统读取;
  • lib/zip.js:自写 ZIP 写入器(store 方式 + CRC-32),零依赖,符合插件一直以来的约束;CRC 用标准向量固定(123456789 → 0xcbf43926),并用系统解压器端到端验证(6 个文件全部按字节还原);
  • operator-work/ 加入 .gitignore 与同步排除 —— 它是每个工作区的产物,不是源码。

顺带修正(离线自检)

  • 200 万元素上 Math.max(...arr) 导致的爆栈已修;
  • 判据改为归一化误差 maxAbs/rms(归一化输出会穿过零点,纯相对误差毫无意义),相对值只统计有量级的元素;
  • row-norm 容差按 sqrt(cols) 缩放:kernel 是顺序求和,误差随归约长度增长。

验证

  • 128 个用例全部通过(+3 ZIP 写入器、+1 导出路由、+1 行内按钮 DOM 用例),CI 在 Node 22/24 上跑同一套;
  • 真实浏览器实测:advice-view.js 已带 exportControl/export-disabled,导出路由返回 200 · application/zip · 18,131 B,下载后用解压器核对 6 个文件;
  • DOM 用例断言:执行前 3 行均为禁用态、执行后变为带正确 href/download 的链接、DOM 顺序上位于「执行」右侧。

仍需真机

导出的是源码工程:编译、精度、性能需要 CANN + 昇腾 NPU(bash build.sh → 装 wheel → pytest → npu-op-benchmark),本版本没有任何实测性能数字。

安装 / 升级

dsh plugin --profile web add github:nutsDad/dsh-plugin-vllm-ascend-profiler

完整变更:v1.6.0...v1.7.0

v1.5.0 — 点「执行」即产出优化后的算子

Choose a tag to compare

@nutsDad nutsDad released this 04 Oct 06:09

v1.5.0 — 点「执行」即产出优化后的算子(不再只是任务包)

之前点「执行」是交接:生成任务包、给出 skill 链与验收阈值,算子还得有人去写。现在同一次点击会直接把算子工程生成出来(lib/operator-gen.js)。

按建议自动选算子类型

优化项 生成 优化点(写进 kernel,不是写在文档里)
compute.quantize / compute.decode-increase-batch dyn_quant_dequant(动态 per-row INT8 量化/反量化融合) 量化与反量化合并进一个 kernel;按 max|x| 求对称 scale,无需校准数据、无额外 D2H 读回
host.reduce-dispatch / host.enable-graph-mode / compute.tune-chunked-prefill / copy.kv-locality rms_norm_fused(单趟融合 RMSNorm) 平方与归约在同一 UB tile 完成(不再对 fp32 副本二次遍历),fp32 累加 + 向量 Reciprocal,gamma 融合且每核只加载一次
compute.fuse-small-ops 等融合类 fused_activation_chain(融合逐元素链) 框架里 mul/add/silu 三次下发合成一次 kernel 启动,fp16/bf16 只升/降精度一次

每个工程 6 个文件

csrc/ops/<op>/op_kernel/<op>.cpp         # 已按优化写好的 kernel
csrc/ops/<op>/op_host/<op>.cpp           # tiling + 启动(平台 API 取核数/UB)
csrc/ops/<op>/design.md                  # 设计文档(含 profiling 溯源与验收表)
csrc/ops/<op>/test/<op>-test-cases.md    # 统一测试用例(精度/性能共用)
csrc/ops/<op>/README.md                  # 用法与下一步
csrc/ops/<op>/register-patch.md          # 三处注册点的改法

写入 <工作区>/operator-work/<op>/。生成是确定性的:同一建议每次产出相同,不依赖模型、网络或 NPU。

遵守 ascendc skill 的硬规则

BUFFER_NUM = 2 双缓冲 · GM↔UB 只用 DataCopyPad · fp16/bf16 升 fp32 再算 · 归约的 dst/src/work 是三块不同缓冲 · kernel 内不出现 std::* 数学 · 核数与 UB 由平台 API 查询 · EXEC_KERNEL_CMD 参数全为具名左值。

首版生成结果里发现并修掉了两处真实缺陷:RMSNorm 模板把 gamma 所在的缓冲当成了归约的 work(后续乘 gamma 会读到垃圾),量化模板把归约源自己当 work。两者都违反了 skill 明写的规则,现在生成器测试会断言归约缓冲互不重叠。

新接口与页面

  • POST /api/datasets/<id>/advice/<adviceId>/execute:一次调用同时产出任务包与算子工程,返回文件清单、字节数与仍需真机的部分;
  • 页面「执行」按钮改为调用它,面板顶部变成「算子工程已生成」+ 优化说明 + 目录 + 生成文件表,skill 链与验收表照旧显示。

验证

  • 116 个用例全部通过(+4 生成器、+1 路由、+1 前端用例),CI Node 22/24 全绿;
  • 实测(POST /execute,真实 fixture 数据):host.reduce-dispatch → rms_norm_fused(6 文件,kernel 7.9 KB);compute.quantize → dyn_quant_dequant(6 文件,kernel 6.9 KB),归约缓冲校验通过;
  • 生成器测试逐个建议检查模板规则(双缓冲、只用 DataCopyPad、无 std::*、平台 API、TORCH_CHECK、EXEC_KERNEL_CMD、设计/用例含溯源与验收)。

仍需真机

编译、精度与性能必须有 CANN + 昇腾 NPU:生成工程的 README 与 design.md §6 给了完整命令,没有实测数字被写进结论。单算子基准用 npu-op-benchmark,端到端复测用第 6 步与本次数据集对比(阈值 = 预期收益一半,下限 1%)。

安装 / 升级

dsh plugin --profile web add github:nutsDad/dsh-plugin-vllm-ascend-profiler

完整变更:v1.4.1...v1.5.0

v1.4.1 — 修复桌面应用里侧边栏入口点击无反应

Choose a tag to compare

@nutsDad nutsDad released this 04 Oct 05:07

v1.4.1 — 修复:桌面应用里点侧边栏「Profiler 分析」没有反应

根因(在宿主 shell,不在插件里)

DSH 桌面应用的窗口安装了这样的处理:

view.webContents.setWindowOpenHandler(({ url }) => {
  const destination = new URL(url);
  if (destination.protocol === "https:") shell.openExternal(url).catch(() => {});
  return { action: "deny" };
});

即:所有 window.open 都被拒绝,只有 https: 链接会交给系统浏览器。分析器页面是 http://127.0.0.1:<port>/…,因此弹出被拒、返回 null,点击被静默吞掉。在普通浏览器里同样的代码能开新标签页,所以之前一直没暴露。

修复:按 shell 允许的顺序依次尝试

  1. shell 右侧浏览器标签(sidebarRightTabs + sidebarRight.openTab)—— 与 shell 自己打开外部链接走的是同一条路,聊天界面保持可见;两个服务都做防御式读取,没有也不算错误;
  2. window.open —— 浏览器里开新标签页;
  3. 同窗口导航(同源,shell 允许)—— 这是最后的兜底;此时分析器页面会收到 ?back=<会话地址>,并在顶栏显示 「← 返回会话」,所以兜底不是单向的。该参数只接受同源 http(s) 地址(跨域 / file: / javascript: 一律忽略),不会被当成跳转跳板。

入口的 tooltip 现在也带上分析器 URL,方便直接复制粘贴。

验证

  • 111 个用例全部通过(新增 4 个);CI Node 22/24 全绿;
  • 客户端 bundle 套件覆盖三种策略:有右侧标签时优先用标签(且不尝试弹窗)、弹窗被拒时带 ?back= 回退、无标签服务时仍走 window.open;
  • DOM 套件覆盖「返回会话」链接,包括拒绝跨域、file:、javascript: 目标;
  • 真实浏览器(无头 Chromium)在真实 DSH shell 里点击入口:页面确实跳转到分析器,并带上 ?back=,页面上出现「← 返回会话」(href 指向会话地址)。

测试脚手架本身也补了一处:vm 沙箱不会自带全局对象,URL/URLSearchParams 缺失会让页面在自己的 try/catch 里静默失败——这类问题只有把真实全局补齐才能测出来。

安装 / 升级

dsh plugin --profile web add github:nutsDad/dsh-plugin-vllm-ascend-profiler

升级后需要重启 DSH 桌面应用(浏览器半在启动时打包,刷新页面不够)。

完整变更:v1.4.0...v1.4.1

v1.4.0 — 第 5 步「执行」:把优化建议交给昇腾算子 skills

Choose a tag to compare

@nutsDad nutsDad released this 04 Oct 03:54

v1.4.0 — 第 5 步「执行」:把优化建议交给昇腾算子 skills

第 5 步回答了"改什么",但没人把它带进算子仓库。这一版让每条优化建议都能一键变成可开工的算子优化任务,交给 awesome-ascend-skills 的官方安装包执行。

「执行」按钮做了什么(宿主侧 lib/handoff.js)

  • 挑目标算子:按建议焦点从本次采集里选 —— kernel 取设备计算算子(按累计耗时)、comm 取通信算子、dispatch/graph 取 Host 下发与同步算子(按调用次数)、copy 取拷贝算子,并给出调用次数、单次耗时与占比;
  • 给 skill 链条:16 条建议(含采集质量类)全部映射到三个官方安装包 —— ascend-base(7 个)、ascend-profiling(5 个)、ascend-ops(4 个),标明主/支撑与各自职责;
  • 探测 skills 可见性:按 DSH 自己的发现顺序检查 $DSH_HOME/skills、项目 .dsh/skills、.agents/skills、<AGENTS_HOME>/skills,缺哪个就给出安装命令,而不是运行到一半才失败;
  • 写死验收标准:用与第 6 步对比同一套指标键与同一条阈值规则(预期收益的一半,下限 1%),列出目标指标当前值、预期收益与判定阈值;
  • 落盘任务包:<工作区>/.dsh-vap-tasks/<时间戳>-<建议 id>.md(人读)+ .json(结构化),页面里可直接「复制指令」粘贴给会话中的 agent。

页面

  • ④ 优化行动的每条建议右侧新增 「执行」 按钮;点击后就地展开任务面板:目标算子表、skill 链(含"已安装/未安装")、验收表、产物路径、可复制的完整指令;
  • 面板头显示 skills 可用性(如 算子优化 skills 16/16),缺 skills 时给出 npx 安装命令与上游仓库地址;
  • 新接口:POST /api/datasets/<id>/advice/<adviceId>/handoff(未知建议 404 并返回可用 id 列表)、GET /api/skills(三个安装包与每个 skill 的探测结果)。

端到端验证(docs/operator-handoff.md)

环节 结果
profiling 解析(真实管线) PASS · prefill-compute-bound 6742 事件 / 6 步 / NPU 计算瓶颈 95
「执行」生成算子任务 PASS · compute.quantize → MatMulV2(52.5%)、FusedInferAttentionScore(32%)、RmsNorm(2.6%)
skills 可见性 PASS · 16/16 已安装,链条 ascendc → ascend-opplugin → npu-op-benchmark → profiling-analysis
任务包落盘 PASS · .dsh-vap-tasks/<ts>-compute.quantize.{md,json}
算子工程脚手架 PASS · ascend-kernel/csrc/ops/rms_norm/(来自 ascendc skill 的工程模板)
设计文档门禁 PASS · design.md 9/9 项(签名、实现路径、伪代码、两级 tiling、UB 分配表、bufferCoefficient、升精度、workspace、验收)
编译 / 精度 / 性能 需昇腾机器(本机无 CANN / torch_npu / npu-smi),命令已写进 design.md §8,不用估算值冒充实测

选 RmsNorm 而不是占比最高的 MatMulV2:matmul 属于 CATLASS/genop 路线,不是该 skill 覆盖的向量算子类型;这个取舍写进了设计文档的 Provenance 段。

验证与测试

  • 107 个用例全部通过(新增 7 个交接分析、2 个路由、2 个前端流程用例);CI 在 Node 22 与 24 上跑同一套;
  • 真实浏览器实测:点「执行」后面板出现、算子优化 skills 16/16、目标算子与验收表正确(截图 docs/screenshots/16-execute-handoff.png);
  • 端到端脚本:node .tools/verify-e2e.mjs(工作区内)逐环节打印 PASS/BLOCKED。

已知边界

  • 本机没有昇腾硬件,没有任何实测性能数字;设计里的 tiling 取值是按平台 API 公式推导的示例,真实值必须由 op_host 运行时查询设备得到;
  • skills 内容由上游仓库维护,本插件只做可见性探测与调用编排,不内置;
  • 「执行」不替你改代码:它确定"改哪个算子、拿什么证据、达到什么阈值"。

安装 / 升级

dsh plugin --profile web add github:nutsDad/dsh-plugin-vllm-ascend-profiler

完整变更:v1.3.0...v1.4.0

v1.3.0 — 第 6 步:优化后导入与前后对比

Choose a tag to compare

@nutsDad nutsDad released this 14 Sep 13:34

v1.3.0 — 新增第 6 步:导入优化后的采集,用数据证明改动有效

前五步回答"哪里慢、为什么慢"。这一版补上闭环的另一半:把优化后再采一次的结果导进来,和当前数据集配对,回答"到底有没有变快、是哪条建议起了作用"。

第 6 步 · 优化后导入与前后对比

  • 导入方式与第 1 步完全一致(多选文件 / zip / 按路径),导入后自动把当前数据集当作优化前、新导入的当作优化后配对;
  • 结论句 + 四张对比卡:每步墙钟、NPU 忙碌率、Host 独占/步、派发算子数/步,每张显示 前 → 后 与改善幅度;
  • 可比性检查(明确的"不许拿两份不同负载当优化效果"):步数差异 >15%、Prefill/Decode 构成变化 >10pt、阶段口径不同、任一侧 trace 被采样、产物文件不同、耗时口径来源不同、瓶颈类型变化、采集窗口变化 >20%,逐条列出;
  • 第 5 步建议的达成校验:每条建议声明它要改善的指标,判定 已达成 / 部分达成 / 未达成 / 无法判定,阈值 = 预期收益的一半(下限 1%),并把阈值与目标指标的前后值一并写出;
  • 随时「清除对比」回到单采集视图;切换主数据集会自动解除配对。

第 3、4 步变成左右对照(左 = 优化前,右 = 优化后)

  • 第 3 步:两张泳道图并排(同一排序 / 行数设置,各自可悬停看算子卡片),上方一排 delta 徽标(每步墙钟、NPU 忙碌率、Host 独占/步、派发算子数/步、同步类算子/步、通信未掩盖);
  • 第 4 步:两条大类构成条 + 两张耗时分布图并排,下方两张变化表 —— 大类耗时(前 → 后、绝对与相对变化、占比前后、幅度条)与算子变化 Top(节省最多 / 增加最多);
  • 指标带方向:越低越好 / 越高越好 / 仅作背景。占比类指标的分母是墙钟,优化缩短墙钟会让它反向变化,页面会把这单独解释成"占比指标反向变化",并提示以 µs 绝对值为准。

实现

  • 对比在宿主侧完成(lib/analysis/compare.js),新接口 GET /api/datasets/<before>/compare?with=<after>(缺参 400、数据集不存在 404),页面只负责摆放 —— 因此同一套判定标准也适用于报告与自动化调用;
  • 夹具生成器新增与 host-schedule-bound 配对的优化后场景(每步墙钟 −45%、NPU 忙碌率 33% → 60%),示例产物与截图都按这一对给出;
  • 页面上传多文件时数据集改名为「N 个文件」,拖入文件夹时用文件夹名(原来把文件名拼在一起,胶囊按钮上读不出信息)。

验证

  • 96 个用例全部通过(新增 5 个对比分析、1 个路由、2 个前端对比流程用例);CI 在 Node 22 与 24 上跑同一套;
  • 无头浏览器实测:导入优化后产物 → 第 3 步两张泳道图(左 35,713 事件 / 每步 21.59ms,右 16,320 事件 / 每步 11.83ms)+ 6 个 delta 徽标,第 4 步两张分布图 + 2 张变化表(调度算子 −447.6ms / −59.0%),第 6 步 3 条建议判定达成、0 未达成;
  • 截图见 docs/screenshots/12-compare-summary.png、13-compare-gantt.png、14-compare-share.png、15-compare-full.png。

安装 / 升级

dsh plugin --profile web add github:nutsDad/dsh-plugin-vllm-ascend-profiler

完整变更:v1.2.3...v1.3.0

v1.2.3 — 修复侧边栏入口未注册(inject 声明)

Choose a tag to compare

@nutsDad nutsDad released this 13 Sep 11:49

v1.2.3 — 修复:侧边栏「Profiler 分析」入口没有出现

现象

插件装上、dsh web 重启后,分析页面(/vllm-ascend-profiler/)一切正常,但侧边栏底部没有出现入口。

根因

浏览器半调用了 ctx.slots.inject('sidebar.footer.action', …) 去注册入口,但插件自身声明的是 inject: []。cordis 客户端运行时只会在 apply 之前解析「已声明」的服务,而 ctx.get(name) 只是一次性的可选查询:侧边栏插槽服务(由 dsh-client-ui-sidebar 提供)在 apply 时刻尚未加载,于是 ctx.slots === undefined,代码走进了自己写的降级分支——只打一条 console 警告,什么都不注册。

宿主半(路由、页面、静态资源)不依赖插槽服务,所以页面能用、只是入口没了,这也是它躲过一次发布的原因。作为对照,内置的 dsh-client-ui-cordis 往同一个插槽注册时,声明的是 inject = ["slots", …]。

修复

  • lib/client.js:exports.inject = ['slots'](附注释说明为什么必须声明),保留原有的 try/catch 降级;
  • test/client-bundle.test.mjs:原来断言 inject.length === 0,等于把错误契约写进了测试 —— 改为断言 ['slots'];
  • 运行期验证:重启实例后由 DSH 提供的客户端包 rev 从 a18cd6348f69f6f3-48 变为 52bb11830fa67f15-48(内容哈希),包内含 exports.inject = ['slots'];因此浏览器不会命中旧缓存。

验证

  • 88 个用例全部通过;CI 在 Node 22 与 24 上跑同一套;
  • 重启 dsh web 并强制刷新(Ctrl+F5)后,侧边栏底部应出现「Profiler 分析」(sidebar.footer.action 插槽,kind: list)。

安装 / 升级

dsh plugin --profile web add github:nutsDad/dsh-plugin-vllm-ascend-profiler

完整变更:v1.2.2...v1.2.3

v1.2.2 — 版本号从 package.json 读取

Choose a tag to compare

@nutsDad nutsDad released this 13 Sep 08:54

v1.2.2 — 版本号不再写死(1.0.0 → package.json)

宿主半把版本号硬编码成 1.0.0,于是 /api/health、DSH shell 里注入的全局 __VLLM_ASCEND_PROFILER__ 以及页面内说明文档都显示 1.0.0,而包已经到 1.2.1 —— 在 DSH shell 索引里能直接看到这个过期值:

"__VLLM_ASCEND_PROFILER__"] = {"routePrefix":"/vllm-ascend-profiler","title":"vLLM-Ascend Profiler Analyzer","version":"1.0.0"}

现在版本号在模块加载时从 package.json 读取一次(读取失败回退 0.0.0),tag、manifest、健康检查与页面显示保持一致。已在全新实例上验证:/api/health → "version":"1.2.2"。

验证

  • 88 个用例全部通过;CI 在 Node 22 与 24 上跑同一套;
  • 重启独立 profile 后 GET /vllm-ascend-profiler/api/health 返回 1.2.2,DSH shell 注入的全局同步为 1.2.2。

安装 / 升级

dsh plugin --profile web add github:nutsDad/dsh-plugin-vllm-ascend-profiler

完整变更:v1.2.1...v1.2.2

v1.2.1 — 修复 CSV 多表重复累加(溯源审计发现)

Choose a tag to compare

@nutsDad nutsDad released this 12 Sep 13:17

v1.2.1 — 修复:同一份设备耗时被多张 CSV 表重复累加

这版是一次数据溯源审计(新增 tools/audit-provenance.mjs,28 项检查)的结果。审计方法:走真实上传接口解析真实产物 → 用独立写的 CSV 解析器重新求和比对 → 改写产物里的一个耗时再上传,要求数字跟着变 → 用 CDP 驱动真实页面,把三块图画出来的东西逐项与视图模型对齐。

发现的问题

同一个算子的设备耗时通常会同时出现在三张表里:op_statistic.csv(按算子汇总)、kernel_details.csv(按 kernel 实例)、operator_details.csv(按算子实例)。它们描述的是同一份工作,而聚合时被相加了。后果有两条,都会被用户看到:

  • trace 采样时 CSV 成为权威口径(大 trace 的常态),累计耗时、调用次数、构成条、treemap 面积、以及第 5 步所有评分都被放大了"表的张数"倍(在仓库夹具上是 3 倍);
  • trace 与 CSV 的 cross-check 出现 203% 的"偏差",让完全一致的产物看起来像导出坏了。

修复方式

  • 每个算子只取一张表作为 CSV 口径:优先统计表(op_statistic / op_summary),其次实例表(kernel_details / operator_details / communication_statistic),再次 api_statistic;
  • 其余表仍然作为证据列在 sources.csvTables 里;耗时分布(分位数)与 AIC/MTE 利用率列也各自只来自一张表,不再混合累加;
  • 两张表累计耗时相差 >20% 时给出明确告警(列出各表数值与取值来源),用于发现重复导出、产物缺失或单位混用,而不是把差异平均掉;
  • 夹具上的效果:MatMulV2 的 cross-check 从 203.3% → 0.0%,csvCount 从 1920 → 640(与 trace 一致)。

验证

  • 88 个用例全部通过(新增 2 个:多表只取一张表且相差大时告警;仓库夹具 cross-check 干净);CI 在 Node 22 与 24 上跑同一套;
  • 新增 tools/audit-provenance.mjs:28/28 通过,其中 A 组(独立解析 CSV 重算)偏差 0.0000%,B 组变异后"计算时间增量 = 产物增加的耗时"完全相等(+76981.4µs vs +76981.4µs),C 组覆盖构成条占比、treemap 面积与标注 %、数据表、流程节点、证据面板、行动列表、收益合计与泳道悬停卡片;
  • 三个场景数据集在页面上仍然给出三套不同结论(Host 调度 97 / 跨卡通信 90 / NPU 计算 95),即三块图确实随上传产物变化。

安装 / 升级

dsh plugin --profile web add github:nutsDad/dsh-plugin-vllm-ascend-profiler

完整变更:v1.2.0...v1.2.1

v1.2.0 — 第 4、5 步改为逻辑图:占比归因与优化行动

Choose a tag to compare

@nutsDad nutsDad released this 12 Sep 12:31

v1.2.0 — 第 4、5 步改成逻辑图:图说话,文字退到「依据」里

第 4 步(占比归因)和第 5 步(优化行动)原本是页面上文字最多的两块。现在两块都以图形和数字为主,任何一句话都收在可展开的「依据」中,需要时一键展开。

第 4 步 · 占比归因

  • 大类构成条:一条 100% 构成条按算子大类切分,段内直接写占比与耗时;点段或点图例即按该大类聚焦第 3 步
  • 算子耗时分布图(treemap):每个方块是一个算子,面积 = 耗时占比、颜色 = 大类。一张图同时表达层级(大类 → 算子)、排序(谁最大)与占比(面积),替换原来的环形饼图 + TopN 条形图
  • 精确数字仍在「数据表」里(折叠保留):调用次数、累计、均值、p95、占比、总计来源与 cross-check 偏差
  • 口径(设备侧 / 全部 / Host 侧)、维度(累计 / 单次)、方块数(12 / 20 / 30)三个开关不变
  • 导出的 PDF / Markdown 现在内嵌构成条 + 耗时分布图(不再内嵌饼图与条形图)

第 5 步 · 优化行动

  • 五步推理链改成 ①→⑤ 流程节点:每个节点只带一个数字(瓶颈类型与分数 / 门限通过项数 / 机理条数 / 行动优先级分布 / 保守收益),点节点切换下方图块,节点本身是 role="tab" 的可聚焦按钮
  • ① 瓶颈定位:四类候选 × 全量 / Prefill / Decode 的打分对比柱(未达门限的候选显示为 0,而不是空白);每条结论后跟一行实测摘要
  • ② 量化证据:实测值与门限的对比条 —— 达门限=绿、未达门限=红、虚线=门限位置;点击任一指标可回到第 3 步按时序筛选同类算子
  • ③ 根因推断:每条机理压缩成「触发数据 → 作用机理 → 影响」三段式链条
  • ④ 优化行动:每条一眼看到收益区间条(竖线=估算值、浅色=经验区间)与置信度;依据 / 动作 / 验证 / 风险 / 关联根因在折叠项内
  • ⑤ 预期收益:逐项收益条 + 保守 / 乐观合计 + 可量化项数,并说明多项收益不可简单相加

实现与修复

  • 新增 web/diagram.js:squarify/treemap、构成条、门限对比条、收益区间条、流程节点、根因链等图形基元;charts.js 只保留投影、数据表与 PNG 导出(删除不再使用的饼图/条形图渲染与相关 CSS)
  • 修复 oneLine() 在小数点处断句(把「Host 独占 30.22%」截成「Host 独占 30.」)
  • 修复证据面板把 {element, legend} 直接塞进 DOM,导致门限对比图从未真正渲染
  • 修复 span.pri / span.gain-conf 的 class 被颜色类覆盖,丢失徽标样式
  • 修复推理链在窄窗口下最后一个节点被拉伸成整行宽

验证

  • 86 个用例全部通过(新增 treemap 面积、构成条切分、门限对比、流程节点与面板切换、跨模块联动等用例);CI 在 Node 22 与 24 上跑同一套
  • 前端测试仍解析真实 index.html 并以真实数据驱动渲染,界面结构变化会被测试直接捕获
  • 截图全部重拍(含新面板、窄窗口与深色主题),见 docs/screenshots/

安装 / 升级

dsh plugin --profile web add github:nutsDad/dsh-plugin-vllm-ascend-profiler

完整变更:v1.1.0...v1.2.0

v1.1.0 — 可视化页面改造:动效 / 简化 / 跨模块联动

Choose a tag to compare

@nutsDad nutsDad released this 12 Sep 11:56

v1.1.0 — 可视化页面改造:从三张图变成一台分析仪器

1. 动态效果:都用来解释数据

  • 时间游标播放(1× / 4× / 12×):游标扫过整个采集窗口,扫到的算子条高亮 —— 直接回答"设备空闲时主机在做什么"
  • 载入动效:KPI 数字滚动、进度条分阶段推进 + shimmer、评分/占用条从 0 增长
  • 泳道图从左到右扫出算子条;饼图环形逐段绘出;条形图按名次生长;建议卡片淡入 + hover 抬升
  • 缩放/平移改为缓动过渡;选中算子时其余行淡出而非消失;悬停行高亮
  • 顶栏**「动效」开关**(选择记在 localStorage)一键关闭全部动画,并尊重系统 prefers-reduced-motion

2. 页面简化:删掉重复与次要信息

  • 头部指标 8 → 4(采集窗口 / NPU 忙碌率 / Host 独占每步 / 通信未掩盖),其余指标本就在证据表里
  • 图例即筛选器:去掉"图例 + 类别按钮"两套 UI;缩放按钮改图标;排序/行数合并进一条工具栏
  • 说明文档收进弹窗(原来页面底部有一整块隐藏 section);文件类型清单按需展开
  • 提示文字压成一行;数据集列表改为一行胶囊按钮,空态不显示

3. 逻辑性:一条可追溯的流程

  • 五步流程 + 吸顶步骤条:导入产物 → 概览与定位 → 时序取证 → 占比归因 → 优化行动(随滚动标记当前/已完成,可点击跳转)
  • 结论先行:先给瓶颈横幅(得分/作用范围/阶段来源与置信度),再给三条优先动作,每条可跳转并展开对应方案
  • 一个筛选状态贯穿全页:泳道图点算子、饼图点大类、条形图点排行、建议卡片的「在第 3 步查看…」共享同一份筛选,效果彼此可见,标签可关闭、Esc 清除
  • 每一步标注消费什么、产出什么;根因与方案互相回指(关联根因)
  • 阶段口径成为全局维度:自动推断 / 仅 Prefill / 仅 Decode 切换即重新分析,横幅与图表同步更新

验证

  • 80 个用例全部通过(新增 11 个前端交互/动效用例);CI 在 Node 22 与 24 上均为 success
  • 前端测试改为解析真实 index.html 并驱动交互(点击条形筛选、图例联动、阶段重算、播放与动效开关),因此界面改动会被测试捕获
  • 截图见 docs/screenshots/(含联动筛选与深色主题),由 tools/capture-page.mjs 驱动无头浏览器生成

安装 / 升级

dsh plugin --profile web add github:nutsDad/dsh-plugin-vllm-ascend-profiler

完整变更:v1.0.0...v1.1.0