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 b59263fbf526620c40f8b2c074004832b76ae64d..a5ecdc4a5dab6a5ad34d8160b4055f6ba1251ae3 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" @@ -1193,7 +1193,7 @@ https://gitee.com/ascend/tools/tree/master/msquickcmp ### 6.2 交付标准与规范 - 交付标准 - 精度: - om模型推理的精度与PyTorch预训练模型github代码仓README.md或官网文档公布的精度对比,精度下降不超过1%则认为精度达标 + om模型推理的精度与Ascend 910训练出的权重精度或PyTorch预训练模型github代码仓README.md或官网文档公布的精度对比,精度下降不超过1%则认为精度达标 - 性能: Ascend benchmark工具在数据集上推理测的NPU 310单颗device吞吐率乘以4颗即单卡吞吐率大于TensorRT工具测的GPU T4单卡吞吐率则认为性能达标 如若交付要求中对性能有要求(易模型),310的性能必须高于t4的性能 @@ -1212,7 +1212,7 @@ https://gitee.com/ascend/tools/tree/master/msquickcmp 说明: ``` - 1.如果开源代码仓提供了多个权重文件,使用常用的基础的那个配置的权重文件即可;如果开源代码仓没有提供pth权重文件,则需要该模型的训练同学提供pth权重文件,或者使用开源代码仓训练脚本简单训练一个pth权重文件,然后对比om精度与该pth权重文件的精度 + 1.如果已经有了ascend 910训练提供的权重文件,那么优先使用910训练提供的权重文件做离线推理,精度与910训练出的精度对齐;如果开源代码仓提供了多个权重文件,使用常用的基础的那个配置的权重文件即可;如果开源代码仓没有提供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模型在线推理性能 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" index 1fcac6f75d27dafa1d06ad0dbf8ef93cf3c9f1cb..35f39e40d4594298428248e0eb99d7763bb7d7c0 100644 --- "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" @@ -14,14 +14,39 @@ ## [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表示动态 +### FAQ1、需要提供哪些交付件,如何交付? +交付请参考《推理指导》6.2 交付标准与规范 +交付件样例:https://gitee.com/ascend/modelzoo/tree/master/built-in/ACL_PyTorch/Benchmark/cv/classification/ResNext50 + +### FAQ2、装有Ascend 310卡的服务器环境如何使用? +提供的装有Ascend 310卡的服务器已经安装好ascend的包,服务器home/common/resnext50的样例是可以运行的 + +### FAQ3、推理与训练的关系? +模型推理与训练是独立的事情,推理比训练简单一些,推理是使用Ascend 910训练的权重或模型开源代码仓提供的权重在310上执行推理,一般在训练等待结果的时间内可以同步做推理 + +### FAQ4、推理工作量? +做之前需要先熟悉相关工作,然后进行模型推理,如果精度性能不达标就需要花费不少时间了,模型推理到验收还有检视整改测试资料文档的工作,不是三天就能做完模型推理,从开始到验收完成整个周期规划了1个月~1.5个月的时间 + +### FAQ5、推理过程中哪些工作在310服务器上做,哪些在t4服务器上做,哪些在cpu上做? +前后处理与转onnx在cpu上做即可,转om模型和benchmark推理时的命令在装有ascend 310的服务器上执行即可,因为两个命令依赖Ascend cann包提供的编译工具与npu算子库,gpu性能数据需要在装有t4卡的服务器上测 + +### FAQ6、预训练权重文件选择的问题? +如果已经有了ascend 910训练提供的权重文件,那么优先使用910训练提供的权重文件做离线推理,精度与910训练出的精度对齐 +如果开源代码仓提供了多个权重文件,使用常用的基础的那个配置的权重文件即可,并且模型支持多任务时只需要针对一个任务做推理 +如果开源代码仓没有提供pth权重文件,则需要该模型的训练同学提供pth权重文件,或者使用开源代码仓训练脚本简单训练一个pth权重文件,然后对比om精度与该pth权重文件的精度 + +### FAQ7、精度与性能需要测试哪些batch? +如果模型支持多batch,需要测试batch1,4,8,16,32的精度与性能,写在README.md里,模型测试脚本与提交代码的描述只需提供bs1和bs16的精度性能数据 + +### FAQ8、onnx不能推理,t4性能如何测? +如果导出的onnx因包含自定义算子等而不能推理,则在t4上运行开源评测脚本测试pth模型在线推理性能 + +### FAQ9、om性能如何测? +测试时需要确保测试过程中device只进行了这一个测试任务,使用npu-smi info查看device是否空闲 +由于随机数可能不能模拟数据分布,Ascend benchmark工具纯推理功能测的有些模型性能数据可能不太准,所以模型测试脚本与提交代码的描述中的性能数据以Ascend benchmark在数据集上推理时得到性能数据为准 + +### FAQ10、导出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"] @@ -34,18 +59,54 @@ 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动态库 - -* 现象描述 +### FAQ11、atc命令失败时如何查看日志? +``` +export ASCEND_SLOG_PRINT_TO_STDOUT=1 +export ASCEND_GLOBAL_LOG_LEVEL=0 #debug 0 --> info 1 --> warning 2 --> error 3 +然后执行atc ... > atc.log +``` +### FAQ12、模型代码包含不能导出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) ``` -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 +修改模型代码,将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)) +``` + +### FAQ13、运行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 + ``` * 原因分析 @@ -54,19 +115,19 @@ or * 处理方法 设置环境变量: -``` -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 -``` + ``` + 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' -``` + ``` + 修改/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)