大模型训练精度问题表现及工具使用
每张卡上的 module,api,kernel(O0)组成了一个Ranknode(O1),不同的 Ranknode 组成对应的T/D/PP域节点(O1.5),不同的并行域节点拼合形成完整(model)micro_step(O2),不同 micro step拼合形成 step(O3),多个step拼合形成区域段数据集表现,一般就loss趋势等。下面探讨精度问题定位过程中几个核心步骤。
作者:昇腾实战派 x 疆浙户
本文从宏观的角度梳理了训练的大致流程,分析了精度问题在训练流程中的表现,梳理了针对训练各环节进行相应数据采集和分析的工具。
概览图

基本概念
训练流程

概览图的上半部分展示了一个大模型训练的完整流程,从数据输入到权重更新,大体上分为以下五个部分:
- 准备阶段 (START 之前):左侧的“weight、dataset、env(sys env)、CANN/CUDA、config”代表训练所需的输入条件
- weight:模型的初始权重(参数)。
- dataset:训练用的数据集。
- env(sys env):系统环境配置、环境变量等。
- CANN/CUDA:深度学习框架或加速库。
- config:训练的超参数配置(学习率、batch_size、梯度累积步数、并行配置)。
- 前向传播(forward):训练通过 forward 计算出 device_local_loss(每个 rank 上的 loss,通常最后一个 PP 计算),再通过聚合,计算出当前 grad_accumulation_step 的 loss,之后完成所有 grad_accumulation_steps 后,得到最终的平均 loss,也即当前 step 的 loss。
- 反向传播(backward):对应概览图中的 backward 到 optimizer。蓝色的 backward 模块基于前向得到的 loss,计算模型权重的梯度(weight_grads)。这一步是反向传播算法的核心:从损失出发,沿着网络反向计算每一层参数的梯度,告诉模型“参数往哪个方向调整能减小损失”。
- 梯度同步与累积(grads_sync、grad accumulation steps)
- grads_sync:如果是分布式训练,这一步会把不同设备上计算的梯度做同步(如 AllReduce ),保证所有设备上的梯度一致。
- grad accumulation steps:如果设置了“梯度累积”,模型不会每计算完一个 batch 就更新权重,而是累积多个 batch 的梯度后再更新。这样做可以在显存有限时,等效增大 batch_size。图中用虚线框和循环箭头表示“重复多步梯度累积,再同步”。
- 简略公式: global_batch_size = dp_size * micro_batch_size * grad_accumulation_steps
- 梯度处理与优化器(optimizer 部分)
- device_grad_norm、grad_norm:先计算每个设备上的梯度范数,再汇总得到全局梯度范数。
- clip:对梯度做裁剪,把过大的梯度限制在某个阈值内,保证训练稳定性。
- variance、momentum:优化器的超参数(如 Adam 里的动量、方差项),用来调整更新步长和方向,让训练更高效、稳定。
- update:根据处理后的梯度,结合优化器的更新规则,计算出每个权重应该更新的幅度。
- 权重更新(STEP 到 updated weight):最后一步“STEP”执行权重的实际更新,得到“updated weight(更新后的权重)”。这一步完成后,模型参数就朝着“减小损失”的方向前进了一小步;然后流程会回到 forward,用新的权重继续下一轮训练,直到满足停止条件(比如达到指定 epoch 数、损失不再下降等)。
工具概念

工具仓库:Ascend/mstt: 针对训练&大模型场景,提供端到端命令行&可视化调试调优工具,帮助用户快速提高模型开发效率
- msprobe 工具提供多方位的数据采集和数据分析,提供问题定位的手段。
- 工具按照层级划分为数据采集(图中Data collecting)和数据分析(图中Data Analysis)。
- 数据采集工具主要包括 config_check , msprobe_dump ,msprobe_monitor 等。
- 数据分析工具主要包括 msprobe_visualization,msprobe_compare , msprobe_run_ut , msprobe_checkpoint_compare等。
精度问题表现
精度层级定位划分

