diff --git "a/AscendPyTorch\346\250\241\345\236\213\344\274\227\346\231\272\346\226\207\346\241\243-\347\246\273\347\272\277\346\216\250\347\220\206.md" "b/AscendPyTorch\346\250\241\345\236\213\344\274\227\346\231\272\346\226\207\346\241\243-\347\246\273\347\272\277\346\216\250\347\220\206.md" index 5629787168ea873b61248045ad587e9d297ee707..b59263fbf526620c40f8b2c074004832b76ae64d 100644 --- "a/AscendPyTorch\346\250\241\345\236\213\344\274\227\346\231\272\346\226\207\346\241\243-\347\246\273\347\272\277\346\216\250\347\220\206.md" +++ "b/AscendPyTorch\346\250\241\345\236\213\344\274\227\346\231\272\346\226\207\346\241\243-\347\246\273\347\272\277\346\216\250\347\220\206.md" @@ -50,13 +50,16 @@ ### 1.2 端到端推理流程与交付标准 - 精度性能要求 -由开源PyTorch模型转换的Ascend om模型离线推理的精度与开源PyTorch预训练模型在github代码仓或官网公布的精度对比,精度下降不超过1%则认为精度达标 +Ascend PyTorch模型离线推理目标是开源代码仓的pytorch模型在npu Ascend 310卡上离线推理的精度与gpu T4卡上推理精度一致,推理性能超过T4。 +由开源PyTorch模型转换的Ascend om模型离线推理的精度与开源PyTorch预训练模型在github代码仓或官网公布的精度对比,精度下降不超过1%则认为精度达标; npu 310单颗芯片上模型推理性能的吞吐率乘以4颗即单卡吞吐率大于gpu T4单卡上模型推理性能的吞吐率则认为性能达标 - Ascend PyTorch模型端到端推理流程 -昇腾NPU推理芯片只支持昇腾om格式的离线模型,由于昇腾atc工具不支持pth模型转换为om模型,因此先将PyTorch预训练的pth模型文件转换为onnx模型文件,再用atc工具将onnx转化为om模型文件。首先在github上找到PyTorch实现的引用多包含预训练的模型代码仓,参考代码仓预处理模型加载的代码加载pth并转换为onnx模型,参考代码仓预训练模型数据预处理代码对用来评价模型精度的数据集进行预处理,使用昇腾benchmark工具执行om模型的离线推理,最后参考代码仓数据后处理代码进行后处理,统计出om模型的推理精度 -使用benchmark工具纯推理功能测试om推理性能,对性能不达标的om模型,使用profiling工具分析,通过模型调优,算子开发与算子融合等方法实现达标 +首先在github上找到PyTorch实现的引用多包含预训练的模型代码仓,参考代码仓预处理模型加载的代码加载pth并转换为onnx模型,参考代码仓预训练模型数据预处理代码对用来评价模型精度的数据集进行预处理,使用昇腾benchmark工具执行om模型的离线推理,最后参考代码仓数据后处理代码进行后处理,统计出om模型的推理精度。使用benchmark工具测试om推理性能,对性能不达标的om模型,使用profiling工具分析,通过模型调优,算子开发与算子融合等方法实现达标 + +下图为Ascend PyTorch模型离线推理流程: +![](figures/pyotrch_offline_infer.png) ## 2 环境搭建 @@ -1211,19 +1214,18 @@ https://gitee.com/ascend/tools/tree/master/msquickcmp ``` 1.如果开源代码仓提供了多个权重文件,使用常用的基础的那个配置的权重文件即可;如果开源代码仓没有提供pth权重文件,则需要该模型的训练同学提供pth权重文件,或者使用开源代码仓训练脚本简单训练一个pth权重文件,然后对比om精度与该pth权重文件的精度 2.由于随机数可能不能模拟数据分布,Ascend benchmark工具纯推理功能测的有些模型性能数据可能不太准,所以模型测试脚本与提交代码的描述中的性能数据以Ascend benchmark在数据集上推理时得到性能数据为准 - 3.如果模型支持多batch,需要测试batch1,4,8,16,32的精度与性能,写在模型名称_Onnx端到端推理指导.md里,模型测试脚本与提交代码的描述只需提供bs1和bs16的精度性能数据 + 3.如果模型支持多batch,需要测试batch1,4,8,16,32的精度与性能,写在README.md里,模型测试脚本与提交代码的描述只需提供bs1和bs16的精度性能数据 4.如果导出的onnx因包含自定义算子等而不能推理,则在t4上运行开源评测脚本测试pth模型在线推理性能 5.对于性能不达标的模型,需要进行如下工作: 1)优化修改onnx模型去掉影响性能的冗余pad,用Ascend atc的相关优化选项尝试一下,尝试使用最近邻替换双线性的resize重新训练,降低图片分辨率等使性能达标。 2)对于算子导致的性能问题,需要使用profiling分析定位引起性能下降的原因,具体到引起性能下降的算子。优先修改模型代码以使其选择性能好的npu算子替换性能差的npu算子使性能达标,然后在modelzoo上提issue,等修复版本发布后再重测性能,继续优化。 - 3)需要交付profiling性能数据,对经过上述方法性能可以达标的模型,在交付文档中写明问题原因与达标需要执行的操作;对经过上述方法性能仍不达标的模型,在交付文档中写明问题原因与简要的定位过程。 - 6.工作量为简单模型2-3个工作日,复杂模型5-10个工作日,个别难度大的模型15-20个工作日。 + 3)需要交付profiling性能数据,对经过上述方法性能可以达标的模型,在交付文档中写明问题原因与达标需要执行的操作;对经过上述方法性能仍不达标的模型,在交付的README.md文档中写明问题原因与简要的定位过程。 ``` - 交付件 - 交付件参考:[ResNeXt50_Onnx模型端到端推理指导.md](https://gitee.com/ascend/modelzoo/tree/master/built-in/ACL_PyTorch/Benchmark/cv/classification/ResNext50) - 最终交付件: - 包含以上交付标准的代码,模型名称_Onnx端到端推理指导.md,以及验收脚本 + 包含以上交付标准的代码,README.md,以及验收脚本 - 最终交付形式: gitee网址:https://gitee.com/ascend/modelzoo/tree/master/contrib/ACL_PyTorch/Research commit信息格式:【高校贡献-${学校学院名称}】【Pytorch离线推理-${模型名称}】${PR内容摘要} @@ -1281,7 +1283,7 @@ https://gitee.com/ascend/tools/tree/master/msquickcmp | :------: | :------: | :------: | :------: | :------: | | ResNeXt50 bs1 | top1:77.62% top5:93.70% | top1:77.62% top5:93.69% | 763.044fps | 1497.252fps | | ResNeXt50 bs16 | top1:77.62% top5:93.70% | top1:77.62% top5:93.69% | 1234.940fps | 2096.376fps | - # 如果是无法规避的算子缺陷导致性能不达标,这里需要添加性能不达标的原因 + # 如果是无法规避的算子缺陷导致性能不达标,这里需要添加性能不达标的原因与解决方案 # 自验报告 ```shell diff --git "a/AscendPyTorch\346\250\241\345\236\213\346\216\250\347\220\206\344\274\227\346\231\272\351\252\214\346\224\266\346\214\207\345\215\227.md" "b/AscendPyTorch\346\250\241\345\236\213\346\216\250\347\220\206\344\274\227\346\231\272\351\252\214\346\224\266\346\214\207\345\215\227.md" index e829474f677a1b68224a7bcbfd9dbfe49a20f34d..25773b1525e2e791d1984cd5f49d4fb9ea6db87a 100644 --- "a/AscendPyTorch\346\250\241\345\236\213\346\216\250\347\220\206\344\274\227\346\231\272\351\252\214\346\224\266\346\214\207\345\215\227.md" +++ "b/AscendPyTorch\346\250\241\345\236\213\346\216\250\347\220\206\344\274\227\346\231\272\351\252\214\346\224\266\346\214\207\345\215\227.md" @@ -159,7 +159,7 @@ | :------: | :------: | :------: | :------: | :------: | | ResNeXt50 bs1 | top1:77.62% top5:93.70% | top1:77.62% top5:93.69% | 763.044fps | 1497.252fps | | ResNeXt50 bs16 | top1:77.62% top5:93.70% | top1:77.62% top5:93.69% | 1234.940fps | 2096.376fps | - # 如果是无法规避的算子缺陷导致性能不达标,这里需要添加性能不达标的原因 + # 如果是无法规避的算子缺陷导致性能不达标,这里需要添加性能不达标的原因与解决方案 # 自验报告 ```shell diff --git "a/AscendPytorch\346\250\241\345\236\213\346\216\250\347\220\206\344\274\227\346\231\272FAQ.md" "b/AscendPytorch\346\250\241\345\236\213\346\216\250\347\220\206\344\274\227\346\231\272FAQ.md" new file mode 100644 index 0000000000000000000000000000000000000000..1fcac6f75d27dafa1d06ad0dbf8ef93cf3c9f1cb --- /dev/null +++ "b/AscendPytorch\346\250\241\345\236\213\346\216\250\347\220\206\344\274\227\346\231\272FAQ.md" @@ -0,0 +1,87 @@ +# Ascend PyTorch模型推理常见问题FAQ +- [1 介绍](#1-介绍) +- [2 常见问题FAQ](#2-常见问题FAQ) + - [2.1 NPU模型打通常见问题FAQ](#21-NPU模型打通常见问题FAQ) + - [2.2 NPU模型精度调试常见问题FAQ](#22-NPU模型精度调试常见问题FAQ) + - [2.3 NPU模型性能优化常见问题FAQ](#23-NPU模型性能优化常见问题FAQ) + +# [1 介绍](#1-介绍) + + 本文目标读者为Ascend模型离线推理开发者,用于指导开发者在昇腾版本的CANN包下,实现模型推理精度性能达标。这里仅列举模型离线推理中遇到的常见问题与解决方法,持续更新。 + + +# [2 常见问题FAQ](#2-常见问题FAQ) + +## [2.1 NPU模型打通常见问题FAQ](#21-NPU模型打通常见问题FAQ) + +1.如果开源代码仓提供了多个权重文件,使用常用的基础的那个配置的权重文件即可;如果开源代码仓没有提供pth权重文件,则需要该模型的训练同学提供pth权重文件,或者使用开源代码仓训练脚本简单训练一个pth权重文件,然后对比om精度与该pth权重文件的精度 +2.由于随机数可能不能模拟数据分布,Ascend benchmark工具纯推理功能测的有些模型性能数据可能不太准,所以模型测试脚本与提交代码的描述中的性能数据以Ascend benchmark在数据集上推理时得到性能数据为准 +3.如果模型支持多batch,需要测试batch1,4,8,16,32的精度与性能,写在README.md里,模型测试脚本与提交代码的描述只需提供bs1和bs16的精度性能数据 +4.如果导出的onnx因包含自定义算子等而不能推理,则在t4上运行开源评测脚本测试pth模型在线推理性能 +5.交付请参考《推理指导》6.2 交付标准与规范,交付件样例:https://gitee.com/ascend/modelzoo/tree/master/built-in/ACL_PyTorch/Benchmark/cv/classification/ResNext50 +6.模型推理与训练是独立的事情,推理比训练简单一些,推理是使用模型开源代码仓提供的权重在310上执行推理,一般在训练等待结果的时间内可以同步做推理,但是做之前需要先熟悉相关工作,然后进行模型推理,如果精度性能不达标就需要花费不少时间了,模型推理到验收还有检视整改测试资料文档的工作,不是三天就能做完模型推理,从开始到验收完成整个周期规划了一个月的时间 +7.前后处理与转onnx在cpu上做即可,转om模型和benchmark推理时的命令在装有ascend 310的服务器上执行即可,因为两个命令依赖Ascend cann包提供的编译工具与npu算子库,gpu性能数据需要在装有t4卡的服务器上测 +8.如下导出的onnx模型通过可视化工具netron查看其输入shape是(-1,3,224,224),-1代表onnx模型是动态batch的,当用tensorRT在t4上测onnx的性能时可以指定任意batch的输入(batch,3,224,224),dynamic_axes是动态batch参数,'image': {0: '-1'}表示输入image的第一维是-1即batch维为-1表示动态 +``` + input_names = ["image"] + output_names = ["class"] + dynamic_axes = {'image': {0: '-1'}, 'class': {0: '-1'}} + dummy_input = torch.randn(1, 3, 224, 224) + torch.onnx.export(model, dummy_input, output_file, input_names = input_names, dynamic_axes = dynamic_axes, output_names = output_names, opset_version=11, verbose=True) +``` +无论onnx模型的batch是多少,onnx转换为om时只要通过--input_shape指定batch为正整数,就得到对应batch的om模型,目前om虽然支持动态batch,但是我们不使用动态batch的om模型 +``` +atc --framework=5 --model=./resnext50.onnx --input_format=NCHW --input_shape="image:16,3,224,224" --output=resnext50_bs16 --log=debug --soc_version=Ascend310 +``` +当然像一些模型如shufflenetv1其实不支持动态batch,转换为固定batch的om时除了指定--input_shape的相同的batch,还需要相同batch的onnx模型来转换,否则会报错 +9.提供的装有Ascend 310卡的服务器已经安装好ascend的包,服务器home/common/resnext50的样例是可以运行的 +10.atc日志如何查看 + +### FAQ1、运行atc或benchmark命令时报错找不到atc命令或找不到ascend动态库 + +* 现象描述 + +``` +Command 'atc' not found, but can be installed with: +or +./benchmark.x86_64: error while loading shared libraries: libascendcl.so: cannot open shared object file: No such file or directory +``` + +* 原因分析 + + 当环境变量未设置或者无效时,会出现上述错误。 + +* 处理方法 + + 设置环境变量: +``` +export install_path=/usr/local/Ascend/ascend-toolkit/latest +export PATH=/usr/local/python3.7.5/bin:${install_path}/atc/ccec_compiler/bin:${install_path}/atc/bin:$PATH +export PYTHONPATH=${install_path}/atc/python/site-packages:$PYTHONPATH +export LD_LIBRARY_PATH=${install_path}/atc/lib64:${install_path}/acllib/lib64:$LD_LIBRARY_PATH +export ASCEND_OPP_PATH=${install_path}/opp +export ASCEND_AICPU_PATH=/usr/local/Ascend/ascend-toolkit/latest +``` + 若是普通用户登录装有Ascend310卡的服务器,需要使用sudo执行命令,并且 +``` +修改/etc/sudoers将Defaults env_reset改成Defaults !env_reset +修改/etc/bash.bashrc添加alias sudo='sudo env PATH=$PATH LD_LIBRARY_PATH=$LD_LIBRARY_PATH' +``` + + +## [2.2 NPU模型精度调试常见问题FAQ](#22-NPU模型精度调试常见问题FAQ) + + 1.前后处理与模型参数是否与开源代码仓的推理使用的完全一致 + 2.使用开源代码仓提供的测评pth的脚本测试pth在线推理精度是否达标,可以添加算子输出结果的调试打印 + 3.如果导出的onnx可以推理,确定onnx精度是否达标 + 4.如果是om算子导致精度下降,则模型转换时指定算子为om的输出节点,然后与pth在线推理时该算子(开启verbose导出onnx时会打印算子对应的py文件代码行)的输出对比,查看是否一致 + 5.如果某算子导致精度下降问题,尝试是否可以修改模型使用其它方法替换掉该算子,然后看精度是否达标,如果遇到实在规避不了的算子问题则需要在modelzoo提issue +参考《推理指导》的4.5 maskrcnn端到端推理指导案例 + + +## [2.3 NPU模型性能优化常见问题FAQ](#22-NPU模型性能优化常见问题FAQ) + + 1.优化修改onnx模型去掉影响性能的冗余pad,用Ascend atc的相关优化选项尝试一下,尝试使用最近邻替换双线性的resize重新训练,降低图片分辨率等使性能达标。 + 2.对于算子导致的性能问题,需要使用profiling分析定位引起性能下降的原因,具体到引起性能下降的算子。优先修改模型代码以使其选择性能好的npu算子替换性能差的npu算子使性能达标,然后在modelzoo上提issue,等修复版本发布后再重测性能,继续优化。 + 3.需要交付profiling性能数据,对经过上述方法性能可以达标的模型,在交付文档中写明问题原因与达标需要执行的操作;对经过上述方法性能仍不达标的模型,在交付的README.md文档中写明问题原因与简要的定位过程。 + diff --git a/figures/pyotrch_offline_infer.png b/figures/pyotrch_offline_infer.png new file mode 100644 index 0000000000000000000000000000000000000000..bc5458e4c1edce001bdbd2193100ff18327318c9 Binary files /dev/null and b/figures/pyotrch_offline_infer.png differ