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 07743b014fb122ea05b9063e42e105ef57496e6f..1e5b9b4e463d137d5802ab9abd209683263fedf0 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" @@ -14,6 +14,7 @@ - [4.3 SSD端到端推理要点](#43-SSD端到端推理要点) - [4.4 Inception-V3端到端推理要点](#44-Inception-V3端到端推理要点) - [4.5 maskrcnn端到端推理指导](#45-maskrcnn端到端推理指导) + - [4.6 精度调试指导](#46-精度调试指导) - [5 深度学习指导](#5-深度学习指导) - [5.1 书籍推荐](#51-书籍推荐) - [5.2 实践](#52-实践) @@ -29,7 +30,7 @@ - **[Ascend文档与软件包网址](#11-Ascend文档与软件包网址)** -- **[端到端推理流程与交付标准)](#12-端到端推理流程与交付标准)** +- **[端到端推理流程与交付标准](#12-端到端推理流程与交付标准)** ### 1.1 Ascend文档与软件包网址 @@ -49,8 +50,8 @@ ### 1.2 端到端推理流程与交付标准 - 精度性能要求 -om模型推理的精度与PyTorch预训练模型github代码仓或官网公布的精度对比,精度下降不超过1%则认为精度达标 -npu单颗芯片吞吐率乘以4颗大于gpu T4吞吐率则认为性能达标 +由开源PyTorch模型转换的Ascend om模型离线推理的精度与开源PyTorch预训练模型在github代码仓或官网公布的精度对比,精度下降不超过1%则认为精度达标 +npu 310单颗芯片上模型推理性能的吞吐率乘以4颗即单卡吞吐率大于gpu T4单卡上模型推理性能的吞吐率则认为性能达标 - Ascend PyTorch模型端到端推理流程 @@ -357,6 +358,10 @@ atc --framework=5 --model=efficientnet-b0_sim.onnx --output=efficientnet-b0_bs1 > >算子精度通过参数--precision_mode选择,默认值force_fp16 > +>--input_shape是模型输入数据的shape,可使用开源模型可视化工具Netron查看onnx输入节点名与shape +> +>--out_nodes选项可以指定模型的输出节点,形如--out_nodes="节点1名称:0;节点2名称:0;节点3名称:0"就指定了这三个节点每个节点的第1个输出作为模型的第一,第二,第三个输出 +> > atc工具的使用可以参考[CANN V100R020C10 开发辅助工具指南 (推理) 01](https://support.huawei.com/enterprise/zh/doc/EDOC1100164868?idPath=23710424%7C251366513%7C22892968%7C251168373) 2.数据集预处理 @@ -496,15 +501,26 @@ python3 vision_metric_ImageNet.py result/dumpOutput_device0/ dataset/ImageNet/va 将得到的om离线模型推理TopN结果与github该模型代码仓上公布的结果对比,精度下降在1%范围内可认为精度达标 5.性能测试 - +benchmark工具在整个数据集上推理时也会统计性能数据,但是推理整个数据集较慢,如果这么测性能那么整个推理期间需要确保独占device。为快速获取性能数据,也可以使用benchmark纯推理功能测得性能数据,但是由于随机数不能模拟数据分布,纯推理功能测的有些模型性能数据可能不太准。 +1.benchmark工具在整个数据集上推理获得性能数据 +以batch1为例,benchmark工具在整个数据集上推理后生成result/perf_vision_batchsize_1_device_0.txt: +``` +[e2e] throughputRate: 243.034, latency: 205733 +[data read] throughputRate: 258.963, moduleLatency: 3.86155 +[preprocess] throughputRate: 258.404, moduleLatency: 3.86991 +[infer] throughputRate: 244.435, Interface throughputRate: 382.328, moduleLatency: 3.35758 +[post] throughputRate: 244.435, moduleLatency: 4.09107 +``` +Interface throughputRate: 382.328,382.328乘以4既是310单卡吞吐率 +2.benchmark纯推理功能测得性能数据 - npu 测试npu性能要确保device空闲,使用npu-smi info命令可查看device是否在运行其它推理任务 ``` -./benchmark -round=50 -om_path=efficientnet-b0_bs1.om -device_id=0 -batch_size=1 +./benchmark -round=20 -om_path=efficientnet-b0_bs1.om -device_id=0 -batch_size=1 ``` -执行50次纯推理取均值,统计吞吐率与其倒数时延(benchmark的时延是单个数据的推理时间),npu性能是一个device执行的结果 +执行20次纯推理取均值,统计吞吐率与其倒数时延(benchmark的时延是单个数据的推理时间),npu性能是一个device执行的结果 ``` - [INFO] Dataset number: 49 finished cost 2.808ms + [INFO] Dataset number: 19 finished cost 2.808ms [INFO] PureInfer result saved in ./result/PureInfer_perf_of_efficientnet-b0_bs1_in_device_0.txt -----------------PureInfer Performance Summary------------------ [INFO] ave_throughputRate: 354.724samples/s, ave_latency: 2.82228ms @@ -533,7 +549,7 @@ gpu T4是4个device并行执行的结果,mean是时延(tensorrt的时延是b ``` 以root用户运行ada:kill -9 $(pidof ada) && /usr/local/Ascend/driver/tools/ada ... -新建/home/HwHiAiUser/test/run文件: +新建/home/HwHiAiUser/test/run文件,内容如下: #! /bin/bash 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 @@ -541,15 +557,16 @@ 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 ./benchmark -round=50 -om_path=/home/HwHiAiUser/test/efficientnet-b0_bs1.om -device_id=0 -batch_size=1 -... + +然后执行如下命令: chmod 777 /home/HwHiAiUser/test/run cd /usr/local/Ascend/ascend-toolkit/latest/toolkit/tools/profiler/profiler_tool/analysis/command/ python3.7.5 hiprof.pyc --ip_address=本机ip --result_dir=/root/out --profiling_options=task_trace --app_dir=/home/HwHiAiUser/test/ --app="run" ``` - - CANN C20 版本profiling使用方法 + - CANN C20及以后的版本profiling使用方法 ``` -新建/home/HwHiAiUser/test/run文件: +新建/home/HwHiAiUser/test/run文件,内容如下: #! /bin/bash 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 @@ -557,13 +574,14 @@ 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 ./benchmark -round=50 -om_path=/home/HwHiAiUser/test/efficientnet-b0_bs1.om -device_id=0 -batch_size=1 -... + +然后执行如下命令: chmod 777 /home/HwHiAiUser/test/run cd /usr/local/Ascend/ascend-toolkit/latest/x86_64-linux/toolkit/tools/profiler/bin ./msprof --output=/home/HwHiAiUser/test --application=/home/HwHiAiUser/test/run --sys-hardware-mem=on --sys-cpu-profiling=on --sys-profiling=on --sys-pid-profiling=on --sys-io-profiling=on --dvpp-profiling=on cd /usr/local/Ascend/ascend-toolkit/latest/x86_64-linux/toolkit/tools/profiler/profiler_tool/analysis/msprof/ -python3.7 msprof.pyc import -dir /home/HwHiAiUser/test/生成的profiling目录 -python3.7 msprof.pyc export summary -dir /home/HwHiAiUser/test/生成的profiling目录 +python3.7 msprof.py import -dir /home/HwHiAiUser/test/生成的profiling目录 +python3.7 msprof.py export summary -dir /home/HwHiAiUser/test/生成的profiling目录 ``` >![](public_sys-resources/icon-note.gif) **说明:** @@ -585,6 +603,8 @@ python3.7 msprof.pyc export summary -dir /home/HwHiAiUser/test/生成的profilin - **[maskrcnn端到端推理指导](#45-maskrcnn端到端推理指导)** +- **[精度调试指导](#46-精度调试指导)** + 这里对经典类型的端到端推理网络遇到的问题做了一些总结,读者可以按照上面的流程尝试一下,从中体会代码是如何写出来的以及问题是如何解决的 ### 4.1 Inception-V4端到端推理要点 1.github开源代码网址 @@ -1098,6 +1118,18 @@ profiling也会统计每个算子耗时,结合使用netron查看onnx模型结 [基于开源mmdetection预训练的maskrcnn_Onnx模型端到端推理指导.md](https://gitee.com/pengyeqing/ascend-pytorch-crowdintelligence-doc/blob/master/onnx%E7%AB%AF%E5%88%B0%E7%AB%AF%E6%8E%A8%E7%90%86%E6%8C%87%E5%AF%BC/benchmark/cv/segmentation/%E5%9F%BA%E4%BA%8E%E5%BC%80%E6%BA%90mmdetection%E9%A2%84%E8%AE%AD%E7%BB%83%E7%9A%84maskrcnn_Onnx%E6%A8%A1%E5%9E%8B%E7%AB%AF%E5%88%B0%E7%AB%AF%E6%8E%A8%E7%90%86%E6%8C%87%E5%AF%BC.md) [基于detectron2训练的npu权重的maskrcnn_Onnx模型端到端推理指导.md](https://gitee.com/pengyeqing/ascend-pytorch-crowdintelligence-doc/blob/master/onnx%E7%AB%AF%E5%88%B0%E7%AB%AF%E6%8E%A8%E7%90%86%E6%8C%87%E5%AF%BC/benchmark/cv/segmentation/%E5%9F%BA%E4%BA%8Edetectron2%E8%AE%AD%E7%BB%83%E7%9A%84npu%E6%9D%83%E9%87%8D%E7%9A%84maskrcnn_Onnx%E6%A8%A1%E5%9E%8B%E7%AB%AF%E5%88%B0%E7%AB%AF%E6%8E%A8%E7%90%86%E6%8C%87%E5%AF%BC.md) +### 4.6 精度调试指导 + +精度调试可以参考4.5 maskrcnn端到端推理指导 + +精度调试:根据推理流程逐步排除引起精度下降的点,由大到小排查,先确认开源代码加载pth权重文件后在线推理的精度是否达标,onnx模型运行时推理的精度是否达标,再排查前后处理脚本是否与开源代码训练时采用的前后处理完全一致,最后用替换法对比输入输出排查某个修改的或自定子或关键算子的影响,对影响精度的算子改进,可能是算子代码实现问题也可能是算子推理设置的参数没有与训练时用的保持一致。一般github代码仓提供了测评单个样本与整个验证数据集的命令,已此为基准调试精度。 + +1.前后处理与模型参数是否与开源代码仓的推理使用的完全一致 +2.使用开源代码仓提供的测评pth的脚本测试pth在线推理精度是否达标,可以添加算子输出结果的调试打印 +3.如果导出的onnx可以推理,确定onnx精度是否达标 +4.如果是om算子导致精度下降,则模型转换时指定算子为om的输出节点,然后与pth在线推理时该算子(开启verbose导出onnx时会打印算子对应的py文件代码行)的输出对比,查看是否一致 +5.如果某算子导致精度下降问题,尝试是否可以修改模型使用其它方法替换掉该算子,然后看精度是否达标,如果遇到实在规避不了的算子问题则需要在modelzoo提issue + ## 5 深度学习指导 ### 5.1 书籍推荐 ``` @@ -1158,7 +1190,7 @@ profiling也会统计每个算子耗时,结合使用netron查看onnx模型结 - 精度: om模型推理的精度与PyTorch预训练模型github代码仓README.md或官网文档公布的精度对比,精度下降不超过1%则认为精度达标 - 性能: - ascend benchmark工具纯推理测的npu单颗device吞吐率乘以4颗大于TensorRT工具测的gpu T4吞吐率则认为性能达标 + Ascend benchmark工具在数据集上推理测的NPU 310单颗device吞吐率乘以4颗即单卡吞吐率大于TensorRT工具测的GPU T4单卡吞吐率则认为性能达标 - 脚本: 代码符合pep8规范; 脚本命名格式需统一,文件名含模型名时模型名用小写,模型名含多个字符串时用-连接; @@ -1172,12 +1204,15 @@ profiling也会统计每个算子耗时,结合使用netron查看onnx模型结 说明: ``` - 1.需要测试batch1,4,8,16,32的精度与性能 - 2.对于性能不达标的模型,需要进行如下工作: - 1)用ascend atc的相关优化选项尝试一下,尝试使用最近邻替换双线性的resize重新训练,降低图片分辨率等使性能达标。 + 1.如果开源代码仓没有提供pth权重文件,则需要该模型的训练同学提供pth权重文件,或者使用开源代码仓训练脚本简单训练一个pth权重文件,然后对比om精度与该pth权重文件的精度 + 2.由于随机数可能不能模拟数据分布,Ascend benchmark工具纯推理功能测的有些模型性能数据可能不太准,所以模型测试脚本与提交代码的描述中的性能数据以Ascend benchmark在数据集上推理时得到性能数据为准 + 3.如果模型支持多batch,需要测试batch1,4,8,16,32的精度与性能,写在模型名称_Onnx端到端推理指导.md里,模型测试脚本与提交代码的描述只需提供bs1和bs16的精度性能数据 + 4.如果导出的onnx因包含自定义算子等而不能推理,则在t4上运行开源评测脚本测试pth模型在线推理性能 + 5.对于性能不达标的模型,需要进行如下工作: + 1)用Ascend atc的相关优化选项尝试一下,尝试使用最近邻替换双线性的resize重新训练,降低图片分辨率等使性能达标。 2)对于算子导致的性能问题,需要使用profiling分析定位引起性能下降的原因,具体到引起性能下降的算子。优先修改模型代码以使其选择性能好的npu算子替换性能差的npu算子使性能达标,然后在modelzoo上提issue,等修复版本发布后再重测性能,继续优化。 3)需要交付profiling性能数据,对经过上述方法性能可以达标的模型,在交付文档中写明问题原因与达标需要执行的操作;对经过上述方法性能仍不达标的模型,在交付文档中写明问题原因与简要的定位过程。 - 3.工作量为简单模型2-3个工作日,复杂模型5-10个工作日,个别难度大的模型15-20个工作日。 + 6.工作量为简单模型2-3个工作日,复杂模型5-10个工作日,个别难度大的模型15-20个工作日。 ``` - 交付件 @@ -1205,20 +1240,17 @@ profiling也会统计每个算子耗时,结合使用netron查看onnx模型结 **说明:** > **提交前请确保自验通过!确保直接执行以下脚本就可运行!** - ```shell script + ```shell # pth是否能正确转换为om - bash scripts/pth2om.sh + bash test/pth2om.sh # 精度数据是否达标(需要显示官网精度与om模型的精度) - bash scripts/eval_acc.sh - # npu性能数据(如果模型支持多batch,测试bs1与bs16,否则只测试bs1,性能数据以单卡吞吐率为标准) - bash scripts/perform_310.sh + bash test/eval_acc_perf.sh # 在t4环境测试性能数据(如果模型支持多batch,测试bs1与bs16,否则只测试bs1,如果导出的onnx模型因含自定义算子等不能离线推理,则在t4上测试pytorch模型的在线推理性能,性能数据以单卡吞吐率为标准) - bash scripts/perform_t4.sh - + bash test/perf_t4.sh ``` - PR内容模板 - PR示例链接 https://gitee.com/ascend/modelzoo/pulls/887 @@ -1249,29 +1281,26 @@ profiling也会统计每个算子耗时,结合使用netron查看onnx模型结 ```shell # 第X次验收测试 # 验收结果 OK / Failed - # 验收环境: A + K / CANN R20C20TR5 + # 验收环境: A + K / CANN 5.0.1 # 关联issue: # pth是否能正确转换为om - bash scripts/pth2om.sh + bash test/pth2om.sh # 验收结果: OK / Failed # 备注: 成功生成om,无运行报错,报错日志xx 等 # 精度数据是否达标(需要显示官网精度与om模型的精度) - bash scripts/eval_acc.sh - # 验收结果: OK / Failed - # 备注: 目标精度top1:77.62% top5:93.70%;bs1,bs16验收精度top1:77.62% top5:93.69%;精度下降不超过1%;无运行报错,报错日志xx 等 - # npu性能数据(如果模型支持多batch,测试bs1与bs16,否则只测试bs1,性能数据以单卡吞吐率为标准) - bash scripts/perform_310.sh + bash test/eval_acc_perf.sh # 验收结果: OK / Failed + # 备注: 目标精度top1:77.62% top5:93.70%;bs1,bs16验收精度top1:77.62% top5:93.69%;精度下降不超过1%;无运行报错,报错日志xx 等 # 备注: 验收测试性能bs1:1497.252FPS bs16:2096.376FPS;无运行报错,报错日志xx 等 + # 在t4环境测试性能数据(如果模型支持多batch,测试bs1与bs16,否则只测试bs1,如果导出的onnx模型因含自定义算子等不能离线推理,则在t4上测试pytorch模型的在线推理性能,性能数据以单卡吞吐率为标准) - bash scripts/perform_t4.sh + bash test/perf_t4.sh # 验收结果: OK / Failed # 备注: 验收测试性能bs1:763.044FPS bs16:1234.940FPS;无运行报错,报错日志xx 等 # 310性能需要超过t4 - ``` - 示例链接 https://gitee.com/ascend/modelzoo/pulls/836#note_4750681