Accuracy 使用示例
1、获取分析报告
dump了某模型训练和推理的数据,接下来用msAgent进行分析。
进入精度分析界面,对于“RL训推不一致分析场景”,
人:输入示例提示词“请基于输入的训练和推理dump数据,分析训推的差异来源,给出可能原因。
Agent:提示给出dump数据文件路径。
人:输入训练和推理的“xxx/dump.json”。
Agent:分析,给出分析对比文档和报告。
人:查看分析文件**【层名映射文件】,结果有问题,一个也没对应上**,如下图所示
人:给Agent增加construct和stack文件,更新分析结果和文件
Agent:更新结果。
人:查看分析文件【层名映射文件】,这下看着没什么问题了。
2、查看分析报告中的分析逻辑和依据
2.1 Agent分析报告内容(部分)
数值验证
使用正确输出索引(output.1)对比结果:
Layer |
训练端 Norm |
推理端 output.1 |
差异 |
状态 |
|---|---|---|---|---|
1 |
79.00 |
63.25 |
19.93% |
✗ 异常 |
5 |
1723.28 |
1696.00 |
1.58% |
⚠ 微小 |
10 |
1725.05 |
1728.00 |
0.17% |
✓ 对齐 |
15 |
1728.08 |
1728.00 |
0.00% |
✓ 对齐 |
20 |
1767.31 |
1760.00 |
0.41% |
✓ 对齐 |
23 |
538.36 |
684.00 |
27.05% |
✗ 异常 |
首尾层异常分析
Layer 0: 推理端 output.0=55.0 接近训练端 55.09,但 output.1=5.12 异常低
Layer 23: 推理端 output.1=684 与训练端 538.36 差异 27%
2.2 人工检查
从数值验证看,Layer 1、23有较大问题。
使用msprobe的分级可视化工具进行人工查看后发现

1、Layer1、Layer23如果打开来看子模块,则结果能对上;
2、训练的Layer层父模块的output和子模块最后一层(Qwen2MLP)的output不是相同值,而推理的是相同值。
故人工复核的结论是:训推结果基本一致。
3、进一步研讨,搞清楚原理,和Agent结果对齐
将上述的人工复核结论反馈给Agent,进行进一步研讨,搞清楚现象的原因
人:输入“训练侧的父模块Module._fsdp_wrapped_module.model.layers.23._fsdp_wrapped_module.Qwen2DecoderLayer.forward.0和父模块中最后一个子模块Module._fsdp_wrapped_module.model.layers.23._fsdp_wrapped_module.mlp.Qwen2MLP.forward.0的输出不一致,而推理侧Module.model.layers.23.Qwen2DecoderLayer.forward.0和Module.model.layers.23.mlp.Qwen2MLP.forward.0的output是一致的,这个是为什么?实际上训练侧和推理侧的Layer23的子模块的output是一致的”
Agent:
这是一个关于 模块层级输出关系 的重要问题。让我解释可能的原因:
关键理解:DecoderLayer 的输出 ≠ MLP 的输出
Qwen2DecoderLayer 的典型结构:
def forward(self, hidden_states, ...):
# Self Attention block
residual = hidden_states
hidden_states = self.input_layernorm(hidden_states)
hidden_states = self.self_attn(hidden_states, ...)
hidden_states = residual + hidden_states # residual connection
# MLP block
residual = hidden_states
hidden_states = self.post_attention_layernorm(hidden_states)
hidden_states = self.mlp(hidden_states)
hidden_states = residual + hidden_states # 关键!residual connection
return hidden_states # DecoderLayer 的输出
核心点:
• DecoderLayer.output = residual + mlp.output(经过 residual connection)
• 不是直接等于 mlp.output
训练侧的Layer是单输入单输出(直接输出hidden_states),而推理侧的为多输入多输出。具体的,推理侧的input0是位置编码,input1和input2是上一层的residual和mlp.output,输出则是residual和mlp.output。 这就解释了:
1、训推子模块能对上,因为都是mlp.output;
2、训推父模块对不上,因为一个是单输出residual + mlp.output,一个是双输出residual,mlp.output。
人:把上述结论反馈给Agent
Agent:
好,这下对齐了。
4、总结
1、在这个案例中,Qwen2模型的训推实现有明显区别(子模块、算子存在融合),但整体模块结构可以大致对上,在提供construct信息后,Agent可以大致对齐层。
2、但训推的层的输入输出数量、走向也存在明显区别,此时Agent做了基本情况的遍历验证,但对于特殊情况应对不足(Layer1/23的输出方式),在进行人工引导后Agent判断正确。