diff --git "a/Ascend-PyTorch\347\246\273\347\272\277\346\216\250\347\220\206\346\214\207\345\257\274/\344\270\223\351\242\230\346\241\210\344\276\213/\345\212\237\350\203\275\346\211\223\351\200\232/\343\200\220\345\212\250\346\200\201Shape\343\200\221-\346\216\250\347\220\206\346\214\207\345\257\274(ResNet50).md" "b/Ascend-PyTorch\347\246\273\347\272\277\346\216\250\347\220\206\346\214\207\345\257\274/\344\270\223\351\242\230\346\241\210\344\276\213/\345\212\237\350\203\275\346\211\223\351\200\232/\343\200\220\345\212\250\346\200\201Shape\343\200\221-\346\216\250\347\220\206\346\214\207\345\257\274(ResNet50).md" index a72efe580ada7306e5d9135873a98ded93df22b3..32666e579db2e3159081df54c125a1f2771cb42e 100644 --- "a/Ascend-PyTorch\347\246\273\347\272\277\346\216\250\347\220\206\346\214\207\345\257\274/\344\270\223\351\242\230\346\241\210\344\276\213/\345\212\237\350\203\275\346\211\223\351\200\232/\343\200\220\345\212\250\346\200\201Shape\343\200\221-\346\216\250\347\220\206\346\214\207\345\257\274(ResNet50).md" +++ "b/Ascend-PyTorch\347\246\273\347\272\277\346\216\250\347\220\206\346\214\207\345\257\274/\344\270\223\351\242\230\346\241\210\344\276\213/\345\212\237\350\203\275\346\211\223\351\200\232/\343\200\220\345\212\250\346\200\201Shape\343\200\221-\346\216\250\347\220\206\346\214\207\345\257\274(ResNet50).md" @@ -1,19 +1,13 @@ # 动态Shape推理指导 +[TOC] - -## 1. 前言 +## 1. 模型背景 本文旨在说明如何在模型存在动态shape算子的场景下,进行模型转换和模型推理。 本文介绍的动态shape场景通过设定`shape_range`的方式,支持`shape_range`内的任意shape。 -现有离线推理工具:benchmark/msame暂不支持动态shape的推理,需要基于pyACL库实现模型的动态shape推理,具体可参照:4. 模型推理 - -代码可参考:[Resnet50_dynamic](https://gitee.com/zheng-wengang1/personal_model_zoos/tree/master/dynamic_shape_ResNet50) - -## 2. 原理说明 - 本文主要基于pyACL(Python Ascend Computing Language)进行动态shape模型的推理: pyACL就是在ACL的基础上使用CPython封装得到的Python API库,使用户可以通过Python进行昇腾 AI 处理器的运行管理、资源管理等。 @@ -34,7 +28,13 @@ pyACL就是在ACL的基础上使用CPython封装得到的Python API库,使用 ![image-20210901203311059](./imgs/image-20210901203311059.png) -## 3. 模型转换 +## 2.问题发现 + +现有离线推理工具:benchmark/msame暂不支持动态shape的推理,需要基于pyACL库实现模型的动态shape推理,具体可参照:4. 模型推理 + +代码可参考:[Resnet50_dynamic](https://gitee.com/zheng-wengang1/personal_model_zoos/tree/master/dynamic_shape_ResNet50) + +## 3. 调试思路 动态shape的模型转化可以直接与atc工具进行转化: @@ -47,7 +47,7 @@ pyACL就是在ACL的基础上使用CPython封装得到的Python API库,使用 关键参数说明:`--input_shape_range`:可以设置动态shape的范围,如本例中的`1~6` -## 4. 模型推理 +## 4. 解决方案 动态shape模型的推理流程可以分为以下几个步骤: @@ -187,9 +187,11 @@ buffer申请(data&&dataset): check_ret("acl.rt.free_host", ret) ``` +## 5.关于动态Shape推理问题的总结 +无 -## 5. 参考资料 +## 6. 附件 [CANN 5.0.2 应用软件开发指南 (Python, 推理)](https://support.huawei.com/enterprise/zh/doc/EDOC1100206683) diff --git "a/Ascend-PyTorch\347\246\273\347\272\277\346\216\250\347\220\206\346\214\207\345\257\274/\344\270\223\351\242\230\346\241\210\344\276\213/\346\200\247\350\203\275\350\260\203\344\274\230/\344\274\230\345\214\226\345\234\250\346\234\200\345\220\216\344\270\200\346\240\271\350\275\264\345\201\232softmax\346\200\247\350\203\275\344\275\216\347\232\204\351\227\256\351\242\230.md" "b/Ascend-PyTorch\347\246\273\347\272\277\346\216\250\347\220\206\346\214\207\345\257\274/\344\270\223\351\242\230\346\241\210\344\276\213/\346\200\247\350\203\275\350\260\203\344\274\230/\344\274\230\345\214\226\345\234\250\346\234\200\345\220\216\344\270\200\346\240\271\350\275\264\345\201\232softmax\346\200\247\350\203\275\344\275\216\347\232\204\351\227\256\351\242\230.md" index d915a25884867ef204aff7e4833da671199b7cc7..a00811ac555545f5b4b64918144ac90a30faf811 100644 --- "a/Ascend-PyTorch\347\246\273\347\272\277\346\216\250\347\220\206\346\214\207\345\257\274/\344\270\223\351\242\230\346\241\210\344\276\213/\346\200\247\350\203\275\350\260\203\344\274\230/\344\274\230\345\214\226\345\234\250\346\234\200\345\220\216\344\270\200\346\240\271\350\275\264\345\201\232softmax\346\200\247\350\203\275\344\275\216\347\232\204\351\227\256\351\242\230.md" +++ "b/Ascend-PyTorch\347\246\273\347\272\277\346\216\250\347\220\206\346\214\207\345\257\274/\344\270\223\351\242\230\346\241\210\344\276\213/\346\200\247\350\203\275\350\260\203\344\274\230/\344\274\230\345\214\226\345\234\250\346\234\200\345\220\216\344\270\200\346\240\271\350\275\264\345\201\232softmax\346\200\247\350\203\275\344\275\216\347\232\204\351\227\256\351\242\230.md" @@ -1,4 +1,19 @@ +# 优化在最后一根轴做softmax性能低的问题 + +[TOC] + +## 模型背景 + +本文旨在解决模型在最后一根轴做softmax性能低的问题 + +## 问题现象 + +模型在最后一根轴做softmax性能低的问题 + +## 解决方案 + 1.transpose到最后一根轴做softmax的场景: + ``` import sys import onnx @@ -125,4 +140,12 @@ for i in range(length): print("softmax transpose adapted") onnx.save(model, output_model) -``` \ No newline at end of file +``` + +## 关于优化在最后一根轴做softmax性能低的问题的总结 + +无 + +## 附件 + +无 \ No newline at end of file diff --git "a/Ascend-PyTorch\347\246\273\347\272\277\346\216\250\347\220\206\346\214\207\345\257\274/\344\270\223\351\242\230\346\241\210\344\276\213/\346\200\247\350\203\275\350\260\203\344\274\230/\346\241\210\344\276\213-Conv1D\347\256\227\345\255\220\344\274\230\345\214\226.md" "b/Ascend-PyTorch\347\246\273\347\272\277\346\216\250\347\220\206\346\214\207\345\257\274/\344\270\223\351\242\230\346\241\210\344\276\213/\346\200\247\350\203\275\350\260\203\344\274\230/\346\241\210\344\276\213-Conv1D\347\256\227\345\255\220\344\274\230\345\214\226.md" index 092e4fab4d0cbddeac653f058e30f53def6c6afe..64dc6482a6a2c51a6dff39757712de6fc4ad80cb 100644 --- "a/Ascend-PyTorch\347\246\273\347\272\277\346\216\250\347\220\206\346\214\207\345\257\274/\344\270\223\351\242\230\346\241\210\344\276\213/\346\200\247\350\203\275\350\260\203\344\274\230/\346\241\210\344\276\213-Conv1D\347\256\227\345\255\220\344\274\230\345\214\226.md" +++ "b/Ascend-PyTorch\347\246\273\347\272\277\346\216\250\347\220\206\346\214\207\345\257\274/\344\270\223\351\242\230\346\241\210\344\276\213/\346\200\247\350\203\275\350\260\203\344\274\230/\346\241\210\344\276\213-Conv1D\347\256\227\345\255\220\344\274\230\345\214\226.md" @@ -1,9 +1,13 @@ # Conv1D场景优化 +[TOC] + ## 背景分析 Conv1D算子指的是输入数据为1d输入场景,于常见CV场景下的2D输入(`[batch_size,channels, height, width]`)不同,其输入形式通常为(以点云输入为例):`[batch_size, coord, npoints]`,这里`coord`为坐标(x,y,z),`npoints`表示点数目。 +## 问题现象 + 这里以PointNet的网络为例,其输入为`[1,3,2500]`: ![image-20211012114743708](img/image-20211012114743708.png) @@ -17,7 +21,7 @@ Conv1D算子指的是输入数据为1d输入场景,于常见CV场景下的2D + 卷积前后插入多余的格式转换算子:`TransData` + `Conv2D+BN+Relu`:本身om模型转换的时候时支持算子融合的,可以减少数据搬运的时间,从而提升模型性能 -## 原因分析 +## 调试思路 首先了解下om模型的算子融合逻辑:基于`Pattern`:本质上是一系列按照算子名称/格式/输入输出参数配置的模板。模型转换过程会按照这些模板进行匹配,如果成功匹配则会进行算子融合。 @@ -41,7 +45,7 @@ Conv1D算子指的是输入数据为1d输入场景,于常见CV场景下的2D screenshot_20211012144413617 - ## 代码解析 + ### 代码解析 ```python import sys @@ -161,5 +165,11 @@ Conv1D算子指的是输入数据为1d输入场景,于常见CV场景下的2D + ## 关于Conv1D算子优化总结 + + 无 + + ## 附件 + 无 diff --git "a/Ascend-PyTorch\347\246\273\347\272\277\346\216\250\347\220\206\346\214\207\345\257\274/\344\270\223\351\242\230\346\241\210\344\276\213/\346\200\247\350\203\275\350\260\203\344\274\230/\346\241\210\344\276\213-PCB\346\250\241\345\236\213\347\262\276\345\272\246\350\260\203\350\257\225.md" "b/Ascend-PyTorch\347\246\273\347\272\277\346\216\250\347\220\206\346\214\207\345\257\274/\344\270\223\351\242\230\346\241\210\344\276\213/\346\200\247\350\203\275\350\260\203\344\274\230/\346\241\210\344\276\213-PCB\346\250\241\345\236\213\347\262\276\345\272\246\350\260\203\350\257\225.md" index 5899a1580e861935310ef45b144a5b8a6e4e8aa5..0ab39f71c71ff2482c7a8d020741769b22cbf64d 100644 --- "a/Ascend-PyTorch\347\246\273\347\272\277\346\216\250\347\220\206\346\214\207\345\257\274/\344\270\223\351\242\230\346\241\210\344\276\213/\346\200\247\350\203\275\350\260\203\344\274\230/\346\241\210\344\276\213-PCB\346\250\241\345\236\213\347\262\276\345\272\246\350\260\203\350\257\225.md" +++ "b/Ascend-PyTorch\347\246\273\347\272\277\346\216\250\347\220\206\346\214\207\345\257\274/\344\270\223\351\242\230\346\241\210\344\276\213/\346\200\247\350\203\275\350\260\203\344\274\230/\346\241\210\344\276\213-PCB\346\250\241\345\236\213\347\262\276\345\272\246\350\260\203\350\257\225.md" @@ -1,8 +1,10 @@ +# PCB模型精度调试 + [TOC] -# 模型背景说明 +## 模型背景 -## 模型结构 +### 模型结构 开源仓路径:[PCB_RPP_for_reID][https://github.com/syfafterzy/PCB_RPP_for_reID] @@ -10,16 +12,14 @@ ![image-20210727213715784](./img/image-20210727213715784.png) -## 原始性能 +### 原始性能 | BatchSize | t4 | 310 | | --------- | ----------- | --------------- | | bs1 | 775.90 fps | **444.60 fps** | | bs16 | 1472.31 fps | **1025.54 fps** | - - -# 模型结构分析 +### 模型结构分析 ONNX模型结构如下: @@ -28,7 +28,7 @@ ONNX模型结构如下: ![img](./img/screenshot_20210727215242341.png) -# Profiling数据分析 +## 调试思路 性能的Profiling流程可参考:[ONNX推理指导 - Wiki - Gitee.com](https://gitee.com/ascend/modelzoo/wikis/ONNX推理指导?sort_id=3690605) @@ -54,9 +54,9 @@ op_summary.csv反映的是单个算子的耗时比例,可以明显看到Reduce 另外,需要注意的是**不同BatchSize下算子的耗时比例是不同的**,需要根据具体情况查看对应Batch Size下的算子耗时比(上面显示的是BS16的profiling数据) -# 优化方案 +## 解决方案 -## 常量算子折叠 +### 常量算子折叠 对于常量算子通常可以通过`onnx-simplifier`工具进行优化 @@ -70,7 +70,7 @@ op_summary.csv反映的是单个算子的耗时比例,可以明显看到Reduce + 图变换:图变换,如:合并conv和bn等 + 消除`dead`分支 -## ReduceL2算子优化 +### ReduceL2算子优化 对于单算子的性能问题,通常要联系华为方人员进行优化,学生侧可以先提issue:[issue模板](https://gitee.com/zheng-wengang1/ascend-pytorch-crowdintelligence-doc/blob/master/Ascend-PyTorch离线推理指导/PyTorch离线推理-issue模板.md) @@ -80,7 +80,7 @@ ReduceL2算子采用小算子融合的方式进行优化:`ReduceL2` -> `mul+su ![image-20210729213045861](./img/image-20210729213045861.png) -## Cast算子优化 +### Cast算子优化 Cast算子优化出发点:大部分Cast算子都是在模型输入/输出位置(这个观点要从om模型角度得到):原因是OM模型算子的数据类型为`fp16`,但是模型的输入/输出默认为`fp32`格式,因此前后都会有Cast算子。这种情况可以直接指定输出节点格式实现: @@ -88,7 +88,7 @@ Cast算子优化出发点:大部分Cast算子都是在模型输入/输出位 atc --model={onnx_model_path} --framework=5 --output={om_model_name} --input_format=NCHW --input_shape="input:3,128,64" --log=info --soc_version=Ascend310 --buffer_optimize=off_optimize --output_type="out_0:0:FP32;out_1:0:FP32" --out_nodes="out_:0;out_1:0" ``` -## Transdata算子优化 +### Transdata算子优化 Transdata算子优化是常用的性能优化手段,可以采用白名单的方式:单TransData算子aicore耗时如果在几十毫秒或者更多,则需要根据输入输出shape与格式添加shape白名单优化。 @@ -108,15 +108,15 @@ Transdata算子优化是常用的性能优化手段,可以采用白名单的 ![image-20210729211430558](./img/image-20210729211430558.png) -# 最终优化结果 +### 最终优化结果 -## 优化后的profiling数据 +#### 优化后的profiling数据 优化后的profiling数据如下,可见拆分为小算子后,`Mul+ReduceSum+Sqrt`算子耗时明显变小: ![img](./img/screenshot_20210728104024146.png) -## 优化后的性能数据 +#### 优化后的性能数据 其中`Transdata`,`Cast`算子影响不大,原因是: diff --git "a/Ascend-PyTorch\347\246\273\347\272\277\346\216\250\347\220\206\346\214\207\345\257\274/\344\270\223\351\242\230\346\241\210\344\276\213/\347\262\276\345\272\246\350\260\203\350\257\225/\343\200\220\346\250\241\345\236\213\350\260\203\350\257\225\345\237\272\347\241\200\343\200\221-mmdetection\346\241\206\346\236\266\344\270\272\344\276\213.md" "b/Ascend-PyTorch\347\246\273\347\272\277\346\216\250\347\220\206\346\214\207\345\257\274/\344\270\223\351\242\230\346\241\210\344\276\213/\347\262\276\345\272\246\350\260\203\350\257\225/\343\200\220\346\250\241\345\236\213\350\260\203\350\257\225\345\237\272\347\241\200\343\200\221-mmdetection\346\241\206\346\236\266\344\270\272\344\276\213.md" index bf5b0df91a6ffeb6e711db66e496ae87554aac3c..578f28d0b374e1fcd32e71d62c5f6ada7aaf2e91 100644 --- "a/Ascend-PyTorch\347\246\273\347\272\277\346\216\250\347\220\206\346\214\207\345\257\274/\344\270\223\351\242\230\346\241\210\344\276\213/\347\262\276\345\272\246\350\260\203\350\257\225/\343\200\220\346\250\241\345\236\213\350\260\203\350\257\225\345\237\272\347\241\200\343\200\221-mmdetection\346\241\206\346\236\266\344\270\272\344\276\213.md" +++ "b/Ascend-PyTorch\347\246\273\347\272\277\346\216\250\347\220\206\346\214\207\345\257\274/\344\270\223\351\242\230\346\241\210\344\276\213/\347\262\276\345\272\246\350\260\203\350\257\225/\343\200\220\346\250\241\345\236\213\350\260\203\350\257\225\345\237\272\347\241\200\343\200\221-mmdetection\346\241\206\346\236\266\344\270\272\344\276\213.md" @@ -1,5 +1,31 @@ +# 应用mmdetection框架的模型 + +[TOC] + +## 模型背景 + +本文旨在介绍mmdetection框架的应用。 + +mmdetection框架用统一的代码规范复现了当前大部分主流和前沿的模型,比如Faster R-CNN系列、YOLO系列,以及较新的DETR等,并提供了预训练模型。其他人只需要遵循这个规范,就能直接应用,不需要自己再重新实现一遍。 + +## 问题现象 + +无 + +## 调试思路 + +### 定位阶段 + +如需判断模型是否被支持mmdetection框架支持,可以在官网的 [Benchmark and Model Zoo — MMDetection 2.20.0 documentation](https://mmdetection.readthedocs.io/en/latest/model_zoo.html) 进行查询 + +### 解决思路 + +可以按照官网指导教程进行,也可以按照下面的解决方案进行。 + 详情参见[maskrcnn模型PyTorch离线推理指导](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/ONNX%E6%A8%A1%E5%9E%8B%E6%8E%A8%E7%90%86%E6%8C%87%E5%AF%BC/benchmark/cv/segmentation) +## 解决方案 + - 获取源码并安装: ```shell @@ -20,6 +46,7 @@ pip3.7 install mmdet 开源代码导出onnx:python3.7 tools/deployment/pytorch2onnx.py configs/fsaf/fsaf_r50_fpn_1x_coco.py fsaf_r50_fpn_1x_coco-94ccc51f.pth --output-file fsaf.onnx --shape 800 1216 --show 导出onnx的脚本的torch.onnx.export函数如果添加verbose=True,导出onnx时会将onnx中每个算子与对应的模型代码行都打印出来,这时使用Netron开源模型可视化工具可以方便查找到某个算子是由哪个函数产生的 开源代码导出的onnx精度评测: + ```python import os, sys from PIL import Image @@ -619,3 +646,11 @@ branch:master commit id:ec91893931b5bb77766de0cc53e37fdc80b4b3eb 评测pth命令:python3.7 tools/test.py configs/fcn/fcn_r50-d8_512x512_20k_voc12aug.py fcn_r50-d8_512x512_20k_voc12aug_20200617_010715-52dc5306.pth --eval mIoU 评测onnx命令:python3.7 tools/deploy_test.py configs/fcn/fcn_r50-d8_512x512_20k_voc12aug.py fcn_r50-d8_512x512_20k_voc12aug.onnx --backend onnxruntime --eval mIoU + +## 关于mmdetection框架模型的总结 + +无 + +## 附件 + +无 \ No newline at end of file