O0(零级节点): 包含单一 rank 上涉及的module、api、kernel、graph等细粒度节点,内部存在module->api->kernel之类的层级关系。
O1(一级节点): 单一 rank 上涉及的module、api、kernel、graph等细粒度节点聚合成 RankNode 后。
O1.5(半二级节点): 相同XP(TP/DP/PP)域的 RankNode 聚合成 XPNode,即为半二级节点,为什么定为半二级节点,主要是 XPNode 的表现基本与某个RankNode趋于一致,通常查看RankNode行为基本能知道XPNode的行为。
O2(二级节点): XPNode 聚合成完整的 ModelNode,一般而言走完一次 ModelNode,即完成一次 MicroStepNode(依然等价于二级节点),可以得到micro step loss。
O3(三级节点): 多个 MicroStepNode 聚合成一个 StepNode,即为三级节点,step结束即可得到当前 step 的 loss 和 norm。
一句话总结:每张卡上的 module,api,kernel(O0)组成了一个Ranknode(O1),不同的 Ranknode 组成对应的T/D/PP域节点(O1.5),不同的并行域节点拼合形成完整(model)micro_step(O2),不同 micro step拼合形成 step(O3),多个step拼合形成区域段数据集表现,一般就loss趋势等。
下面探讨精度问题定位过程中几个核心步骤采集(原始数据)、判别(一般是差异分析)、定序(确认偏序)
采集
采集数据需要明确采集的特征量,和采集的范围(时间宽度、节点范围等)。
特征量
什么层级什么类型问题用什么层级对应类型的特征量。特征量按照层级的划分如下:
- O0节点(零级特征): 对应的一般是 tensor 语义的特征,主要有 tensor 的min、max、mean、norm、md5,或者最原始的全量tensor。
- O1节点(一级特征): 通常是一个 RankNode 的特征量,如说 RankNode 输入+输出 tensor 的min、max、mean、norm、md5,或者最原始的全量tensor 。
- O2节点(二级特征): 通常是一个 MicroStepNode(ModelNode),那么一般就是 micro step loss,Model输出的 logits 的相关统计量等。
- O3节点(三级特征),通常是一个 StepNode,那么一般是step的loss,norm,还有step的 weight grad 相关统计量等。
采集范围
采集的范围要包含问题可能涉及到的范围,在此前提下尽量减少不必要的采集数据缩小采集规模。
范围包括节点范围和时间范围,一般而言层级越低(越靠近零),涉及的节点范围越大,采集量也越大。通常情况优先选取高特征值,缩小节点范围。
而时间范围上优化,就是降低规模,缩小复现成本。
判别
在完成采集的前提下,需要完成对问题节点的判别,针对问题的现象,大致怀疑的方向,去选择特征量进行排查,而这个特征量应当是能够确定问题是否存在的。通常判别有这几种:单个节点的判别,同层级多节点联动的判别,跨层级多节点联动的判别。
- 单个节点判别: 一般是特征量差异表现明显/微弱,确有问题/无问题,那么可以直接判定节点A是问题节点/非问题节点
- 同层级多节点联动的判断: 一般是特征量差异不太明显,暂无法明确是否有问题,那么可以看同层级的节点差异是否有放大/缩小/持平趋势,通过多个节点间的组合去判断整体差异是否正常。
- 跨层级多节点联动的判别: 一般是上层节点确认存在问题,下层多个节点差异表现不明显,这种情况下可以查看其他正常上层节点下的下层节点差异波动范围来辅助判断。
这里其实不需要保证问题节点集完全完整(因为判别准确率、现实噪声影响等),至少要保证首问题节点在我们获取的问题节点集里。
定序
下面列举了不同层级的定序常见方法:
- **O0(零级节点): **由于是同rank内节点,所以偏序由存储顺序(按执行序落盘)自然确定。
- O1(一级节点): RankNode间通过并行策略进行排布,通过通信或者并行排布确定相互之间的偏序。
- O2(二级节点): Total Model2TotalModel的分析,由执行序自然确定。
- O3(三级节点): 按照时间序自然确定。
可以看到最为复杂的是O1,相关技术有
- [1]块间通信定序
- [2]块内执行定序,
- [3]流水线并行可能涉及节点拆分再按照[1][2]重排布
定序这方面的难度其实没有判别高,如果判别的准确度满足要求,那么定序得到的结果一般而言就能找到问题所在,比如针对定序的TOP10进行筛查筛查出真实首问题节点。
精度问题定位
精度问题定位的本质是递归式找首错,一个重要考量就是时间序,本质上做的是:
step1: 找到问题节点集
step2: 确定问题节点集的偏序
step3: 进入下一层级重复 step1
这样就引出了两个核心问题:
a. 如何确认某一层级的某节点是问题节点(判定问题)
b. 如何找到同一层级问题节点集的首问题节点(集合偏序问题)
如何确认某一层级的某节点是问题节点(判定问题)
一般精度问题起点都是该类问题出现的,通过比较,得到了一些不符合预期的数值表现。比如图中 O0/O1/O2 的某节点的特征量出现问题,与正常节点的特征量数值出现以下三种表现:
- [1]≠:最容易判断的,通过一些特征量(norm, md5等)即可判别
- [2] 超出值域(最典型的是inf和nan) :极化形式(inf 和 nan)也容易判断,但是一些正常情况就不那么直观,需要因特定节点的特征确定,因此亦有一定难度。
- [3]≈但有超出预期的差距: 该现象的判判定是最为困难的,通常没有一个业界的标准可以完全绝对的判定,通常需要通过辅助手段去判断(比如后继节点误差是否放大?最终节点误差是否合理?亦或下游任务表现是否合理等)。
如何找到同一层级问题节点集的首问题节点(集合偏序问题)
该问题的判别一般是:找到一类一致的表达来确定节点与节点之间的偏序(执行序or时间序),或者可以分块化的在块内使用某种一致的偏序判断(不同块内可能使用的偏序可以不一致),块间通过某种偏序进行排序,得到偏序首节点。这类问题通常是比较复杂的,因为偏序的手段是因节点之间连接的特征而定的,常见的偏序有块间通过通信算子确定偏序,块内按照时间存储顺序确定偏序,或者通过一致时间戳确定偏序。
问题定位方法论
- 整体环节为 [训练环境] -> [训练前向] -> [训练反向] -> [优化器] -> [训练前向]…
- 一般而言,问题定位需要保证问题定位环节的 前置环节 都正确,才能保证问题定位中结果的正确性
- 推荐使用 MindStudio 工具链中的 msprobe 工具,进行精度问题的数据采集与分析
训练环境对齐
精度工具安装
从 mstt 代码仓 代码仓拉下相关代码,
pip uninstall mindstudio-probe
#git clone https://gitee.com/ascend/mstt.git
git clone https://gitcode.com/Ascend/mstt.git
export PYTHONPATH=/path/mstt/debug/accuracy_tools:$PYTHONPATH
cd mstt/debug/accuracy_tools
pip install .
为了保证精度问题能够稳定复现,以下几项操作也是必须的:固定随机性,打开确定性计算等。
固定随机性
复现需要固定住存在随机性的模块,包括模型参数初始化,dropout 层,数据加载顺序等。主要涉及以下几项:
- 固定随机种子,如 np.random.seed、torch.manual_seed、torch_npu.npu.manual_seed等。
- 关闭 Dropout 层。
- 数据加载关闭 shuffle,一般可以设置 shuffle=False
打开确定性
在训练代码开始之前开启算子计算确定性和通信确定性:
- 算子计算确定性
torch.use_deterministic_algorithms(True) - 通信确定性
export HCCL_DETERMINISTIC=TRUE
除随机性算子之外,还有部分算子暂不支持确定性计算的特性,因此每次运行结果会有细微差异。因此若排查到一些不常见的特殊算子(如MSDA、grid_sample)可通过转CPU或联系算子支撑人员咨询是否有替代实现来进行规避。
工具固定(seed_all)
msprobe工具包提供 seed_all 接口,可以快速固定网络中所有随机种子、dropout层及算子计算和通信确定性,除 seed_all 之外只需要再手动关闭数据集 shuffle。
在训练入口文件的开头加入如下代码(如LLM 仓的 pretrain_gpt.py)
from msprobe.pytorch import seed_all
seed_all(seed=1234, mode=True, rm_dropout=True)
参数介绍:
- seed : 随机数种子,默认为1234;
- mode:是否开启确定性计算模式,默认值为 False,同时包含算子计算确定性和通信确定性;
- rm_dropout:控制 dropout失效的开关,默认值为 True,开启后会将 dropout 概率设置为 0。
seed_all 固定随机数的范围如下:
| API | 固定随机数 |
|---|---|
| os.environ[‘PYTHONHASHSEED’] = str(seed) | 禁止Python中的hash随机化。 |
| random.seed(seed) | 设置random随机生成器的种子。 |
| np.random.seed(seed) | 设置numpy中随机生成器的种子。 |
| torch.manual_seed(seed) | 设置当前CPU的随机种子。 |
| torch.cuda.manual_seed(seed) | 设置当前GPU的随机种子。 |
| torch.cuda.manual_seed_all(seed) | 设置所有GPU的随机种子。 |
| torch_npu.npu.manual_seed(seed) | 设置当前NPU的随机种子。 |
| torch_npu.npu.manual_seed_all(seed) | 设置所有NPU的随机种子。 |
| torch.backends.cudnn.enable=False | 关闭cuDNN。 |
| torch.backends.cudnn.benchmark=False | cuDNN确定性地选择算法。 |
| torch.backends.cudnn.deterministic=True | cuDNN仅使用确定性的卷积算法。 |
缩小模型训练规模
对于一些大集群如千卡甚至万卡训练出现的精度问题,需要将集群规模缩小进行复现定位。
常见的做法是保持TP, PP, CP, SP, EP等切分参数不变,将Batch Size缩小或直接减少模型层数,裁剪时需伴随实验确保能复现,最终选择规模尽可能小且可复现的训练参数。
config_check 检查训练环境
训练环境一般可以使用 config_check 工具进行检查,训练环境的对齐 是 控制变量实验 中 最重要 的一环,保证此处符合实验目标,后续的实验数据才有意义。

