diff --git "a/Ascend-PyTorch\347\246\273\347\272\277\346\216\250\347\220\206\346\214\207\345\257\274/PyTorch\347\246\273\347\272\277\346\216\250\347\220\206-\347\246\273\347\272\277\346\216\250\347\220\206\346\214\207\345\257\274.md" "b/Ascend-PyTorch\347\246\273\347\272\277\346\216\250\347\220\206\346\214\207\345\257\274/PyTorch\347\246\273\347\272\277\346\216\250\347\220\206-\347\246\273\347\272\277\346\216\250\347\220\206\346\214\207\345\257\274.md" index 8b03184b239fab89956a6e2a6566e032cfb8b8d2..ad9cb7c0d832c71a5ca70369b562a79bfdd7c794 100644 --- "a/Ascend-PyTorch\347\246\273\347\272\277\346\216\250\347\220\206\346\214\207\345\257\274/PyTorch\347\246\273\347\272\277\346\216\250\347\220\206-\347\246\273\347\272\277\346\216\250\347\220\206\346\214\207\345\257\274.md" +++ "b/Ascend-PyTorch\347\246\273\347\272\277\346\216\250\347\220\206\346\214\207\345\257\274/PyTorch\347\246\273\347\272\277\346\216\250\347\220\206-\347\246\273\347\272\277\346\216\250\347\220\206\346\214\207\345\257\274.md" @@ -635,25 +635,29 @@ bs16: 310/t4=2078.536/1234.940=1.68倍 ### 2.3 精度调试指导 -1.根据推理流程逐步排查引起精度下降的问题点,先粗调确认是哪个流程的问题再微调 +- 精度调试基本思路 -2.以开源模型代码在线推理为基准,在gpu上加载pth权重运行评测脚本,查看pth在线推理精度是否达标。可以添加打印熟悉模型结构,前后处理与算子的输出,通过制作异常产生的调用栈查看函数调用关系。使用控制变量替换法将自己预处理代码或om结果或算子参数等替换掉在线推理的相应变量,同时后处理需要做与预处理相应的适配,看自己的结果是否精度不达标。确保前后处理,模型参数与算子参数与开源模型代码在线推理使用的完全一致 + 1.根据推理流程逐步排查引起精度下降的问题点,先粗调确认是哪个流程的问题再微调 -3.注意如果使用的是910权重需要把训练适配的影响精度的代码移植到开源模型代码,因为是基于开源模型代码加910权重做推理 + 2.以开源模型代码在线推理为基准,在gpu上加载pth权重运行评测脚本,查看pth在线推理精度是否达标。可以添加打印熟悉模型结构,前后处理与算子的输出,通过制作异常产生的调用栈查看函数调用关系。使用控制变量替换法将自己预处理代码或om结果或算子参数等替换掉在线推理的相应变量,同时后处理需要做与预处理相应的适配,看自己的结果是否精度不达标。确保前后处理,模型参数与算子参数与开源模型代码在线推理使用的完全一致 -4.如果修改了开源模型代码,优先排查修改的代码或关键算子参数是否有问题或与训练使用的不一致 + 3.注意如果使用的是910权重需要把训练适配的影响精度的代码移植到开源模型代码,因为是基于开源模型代码加910权重做推理 -5.如果导出的onnx可以推理,确定onnx精度是否达标 + 4.如果修改了开源模型代码,优先排查修改的代码或关键算子参数是否有问题或与训练使用的不一致 -6.如果是om算子缺陷导致精度下降,则指定算子为om的输出节点,然后与在线推理时该算子(使用开源netron工具查看onnx模型算子,开启verbose导出onnx时会打印算子对应的py文件代码行)的输出对比,查看是否一致。二分法排查对比pytorch或onnx与om哪个算子输出不一致,需要保证条件是输入一样 + 5.如果导出的onnx可以推理,确定onnx精度是否达标 -7.pytorch模型在线推理支持模型输入的hw维是变化的,而om模型由于不支持动态算子暂需要固定输入的hw维,即每个预处理后输入样本的hw都是一样的。为了验证预处理等比例缩放加pad固定样本的hw维对精度的影响,可以修改开源模型代码评测脚本,加载预处理后的样本,然后替换掉model的输入再评测精度,后处理需要做相应适配恢复到原图,查看精度是否下降。同样为了验om模型输出的结果与后处理,可以修改开源模型代码评测脚本,加载om模型输出的结果,然后替换掉model的输出再评测精度,查看精度是否下降。 + 6.如果是om算子缺陷导致精度下降,则指定算子为om的输出节点,然后与在线推理时该算子(使用开源netron工具查看onnx模型算子,开启verbose导出onnx时会打印算子对应的py文件代码行)的输出对比,查看是否一致。二分法排查对比pytorch或onnx与om哪个算子输出不一致,需要保证条件是输入一样 -8.用替换法对比输入输出排查某个修改的或自定义或关键算子的影响,如果某算子导致精度下降问题,尝试是否可以修改模型使用其它方法替换掉该算子。 + 7.pytorch模型在线推理支持模型输入的hw维是变化的,而om模型由于不支持动态算子暂需要固定输入的hw维,即每个预处理后输入样本的hw都是一样的。为了验证预处理等比例缩放加pad固定样本的hw维对精度的影响,可以修改开源模型代码评测脚本,加载预处理后的样本,然后替换掉model的输入再评测精度,后处理需要做相应适配恢复到原图,查看精度是否下降。同样为了验om模型输出的结果与后处理,可以修改开源模型代码评测脚本,加载om模型输出的结果,然后替换掉model的输出再评测精度,查看精度是否下降。 -[精度对比工具](https://gitee.com/ascend/tools/tree/master/msquickcmp) -[精度对比工具简洁版](https://gitee.com/wangjiangben_hw/ascend-pytorch-crowdintelligence-doc/tree/master/Ascend-PyTorch%E7%A6%BB%E7%BA%BF%E6%8E%A8%E7%90%86%E6%8C%87%E5%AF%BC/%E4%B8%93%E9%A2%98%E6%A1%88%E4%BE%8B/%E7%9B%B8%E5%85%B3%E5%B7%A5%E5%85%B7/one_step_accuracy_cmp) -[精度调试专题](https://gitee.com/wangjiangben_hw/ascend-pytorch-crowdintelligence-doc/tree/master/Ascend-PyTorch%E7%A6%BB%E7%BA%BF%E6%8E%A8%E7%90%86%E6%8C%87%E5%AF%BC/%E4%B8%93%E9%A2%98%E6%A1%88%E4%BE%8B/%E7%B2%BE%E5%BA%A6%E8%B0%83%E8%AF%95) + 8.用替换法对比输入输出排查某个修改的或自定义或关键算子的影响,如果某算子导致精度下降问题,尝试是否可以修改模型使用其它方法替换掉该算子。 + +- 精度调试工具与案例 + + [精度对比工具](https://gitee.com/ascend/tools/tree/master/msquickcmp) + [精度对比工具简洁版](https://gitee.com/wangjiangben_hw/ascend-pytorch-crowdintelligence-doc/tree/master/Ascend-PyTorch%E7%A6%BB%E7%BA%BF%E6%8E%A8%E7%90%86%E6%8C%87%E5%AF%BC/%E4%B8%93%E9%A2%98%E6%A1%88%E4%BE%8B/%E7%9B%B8%E5%85%B3%E5%B7%A5%E5%85%B7/one_step_accuracy_cmp) + [精度调试专题](https://gitee.com/wangjiangben_hw/ascend-pytorch-crowdintelligence-doc/tree/master/Ascend-PyTorch%E7%A6%BB%E7%BA%BF%E6%8E%A8%E7%90%86%E6%8C%87%E5%AF%BC/%E4%B8%93%E9%A2%98%E6%A1%88%E4%BE%8B/%E7%B2%BE%E5%BA%A6%E8%B0%83%E8%AF%95) ### 2.4 性能优化指导