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判断正确。