工具使用:
- pretrain_glm_omni.py中增加:
from msprobe.core.config_check import ConfigChecker
ConfigChecker.apply_patches()
/path/megatron/training/training.py中增加:
from msprobe.core.config_check import ConfigChecker
ConfigChecker(model,output_zip_path = './check/npu_dynamic.zip' )

- 运行数据比对脚本:
msprobe -f pytorch config_check -c ./check/0611_npu_dynamic.zip ./check/gpu_dynamic.zip -o ./check/out_dynamic
# ./check/0611_npu_dynamic.zip 和 ./check/gpu_dynamic.zip 为两个比对的 zip包
# 为输出路径
- 输出文件:

注意:当前工具没有办法覆盖所有场景的第三方库,建议不同设备上直接执行 pip list 比对两边三方库的版本。
训练前向
问题现象
- 由 loss 作为指标分析训练前向导致的问题。
- 训练前向问题一般表征会有 loss 对不齐(首 loss 对不齐为代表),训练数据溢出(loss 溢出为代表),loss 尖刺,loss 跑飞
- 这几类问题中首 loss 对不齐比较重要,可以想象训练前向问题分为浅层(前期)和深层(后期)问题。如果首 loss 对不齐问题解决,那么至少训练前向的浅层问题已经解决。后续可能会出现loss 尖刺,loss 跑飞,一般为深层问题,可能要很多 step 才会出现
溢出或NaN,即相较于标杆更频繁地出现Loss或Grad Norm溢出、NaN,如下图所示:

