Repository navigation
Releases
v1.7.0 — 算子工程一键导出
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 — 点「执行」即产出优化后的算子
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 — 修复桌面应用里侧边栏入口点击无反应
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 允许的顺序依次尝试
- shell 右侧浏览器标签(
sidebarRightTabs+sidebarRight.openTab)—— 与 shell 自己打开外部链接走的是同一条路,聊天界面保持可见;两个服务都做防御式读取,没有也不算错误; window.open—— 浏览器里开新标签页;- 同窗口导航(同源,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
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 步:优化后导入与前后对比
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 声明)
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 读取
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 多表重复累加(溯源审计发现)
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 步改为逻辑图:占比归因与优化行动
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 — 可视化页面改造:动效 / 简化 / 跨模块联动
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