From 4ea66fc174d16e012f248a38d23877d367a5e942 Mon Sep 17 00:00:00 2001 From: Ronnie_zheng Date: Tue, 23 Nov 2021 18:44:51 +0800 Subject: [PATCH 1/3] update temp file --- modify_magiconnx.py | 47 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 47 insertions(+) create mode 100644 modify_magiconnx.py diff --git a/modify_magiconnx.py b/modify_magiconnx.py new file mode 100644 index 0000000..0f0a127 --- /dev/null +++ b/modify_magiconnx.py @@ -0,0 +1,47 @@ +import onnx +from onnx import helper +from onnx import AttributeProto, TensorProto, numpy_helper +import numpy as np +from magiconnx import OnnxGraph + +INT32_MAX = 2147483647 +INT32_MIN = -2147483648 + +def modify(path): + graph = OnnxGraph(path) + inits = graph.get_nodes("Initializer") + for init in inits: + if init.value.dtype == np.int64: + a = init.value + a.flags.writeable = True + a[a > INT32_MAX] = INT32_MAX + a[a < INT32_MIN] = INT32_MIN + init.value = a.astype(np.int32) + col2ims = graph.get_nodes("Col2im") + for idx, node in enumerate(col2ims): + attr = node['output_size'] + node.attrs.pop("output_size") + new_init = graph.add_initializer(f'output_size_{node.name}', np.array(attr)) + node.inputs = [node.inputs[0], f'output_size_{node.name}'] + + graph.save('volo_modify_test.onnx') + +if __name__ == "__main__": + modify('volo_d1_384_85_Col2im.onnx') + +'''for node in model.graph.node: + if node.op_type == "Col2im": + attr = node.attribute[2] + del node.attribute[2] + tensor = helper.make_tensor(f'output_size_{node.name}', + TensorProto.INT32, + [len(attr.ints)], + attr.ints) + node.input.append(f'output_size_{node.name}') + model.graph.initializer.append(tensor) + + +model.opset_import[0].version = 11 + +onnx.save(model, 'volo.onnx') +''' \ No newline at end of file -- Gitee From 0438ac119b670fe35c49d4c3ffdcb642b3c2ec33 Mon Sep 17 00:00:00 2001 From: Ronnie_zheng Date: Wed, 1 Dec 2021 14:58:01 +0800 Subject: [PATCH 2/3] add two FAQ --- ...47\272\277\346\216\250\347\220\206-FAQ.md" | 58 +++++++++++++++++-- 1 file changed, 52 insertions(+), 6 deletions(-) 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 e74e7ae..17bfea4 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" @@ -9,6 +9,8 @@ - [3.1 找不到atc命令或找不到ascend动态库](#31-找不到atc命令或找不到ascend动态库) - [3.2 模型推理工具常见的错误&&解决方案](#32-模型推理工具常见的错误解决方案) - [3.3 msame和benchmark在多batch下推理区别](#33-msame和benchmark在多batch下推理区别) + - [3.4 msame/benchmark推理提示实际输入和om输入size不一致](#34-msamebenchmark推理提示实际输入和om输入size不一致) + - [3.5 benchmark工具报错`ERROR Check free memory less 0.256 rate now wait!`](#35-benchmark工具报错error-check-free-memory-less-0256-rate-now-wait) - [4 精度调试常见问题](#4-精度调试常见问题) - [5 性能优化常见问题](#5-性能优化常见问题) - [5.1 如何使用AIPP进行性能提升](#51-如何使用aipp进行性能提升) @@ -23,7 +25,7 @@ # 2 om模型转换问题汇总 ## 2.1 如何查看 `ONNX/om/pbtxt` 模型 -可以使用[在线版netron工具](https://netron.app/)或者[本地安装netron工具](https://github.com/lutzroeder/Netron)查看 +可以使用[在线版netron工具](https://netron.app/)或者[本地安装netron工具](https://github.com/lutzroeder/Netron)查看,建议本地安装查看。 ## 2.2 `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自定义算子(方式一) @@ -166,13 +168,57 @@ [ERROR] model execute failed [ERROR] Sample process failed ``` - - 原因分析 +- 原因分析 - benchmark工具多batch模式下设置 `batch_size=16` 数值后,benchmark工具会一次读取16个bin进行推理,所以一个bin对应的是一张图片; - msame工具只会一次读取1个bin进行推理(没有`batch_size`命令行参数),所以多batch模式下需要一个bin对应的是16张图片; - - 解决方案 + benchmark工具多batch模式下设置 `batch_size=16` 数值后,benchmark工具会一次读取16个bin进行推理,所以一个bin对应的是一张图片; + msame工具只会一次读取1个bin进行推理(没有`batch_size`命令行参数),所以多batch模式下需要一个bin对应的是16张图片; +- 解决方案 + + 预处理时把16张图片保存成一个bin文件 + +## 3.4 msame/benchmark推理提示实际输入和om输入size不一致 +- 问题现象: + + 日志中表明实际输入和om中的输入size不一致。 + ```shell + [WARNING] GE(231368,msame):2021-11-29-15:52:53.388.686 [davinci_model.cc:3421]231368 CheckUserAndModelSize:User input size [5836800] is bigger than om size need [2067232], MAY cause inference result ERROR, please check model input + ``` +- 定位过程 + + 查看debug日志可以看出其它的input是没有问题的,msame处理多输入存在无问题的部分,应该是bin文件出了问题。 + ```shell + INFO[INFO] GE(231368,msame):2021-11-29-15:52:53.388.794 [davinci_model.cc:3527]231368 UpdateZeroCopyTaskParam:[ZCPY] Copy input blobs_index 7, virtual_addr: 0x108192984c00, size: 64, user_data_addr: 0x108081dba000, batch_label: + ``` +- 解决方案 + + 在pdb中查看input blobs_index 对应输入的shape,发现与om输入的shape不一致。更换输入后,用getsizeof查看存入bin文件之前的nparray,依然是比msame日志中的need size要大。通过观察在日志中没有问题的输入,发现无论是float32还是float64,在存入bin之前都是比日志中的size要大。而使用input.nbytes发现它的datasize是要小于日志中的size。最后发现nparray为空时,依然占用了内存中的96字节。 + +## 3.5 benchmark工具报错`[ERROR][VisionPreProcess] Check free memory less 0.256 rate now wait!` +- 问题现象: + + 使用benchmark工具推理时遇到如下报错 + ```shell + [INFO][VisionPreProcess] Create stream SUCCESS + [INFO][VisionPreProcess] Init SUCCESS + [INFO][Preprocess] Init SUCCESS + [INFO][DataManager] Init SUCCESS + [INFO][Inference] Init SUCCESS + [INFO][PostProcess] Init SUCCESS + [ERROR][VisionPreProcess] Check free memory less 0.256 rate now wait! If long time free memory lower, please check. + ``` - 预处理时把16张图片保存成一个bin文件 +- 定位过程 + + 因为是benchmark工具的报错,所以直接查看源码发现是有**DevMemNotEnough**函数检测device内存使用率,当om内存使用大于0.75后会直接报错。目前已与benchmark开发同事沟通去除该限制,详见[PR链接](https://gitee.com/ascend/cann-benchmark/commit/6ec0a0a7bff64130362db9ca6cd125dad023bbda) + +- 解决方案 + + 下载[benchmark工具](https://gitee.com/ascend/cann-benchmark)源码,本地编译即可。或者使用[msame工具](https://gitee.com/ascend/tools/tree/master/msame)进行替代。 + ```shell + # benchmark工具编译命令 + cd infer/build + bash build_local.sh + ``` # 4 精度调试常见问题 -- Gitee From 48a9c368c250740431ec9ed6ebec485820b8fac4 Mon Sep 17 00:00:00 2001 From: Ronnie_zheng Date: Wed, 1 Dec 2021 15:00:33 +0800 Subject: [PATCH 3/3] remove dummy python file --- modify_magiconnx.py | 47 --------------------------------------------- 1 file changed, 47 deletions(-) delete mode 100644 modify_magiconnx.py diff --git a/modify_magiconnx.py b/modify_magiconnx.py deleted file mode 100644 index 0f0a127..0000000 --- a/modify_magiconnx.py +++ /dev/null @@ -1,47 +0,0 @@ -import onnx -from onnx import helper -from onnx import AttributeProto, TensorProto, numpy_helper -import numpy as np -from magiconnx import OnnxGraph - -INT32_MAX = 2147483647 -INT32_MIN = -2147483648 - -def modify(path): - graph = OnnxGraph(path) - inits = graph.get_nodes("Initializer") - for init in inits: - if init.value.dtype == np.int64: - a = init.value - a.flags.writeable = True - a[a > INT32_MAX] = INT32_MAX - a[a < INT32_MIN] = INT32_MIN - init.value = a.astype(np.int32) - col2ims = graph.get_nodes("Col2im") - for idx, node in enumerate(col2ims): - attr = node['output_size'] - node.attrs.pop("output_size") - new_init = graph.add_initializer(f'output_size_{node.name}', np.array(attr)) - node.inputs = [node.inputs[0], f'output_size_{node.name}'] - - graph.save('volo_modify_test.onnx') - -if __name__ == "__main__": - modify('volo_d1_384_85_Col2im.onnx') - -'''for node in model.graph.node: - if node.op_type == "Col2im": - attr = node.attribute[2] - del node.attribute[2] - tensor = helper.make_tensor(f'output_size_{node.name}', - TensorProto.INT32, - [len(attr.ints)], - attr.ints) - node.input.append(f'output_size_{node.name}') - model.graph.initializer.append(tensor) - - -model.opset_import[0].version = 11 - -onnx.save(model, 'volo.onnx') -''' \ No newline at end of file -- Gitee