首Step Loss差异,即第0步或前几步Loss与标杆出现差异,平均误差大于1%,如下图所示:

长稳Loss差异,即前期Loss拟合后期与标杆差异逐渐变大,平均误差大于1%,如下图所示:

尖刺,即相较于标杆更频繁地出现Loss或Grad Norm陡增又快速跌落的现象,如下图所示:

训练中Loss与标杆相比差异较小但下游任务表现差,如下图所示:

定位方法
- 训练前向导致的问题一般看前向 module 的输入输出,寻找首个输入一致输出不一致的 module(即首差异 module)。可以通过 msprobe_dump 进行采集,同时工具也提供了 api(torch api) 粒度的采集。
- 具体采集配置参数可参考配置文件介绍
- 一般来说,排查前向数据,通常采用统计值模式(max,min,mean,norm)采集确定问题的范围,再确定具体到具体 layer 或者子模块后进行 tensor 模式或者详细 api 采集,确定具体问题。
- 由于全量采集性能消耗比较高,所以如果是多 step(10 以上)才能复现的问题,建议使用指定 module/关键字 dump,以缩小性能开销。或者如果能 确定复现步数范围,可以指定 step 进行 dump。
- 注:dump 数据自带调用栈信息
训练反向
问题现象
- 一般表现是 loss 差异小,grad_norm 差异大,或者是首 loss 对齐(GPU vs NPU 确定性 relative diff < 2%),grad_norm 有差异(relative diff > 1.0)。
- 训练反向都跟 grad_norm 指标有关,一般有 grad norm 对不齐,grad norm 溢出,grad_norm 跑飞等问题。

