Skip to content

PR CI OP benchmark Manual

GaoWei8 edited this page Dec 21, 2020 · 15 revisions

注意事项

1.缺失脚本的补充,是谁来补充?如果就改了一个注释,也要补齐测试脚本么?

方案: 目前本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检查。

2. 性能测试有波动的话,PR怎么合入?

方案:可以通过rerun CI,排除部分性能存在波动的问题,本周内加入CI 3次自动rerun功能,减少rerun工作量。

3 如果遇到性能测试,部分配置性能好,部分配置性能差,这种情况如何处理?

方案:原则上,不允许导致性能下降的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执行逻辑

CI执行流程如下图所示:

CI执行流程图

  1. 从PR中获取在paddle/fluid/operators目录下修改的*_op.cu*文件列表,对于头文件递归查询到被包含的*_op.cu*文件,然后进行第2步,如果没有获取到任何满足要求的文件则按照CI运行成功状态退出CI执行;

  2. clone PaddlePaddle/benchmark代码库,匹配第1步中修改的文件,生成待测试的op列表,然后进行第3步,如果待测试op列表为空则进行第4步;

  3. 依赖PaddlePaddle/benchmark提供的测试框架,分别编译develop分支与PR分支对应的whl包并运行测试脚本,得到各自对应的性能数据,然后对比性能差异并打印性能变化结果,性能/精度对比超过阈值时设置CI运行状态为失败,然后进行第4步;

  4. 判断是否op在PaddlePaddle/benchmark下缺少测试脚本,如果缺少则给出提示并设置CI运行状态为失败,综合第3、4中的CI运行状态退出CI执行;

注:1)新增OP、OP对应py文件修改的性能测试逻辑当前版本暂时不考虑,待后续优化添加;
       2)op性能测试当前版本只对比GPU数据;

CI失败原因及解决方案

受百度效率云平台、网络波动、PR代码修改、检查策略等多种因素,PR-CI-OP-benchmark失败原因及相应解决方法不同,具体如下:

1. 编译失败

【问题描述】 在CI日志末尾中可以看到make编译执行失败信息。

【解决方案】 首先确认在其他CI是否可以正常编译,如果同样存在编译失败则为代码本身原因,如果其他CI可以正常编译,需要在PR评论处@Avin0323描述详细情况获取帮助。

2. clone代码失败

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描述详细情况获取帮助。

3. 精度检查失败

[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信息、测试参数、是否为前向反向、精度差异等信息,表示精度检查失败。

【解决方案】

  1. 需要对PR代码改动点进行自查,是否为代码本身原因,可以参考OP benchmark调试手册进行验证精度结果。
  2. 如果确认代码本身不会造成精度问题,可以在PR评论处@GaoWei8描述详细情况获取帮助。

4. 性能检查失败

[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%。

【解决方案】

  1. 可以重新rerun CI,确认不是因为性能测试波动导致的问题。
  2. 需要对PR代码改动点进行自查,是否为代码本身原因,可以参考OP benchmark调试手册进行验证性能结果。
  3. 如果确认代码本身不会造成性能问题,可以在PR评论处@GaoWei8描述详细情况获取帮助。
  4. 原则上,不允许导致性能下降的PR合入,如需特殊申请,可以在PR评论处@Xreki或 @GaoWei8描述详细情况获取帮助。

5. 缺少测试脚本

[/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日志末尾中可以找到如上所示日志,提示源文件缺少测试脚本。

【解决方案】

  1. 仅修改注释代码或为外部开发用户,在PR评论处@GaoWei8或 @Avin0323获取CI豁免。
  2. 如果改动了OP实现,参考OP benchmark调试手册进行添加OP测试脚本和配置。
  3. 添加OP测试脚本和配置,需要先找指导人进行review,再找@GaoWei8 review 合入。

6. 其他问题

【问题描述】 除上述5种常见情况外,有可能存在偶发异常情况。

【解决方案】 需要在PR评论处@Avin0323描述详细情况获取帮助。

CI运行时间

由于PR-CI-OP-benchmark仅在存在*_op.cu*文件受PR改动影响时生效,运行时间存在以下几种情况:

  1. 没有op文件修改时: CI耗时主要为clone Paddle代码,一般为3-5min,遇到网络波动情况会较长;

  2. 有op文件修改,但缺少测试脚本时: CI耗时主要为clone Paddle和benchmark代码,一般为5min左右,遇到网络波动情况会较长;

  3. 有op文件修改,且存在测试脚本时: CI耗时主要为编译Paddle代码及执行benchmark测试脚本耗时,一般为40min左右(5min clone代码、20min编译Paddle代码、15min执行测试脚本),遇到测试op较多或网络波动等情况时耗时会较长;


若遇到其他问题,请联系@Avin0323

Clone this wiki locally