-
Notifications
You must be signed in to change notification settings - Fork 5.6k
PR CI OP benchmark Manual
方案: 目前本CI的触发机制为:
- 修改paddle/fluid/operators目录下的 “_op.cu” 文件或”.h”文件递归查询到被包含的”_op.cu“文件会触发CI;
- 仅修改cpu代码,不会进行测试;
- 仅修改注释:这个跟其他CI执行策略保持一致,使用 ”test=document_fix” 本ci直接成功;没有使用”notest”关键字会触发本CI。
缺失脚本的补充,目前优先提交PR的人进行补充,原因是推动API负责人修改需要一定时间,不利于PR快速合入。 如果仅改了一个注释,不涉及op实现且触发CI,可以找@GaoWei8 (Recommend)或 @Xreki或 @luotao1 approve,跳过CI检查。
方案:可以通过rerun CI,排除部分性能存在波动的问题,本周内加入CI 3次自动rerun功能,减少rerun工作量。
方案:原则上,不允许导致性能下降的PR合入,如需特殊申请,可以@GaoWei8(Recommend)或@Xreki描述详细情况获取帮助。
当您提交一个PR(Pull_Request)
,您的PR需要经过一些CI(Continuous Integration)
。其中PR-CI-OP-benchmark负责检查PR中的修改是否会造成OP性能下降或者精度错误,同时该CI任务也可以作为辅助您检查OP性能优化类型的PR效果如何。
该CI使用Dockerfile.cuda10_cudnn7_gcc8_ubuntu16镜像环境,依赖PaddlePaddle/benchmark提供的测试框架实现。
CI执行流程如下图所示:
-
从PR中获取在
paddle/fluid/operators
目录下修改的*_op.cu*
文件列表,对于头文件递归查询到被包含的*_op.cu*
文件,然后进行第2步,如果没有获取到任何满足要求的文件则按照CI运行成功状态退出CI执行; -
clone PaddlePaddle/benchmark代码库,匹配第1步中修改的文件,生成待测试的op列表,然后进行第3步,如果待测试op列表为空则进行第4步;
-
依赖PaddlePaddle/benchmark提供的测试框架,分别编译develop分支与PR分支对应的whl包并运行测试脚本,得到各自对应的性能数据,然后对比性能差异并打印性能变化结果,性能/精度对比超过阈值时设置CI运行状态为失败,然后进行第4步;
-
判断是否op在PaddlePaddle/benchmark下缺少测试脚本,如果缺少则给出提示并设置CI运行状态为失败,综合第3、4中的CI运行状态退出CI执行;
注:1)新增OP、OP对应py文件修改的性能测试逻辑当前版本暂时不考虑,待后续优化添加;
2)op性能测试当前版本只对比GPU数据;
受百度效率云平台、网络波动、PR代码修改、检查策略等多种因素,PR-CI-OP-benchmark失败原因及相应解决方法不同,具体如下:
【问题描述】 在CI日志末尾中可以看到make编译执行失败信息。
【解决方案】 首先确认在其他CI是否可以正常编译,如果同样存在编译失败则为代码本身原因,如果其他CI可以正常编译,需要在PR评论处@Avin0323描述详细情况获取帮助。
Cloning into 'Paddle'...
fatal: unable to access 'https://github.com/PaddlePaddle/Paddle.git/': Received HTTP code 503 from proxy after CONNECT
Clone Paddle failed.
【问题描述】 在CI日志末尾中可以找到如上所示日志,表示clone代码失败。
【解决方案】 需要在PR评论处@Avin0323描述详细情况获取帮助。
[check_op_benchmark_result.py:94] [INFO] ------ OP: dropout ------
[check_op_benchmark_result.py:95] [INFO] Accaury diff: 1.111328125
[check_op_benchmark_result.py:96] [INFO] backward: True
[check_op_benchmark_result.py:97] [INFO] parameters:
[check_op_benchmark_result.py:99] [INFO] x (Variable) - dtype: float16, shape: [32, 128, 768]
[check_op_benchmark_result.py:99] [INFO] axis (string): None
[check_op_benchmark_result.py:99] [INFO] mode (string): upscale_in_train
[check_op_benchmark_result.py:99] [INFO] p (float): 0.1
【问题描述】 在CI日志末尾中可以找到如上所示日志,会打印op信息、测试参数、是否为前向反向、精度差异等信息,表示精度检查失败。
【解决方案】
- 需要对PR代码改动点进行自查,是否为代码本身原因,可以参考OP benchmark调试手册进行验证精度结果。
- 如果确认代码本身不会造成精度问题,可以在PR评论处@GaoWei8描述详细情况获取帮助。
[check_op_benchmark_result.py:82] [INFO] ------ OP: mean ------
[check_op_benchmark_result.py:84] [INFO] GPU time change: 16.22128% (develop: 0.0069817 -> PR: 0.0081142)
[check_op_benchmark_result.py:86] [INFO] Total time change: 0.96183% (develop: 0.0349814 -> PR: 0.0353178)
[check_op_benchmark_result.py:87] [INFO] backward: True
[check_op_benchmark_result.py:88] [INFO] parameters:
[check_op_benchmark_result.py:90] [INFO] x (Variable) - dtype: float32, shape: [16, 8, 128]
[check_op_benchmark_result.py:90] [INFO] axis (list): [1]
[check_op_benchmark_result.py:90] [INFO] keepdim (bool): False
【问题描述】 在CI日志末尾中可以找到如上所示日志,会打印op信息、测试参数、是否为前向反向、性能变化情况,表示性能检查失败,目前设置GPU执行时间变化阈值为5%。
【解决方案】
- 可以重新rerun CI,确认不是因为性能测试波动导致的问题。
- 需要对PR代码改动点进行自查,是否为代码本身原因,可以参考OP benchmark调试手册进行验证性能结果。
- 如果确认代码本身不会造成性能问题,可以在PR评论处@GaoWei8描述详细情况获取帮助。
- 原则上,不允许导致性能下降的PR合入,如需特殊申请,可以在PR评论处@Xreki或 @GaoWei8描述详细情况获取帮助。
[/workspace/Paddle/tools/test_op_benchmark.sh:221] [WARNING] Missing test script of "fill_constant"(paddle/fluid/operators/fill_constant_op.cu.cc) in benchmark.
【问题描述】 在CI日志末尾中可以找到如上所示日志,提示源文件缺少测试脚本。
【解决方案】
- 仅修改注释代码或为外部开发用户,在PR评论处@GaoWei8或 @Avin0323获取CI豁免。
- 如果改动了OP实现,参考OP benchmark调试手册进行添加OP测试脚本和配置。
- 添加OP测试脚本和配置,需要先找指导人进行review,再找@GaoWei8 review 合入。
【问题描述】 除上述5种常见情况外,有可能存在偶发异常情况。
【解决方案】 需要在PR评论处@Avin0323描述详细情况获取帮助。
由于PR-CI-OP-benchmark仅在存在*_op.cu*
文件受PR改动影响时生效,运行时间存在以下几种情况:
-
没有op文件修改时: CI耗时主要为clone Paddle代码,一般为3-5min,遇到网络波动情况会较长;
-
有op文件修改,但缺少测试脚本时: CI耗时主要为clone Paddle和benchmark代码,一般为5min左右,遇到网络波动情况会较长;
-
有op文件修改,且存在测试脚本时: CI耗时主要为编译Paddle代码及执行benchmark测试脚本耗时,一般为40min左右(5min clone代码、20min编译Paddle代码、15min执行测试脚本),遇到测试op较多或网络波动等情况时耗时会较长;
若遇到其他问题,请联系@Avin0323