univis 0.6.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
univis-0.6.0/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 UniVis Contributors
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
univis-0.6.0/PKG-INFO ADDED
@@ -0,0 +1,294 @@
1
+ Metadata-Version: 2.4
2
+ Name: univis
3
+ Version: 0.6.0
4
+ Summary: Transformer inference redundancy diagnostic and visualization toolkit
5
+ License: MIT
6
+ Project-URL: Homepage, https://github.com/cookiesheep/univis
7
+ Project-URL: Repository, https://github.com/cookiesheep/univis
8
+ Project-URL: Changelog, https://github.com/cookiesheep/univis/releases
9
+ Project-URL: Issues, https://github.com/cookiesheep/univis/issues
10
+ Keywords: transformer,llm,inference,redundancy,observability,profiling,visualization,mxmaca,domestic-gpu,edge-computing
11
+ Classifier: Development Status :: 4 - Beta
12
+ Classifier: Intended Audience :: Science/Research
13
+ Classifier: Topic :: Scientific/Engineering :: Artificial Intelligence
14
+ Classifier: Programming Language :: Python :: 3
15
+ Classifier: Programming Language :: Python :: 3.10
16
+ Classifier: Programming Language :: Python :: 3.11
17
+ Classifier: Programming Language :: Python :: 3.12
18
+ Classifier: License :: OSI Approved :: MIT License
19
+ Classifier: Operating System :: OS Independent
20
+ Requires-Python: >=3.10
21
+ Description-Content-Type: text/markdown
22
+ License-File: LICENSE
23
+ Requires-Dist: torch>=2.0
24
+ Requires-Dist: numpy
25
+ Requires-Dist: fastapi>=0.100
26
+ Requires-Dist: uvicorn
27
+ Requires-Dist: websockets
28
+ Provides-Extra: dev
29
+ Requires-Dist: pytest; extra == "dev"
30
+ Requires-Dist: transformers; extra == "dev"
31
+ Requires-Dist: starlette; extra == "dev"
32
+ Requires-Dist: websockets; extra == "dev"
33
+ Provides-Extra: server
34
+ Requires-Dist: fastapi>=0.100; extra == "server"
35
+ Requires-Dist: uvicorn; extra == "server"
36
+ Requires-Dist: websockets; extra == "server"
37
+ Provides-Extra: dashboard
38
+ Dynamic: license-file
39
+
40
+ <div align="center">
41
+
42
+ # UniVis
43
+
44
+ **找出大模型推理时哪些层在空转浪费算力 —— Transformer 推理冗余诊断与可视化工具**
45
+
46
+ *Find out which layers of your LLM actually compute at inference — and which are idle.*
47
+
48
+ `AI Infra · 大模型推理优化与部署`
49
+
50
+ [![CI](https://github.com/cookiesheep/univis/actions/workflows/ci.yml/badge.svg)](https://github.com/cookiesheep/univis/actions/workflows/ci.yml)
51
+ [![Tests](https://img.shields.io/badge/tests-82-brightgreen.svg)](tests)
52
+ [![Python 3.10+](https://img.shields.io/badge/Python-3.10%2B-blue.svg)](https://www.python.org/downloads/)
53
+ [![PyTorch](https://img.shields.io/badge/PyTorch-2.0%2B-ee4c2c.svg)](https://pytorch.org/)
54
+ [![License: MIT](https://img.shields.io/badge/License-MIT-green.svg)](LICENSE)
55
+ [![PRs Welcome](https://img.shields.io/badge/PRs-welcome-brightgreen.svg)](CONTRIBUTING.md)
56
+
57
+ [English](README.en.md) · 简体中文
58
+
59
+ </div>
60
+
61
+ <img src="docs/images/dashboard-c500.png" alt="UniVis Dashboard" width="100%">
62
+
63
+ UniVis 通过 `forward` hook 零侵入地附着在任意 PyTorch / HuggingFace Transformer 上,在**端侧(hook 内部)**把每层激活降维为标量指标(单步仅约 1–2 KB),经 JSONL / WebSocket 输出实时 Dashboard 或自包含离线 HTML 报告,回答一个问题:**推理时,哪些层在真正计算,哪些层在冗余。**
64
+
65
+ UniVis 是**度量与可视化**工具——不修改、不剪枝、不加速你的模型,而是给出判断「该优化什么」的证据,并提供一条可实验的干预路径(Pilot)。
66
+
67
+ ---
68
+
69
+ ## ✨ 效果展示
70
+
71
+ <table>
72
+ <tr>
73
+ <td width="50%" align="center"><b>实时 Dashboard</b></td>
74
+ <td width="50%" align="center"><b>模型 MRI · 同心环</b></td>
75
+ </tr>
76
+ <tr>
77
+ <td width="50%" align="center"><img src="docs/images/dashboard-c500.png" alt="dashboard"></td>
78
+ <td width="50%" align="center"><img src="docs/images/report-mri.png" alt="model MRI"></td>
79
+ </tr>
80
+ <tr>
81
+ <td width="50%" align="center"><sub>Qwen2.5-7B 实时推理于沐曦曦云 C500:热力图随 token 生成从左到右动态生长(plasma:暗=冗余,亮=活跃)</sub></td>
82
+ <td width="50%" align="center"><sub>每一层画成同心环,橙色=活跃、灰绿色=冗余,一眼定位「摸鱼层」</sub></td>
83
+ </tr>
84
+ <tr>
85
+ <td width="50%" align="center"><b>层级脉冲 + 数据河流</b></td>
86
+ <td width="50%" align="center"><b>多模型对比报告</b></td>
87
+ </tr>
88
+ <tr>
89
+ <td width="50%" align="center"><img src="docs/images/report-pulse.png" alt="layer pulse"></td>
90
+ <td width="50%" align="center"><img src="docs/images/report-comparison.png" alt="comparison"></td>
91
+ </tr>
92
+ <tr>
93
+ <td width="50%" align="center"><sub>每层一个迷你波形:平线=冗余、尖峰=活跃;ThemeRiver 展示活跃度随 token 流动</sub></td>
94
+ <td width="50%" align="center"><sub><code>univis compare</code> 横向比较多个模型的冗余分布</sub></td>
95
+ </tr>
96
+ </table>
97
+
98
+ ## 为什么需要 UniVis
99
+
100
+ Transformer 推理成本与显存随参数量暴涨,但并非每一层、每个生成步骤贡献相同——省算力就是省钱,这在国产算力资源紧张的当下尤其重要。要优化,先要知道冗余在哪里。现有工具却都看向别处:
101
+
102
+ | 工具 | 观测期 | 粒度 | 侵入性 | 上手门槛 |
103
+ |---|---|---|---|---|
104
+ | TensorBoard / W&B | 训练期 | loss 等宏观标量 | 需埋点 | 低 |
105
+ | BertViz | 推理期 | 注意力语义 | 需写分析脚本 | 中 |
106
+ | Nsight 等 profiler | 推理期 | GPU 算子 / 内核 | 环境级插桩 | 高 |
107
+ | **UniVis** | **推理期** | **逐层 × 逐 token 冗余指标** | **零侵入 hook** | **低** |
108
+
109
+ UniVis 填补的是中间缺失的语义层:**推理期逐层、逐 token 的冗余度量**,每步只传输几 KB。
110
+
111
+ ## 国产算力与 MXMACA 适配
112
+
113
+ UniVis 的实现天然面向跨硬件移植,以下事实逐条可查证:
114
+
115
+ - **纯 PyTorch `forward` hook 实现**,无任何 CUDA 专有 API 依赖;
116
+ - 指标在**端侧**(hook 内部)计算,单步负载仅 1–2 KB,不增加推理瓶颈;
117
+ - 离线路径(JSONL → HTML 报告)**纯 CPU 可运行**;
118
+ - 不依赖特定 GPU 厂商的 profiler 工具链。
119
+
120
+ ### 环境矩阵
121
+
122
+ | 环境 | 硬件 | 状态 | 已验证内容 |
123
+ |---|---|---|---|
124
+ | NVIDIA L20(48GB) | NVIDIA GPU | ✅ **已验证** | Qwen2.5-0.5B / 3B / 7B + 27B 级 hybrid 完整诊断(跨约 54× 参数跨度) |
125
+ | CPU(无 GPU) | — | ✅ **已验证** | 全量 82 项单元测试、离线报告渲染 |
126
+ | MetaX 曦云 C500(sGPU 切分实例) | 沐曦 GPU + MXMACA 软件栈 | ✅ **阶段 A + B 已验证** | Qwen2.5-0.5B / 3B / 7B 跨硬件对照(与 NVIDIA L20 画像一致性 r ≥ 0.9998),[证据存档](docs/mxmaca/phase-b/README.md) |
127
+
128
+ ### 阶段化路线图
129
+
130
+ | 阶段 | 目标 | 完成判据 | 状态 |
131
+ |---|---|---|---|
132
+ | A | 曦云 C500 指标采集通路验证 | Qwen2.5-0.5B 完整生成一次,产出 HTML 报告 + JSONL 留档 + 环境指纹(MXMACA / mcPyTorch 精确版本 + `mx-smi` 输出) | ✅ **已完成(2026-08-19)**,[证据](docs/mxmaca/phase-a/README.md) |
133
+ | B | C500 跨规模冗余基线 | 0.5B / 3B / 7B 基线报告 + 与 NVIDIA L20 同模型同提示词的对比表 | ✅ **已完成(2026-08-19)**:三规模画像一致性 r ≥ 0.9998,[证据](docs/mxmaca/phase-b/README.md)(27B 需整机 C500,属后续) |
134
+ | C | 诊断结果反哺沐曦生态 | 以冗余定位结论作为 FlagGems / mcTriton 算子优化的输入示例 | 规划中 |
135
+
136
+ ### 精确支持契约与范围声明
137
+
138
+ | 项 | 当前契约 |
139
+ |---|---|
140
+ | 已实测模型 | Qwen2.5-0.5B / 3B / 7B-Instruct(bf16)、Qwen3.6-27B(hybrid) |
141
+ | 自动识别架构 | GPT-2 系;LLaMA 系(LLaMA 1/2/3、Mistral、Mixtral);Qwen 系(1.5 / 2 / 2.5 / 3);BERT 系(BERT、RoBERTa、ALBERT、DeBERTa) |
142
+ | 软件栈 | NVIDIA 栈:Python ≥ 3.10、PyTorch ≥ 2.0、HF transformers(L20 实测);沐曦栈:torch 2.8.0+metax3.3.0.2、MACA 3.3.0.15、transformers 4.57.3(C500 阶段 A 实测) |
143
+ | 硬件 | NVIDIA GPU(CUDA)与 CPU 已验证;沐曦 MXMACA 适配按阶段推进(见上) |
144
+
145
+ **范围声明:**以上验证仅限所列模型与架构,冗余结论不外推到未测模型——这恰恰是 UniVis 的价值:在新模型上跑一次诊断,得到它自己的冗余画像,再谈优化。
146
+
147
+ ### 无卡可审计
148
+
149
+ UniVis 的全部诊断产出——JSONL 原始数据、自包含 HTML 报告、环境指纹——都可在**无 GPU 环境**直接打开复核。诊断工具本身就是证据链:C500 阶段 A 的完整证据(数据、报告、指纹)已发布于 [docs/mxmaca/phase-a/](docs/mxmaca/phase-a/README.md),任何人无需租卡即可审计。
150
+
151
+ 我们期待与沐曦及 MXMACA 社区在测试资源、技术指导与生态联动上展开合作。适配详情与环境指纹规范见 [docs/mxmaca-adaptation.md](docs/mxmaca-adaptation.md)。
152
+
153
+ ## 核心功能
154
+
155
+ - **低侵入 SDK** —— `univis.attach(model)` 一行挂载;detection 按模型 config 自动识别架构,probe 以 `forward` hook 逐层采集,无需改动目标模型。5 项核心指标:Relative Delta、层间余弦相似度、激活稀疏度、预测熵、显存变化。
156
+ - **实时 Dashboard** —— React 18 + TypeScript + ECharts,热力图随 token 生成从左到右生长,支持统计面板、过滤与点击交互。
157
+ - **离线 HTML 报告** —— 单文件、零依赖、可直接打开:模型 MRI 同心环、层级脉冲、ThemeRiver 数据河流、带趋势标注的冗余排名。
158
+ - **多模型对比 CLI** —— `univis compare` 横向比较多个模型的冗余分布,含雷达图与对比表。
159
+ - **Pilot 干预(实验性)** —— 把度量变成行动:基于预测熵的生成提前终止(early-exit);layer-skip 路线的负结果已完整公开(见下节)。
160
+ - **工程质量** —— 82 项单元测试全绿、GitHub Actions CI、3 个 CLI 入口、Python 3.10+ 全类型注解。
161
+
162
+ ## 实验发现
163
+
164
+ ### 1. 中间层冗余最显著,且跨规模稳定成立
165
+
166
+ <div align="center">
167
+
168
+ <img src="docs/images/cross-scale.png" alt="cross-scale redundancy" width="92%">
169
+
170
+ <sub>Qwen2.5-0.5B / 3B / 7B + Qwen3.6-27B(hybrid),参数跨度约 54 倍。层深度归一化到 [0,1] 后,四个模型的中间段余弦相似度都明显高于浅层与深层。</sub>
171
+
172
+ </div>
173
+
174
+ ### 2. 一次公开的失败:layer-skip 不成立
175
+
176
+ Pilot v1 曾按「高余弦相似度 = 可跳过」的直觉跳过中间冗余层,实测(Qwen2.5-7B,NVIDIA L20):
177
+
178
+ | 配置 | perplexity | 变化 |
179
+ |---|---|---|
180
+ | 基线(全部层) | 13.81 | — |
181
+ | 跳过中间冗余层 | 105.67 | **+665%** |
182
+
183
+ 结论:残差架构里余弦相似度饱和 ≠ 该层无用,「看似冗余」的层仍承担必要的细化计算(完整记录见 commit `1938d60` 与 `examples/pilot_perplexity.py`)。据此 Pilot 转向**基于置信度的 early-exit**:当预测熵持续低于阈值时提前结束生成。
184
+
185
+ **early-exit 首批权衡数据(C500 实测,Qwen2.5-0.5B/3B)**:朴素逐 token 熵阈值不可用——聊天模型的格式化 token 形成散布全答案的超低熵簇,任何阈值都会过早截断;引入**连续窗口判据**(`entropy_window`,连续 N 步低熵才退出)后得到单调可控的权衡曲线:保守档省 ~9% token 保留 93% 内容,激进档省 66% 保留 42%(8 提示词 × 128 token,greedy)。曲线族与原始数据见 [docs/mxmaca/phase-b/](docs/mxmaca/phase-b/README.md#附带发现-2窗口化-early-exit-首批权衡数据)。
186
+
187
+ ### 3. 跨硬件实证:冗余画像在沐曦 C500 与 NVIDIA L20 上一致
188
+
189
+ 同一模型、同一提示词、同一解码协议(greedy / bf16 / 50 token),分别在 MetaX 曦云 C500 与 NVIDIA L20 上诊断,逐层冗余画像的皮尔逊相关系数:
190
+
191
+ | 模型 | 架构 | r(余弦画像) | r(Relative Delta 画像) |
192
+ |---|---|---|---|
193
+ | Qwen2.5-0.5B | Qwen2 | 0.9998 → 1.0000 | 1.0000 |
194
+ | Qwen2.5-3B | Qwen2 | 1.0000 | 1.0000 |
195
+ | Qwen2.5-7B | Qwen2 | 1.0000 | 1.0000 |
196
+ | TinyLlama-1.1B | Llama | 0.9968 | 0.9998 |
197
+
198
+ (箭头右侧为 10 条多样化提示词复测值;TinyLlama 为跨架构可移植性检验。)
199
+
200
+ 在该测试范围内,「哪些层冗余」的结论跨硬件可迁移——无需为每种 GPU 重新推导。方法学与全部数据见 [docs/mxmaca/phase-b/](docs/mxmaca/phase-b/README.md)。同轮 C500 实测还驱动了一次工具自身的重要修复:hook 采集开销从旧实现的多层数下 +400~486%(逐层设备同步被放大)优化到 +55% 量级(每步一次批量回传),指标数值逐位不变——「先测量,再优化」正是 UniVis 的用途示范。
201
+
202
+ *以上实验环境:NVIDIA L20(48GB)与 MetaX 曦云 C500(16GB sGPU 切分);27B 级模型为 L20 单侧验证。*
203
+
204
+ ## 快速开始
205
+
206
+ ```bash
207
+ git clone https://github.com/cookiesheep/univis && cd univis
208
+ pip install -e ".[dev]"
209
+ ```
210
+
211
+ **A · 离线报告(最简)**
212
+
213
+ ```python
214
+ import univis
215
+
216
+ tracker = univis.attach(model, transport="file")
217
+ for token_id in generate_loop():
218
+ tracker.on_step(token_id)
219
+ report_path = tracker.finish() # → 自包含 HTML 报告
220
+ ```
221
+
222
+ **B · `model.generate()` 集成**
223
+
224
+ ```python
225
+ tracker = univis.attach(model)
226
+ lp = tracker.logits_processor(tokenizer)
227
+ output = model.generate(input_ids, logits_processor=[lp], max_new_tokens=50)
228
+ tracker.finish()
229
+ ```
230
+
231
+ **C · 实时 Dashboard**
232
+
233
+ ```bash
234
+ python -m univis serve # 终端 1:WebSocket 服务(:8765)
235
+ cd dashboard && npm run dev # 终端 2:Dashboard(:5173)
236
+ python your_script.py # 终端 3:transport="websocket" 运行推理
237
+ ```
238
+
239
+ 三个 CLI 入口:`univis serve`(实时服务)、`univis report`(JSONL → HTML)、`univis compare`(多模型对比)。
240
+
241
+ ## 架构
242
+
243
+ ```
244
+ 你的模型
245
+ │ univis.attach(model)
246
+ ▼
247
+ ┌──────────────────────── univis SDK ───────────────────────┐
248
+ │ detection → probe (forward_hook) → metrics → transport │
249
+ │ (自动识别) (逐层) (标量) (JSONL/HTTP) │
250
+ │ │
251
+ │ 指标在端侧算好 ── 只输出 KB 级 JSON │
252
+ └───────────────────────────┬────────────────────────────────┘
253
+ │ HTTP POST → WebSocket
254
+ ▼
255
+ React + ECharts Dashboard
256
+ (实时热力图 · 统计 · 过滤)
257
+ │
258
+ ▼ tracker.finish()
259
+ 可独立打开的 HTML 报告
260
+ ```
261
+
262
+ 三层组成:采集 SDK(detection / probe / metrics / transport / tracker / pilot)、FastAPI WebSocket 服务、React 前端。核心设计是**边缘计算**:高维激活在 hook 内部就地降维为标量,监控永不阻塞推理。完整模块设计与 API 见 [ARCHITECTURE.md](ARCHITECTURE.md),范围与动机见 [PRD.md](PRD.md)。
263
+
264
+ ## 工程质量
265
+
266
+ - **82 项单元测试**(8 个测试文件)覆盖 SDK、server、报告生成、三终端链路与 Pilot,`pytest tests/` 全绿;
267
+ - **GitHub Actions CI**:每次 push 在 Python 3.10 / 3.12 + CPU torch 上自动跑全量测试;
268
+ - Python ≥ 3.10 全类型注解,SDK 10 个模块,公开 API 统一在 `__init__.py` 导出。
269
+
270
+ ```
271
+ src/univis/ Python SDK —— attach() → on_step() → finish()
272
+ dashboard/ React 18 + TypeScript + ECharts 前端
273
+ docs/images/ 报告与图表样例
274
+ examples/ 可运行示例
275
+ tests/ 82 项单元测试
276
+ ```
277
+
278
+ ## 路线图
279
+
280
+ - **近期** —— Pilot early-exit:首批权衡数据已产出(C500,窗口判据),扩展到更多提示词集与 27B 级;C500 剩余 ~55% 采集开销的继续压缩;27B 级 C500 整机验证。
281
+ - **中期** —— MXMACA 验证深化(阶段 C,对接 FlagGems / mcTriton 生态);DiT / 视频生成模型(去噪步之间的时序冗余);hook 下钻到 Attention / FFN 子层。
282
+ - **远期** —— 70B+ 与 MoE 模型;接入主流推理框架。
283
+
284
+ ## 社区与合作
285
+
286
+ UniVis 已用于实验室内部日常诊断与教学演示。GitLink 镜像筹备中。欢迎贡献——新的指标插件、模型适配、Dashboard 视图与 benchmark 都有价值,参见 [CONTRIBUTING.md](CONTRIBUTING.md);`metrics.py` 中的指标函数是纯函数、可独立测试,新增指标风险很低。
287
+
288
+ ## 许可证
289
+
290
+ [MIT](LICENSE)
291
+
292
+ ## 鸣谢
293
+
294
+ 感谢中山大学 AI Systems 研究组提供的算力资源与技术讨论。本项目基于 PyTorch、FastAPI、React、ECharts 构建。
univis-0.6.0/README.md ADDED
@@ -0,0 +1,255 @@
1
+ <div align="center">
2
+
3
+ # UniVis
4
+
5
+ **找出大模型推理时哪些层在空转浪费算力 —— Transformer 推理冗余诊断与可视化工具**
6
+
7
+ *Find out which layers of your LLM actually compute at inference — and which are idle.*
8
+
9
+ `AI Infra · 大模型推理优化与部署`
10
+
11
+ [![CI](https://github.com/cookiesheep/univis/actions/workflows/ci.yml/badge.svg)](https://github.com/cookiesheep/univis/actions/workflows/ci.yml)
12
+ [![Tests](https://img.shields.io/badge/tests-82-brightgreen.svg)](tests)
13
+ [![Python 3.10+](https://img.shields.io/badge/Python-3.10%2B-blue.svg)](https://www.python.org/downloads/)
14
+ [![PyTorch](https://img.shields.io/badge/PyTorch-2.0%2B-ee4c2c.svg)](https://pytorch.org/)
15
+ [![License: MIT](https://img.shields.io/badge/License-MIT-green.svg)](LICENSE)
16
+ [![PRs Welcome](https://img.shields.io/badge/PRs-welcome-brightgreen.svg)](CONTRIBUTING.md)
17
+
18
+ [English](README.en.md) · 简体中文
19
+
20
+ </div>
21
+
22
+ <img src="docs/images/dashboard-c500.png" alt="UniVis Dashboard" width="100%">
23
+
24
+ UniVis 通过 `forward` hook 零侵入地附着在任意 PyTorch / HuggingFace Transformer 上,在**端侧(hook 内部)**把每层激活降维为标量指标(单步仅约 1–2 KB),经 JSONL / WebSocket 输出实时 Dashboard 或自包含离线 HTML 报告,回答一个问题:**推理时,哪些层在真正计算,哪些层在冗余。**
25
+
26
+ UniVis 是**度量与可视化**工具——不修改、不剪枝、不加速你的模型,而是给出判断「该优化什么」的证据,并提供一条可实验的干预路径(Pilot)。
27
+
28
+ ---
29
+
30
+ ## ✨ 效果展示
31
+
32
+ <table>
33
+ <tr>
34
+ <td width="50%" align="center"><b>实时 Dashboard</b></td>
35
+ <td width="50%" align="center"><b>模型 MRI · 同心环</b></td>
36
+ </tr>
37
+ <tr>
38
+ <td width="50%" align="center"><img src="docs/images/dashboard-c500.png" alt="dashboard"></td>
39
+ <td width="50%" align="center"><img src="docs/images/report-mri.png" alt="model MRI"></td>
40
+ </tr>
41
+ <tr>
42
+ <td width="50%" align="center"><sub>Qwen2.5-7B 实时推理于沐曦曦云 C500:热力图随 token 生成从左到右动态生长(plasma:暗=冗余,亮=活跃)</sub></td>
43
+ <td width="50%" align="center"><sub>每一层画成同心环,橙色=活跃、灰绿色=冗余,一眼定位「摸鱼层」</sub></td>
44
+ </tr>
45
+ <tr>
46
+ <td width="50%" align="center"><b>层级脉冲 + 数据河流</b></td>
47
+ <td width="50%" align="center"><b>多模型对比报告</b></td>
48
+ </tr>
49
+ <tr>
50
+ <td width="50%" align="center"><img src="docs/images/report-pulse.png" alt="layer pulse"></td>
51
+ <td width="50%" align="center"><img src="docs/images/report-comparison.png" alt="comparison"></td>
52
+ </tr>
53
+ <tr>
54
+ <td width="50%" align="center"><sub>每层一个迷你波形:平线=冗余、尖峰=活跃;ThemeRiver 展示活跃度随 token 流动</sub></td>
55
+ <td width="50%" align="center"><sub><code>univis compare</code> 横向比较多个模型的冗余分布</sub></td>
56
+ </tr>
57
+ </table>
58
+
59
+ ## 为什么需要 UniVis
60
+
61
+ Transformer 推理成本与显存随参数量暴涨,但并非每一层、每个生成步骤贡献相同——省算力就是省钱,这在国产算力资源紧张的当下尤其重要。要优化,先要知道冗余在哪里。现有工具却都看向别处:
62
+
63
+ | 工具 | 观测期 | 粒度 | 侵入性 | 上手门槛 |
64
+ |---|---|---|---|---|
65
+ | TensorBoard / W&B | 训练期 | loss 等宏观标量 | 需埋点 | 低 |
66
+ | BertViz | 推理期 | 注意力语义 | 需写分析脚本 | 中 |
67
+ | Nsight 等 profiler | 推理期 | GPU 算子 / 内核 | 环境级插桩 | 高 |
68
+ | **UniVis** | **推理期** | **逐层 × 逐 token 冗余指标** | **零侵入 hook** | **低** |
69
+
70
+ UniVis 填补的是中间缺失的语义层:**推理期逐层、逐 token 的冗余度量**,每步只传输几 KB。
71
+
72
+ ## 国产算力与 MXMACA 适配
73
+
74
+ UniVis 的实现天然面向跨硬件移植,以下事实逐条可查证:
75
+
76
+ - **纯 PyTorch `forward` hook 实现**,无任何 CUDA 专有 API 依赖;
77
+ - 指标在**端侧**(hook 内部)计算,单步负载仅 1–2 KB,不增加推理瓶颈;
78
+ - 离线路径(JSONL → HTML 报告)**纯 CPU 可运行**;
79
+ - 不依赖特定 GPU 厂商的 profiler 工具链。
80
+
81
+ ### 环境矩阵
82
+
83
+ | 环境 | 硬件 | 状态 | 已验证内容 |
84
+ |---|---|---|---|
85
+ | NVIDIA L20(48GB) | NVIDIA GPU | ✅ **已验证** | Qwen2.5-0.5B / 3B / 7B + 27B 级 hybrid 完整诊断(跨约 54× 参数跨度) |
86
+ | CPU(无 GPU) | — | ✅ **已验证** | 全量 82 项单元测试、离线报告渲染 |
87
+ | MetaX 曦云 C500(sGPU 切分实例) | 沐曦 GPU + MXMACA 软件栈 | ✅ **阶段 A + B 已验证** | Qwen2.5-0.5B / 3B / 7B 跨硬件对照(与 NVIDIA L20 画像一致性 r ≥ 0.9998),[证据存档](docs/mxmaca/phase-b/README.md) |
88
+
89
+ ### 阶段化路线图
90
+
91
+ | 阶段 | 目标 | 完成判据 | 状态 |
92
+ |---|---|---|---|
93
+ | A | 曦云 C500 指标采集通路验证 | Qwen2.5-0.5B 完整生成一次,产出 HTML 报告 + JSONL 留档 + 环境指纹(MXMACA / mcPyTorch 精确版本 + `mx-smi` 输出) | ✅ **已完成(2026-08-19)**,[证据](docs/mxmaca/phase-a/README.md) |
94
+ | B | C500 跨规模冗余基线 | 0.5B / 3B / 7B 基线报告 + 与 NVIDIA L20 同模型同提示词的对比表 | ✅ **已完成(2026-08-19)**:三规模画像一致性 r ≥ 0.9998,[证据](docs/mxmaca/phase-b/README.md)(27B 需整机 C500,属后续) |
95
+ | C | 诊断结果反哺沐曦生态 | 以冗余定位结论作为 FlagGems / mcTriton 算子优化的输入示例 | 规划中 |
96
+
97
+ ### 精确支持契约与范围声明
98
+
99
+ | 项 | 当前契约 |
100
+ |---|---|
101
+ | 已实测模型 | Qwen2.5-0.5B / 3B / 7B-Instruct(bf16)、Qwen3.6-27B(hybrid) |
102
+ | 自动识别架构 | GPT-2 系;LLaMA 系(LLaMA 1/2/3、Mistral、Mixtral);Qwen 系(1.5 / 2 / 2.5 / 3);BERT 系(BERT、RoBERTa、ALBERT、DeBERTa) |
103
+ | 软件栈 | NVIDIA 栈:Python ≥ 3.10、PyTorch ≥ 2.0、HF transformers(L20 实测);沐曦栈:torch 2.8.0+metax3.3.0.2、MACA 3.3.0.15、transformers 4.57.3(C500 阶段 A 实测) |
104
+ | 硬件 | NVIDIA GPU(CUDA)与 CPU 已验证;沐曦 MXMACA 适配按阶段推进(见上) |
105
+
106
+ **范围声明:**以上验证仅限所列模型与架构,冗余结论不外推到未测模型——这恰恰是 UniVis 的价值:在新模型上跑一次诊断,得到它自己的冗余画像,再谈优化。
107
+
108
+ ### 无卡可审计
109
+
110
+ UniVis 的全部诊断产出——JSONL 原始数据、自包含 HTML 报告、环境指纹——都可在**无 GPU 环境**直接打开复核。诊断工具本身就是证据链:C500 阶段 A 的完整证据(数据、报告、指纹)已发布于 [docs/mxmaca/phase-a/](docs/mxmaca/phase-a/README.md),任何人无需租卡即可审计。
111
+
112
+ 我们期待与沐曦及 MXMACA 社区在测试资源、技术指导与生态联动上展开合作。适配详情与环境指纹规范见 [docs/mxmaca-adaptation.md](docs/mxmaca-adaptation.md)。
113
+
114
+ ## 核心功能
115
+
116
+ - **低侵入 SDK** —— `univis.attach(model)` 一行挂载;detection 按模型 config 自动识别架构,probe 以 `forward` hook 逐层采集,无需改动目标模型。5 项核心指标:Relative Delta、层间余弦相似度、激活稀疏度、预测熵、显存变化。
117
+ - **实时 Dashboard** —— React 18 + TypeScript + ECharts,热力图随 token 生成从左到右生长,支持统计面板、过滤与点击交互。
118
+ - **离线 HTML 报告** —— 单文件、零依赖、可直接打开:模型 MRI 同心环、层级脉冲、ThemeRiver 数据河流、带趋势标注的冗余排名。
119
+ - **多模型对比 CLI** —— `univis compare` 横向比较多个模型的冗余分布,含雷达图与对比表。
120
+ - **Pilot 干预(实验性)** —— 把度量变成行动:基于预测熵的生成提前终止(early-exit);layer-skip 路线的负结果已完整公开(见下节)。
121
+ - **工程质量** —— 82 项单元测试全绿、GitHub Actions CI、3 个 CLI 入口、Python 3.10+ 全类型注解。
122
+
123
+ ## 实验发现
124
+
125
+ ### 1. 中间层冗余最显著,且跨规模稳定成立
126
+
127
+ <div align="center">
128
+
129
+ <img src="docs/images/cross-scale.png" alt="cross-scale redundancy" width="92%">
130
+
131
+ <sub>Qwen2.5-0.5B / 3B / 7B + Qwen3.6-27B(hybrid),参数跨度约 54 倍。层深度归一化到 [0,1] 后,四个模型的中间段余弦相似度都明显高于浅层与深层。</sub>
132
+
133
+ </div>
134
+
135
+ ### 2. 一次公开的失败:layer-skip 不成立
136
+
137
+ Pilot v1 曾按「高余弦相似度 = 可跳过」的直觉跳过中间冗余层,实测(Qwen2.5-7B,NVIDIA L20):
138
+
139
+ | 配置 | perplexity | 变化 |
140
+ |---|---|---|
141
+ | 基线(全部层) | 13.81 | — |
142
+ | 跳过中间冗余层 | 105.67 | **+665%** |
143
+
144
+ 结论:残差架构里余弦相似度饱和 ≠ 该层无用,「看似冗余」的层仍承担必要的细化计算(完整记录见 commit `1938d60` 与 `examples/pilot_perplexity.py`)。据此 Pilot 转向**基于置信度的 early-exit**:当预测熵持续低于阈值时提前结束生成。
145
+
146
+ **early-exit 首批权衡数据(C500 实测,Qwen2.5-0.5B/3B)**:朴素逐 token 熵阈值不可用——聊天模型的格式化 token 形成散布全答案的超低熵簇,任何阈值都会过早截断;引入**连续窗口判据**(`entropy_window`,连续 N 步低熵才退出)后得到单调可控的权衡曲线:保守档省 ~9% token 保留 93% 内容,激进档省 66% 保留 42%(8 提示词 × 128 token,greedy)。曲线族与原始数据见 [docs/mxmaca/phase-b/](docs/mxmaca/phase-b/README.md#附带发现-2窗口化-early-exit-首批权衡数据)。
147
+
148
+ ### 3. 跨硬件实证:冗余画像在沐曦 C500 与 NVIDIA L20 上一致
149
+
150
+ 同一模型、同一提示词、同一解码协议(greedy / bf16 / 50 token),分别在 MetaX 曦云 C500 与 NVIDIA L20 上诊断,逐层冗余画像的皮尔逊相关系数:
151
+
152
+ | 模型 | 架构 | r(余弦画像) | r(Relative Delta 画像) |
153
+ |---|---|---|---|
154
+ | Qwen2.5-0.5B | Qwen2 | 0.9998 → 1.0000 | 1.0000 |
155
+ | Qwen2.5-3B | Qwen2 | 1.0000 | 1.0000 |
156
+ | Qwen2.5-7B | Qwen2 | 1.0000 | 1.0000 |
157
+ | TinyLlama-1.1B | Llama | 0.9968 | 0.9998 |
158
+
159
+ (箭头右侧为 10 条多样化提示词复测值;TinyLlama 为跨架构可移植性检验。)
160
+
161
+ 在该测试范围内,「哪些层冗余」的结论跨硬件可迁移——无需为每种 GPU 重新推导。方法学与全部数据见 [docs/mxmaca/phase-b/](docs/mxmaca/phase-b/README.md)。同轮 C500 实测还驱动了一次工具自身的重要修复:hook 采集开销从旧实现的多层数下 +400~486%(逐层设备同步被放大)优化到 +55% 量级(每步一次批量回传),指标数值逐位不变——「先测量,再优化」正是 UniVis 的用途示范。
162
+
163
+ *以上实验环境:NVIDIA L20(48GB)与 MetaX 曦云 C500(16GB sGPU 切分);27B 级模型为 L20 单侧验证。*
164
+
165
+ ## 快速开始
166
+
167
+ ```bash
168
+ git clone https://github.com/cookiesheep/univis && cd univis
169
+ pip install -e ".[dev]"
170
+ ```
171
+
172
+ **A · 离线报告(最简)**
173
+
174
+ ```python
175
+ import univis
176
+
177
+ tracker = univis.attach(model, transport="file")
178
+ for token_id in generate_loop():
179
+ tracker.on_step(token_id)
180
+ report_path = tracker.finish() # → 自包含 HTML 报告
181
+ ```
182
+
183
+ **B · `model.generate()` 集成**
184
+
185
+ ```python
186
+ tracker = univis.attach(model)
187
+ lp = tracker.logits_processor(tokenizer)
188
+ output = model.generate(input_ids, logits_processor=[lp], max_new_tokens=50)
189
+ tracker.finish()
190
+ ```
191
+
192
+ **C · 实时 Dashboard**
193
+
194
+ ```bash
195
+ python -m univis serve # 终端 1:WebSocket 服务(:8765)
196
+ cd dashboard && npm run dev # 终端 2:Dashboard(:5173)
197
+ python your_script.py # 终端 3:transport="websocket" 运行推理
198
+ ```
199
+
200
+ 三个 CLI 入口:`univis serve`(实时服务)、`univis report`(JSONL → HTML)、`univis compare`(多模型对比)。
201
+
202
+ ## 架构
203
+
204
+ ```
205
+ 你的模型
206
+ │ univis.attach(model)
207
+ ▼
208
+ ┌──────────────────────── univis SDK ───────────────────────┐
209
+ │ detection → probe (forward_hook) → metrics → transport │
210
+ │ (自动识别) (逐层) (标量) (JSONL/HTTP) │
211
+ │ │
212
+ │ 指标在端侧算好 ── 只输出 KB 级 JSON │
213
+ └───────────────────────────┬────────────────────────────────┘
214
+ │ HTTP POST → WebSocket
215
+ ▼
216
+ React + ECharts Dashboard
217
+ (实时热力图 · 统计 · 过滤)
218
+ │
219
+ ▼ tracker.finish()
220
+ 可独立打开的 HTML 报告
221
+ ```
222
+
223
+ 三层组成:采集 SDK(detection / probe / metrics / transport / tracker / pilot)、FastAPI WebSocket 服务、React 前端。核心设计是**边缘计算**:高维激活在 hook 内部就地降维为标量,监控永不阻塞推理。完整模块设计与 API 见 [ARCHITECTURE.md](ARCHITECTURE.md),范围与动机见 [PRD.md](PRD.md)。
224
+
225
+ ## 工程质量
226
+
227
+ - **82 项单元测试**(8 个测试文件)覆盖 SDK、server、报告生成、三终端链路与 Pilot,`pytest tests/` 全绿;
228
+ - **GitHub Actions CI**:每次 push 在 Python 3.10 / 3.12 + CPU torch 上自动跑全量测试;
229
+ - Python ≥ 3.10 全类型注解,SDK 10 个模块,公开 API 统一在 `__init__.py` 导出。
230
+
231
+ ```
232
+ src/univis/ Python SDK —— attach() → on_step() → finish()
233
+ dashboard/ React 18 + TypeScript + ECharts 前端
234
+ docs/images/ 报告与图表样例
235
+ examples/ 可运行示例
236
+ tests/ 82 项单元测试
237
+ ```
238
+
239
+ ## 路线图
240
+
241
+ - **近期** —— Pilot early-exit:首批权衡数据已产出(C500,窗口判据),扩展到更多提示词集与 27B 级;C500 剩余 ~55% 采集开销的继续压缩;27B 级 C500 整机验证。
242
+ - **中期** —— MXMACA 验证深化(阶段 C,对接 FlagGems / mcTriton 生态);DiT / 视频生成模型(去噪步之间的时序冗余);hook 下钻到 Attention / FFN 子层。
243
+ - **远期** —— 70B+ 与 MoE 模型;接入主流推理框架。
244
+
245
+ ## 社区与合作
246
+
247
+ UniVis 已用于实验室内部日常诊断与教学演示。GitLink 镜像筹备中。欢迎贡献——新的指标插件、模型适配、Dashboard 视图与 benchmark 都有价值,参见 [CONTRIBUTING.md](CONTRIBUTING.md);`metrics.py` 中的指标函数是纯函数、可独立测试,新增指标风险很低。
248
+
249
+ ## 许可证
250
+
251
+ [MIT](LICENSE)
252
+
253
+ ## 鸣谢
254
+
255
+ 感谢中山大学 AI Systems 研究组提供的算力资源与技术讨论。本项目基于 PyTorch、FastAPI、React、ECharts 构建。
@@ -0,0 +1,74 @@
1
+ [build-system]
2
+ requires = ["setuptools>=68.0", "wheel"]
3
+ build-backend = "setuptools.build_meta"
4
+
5
+ [project]
6
+ name = "univis"
7
+ version = "0.6.0"
8
+ description = "Transformer inference redundancy diagnostic and visualization toolkit"
9
+ readme = "README.md"
10
+ requires-python = ">=3.10"
11
+ license = {text = "MIT"}
12
+ keywords = [
13
+ "transformer",
14
+ "llm",
15
+ "inference",
16
+ "redundancy",
17
+ "observability",
18
+ "profiling",
19
+ "visualization",
20
+ "mxmaca",
21
+ "domestic-gpu",
22
+ "edge-computing",
23
+ ]
24
+ dependencies = [
25
+ "torch>=2.0",
26
+ "numpy",
27
+ "fastapi>=0.100",
28
+ "uvicorn",
29
+ "websockets",
30
+ ]
31
+
32
+ classifiers = [
33
+ "Development Status :: 4 - Beta",
34
+ "Intended Audience :: Science/Research",
35
+ "Topic :: Scientific/Engineering :: Artificial Intelligence",
36
+ "Programming Language :: Python :: 3",
37
+ "Programming Language :: Python :: 3.10",
38
+ "Programming Language :: Python :: 3.11",
39
+ "Programming Language :: Python :: 3.12",
40
+ "License :: OSI Approved :: MIT License",
41
+ "Operating System :: OS Independent",
42
+ ]
43
+
44
+ [project.scripts]
45
+ univis = "univis.__main__:main"
46
+
47
+ [project.optional-dependencies]
48
+ dev = [
49
+ "pytest",
50
+ "transformers",
51
+ "starlette",
52
+ "websockets",
53
+ ]
54
+ server = [
55
+ "fastapi>=0.100",
56
+ "uvicorn",
57
+ "websockets",
58
+ ]
59
+ dashboard = [] # Separate npm project in dashboard/
60
+
61
+ [project.urls]
62
+ Homepage = "https://github.com/cookiesheep/univis"
63
+ Repository = "https://github.com/cookiesheep/univis"
64
+ Changelog = "https://github.com/cookiesheep/univis/releases"
65
+ Issues = "https://github.com/cookiesheep/univis/issues"
66
+
67
+ [tool.setuptools.packages.find]
68
+ where = ["src"]
69
+
70
+ [tool.setuptools.package-data]
71
+ univis = ["data/echarts.min.js"]
72
+
73
+ [tool.pytest.ini_options]
74
+ testpaths = ["tests"]
univis-0.6.0/setup.cfg ADDED
@@ -0,0 +1,4 @@
1
+ [egg_info]
2
+ tag_build =
3
+ tag_date = 0
4
+