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-FAQ.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-FAQ.md" index 5a31cdac6fd26f83b67708be2d781d4e458e1018..1912728e57e67eb5b1c4d6ba3ca32bc2e7e4a4ed 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-FAQ.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-FAQ.md" @@ -1,274 +1,99 @@ # Ascend PyTorch模型离线推理常见问题FAQ +- [Ascend PyTorch模型离线推理常见问题FAQ](#ascend-pytorch模型离线推理常见问题faq) - [1 介绍](#1-介绍) -- [2 常见问题FAQ](#2-常见问题faq) - - [2.1 PyTorch离线推理打通常见问题FAQ](#21-PyTorch离线推理打通常见问题faq) - - [FAQ1、推理须知](#faq1推理须知) - - [FAQ2、导出onnx脚本的dynamic_axes与onnx的输入shape(-1,3,224,224)中的-1是什么意思?](#faq10导出onnx脚本的dynamic_axes与onnx的输入shape-13224224中的-1是什么意思) - - [FAQ3、模型代码包含不能导出onnx的算子时如何解决-等价替换为自定义算子?](#faq12模型代码包含不能导出onnx的算子时如何解决-等价替换为自定义算子) - - [FAQ4、运行atc或benchmark命令时报错找不到atc命令或找不到ascend动态库](#faq13运行atc或benchmark命令时报错找不到atc命令或找不到ascend动态库) - - [FAQ5、推理性能不达标,profiling显示TransData算子耗时,参考如下方案优化](#faq14推理性能不达标profiling显示transdata算子耗时参考如下方案优化) - - [FAQ6、onnx转om模型报错atc命令ERROR问题解决](#faq15onnx转om模型报错atc命令error问题解决) - - [FAQ7、离线推理后处理脚本适配](#faq16离线推理后处理脚本适配) - - [FAQ8、执行数据集预处理报错](#faq17执行数据集预处理报错) - - [FAQ9、模型推理工具常见的错误&&解决方案](#faq18模型推理工具常见的错误&&解决方案) - - [2.2 PyTorch离线推理精度调试常见问题FAQ](#22-PyTorch离线推理精度调试常见问题faq) - - [FAQ1、精度调试指导](#faq1精度调试指导) - - [2.3 PyTorch离线推理性能优化常见问题FAQ](#23-PyTorch离线推理性能优化常见问题faq) - - [FAQ1、性能优化指导](#faq1性能优化指导) + - [FAQ上传格式](#faq上传格式) +- [2 om模型转换问题汇总](#2-om模型转换问题汇总) + - [如何查看 `ONNX/om/pbtxt` 模型](#如何查看-onnxompbtxt-模型) + - [导出onnx脚本的 `dynamic_axes` 参数与onnx模型中的-1是什么意思?](#导出onnx脚本的-dynamic_axes-参数与onnx模型中的-1是什么意思) + - [`Exporting the operator {opname} to ONNX opset version {version} is not supported.`](#exporting-the-operator-opname-to-onnx-opset-version-version-is-not-supported) +- [3 OM离线推理失败问题汇总](#3-om离线推理失败问题汇总) + - [运行atc或benchmark命令时报错找不到atc命令或找不到ascend动态库](#运行atc或benchmark命令时报错找不到atc命令或找不到ascend动态库) + - [模型推理工具常见的错误&&解决方案](#模型推理工具常见的错误解决方案) +- [4 精度调试常见问题](#4-精度调试常见问题) +- [5 性能优化常见问题](#5-性能优化常见问题) # [1 介绍](#1-介绍) - - 本文目标读者为Ascend PyTorch模型离线推理开发者,用于指导开发者在昇腾服务器的CANN软件环境中,实现模型离线推理精度性能达标。这里仅列举模型离线推理中遇到的常见问题与解决方法,持续更新。 - - -# [2 常见问题FAQ](#2-常见问题FAQ) - -## [2.1 PyTorch离线推理打通常见问题FAQ](#21-PyTorch离线推理打通常见问题FAQ) - -### FAQ1、推理须知 -推理与训练关系: -推理与训练是独立的事情,推理是基于开源PyToch框架与开源模型代码,使用Ascend 910训练的权重或开源模型代码提供的pth权重文件,在Ascend 310上执行离线推理。推荐可以先做gpu训练作为基准,然后导出onnx获悉模型包含的自定义算子,训练周期长有些问题需要及早发现,推理问题少点但是可以作为入门帮助理解复杂模型的训练,根据模型难度与机器资源合理安排训练推理,不需要等待训练完成,训练推理可以并行做 - -推理工作量: -精度或性能不达标就需要花费不少时间调试,模型推理完成到交付验收还有检视整改测试资料文档的工作,从开始模型推理到验收完成整个周期规划了1个月~2个月的时间 - -权重文件选择: -如果已经有了ascend 910训练提供的权重文件,那么优先使用910训练提供的权重文件做离线推理,精度与910训练出的精度对齐 -如果开源代码仓提供了多个权重文件,使用常用的基础的那个配置的权重文件即可,并且模型支持多任务时只需要针对一个任务做推理 -如果开源代码仓没有提供pth权重文件,则需要该模型的训练同学提供pth权重文件,或者使用开源代码仓训练脚本简单训练一个pth权重文件,然后对比om精度与该pth权重文件的精度 - -[模型转换专题](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/%E5%8A%9F%E8%83%BD%E6%89%93%E9%80%9A) -[MindStudio可视化om模型](https://gitee.com/wangjiangben_hw/ascend-pytorch-crowdintelligence-doc/blob/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/MindStudio%E5%B7%A5%E5%85%B7%E5%8F%AF%E8%A7%86%E5%8C%96om%E6%A8%A1%E5%9E%8B%E6%95%99%E7%A8%8B.docx) - -### FAQ2、导出onnx脚本的dynamic_axes与onnx的输入shape(-1,3,224,224)中的-1是什么意思? -如下导出的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模型来转换,否则会报错 - -### FAQ3、模型代码包含不能导出onnx的算子时如何解决-等价替换为自定义算子? -pytorch代码的adaptive_avg_pool2d目前onnx还不支持,所以导出onnx时报错,解决方案是尝试使用avg_pool2d替换adaptive_avg_pool2d,但当input最后两维不是output的整数倍时,adaptive_avg_pool2d不能完全等价替换为avg_pool2d,而npu有adaptive_avg_pool2d算子的实现,所以解决方案变为将adaptive_avg_pool2d改为自定义算子导出onnx,自定义算子不需要具体实现代码(因此导出的onnx不能使用onnxruntime进行推理,还需要将pytorch的_check_onnx_proto(proto)改为pass去除导出onnx时进行检查),只要自定义算子返回的输出shape与原算子输出的shape保持一致即可,相当于onnx只包含这个算子的声明(数据类型与属性需要与npu版算子对应),在onnx转为om时,atc工具的onnx插件如果支持该算子,atc工具会根据这个声明找到该算子npu的实现。 -查看npu的adaptive_avg_pool2d声明: -``` -REG_OP(AdaptiveAvgPool2d) - .INPUT(x, TensorType({DT_FLOAT, DT_FLOAT16})) - .OUTPUT(y, TensorType({DT_FLOAT, DT_FLOAT16})) - .REQUIRED_ATTR(output_size, ListInt) - .OP_END_FACTORY_REG(AdaptiveAvgPool2d) -``` -修改模型代码,将adaptive_avg_pool2d改为自定义算子,然后导出onnx,其中output_size_i代表int64类型的算子属性: -``` -class AdaptiveAvgPoolOp(torch.autograd.Function): - - @staticmethod - def forward(ctx, x, output_size): - out = torch.randn(x.shape[0], x.shape[1], output_size[0], output_size[1]).to(x.dtype) - return out - - @staticmethod - def symbolic(g, x, output_size): - out = g.op('AdaptiveAvgPool2d', x, output_size_i = output_size) - return out - -def adaptive_avg_pool_op(x, output_size): - out = AdaptiveAvgPoolOp.apply(x, output_size) - return out - -x = F.adaptive_avg_pool2d(input, output_size=bin_size)替换为x = adaptive_avg_pool_op(input, (bin_size, bin_size)) -``` - -### FAQ4、运行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' - ``` - -### FAQ5、推理性能不达标,profiling显示TransData算子耗时,参考如下方案优化 -(1)修改five_2_four.py优化方法 - 在环境变量env.sh中export install_path=/usr/local/Ascend/ascend-toolkit/latest路径下查找five_2_four.py文件,路径一般为 -``` -/usr/local/Ascend/ascend-toolkit/latest/x86_64-linux/opp/op_impl/built-in/ai_core/tbe/impl/five_2_four.py -``` - -修改five_2_four.py文件,将TransData算子的output shape加入five_2_four函数行中,示例如下: -``` -from impl import trans_data_negative_target_ntc - -@util.check_input_type(dict, dict, str, str, str) -def five_2_four(src, dst, src_format, dst_format, kernel_name='five_2_four'): - ... - elif dst_format.lower() == "nhwc" and dst_shape in [[10000, 63, 63, 1], [10000, 127, 127, 1], [16, 19, 19, 486], - [16, 10, 10, 486], [16, 38, 38, 324], [16, 5, 5, 486], - [16, 3, 3, 324], [8, 19, 19, 486], [8, 10, 10, 486], - [8, 38, 38, 324], [8, 5, 5, 486], [8, 3, 3, 324], - [100, 28, 28, 91]]: - trans_data_negative_target_tc.trans_data_negative_target_tc(src, dst, src_format, dst_format, kernel_name) - elif dst_format.lower() == "nchw" and dst_shape in [[2560, 512, 4, 26], [2560, 512, 1, 26], [2560, 256, 8, 25], - [16, 240, 7, 7], [16, 120, 14, 14], [1,19,1024,2048], [4,19,1024,2048]]: - print("=================================") - print("ntc dst shape:", dst_shape) - print("=================================") - trans_data_negative_target_ntc.trans_data_negative_target_ntc(src, dst, src_format, dst_format, kernel_name) - ... -``` -- 不同的batch_size,添加的shape不一样,shape大小为[*,19,1024,2048 ] ,以某模型为例,只测试batch1和batch4,因此添加的shape为[1,19,1024,2048],[4,19,1024,2048] - -修改完成后,重新转换生成om文件,atc转换过程会打印添加的日志,如下: -``` -ATC start working now, please wait for a moment. -================================= -ntc dst shape: [1, 19, 1024, 2048] -================================= -================================= -ntc dst shape: [1, 19, 1024, 2048] -================================= -ATC run success, welcome to the next use. -W11001: High-priority service of op[PartitionedCall_AvgPool_45_2] is invalid, low-priority service is used. It can work normally but may affect performance. -W11001: High-priority service of op[PartitionedCall_AvgPool_52_6] is invalid, low-priority service is used. It can work normally but may affect performance. -``` -(2)output_node输出节点类型更改为float16 -atc转换时指定输出节点类型为float16 -``` -atc --framework=5 --model=./ICNet.onnx --output=ICNet_bs1 --out_nodes="Resize_317:0" --output_type=FP16 --input_format=NCHW --input_shape="actual_input_1: 1,3,1024,2048" --log=debug --soc_version=Ascend310 -``` - -### FAQ6、onnx转om模型报错atc命令ERROR问题解决 -* 现象描述 - ``` - ATC run failed,please check the detail log. try 'atc --help' - E19999: Inter Error! - Unknown error occurred,please check the log. - ``` - 1. 设置环境变量 - ``` - 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 + 本文目标读者为Ascend PyTorch模型离线推理开发者,用于指导开发者在昇腾服务器的CANN软件环境中,实现模型离线推理精度性能达标。这里仅列举模型离线推理中遇到的常见问题与解决方法,持续更新。 +## FAQ上传格式 +尽量以文本方式呈现,方便索引查找 +- 标题 + - 错误现象 + - 原因分析 + - 解决方案 + +# [2 om模型转换问题汇总](#2-om模型转换问题汇总) +## 如何查看 `ONNX/om/pbtxt` 模型 +可以使用[在线版netron工具](https://netron.app/)或者[本地安装netron工具](https://github.com/lutzroeder/Netron)查看 +## 导出onnx脚本的 `dynamic_axes` 参数与onnx模型中的-1是什么意思? +常用ONNX导出命令如下,其中 `-1` 表示动态shape轴,即任意数值的输入shape均支持。 +```python +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) +``` +因为目前CANN层对动态shape支持不完善,所以在ATC进行om模型转换时**优先使用** [dynamic_batch_size](https://support.huaweicloud.com/atctool-cann503alpha2infer/atlasatc_16_0051.html),[dynamic_image_size](https://support.huaweicloud.com/atctool-cann503alpha2infer/atlasatc_16_0052.html),[dynamic_dims](https://support.huaweicloud.com/atctool-cann503alpha2infer/atlasatc_16_0053.html) 动态分档特性。 + +## `Exporting the operator {opname} to ONNX opset version {version} is not supported.` +常见于 [mmdection](https://github.com/open-mmlab/mmdetection) 或者 [Ascend_pytorch](https://gitee.com/ascend/pytorch?_from=gitee_search) 等框架下出现了不存在于[ONNX标准库算子](https://github.com/onnx/onnx/blob/master/docs/Operators.md)的自定义算子,所以导出ONNX报错失败。解决方案有如下两种可供选择: +- 注册ONNX自定义算子(方式一) + ```python + class AdaptiveAvgPoolOp(torch.autograd.Function): + + @staticmethod + def forward(ctx, x, output_size): + out = torch.randn(x.shape[0], x.shape[1], output_size[0], output_size[1]).to(x.dtype) + return out + + @staticmethod + def symbolic(g, x, output_size): + out = g.op('AdaptiveAvgPool2d', x, output_size_i = output_size) + return out + + def adaptive_avg_pool_op(x, output_size): + out = AdaptiveAvgPoolOp.apply(x, output_size) + return out + + x = F.adaptive_avg_pool2d(input, output_size=bin_size)替换为x = adaptive_avg_pool_op(input, (bin_size, bin_size)) + ``` +- 注册ONNX自定义算子(方式二) + ```python + # 待补充 + ``` +# [3 OM离线推理失败问题汇总](#3-OM离线推理失败问题汇总) +## 运行atc或benchmark命令时报错找不到atc命令或找不到ascend动态库 +- 现象描述 + ```shell + Command 'atc' not found, but can be installed with: + ``` + 或者 + ```shell + ./benchmark.x86_64: error while loading shared libraries: libascendcl.so: cannot open shared object file: No such file or directory + ``` +- 原因分析 + 当环境变量未设置或者无效时,会出现上述错误。 +- 处理方法 + 设置环境变量: + ```shell + 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. 更新最新的推理包run包 - - 3. 打印host日志 - ``` - export ASCEND_SLOG_PRINT_TO_STDOUT=1 - [WARNING] TBE(3112,atc.bin):2021-05-25-15:20:33.329.360 [image_ops.cc:2146][OP_PROTO] ResizeNearestInferShape:2146 OpName:[Resize_140] "Get - constValue failed of [sizes]" - [ERROR] TBE(3112,atc.bin):2021-05-25-15:20:33.329.371 [image_ops.cc:2084][OP_PROTO] CalculateSizeOut:2084 OpName:[Resize_140] "length of scale_out - after erase must be equal to 2" - [ERROR] TBE(3112,atc.bin):2021-05-25-15:20:33.329.376 [image_ops.cc:2155][OP_PROTO] ResizeNearestInferShape:2155 OpName:[Resize_140] "calculate size - out failed." - [ERROR] GE(3112,atc.bin):2021-05-25-15:20:33.329.391 [op_desc.cc:1345]3112 CallInferFunc: ErrorNo: -1(failed) [COMP][PRE_OPT]Resize_140 call infer - func. ret: 4294967295 - [ERROR] GE(3112,atc.bin):2021-05-25-15:20:33.329.397 [shape_refiner.cc:766]3112 InferShapeAndType: ErrorNo: -1(failed) [COMP][PRE_OPT]Resize_140 call - infer function failed. - ``` - 得出的结论为:onnx不支持 constValuse 需要进行优化转换 - 优化转换采用onnx-simplifier 工具进行转换 - 安装onnx-simplifier - pip3 install onnx-simplifier - 简化onnx模型: - python3 -m onnxsim ./hrnet_w18.onnx ./hrnet_w18_1.onnx --input-shape "16,3,224,224" - 转换完成再执行如下命令 - ``` - atc --framework=5 --model=./hrnet_w18_1.onnx --input_format=NCHW --input_shape="image:16,3,224,224" --output=hrnet_bs16 --log=debug -- - soc_version=Ascend310 - ``` - onnx转om成功。 - -### FAQ7、离线推理后处理脚本适配 - 对于一些图像分类的模型,后处理脚本都是通用的;而有些模型(比如分割类)是没有后处理脚本的,需要读者自行适配。 -(1)源码中包含在线推理脚本(如evaluate.py)或测试类脚本(如test.py) -基于这两个脚本适配,一般脚本中都包含类似的model语句 -``` -outputs = model(image) -``` -benchmark离线推理得到的./result/dumpOutput_device0/数据就可以理解为在线推理的model(image)步骤,适配过程就是从./result/dumpOutput_device0/中按照对应的名字将数据读取出来,适配代码参考如下: -``` -outputs = self.file2tensor(annotation_file) - -# 生成的是bin文件 -def file2tensor(self, annotation_file): - - filepath = annotation_file + '_1.bin' - size = os.path.getsize(filepath) - res = [] - L = int(size/4) #由于需要的是float32类型,所以按照4字节读取;根据实际情况按字节读取 - binfile = open(filepath, 'rb') - for i in range(L): - data = binfile.read(4) - num = struct.unpack('f', data) - res.append(num[0]) - binfile.close() - - dim_res = np.array(res).reshape(1,19,1024,2048) #转换为对应的shape,可通过在线推理打印outputs的shape获取到 - tensor_res = torch.tensor(dim_res, dtype=torch.float32) - print(filepath, tensor_res.dtype, tensor_res.shape) - - return tensor_res -``` -(2)如上的文件都没有,可以参考训练过程的validation步骤进行适配,适配方法同上。 - - -### FAQ8、执行数据集预处理报错 -``` -python3.7 imagenet_torch_preprocess.py /opt/npu/imagenet/val ./pre_dataset -``` -报错如下 -``` -PIL.UnidentifeldImageError: cannot identify image file '/opt/npu/imagenet/val/xxxx.jpeg' -``` -出现这个问题代表图片文件损坏。 -解决方法:更换未损坏的val数据集。 - -### FAQ9、模型推理工具常见的错误&&解决方案 +## 模型推理工具常见的错误&&解决方案 当前默认的模型推理是benchmark工具,以下为常见错误和一些解决方案: -1. 输入文件不存在 - -错误日志: -``` -[ERROR] Get absolute xxx path failed! -[ERROR] Get flags path failed! -``` -解决思路:通常是因为输入的input_image_path/input_text_path文件名写错或者不存在 - -2. 模型输入数据存在问题 - +- 模型输入数据存在问题 错误日志: ``` [ERROR][Inference] Input data size don't match the model input size! len is xx, singleSize is xx @@ -276,7 +101,7 @@ PIL.UnidentifeldImageError: cannot identify image file '/opt/npu/imagenet/val/xx ``` 解决思路:通常是dump出来的bin文件有问题,如size等 -3. 输入数据的info文件存在问题 +- 输入数据的info文件存在问题 错误日志: ``` @@ -285,40 +110,10 @@ PIL.UnidentifeldImageError: cannot identify image file '/opt/npu/imagenet/val/xx ``` 解决思路:通常是输入的input_image_path/input_text_path格式问题,如常见的nlp模型通常会有多输入的场合会有输入顺序/输入名的问题 -4. 模型不支持的输入 +- 模型不支持的输入 解决思路:当前benchmark工具支持的模型类型有:图像/自然语音/YOLO检测/搜索/语义理解/翻译,但存在不支持的输入类型如:3D的输入(如视频理解/点云等),可以采用[msame工具](https://gitee.com/ascend/tools/tree/master/msame)进行推理。 -5. 其他问题待补充 - - -## [2.2 PyTorch离线推理精度调试常见问题FAQ](#22-PyTorch离线推理精度调试常见问题FAQ) - -### FAQ1、精度调试指导 - -1.根据推理流程逐步排查引起精度下降的问题点,先粗调确认是哪个流程的问题再微调 - -2.以开源模型代码在线推理为基准,在gpu上加载pth权重运行评测脚本,查看pth在线推理精度是否达标。可以添加打印熟悉模型结构,前后处理与算子的输出,通过制作异常产生的调用栈查看函数调用关系。使用控制变量替换法将自己预处理代码或om结果或算子参数等替换掉在线推理的相应变量,同时后处理需要做与预处理相应的适配,看自己的结果是否精度不达标。确保前后处理,模型参数与算子参数与开源模型代码在线推理使用的完全一致 - -3.注意如果使用的是910权重需要把训练适配的影响精度的代码移植到开源模型代码,因为是基于开源模型代码加910权重做推理 - -4.如果修改了开源模型代码,优先排查修改的代码或关键算子参数是否有问题或与训练使用的不一致 - -5.如果导出的onnx可以推理,确定onnx精度是否达标 - -6.如果是om算子缺陷导致精度下降,则指定算子为om的输出节点,然后与在线推理时该算子(使用开源netron工具查看onnx模型算子,开启verbose导出onnx时会打印算子对应的py文件代码行)的输出对比,查看是否一致。二分法排查对比pytorch或onnx与om哪个算子输出不一致,需要保证条件是输入一样 - -7.pytorch模型在线推理支持模型输入的hw维是变化的,而om模型由于不支持动态算子暂需要固定输入的hw维,即每个预处理后输入样本的hw都是一样的。为了验证预处理等比例缩放加pad固定样本的hw维对精度的影响,可以修改开源模型代码评测脚本,加载预处理后的样本,然后替换掉model的输入再评测精度,后处理需要做相应适配恢复到原图,查看精度是否下降。同样为了验om模型输出的结果与后处理,可以修改开源模型代码评测脚本,加载om模型输出的结果,然后替换掉model的输出再评测精度,查看精度是否下降。 - -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.3 PyTorch离线推理性能优化常见问题FAQ](#22-PyTorch离线推理性能优化常见问题FAQ) - -### FAQ1、性能优化指导 +# [4 精度调试常见问题](#4-精度调试常见问题) -[性能初步优化案例](https://gitee.com/wangjiangben_hw/ascend-pytorch-crowdintelligence-doc/blob/master/Ascend-PyTorch%E7%A6%BB%E7%BA%BF%E6%8E%A8%E7%90%86%E6%8C%87%E5%AF%BC/PyTorch%E7%A6%BB%E7%BA%BF%E6%8E%A8%E7%90%86-Xxx%E6%A8%A1%E5%9E%8B%E6%B5%8B%E8%AF%95%E6%8A%A5%E5%91%8A.docx) -[性能优化专题](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/%E6%80%A7%E8%83%BD%E8%B0%83%E4%BC%98) +# [5 性能优化常见问题](#5-性能优化常见问题)