昇腾社区首页
中文
注册

确定性计算案例

案例:某视觉模型存在确定性计算问题,重复训练loss不一致。

定位方法:

  1. 打开计算确定性(算子计算确定性+通信确定性)、设置随机种子、关闭Dropout并保证数据集读取顺序一致。

    可通过msprobe工具中的seed_all来自动实现以上目的。

    1
    2
    from msprobe.pytorch import seed_all
    seed_all(mode=True)
    

    打开后精度比对结果有改善,部分卡结果一致,但仍有部分卡的反向存在差异,且重复训练出现位置每次对应的卡和位置随机不固定。

  2. 使用dump采集工具采集第0步mix级别数据,设置"summary_mode"为"md5"以凸显微小差异。

    config.json配置如下:

     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。

结果:随机性固定,重复训练结果完全一致。