定位方法
- 通常排查 grad_norm,涉及范围大致为:训练反向 -> 优化器。通常采用 msprobe_monitor 工具进行排查。monitor 提供对权重梯度和优化器 mean/variance 等权重更新指标的采集,并且性能开销很小,另外不会对训练过程中 grad 计算产生影响。(msprobe dump 会影响反向的梯度累加序,影响反向数据,可能会影响问题复现)
- 排查思路: weight_grad[聚合前] -> weight_grad[聚合后] -> [device_local_norm-> grad_norm] -> mean/variance -> updated weight
- weight_grad[聚合前] 有问题,排查反向过程,通常是反向出了问题。考察具体哪个 weight_grad 有差异,排查该模块前后对应反向数据,此处 Monitor 或 dump 均可
- weight_grad[聚合后] 有问题,一般是反向聚合有问题,或者进入优化器处理有问题。需要具体打点处理,或者使用 msprobe dump 采集优化器 forward api 数据进行排查
- device_local_norm(需手动采集) -> grad_norm 此阶段有问题,需要排查 grad_norm 计算相关逻辑。可以使用 msprobe dump 采集相关的 norm api 数据进行排查
通用分析

数据采集

msprobe dump
msprobe dump 按照采集的特征量+范围角度考虑,问题复现步数固定(或者在一个稳定小范围内波动,如 1 - 2 步),但是不确定问题在哪块,可以使用 msprobe dump 采集指定 step 的前反向数据,优先采集 L0 级别数据,如果 functional 调用较多可用 L1 级别。确定到具体模块后可以采用 tensor(真实值)采集,将 tensor 保存。
优点:
- 统计量、MD5、真实值多种模式
- 指定算子、指定rank、指定step等
- 插入接口简单start/stop/step三个
缺点:
- 当前采集的数据特征量层级太低,通常是 ranknode 中的 module 或者 api 层级,数据量过于庞大,无自动化工具分析,需人工结合经验分析。
- 会影响反向的梯度累加序,影响反向数据,可能会影响问题复现。
工具使用
- 在 train 函数附近添加代码
from msprobe.pytorch import PrecisionDebugger, seed_all # mstt_dump
seed_all() # mstt_dump
debugger = PrecisionDebugger(config_path='/path/megatron/training/config.json') # mstt_dump
def train(forward_step_func, model, optimizer, opt_param_scheduler,
train_data_iterator, valid_data_iterator,
process_non_loss_data_func, config, checkpointing_context):
"""Train the model function."""
args = get_args()
timers = get_timers()
one_logger = get_one_logger()
......
while iteration < args.train_iters:
debugger.start(model) # mstt_dump
......
debugger.stop() # mstt_dump
debugger.step() # mstt_dump



