From 3f4c4ff0d4eac90e9649837ec00578c9e432c14d Mon Sep 17 00:00:00 2001 From: h00613304 Date: Thu, 24 Jul 2025 19:27:23 +0800 Subject: [PATCH 1/3] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E5=B7=A5=E5=85=B7?= =?UTF-8?q?=E5=BD=B1=E5=93=8D=E8=AE=A1=E7=AE=97=E7=BB=93=E6=9E=9C=E7=9A=84?= =?UTF-8?q?=E8=B5=84=E6=96=99=E8=AF=B4=E6=98=8E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit (cherry picked from commit aa0fa95aab5fa0702f1baee7da34c8a2beea4eaf) --- .../msprobe/docs/05.data_dump_PyTorch.md | 2 + .../docs/36.calculation_result_change.md | 75 +++++++++++++++++++ 2 files changed, 77 insertions(+) create mode 100644 debug/accuracy_tools/msprobe/docs/36.calculation_result_change.md diff --git a/debug/accuracy_tools/msprobe/docs/05.data_dump_PyTorch.md b/debug/accuracy_tools/msprobe/docs/05.data_dump_PyTorch.md index 95f6d7f85b..3702111bc7 100644 --- a/debug/accuracy_tools/msprobe/docs/05.data_dump_PyTorch.md +++ b/debug/accuracy_tools/msprobe/docs/05.data_dump_PyTorch.md @@ -15,6 +15,8 @@ functional: # functional为算子类别,找到对应的类别,在该类别 删除API的场景:部分模型代码逻辑会存在API原生类型校验,工具执行dump操作时,对模型的API封装可能与模型的原生API类型不一致,此时可能引发校验失败,详见《[FAQ](FAQ.md)》中“异常情况”的第10和11条。 +加工具后loss/gnorm发生变化:可能是工具中的item操作引入同步,pt/ms框架的hook机制导致的,详见《[工具导致计算结果变化](36.calculation_result_change.md)》。 + ## 快速上手 这个示例定义了一个 nn.Module 类型的简单网络,使用原型函数 PrecisionDebugger 进行数据采集。 diff --git a/debug/accuracy_tools/msprobe/docs/36.calculation_result_change.md b/debug/accuracy_tools/msprobe/docs/36.calculation_result_change.md new file mode 100644 index 0000000000..e1648614ac --- /dev/null +++ b/debug/accuracy_tools/msprobe/docs/36.calculation_result_change.md @@ -0,0 +1,75 @@ +# 模型计算结果改变原因分析 + +## 介绍 +在模型训练场景下,使用seed_all接口同时固定随机性和打开计算,通信确定性计算,是能够保证模型跑两次得到的loss和gnorm结果完全一样。如果出现使能工具后loss或者gnorm出现偏差,可能是以下原因导致。 + +## 工具引入同步导致计算结果变化 +工具采集统计量数据时,会涉及到将device上的tensor计算后的统计量信息通过item的时候传到cpu侧,再落盘到json文件中,item操作是一个同步的操作,可能会导致模型的计算结果出现变化。**一般的现象就是模型计算出现了NaN,但加了工具后问题不复现了。** + +ASCEND_LAUNCH_BLOCKING 是一个环境变量,用于控制在 PyTorch 训练或在线推理场景中算子的执行模式。当设置为“1”时,算子将采用同步模式运行。因此如果出现加工具计算结果变化,可以设置ASCEND_LAUNCH_BLOCKING 为1,如果结果一样发生了变化,则说明是由于同步引起的结果改变。这个时候需要复现问题现象完成问题定位,推荐使用msprobe工具的异步dump功能,具体使用方式可查看[config配置](02.config_introduction.md)中的async_dump字段。 + +## Hook机制导致计算结果变化 + +pytorch/mindspore的hook机制会导致某些特殊场景下梯度计算的累加序产生变化,从而影响模型反向计算的gnorm结果。具体代码示例如下: +```python +import random, os +import numpy as np +import torch +from torch import nn + + +class Net(nn.Module): + def __init__(self) -> None: + super().__init__() + self.ln1 = nn.Linear(32, 32) + self.bn1 = nn.BatchNorm1d(32) + self.ln2 = nn.Linear(32, 32) + + def forward(self, x): + x1 = self.ln1(x) + + x2 = self.bn1(x) + x2 = self.ln2(x2) + return x1 + x2 + + +class BigNet(nn.Module): + def __init__(self) -> None: + super().__init__() + self.net1 = Net() + self.net2 = Net() + + def forward(self, x): + out1 = self.net1(x) + out2 = self.net2(out1) + return out1, out2 + + +def my_backward_hook(module, grad_input, grad_output): + pass + + +if __name__ == "__main__": + os.environ["HCCL_DETERMINISTIC"] = 'true' + + seed = 1234 + os.environ["PYTHONHASHSEED"] = str(seed) + torch.manual_seed(seed) + random.seed(seed) + np.random.seed(seed) + + model = BigNet() + model.net2.register_full_backward_hook(my_backward_hook) + inputs = torch.randn(3, 32) + + out1, out2 = model(inputs) + loss = out1.sum() + out2.sum() + loss.backward() + + for name, param in model.named_parameters(): + print(f"{name}: {param.grad.mean()}") + +``` +执行一遍以上脚本,可以打印得到模型中各层的权重梯度,注释model.net2.register_full_backward_hook(my_backward_hook)后再执行一篇,可以看出bn层的权重梯度已经发生了变化。 + +**如果在msprobe L0,mix级别采集出现gnorm发生变化,可以尝试将采集级别改为L1,若L1级别gnorm不发生变化,则大概率是hook机制导致的梯度计算结果变化。** \ No newline at end of file -- Gitee From fcc9839ff2c5b558638e632d06ceec7f2cd1c7da Mon Sep 17 00:00:00 2001 From: h00613304 Date: Fri, 25 Jul 2025 11:08:19 +0800 Subject: [PATCH 2/3] =?UTF-8?q?mindspore=E9=87=87=E9=9B=86=E8=B5=84?= =?UTF-8?q?=E6=96=99=E6=96=B0=E5=A2=9E=E5=B7=A5=E5=85=B7=E5=BD=B1=E5=93=8D?= =?UTF-8?q?=E8=AE=A1=E7=AE=97=E7=BB=93=E6=9E=9C=E7=9A=84=E8=B5=84=E6=96=99?= =?UTF-8?q?=E8=AF=B4=E6=98=8E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit (cherry picked from commit 32f0ab1a158c29faa46b87c5f9c6642816e27cd1) --- debug/accuracy_tools/msprobe/docs/05.data_dump_PyTorch.md | 2 +- debug/accuracy_tools/msprobe/docs/06.data_dump_MindSpore.md | 6 +++++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/debug/accuracy_tools/msprobe/docs/05.data_dump_PyTorch.md b/debug/accuracy_tools/msprobe/docs/05.data_dump_PyTorch.md index 3702111bc7..42a3052b72 100644 --- a/debug/accuracy_tools/msprobe/docs/05.data_dump_PyTorch.md +++ b/debug/accuracy_tools/msprobe/docs/05.data_dump_PyTorch.md @@ -15,7 +15,7 @@ functional: # functional为算子类别,找到对应的类别,在该类别 删除API的场景:部分模型代码逻辑会存在API原生类型校验,工具执行dump操作时,对模型的API封装可能与模型的原生API类型不一致,此时可能引发校验失败,详见《[FAQ](FAQ.md)》中“异常情况”的第10和11条。 -加工具后loss/gnorm发生变化:可能是工具中的item操作引入同步,pt/ms框架的hook机制导致的,详见《[工具导致计算结果变化](36.calculation_result_change.md)》。 +加工具后loss/gnorm发生变化:可能是工具中的item操作引入同步,pt/ms框架的hook机制等原因导致的,详见《[工具导致计算结果变化](36.calculation_result_change.md)》。 ## 快速上手 diff --git a/debug/accuracy_tools/msprobe/docs/06.data_dump_MindSpore.md b/debug/accuracy_tools/msprobe/docs/06.data_dump_MindSpore.md index 842ef74604..26ba15dfe0 100644 --- a/debug/accuracy_tools/msprobe/docs/06.data_dump_MindSpore.md +++ b/debug/accuracy_tools/msprobe/docs/06.data_dump_MindSpore.md @@ -28,7 +28,11 @@ msprobe 工具通过在训练脚本中添加 `PrecisionDebugger` 接口并启动 dump "statistics"模式的性能膨胀大小"与"tensor"模式采集的数据量大小,可以参考[dump基线](data_dump_MindSpore/data_dump_MindSpore_baseline.md)。 -**注意**:因 MindSpore 框架自动微分机制的限制,dump 数据中可能会缺少原地操作模块/API 及其上一个模块/API 的反向数据。 +**注意**: + +* 因 MindSpore 框架自动微分机制的限制,dump 数据中可能会缺少原地操作模块/API 及其上一个模块/API 的反向数据。 + +* 使用msprobe工具后loss/gnorm发生变化:可能是工具中的item操作引入同步,pt/ms框架的hook机制等原因导致的,详见《工具导致计算结果变化》。 ## 5. 场景介绍 -- Gitee From 410e9117cd87b3f771f8a03716dc774f152e9740 Mon Sep 17 00:00:00 2001 From: h00613304 Date: Fri, 25 Jul 2025 11:42:52 +0800 Subject: [PATCH 3/3] =?UTF-8?q?calculation=5Fresult=5Fchange.md=E6=96=87?= =?UTF-8?q?=E6=A1=A3=E7=BB=93=E5=B0=BE=E6=B7=BB=E5=8A=A0=E7=A9=BA=E8=A1=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../accuracy_tools/msprobe/docs/36.calculation_result_change.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/debug/accuracy_tools/msprobe/docs/36.calculation_result_change.md b/debug/accuracy_tools/msprobe/docs/36.calculation_result_change.md index e1648614ac..8fa97d8e43 100644 --- a/debug/accuracy_tools/msprobe/docs/36.calculation_result_change.md +++ b/debug/accuracy_tools/msprobe/docs/36.calculation_result_change.md @@ -72,4 +72,4 @@ if __name__ == "__main__": ``` 执行一遍以上脚本,可以打印得到模型中各层的权重梯度,注释model.net2.register_full_backward_hook(my_backward_hook)后再执行一篇,可以看出bn层的权重梯度已经发生了变化。 -**如果在msprobe L0,mix级别采集出现gnorm发生变化,可以尝试将采集级别改为L1,若L1级别gnorm不发生变化,则大概率是hook机制导致的梯度计算结果变化。** \ No newline at end of file +**如果在msprobe L0,mix级别采集出现gnorm发生变化,可以尝试将采集级别改为L1,若L1级别gnorm不发生变化,则大概率是hook机制导致的梯度计算结果变化。** -- Gitee