Skip to content

PR CI OP benchmark Manual

GaoWei8 edited this page Dec 18, 2020 · 15 revisions

背景

当您提交一个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执行逻辑

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

【解决方案】 需要对PR代码改动点进行自查,是否为代码本身原因,如果确认代码本身不会造成性能问题,可以在PR评论处@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日志末尾中可以找到如上所示日志,提示源文件缺少测试脚本。

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

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