- 配置 config.json
# config.json
{
"task": "statistics",
"dump_path": "/home/dump_path",
"rank": [],
"step": [],
"level": "L1",
"enable_dataloader": false,
"async_dump": false,
"tensor": {
"scope": [],
"list":[],
"data_mode": ["all"],
"file_format": "npy"
},
"statistics": {
"scope": [],
"list":[],
"data_mode": ["all"],
"summary_mode": "statistics"
},
"overflow_check": {
"overflow_nums": 1,
"check_mode":"all"
},
"run_ut": {
"white_list": [],
"black_list": [],
"error_data_path": "./"
},
"grad_probe": {
"grad_level": "L1",
"param_list": [],
"bounds": [-1, 0, 1]
},
"free_benchmark": {
"scope": [],
"list": [],
"fuzz_device": "npu",
"pert_mode": "improve_precision",
"handler_type": "check",
"fuzz_level": "L1",
"fuzz_stage": "forward",
"if_preheat": false,
"preheat_step": 15,
"max_sample": 20
}
}
msprobe monitor
问题复现成本高,复现步数不确定的场景建议使用 monitor,采集聚合前后权重梯度(wg_distribution),优化器状态(mv_distribution),通信算子(cc_distribution)等,性能开销小,可以持续监控训练。由于 msprobe monitor 采集的数据量小(weight grad 单 step < 100 条),直接比对工作量不大,主要通过 beyond compare 直接进行比较。
优点:
- 能采集 O3 特征量,数据量比较小,性能开销相比 dump 小很多,可以做长期监控,并且也能指导定位,比如能够定界是哪个阶段,或者定界是哪个模块。
- 不会对训练过程中 grad 计算产生影响。
缺点:
- 是O1/O2特征量(不懂的参照O3)没有补充,如device local loss,device local norm等等。
工具使用:
- 配置相关代码
# ******************** monitor ********************
from msprobe.pytorch import TrainerMon
monitor = TrainerMon(
config_file_path="/path/megatron/training/monitor_config.json",
params_have_main_grad=True, # 权重是否使用main_grad,通常megatron为True,deepspeed为False。默认为True。
)
# 挂载监控对象
monitor.set_monitor(
model,
grad_acc_steps=args.global_batch_size//args.data_parallel_size//args.micro_batch_size,
optimizer=optimizer,
dp_group=None,
tp_group=None,
# start_iteration=0 # 断点续训时提供当前iteration,默认从0开始
)
# ******************** monitor ********************

monitor_config.json配置:
{
"wg_distribution": true,
"format": "csv",
"ops": ["norm", "min", "max"]
}
targets中指定module包含的所有权重都会被监控。targets为空时,默认监控全部module。
wg_distribution(weight grad,noted as wg)为true,表示开启权重梯度监控功能,默认值为false。
param_distribution为true,表示开启权重监控功能,默认值为false。
- 拉起训练生成文件:

msprobe dump VS msprobe monitor
相同点:
- 两者覆盖范围均为forward + backward + optimizer
区别:
- msprobe dump 可以采集真实数据,并且无论是统计值模式还是真实值模式,都自带软件调用栈信息(stack.json),此外msprobe dump能够对接msprobe visualization 及 msprobe compare等组件,完成可视化或者直接比对。
- msprobe monitor 只采集统计值模式,性能会比msprobe dump 好很多,msprobe monitor 对反向会采集高层级特征量,如weight_grads(聚合前&聚合后),exp_avg,exp_avg_sq 等,数据量更小,人为分析负担小,但是缺乏上层比对。
数据分析

