确定性计算案例
案例:某视觉模型存在确定性计算问题,重复训练loss不一致。
定位方法:
- 打开计算确定性(算子计算确定性+通信确定性)、设置随机种子、关闭Dropout并保证数据集读取顺序一致。
可通过msprobe工具中的seed_all来自动实现以上目的。
1 2
from msprobe.pytorch import seed_all seed_all(mode=True)
打开后精度比对结果有改善,部分卡结果一致,但仍有部分卡的反向存在差异,且重复训练出现位置每次对应的卡和位置随机不固定。
- 使用dump采集工具采集第0步mix级别数据,设置"summary_mode"为"md5"以凸显微小差异。
1 2 3 4 5 6 7 8 9 10 11 12 13 14
{ "task": "statistics", "dump_path": "/home/data_dump", "rank": [], "step": [0], "level": "mix", "enable_dataloader": false, "statistics": { "scope": [], "list": [], "data_mode": ["all"], "summary_mode": "md5" } }
比对前后两次采集的数据,最先出现异常的是masked_fill.23的输入。
图1 比对前后两次采集的数据结果根据dump结果中的stack.json调用栈和代码查找输入来源,代码往上翻找为mmcv的MSDA。
图2 masked_fill.23的调用栈图3 masked_fill.23的代码与MSDA算子支撑人员确认该算子暂不支持确定性计算,建议可用小算子组合进行代替。
小算子代替后masked_fill.23输入一致,但发现grid_sample仍有差异。
图4 比对前后两次采集的数据结果与grid_sample算子支撑人员确认该算子也暂不支持确定性计算。
解决方案:MSDA算子转小算子拼接,grid_sample算子转CPU。
结果:随机性固定,重复训练结果完全一致。
父主题: 精度定位案例