👋 您好,欢迎向 MindStudio Probe 提交 Issue!
我们已收到您的反馈,感谢你对开源社区的支持。🎉
📅处理时效: 维护团队将在24小时内 查看并回复您的问题(工作日)。
🔍自助查询: 在等待期间,建议您先查阅以下资料,可能已有解决方案:
📖 MindStudio Probe官方文档
📝 贡献者指南
请确保 Issue 描述清晰,包含复现步骤和日志,这将帮助我们更快定位问题。谢谢!


/label add triaged




认领这个任务


RFC v0.1:趋势可视化 dump 数据多进程解析设计
1. 背景
趋势可视化工具通过 msprobe data2db 命令,将 msProbe 采集的 dump 或 monitor 数据解析并写入 SQLite 格式的 .trend.db 文件。
当前 --process_num 参数已经支持 monitor 数据的并行处理,但 dump 数据仍采用单进程方式,按照 step、rank 依次读取和处理 dump.json。当 dump 数据包含较多 step 或 rank 时,处理时间会随文件数量增加。
本设计拟为 dump 数据解析增加多进程能力,在保证处理结果正确且与单进程一致的前提下,提高多 dump 文件场景的处理性能。
2. 设计目标
msprobe data2db --format dump支持通过--process_num指定并行解析进程数。--format auto检测到 dump 数据时,--process_num同样生效。process_num=1时保持现有单进程行为。- 单进程与多进程生成的数据库 schema 和各表数据保持一致。
- 支持多 step、多 rank 以及 micro-step 场景。
- 不修改现有 dump 数据目录格式、mapping 规则和
.trend.db数据库格式。 - 子进程异常能够反馈给主进程,避免静默生成不完整的数据库。
3. 非目标
- 不修改趋势可视化前端。
- 不修改 monitor 数据现有的多进程处理逻辑。
- 不修改 dump 数据采集逻辑。
- 不对最终 SQLite 写入过程进行多进程并发写。
4. 当前实现分析
当前 dump 数据解析的主要调用链如下:
msprobe data2db
-> DBImporter.import_dump_data()
-> scan_files()
-> DumpRecordBuilder.import_data()
-> DumpRecordBuilder._process_dump_file()
-> DumpDB 写入 SQLite
涉及的主要文件:
python/msprobe/core/compare/data2db.py
python/msprobe/core/dump/dump2db/dump2db.py
python/msprobe/core/dump/dump2db/db_utils.py
当前实现存在以下特点:
data2db.py已经解析和校验process_num,但该参数只传递给 monitor 数据解析流程。DumpRecordBuilder.import_data()按照 step、rank 串行调用_process_dump_file()。_process_dump_file()同时承担 JSON 解析、target 缓存以及数据库写入。micro_step=True时,下一 step 的起始位置依赖当前 step 下所有 rank 的最大 micro-step 数量。DumpDB在内存中维护 target 缓存,并依赖稳定的处理顺序分配 target ID。
因此,不适合直接让多个子进程同时使用 DumpDB 写入同一个 SQLite 文件。这样可能产生 SQLite 写锁竞争、target ID 顺序不稳定以及缓存不一致等问题。
5. 总体方案
采用“子进程并行解析,主进程确定性写库”的两阶段方案。
扫描 dump 文件
|
v
生成并排序解析任务
|
v
计算各 step 的全局 step 偏移
|
v
子进程并行解析 dump.json
|
v
返回不包含数据库 ID 的规范化记录
|
v
主进程按照固定顺序写入 SQLite
|
v
生成 global_stats 和 tag 映射
子进程只负责文件解析和数据转换,不直接访问最终数据库;主进程负责 target ID 分配、批量写库和最终统计,保证数据库内容和写入顺序稳定。
6. 详细设计
6.1 参数传递
修改 DBImporter.import_dump_data(),将 self.process_num 传递给 DumpRecordBuilder。
process_num 继续复用现有校验规则:
- 必须为正整数;
- 最大值为 128;
- 实际 worker 数量取
min(process_num, dump_file_count)。
process_num=1 时继续使用现有串行路径,避免小数据场景产生额外的进程创建和进程间通信开销。
6.2 任务生成
scan_files() 的返回结果保持不变。
在 DumpRecordBuilder.import_data() 中,将扫描结果转换为解析任务。每个任务对应一个 dump 文件,包含:
original_step
rank
dump_json_path
construct_json_path
所有任务在提交给进程池前按照以下顺序排序:
original_step ASC, rank ASC
该顺序同时作为主进程后续消费结果和分配 target ID 的确定顺序。
6.3 micro-step 全局偏移
当 micro_step=False 时,数据库中的 step 继续使用原始 step 编号。
当 micro_step=True 时:
- 读取各任务对应的
construct.json; - 计算每个
(step, rank)对应的 micro-step 数量; - 对同一个原始 step,取所有 rank 中的最大 micro-step 数量;
- 按原始 step 排序计算前缀和;
- 得到每个原始 step 对应的全局起始 step。
示例:
step0 最大 micro-step 数:2
step1 最大 micro-step 数:3
step2 最大 micro-step 数:1
对应的全局起始位置为:
step0 -> 0
step1 -> 2
step2 -> 5
子进程在解析记录时,根据全局起始位置和记录所属的本地 micro-step 计算最终 step:
global_step = step_start_offset + local_micro_step
6.4 子进程解析
将 _process_dump_file() 中不依赖数据库的逻辑抽取为模块级 worker 函数,确保可以被 ProcessPoolExecutor 调用。
worker 负责:
- 加载
dump.json; - 加载和处理必要的 construct 信息;
- 应用 mapping;
- 判断数据所属的 metric 类型:
- forward;
- backward;
- recompute;
- parameters_grad;
- 解析 input、output、parameters 等 tensor 数据;
- 执行现有的数值转换逻辑;
- 返回规范化记录。
规范化记录不携带 target_id 和 metric_id,至少包含:
rank
global_step
metric_name
target_name
vpp_stage
target_micro_step
norm
max
min
mean
worker 不创建 DumpDB,不共享 SQLite 连接,也不写最终数据库。
6.5 主进程写库
主进程按照任务的 (original_step, rank) 顺序消费 worker 结果。
对于每一个解析结果,主进程复用现有 DumpDB 能力:
- 根据
metric_name获取metric_id; - 调用
cache_targets()缓存 target; - 批量调用
batch_insert_targets()分配并刷新target_id; - 调用
batch_insert_data()写入trend_data; - 全部文件处理完成后写入
global_stats; - 调用
extract_tags_from_processed_targets()生成 tag 及 target 映射。
由于 target 只在主进程中按照固定顺序处理,单进程和多进程可以保持稳定的 target ID 和数据顺序。
6.6 内存控制
单个 dump.json 可能包含较多记录。如果一次提交全部任务,已经完成但尚未消费的结果可能占用较多内存。
计划采用有界的 in-flight 任务窗口,例如:
max_in_flight = max_workers * 2
执行过程:
- 最多提交
max_in_flight个任务; - 主进程消费下一个应处理任务的结果;
- 结果完成写库并释放后,再提交后续任务;
- 始终限制同时保留在内存中的解析结果数量。
数据库写入继续使用现有 Data2DBConst.BATCH_SIZE 进行分批处理。
6.7 异常处理
- worker 解析失败时,将异常和对应文件路径反馈给主进程。
- 主进程记录具体失败的 step、rank 和文件路径。
- 任一任务失败时,取消尚未执行的任务,并使本次转换明确失败。
- 不将部分写入的数据库报告为成功结果。
- 空目录、缺少 dump 文件、非法字段和不支持 dtype 等场景保持现有行为。
7. 兼容性
以下行为保持不变:
rankN和procN目录的扫描及映射规则;- mapping 替换规则;
- forward、backward、recompute、parameters_grad 的识别规则;
- 支持的 Tensor 类型和 dtype;
micro_step=False时使用原始 step 编号;.trend.db文件名和数据库 schema;--format auto、dump、monitor的命令行使用方式。
8. 测试方案
8.1 单元测试
新增或补充以下测试:
DBImporter正确向 dump builder 传递process_num;process_num=1使用串行路径;process_num=2/4使用多进程路径;- process 数量大于 dump 文件数量;
- worker 任务生成和排序;
- micro-step 数量合并和全局偏移计算;
- 同一 step 下不同 rank 的 micro-step 数量不同;
- step 编号不连续;
- mapping 生效;
procN目录映射;- forward、backward、recompute、parameters_grad 数据解析;
- 空数据和非法字段;
- worker 异常能够传递到主进程;
- 失败时不会报告转换成功。
8.2 单进程与多进程等价性测试
准备包含多个 step、rank 和 metric 类型的固定测试数据,分别执行:
msprobe data2db \
--data <dump_path> \
--db <single_process_output> \
--format dump \
--process_num 1
msprobe data2db \
--data <dump_path> \
--db <multi_process_output> \
--format dump \
--process_num 2
msprobe data2db \
--data <dump_path> \
--db <multi_process_output_4> \
--format dump \
--process_num 4
对生成的数据库逐表比较:
global_stats
monitoring_metrics
monitoring_targets
trend_data
monitoring_tags
tag_target_mapping
比较时按照确定字段排序,验证:
- 表结构一致;
- 记录数量一致;
- 全字段数据一致;
- target、metric 和 tag 的关联关系一致;
micro_step=True/False两种模式均一致。
8.3 性能测试
准备以下测试场景:
- 多 rank:1 step × 32 rank;
- 多 step:32 step × 1 rank;
- 多 step、多 rank:32 step × 4 rank。
分别使用:
process_num=1
process_num=2
process_num=4
process_num=8
每组运行三次,记录:
- 测试机器 CPU、内存和 Python 版本;
- dump 文件数量和总大小;
- 数据库最终记录数量;
- 三次运行的中位耗时;
- 相对单进程的加速比;
- 峰值内存占用;
- 单进程和多进程输出一致性结果。
9. 文档修改
更新以下文档:
docs/zh/user_guide/accuracy_compare/trend_visualization_instruct.md
docs/en/accuracy_compare/trend_visualization_instruct.md
修改内容:
- 删除
--process_num“仅用于 monitor 数据”的限制说明; - 说明 dump 和 monitor 数据均支持该参数;
- 增加 dump 数据多进程解析示例;
- 说明小数据场景建议保持默认值 1。
同时修改 data2db.py 中 --process_num 的 CLI help,使其不再只描述 monitor 数据。
10. 预计修改文件
python/msprobe/core/compare/data2db.py
python/msprobe/core/dump/dump2db/dump2db.py
python/msprobe/core/dump/dump2db/db_utils.py(如需要)
test/msprobe_test/core_ut/compare/test_data2db.py
test/msprobe_test/core_ut/dump/dump2db/test_dump2db.py
docs/zh/user_guide/accuracy_compare/trend_visualization_instruct.md
docs/en/accuracy_compare/trend_visualization_instruct.md
11. 当前进度
12. 后续计划
- 构造多 step、多 rank 的固定测试数据;
- 优先完成单进程与多进程数据库逐表等价性测试;
- 拆分
_process_dump_file()中的纯解析逻辑和数据库写入逻辑; - 实现多进程任务调度及有界任务窗口;
- 完成功能测试和性能测试;
- 更新中英文文档并提交 PR。


💻 需求背景、当前现状、期望实现的功能内容、具体的设计方案、以及测试方案
任务来源
本任务来源于#291 MindStudio Probe开源共建任务池
任务背景
msprobe 趋势可视化分析 将msProbe工具采集的精度数据进行解析。将张量目标的统计量数据从迭代步数step、节点rank和张量目标三个维度进行趋势可视化,方便用户从数据整体的趋势分布观测精度数据,分析精度问题。当前对dump工具的落盘数据解析还是单进程的方式,面对dump文件rank数或者step数过多时,时间线性增长。
现状
趋势可视化工具数据解析功能,当前对于dump数据处理场景并不支持多进程处理,需要保证数据处理正确的前提下,实现多进程能力。
修改目标
支持dump数据处理--process_num开启多进程;
单进程和多进程产生数据内容没有差异,但多dump文件下,性能明显提升
交付标准
PR完成合入,满足修改目标,提供测试验证截图并由对接人确认。
级别
L2级:中等代码任务
对接人
@Jian_Daobao
替代方案
补充说明
欢迎加入社区,感谢您对社区的贡献 🎉!