msprobe compare
使用 msprobe compare 可以对 msprobe dump 采集的数据进行数据比对,支持指定 rank、step 数据。提供了同框架、跨框架的基础数据的比对能力。
比对结果按照每个 rank 出一份 result.xlsx,如下图所示,图中红线表示精度异常点,由于比对使用内置误差,具体是否存在问题需要参考业务场景进行考察。

缺点:
判别准确率不足,缺乏去噪声操作,像一些噪声节点的误判,错判,以及误差指标是否合理等,基本需要人工介入确认。
工具使用:
- 配置 compare.json
{
"npu_path": "./dump_path0100/step4/rank0/dump.json",
"bench_path": "./dump_path090/step4/rank0/dump.json", // gpu
"stack_path": "./dump_path0100/step4/rank0/stack.json",
"is_print_compare_log": true
}
// 可以指定到 step,生成一个 step 的比对结果
{
"npu_path": "./dump_path0100/step4",
"bench_path": "./dump_path090/step4", // gpu
"stack_path": "./dump_path0100/step4",
"is_print_compare_log": true
}
- 使用比较命令生成 xlsx 文件
msprobe -f pytorch compare -i /path/megatron/training/compare.json -o ./dump/output_0628_step0 -s
msprobe visualization
使用 msprobe visualization 可以对 msprobe dump 采集的数据进行可视化分析。执行后结果可直接在浏览器中查看,无需下载,结果按 rank 划分,可支持快速搜索节点,节点内部展开,节点差异查看等。

缺点:
不符合层级展示结构,每个rank都是一张图,展示的是代码调用的节点连接关系而非语义层级结构上的数据结构关系,展示的层级其实比较复杂,这会导致用户调试需要的知识门槛高,不方便跨rank确认问题,另外一些节点可以组合成等价语义节点,但是在现有图中无法完成此类匹配,另外节点间的定序也需要人工判断,带来门槛以及耗时。
工具使用:
- 先通过 4.4.1.1 的方法采集好 dump 文件
- 配置 compare.json
{
"npu_path": "./dump_path0100/step4/rank0/dump.json",
"bench_path": "./dump_path090/step4/rank0/dump.json", // gpu
"stack_path": "./dump_path0100/step4/rank0/stack.json",
"is_print_compare_log": true
}
// 可以指定到 step,生成一个 step 的比对结果
{
"npu_path": "./dump_path0100/step4",
"bench_path": "./dump_path090/step4", // gpu
"stack_path": "./dump_path0100/step4",
"is_print_compare_log": true
}
- 使用比较命令生成可视化文件
msprobe -f pytorch graph -i /path/megatron/training/compare.json -o ./dump_graph/graph_output_0628_step0
msprobe run_ut
使用 msprobe accuracy checker 可以对 msprobe dump 采集的数据进行单算子预检,排查是否有 api 算子问题。
主要就是对于框架(torch/mindspore)的 api 进行单算子前向精度检查,构造单算子用例对网络存下来或者自己构造的数据通过跑 api 的形式确认精度差异,起到一个UT功能,对于开发新套件/框架的算子,确认算子精度有帮助,有需要可以配合msprobe dump使用。
Tip: dump 采集的数据都可以进行visualization 或 compare , accuracy checker 。
msprobe checkpoint compare
msprobe checkpoint compare,提供权重比对能力,主要就是针对原始权重,训练落盘权重进行待测和标杆侧的权重比对,比对差异有余弦相似度,欧式距离等,用于评估两侧权重差异。正常余弦相似度 0.99+,l2diff < 1.0 。
工具使用:
msprobe --framework pytorch config_check --compare path1 path2 -o output_path.json
# path1 和 path2 为需要比对的权重路径
# output_path.json 为输出的 json 文件路径
#示例:
msprobe --framework pytorch config_check --compare /path/models/nv_models/iter_0000200 /path/models/iter_0000200 -o ckpt_similarity.json
生成文件:

其中:
l2: 幅度变化,值越小,差异越小
cos: 余弦相似度,越接近1越相似
numel: 参数数量,shape的乘积
shape: 张量形状
更多推荐




所有评论(0)