Skip to content

Upgrade OP Precision to Float64

juncaipeng edited this page Jan 15, 2020 · 11 revisions

单测规范:OP单测精度升级到float64


Upgrade the precision of op test from float32 to float64 (English Version)


规范概要:

  • 第1节,本规范的说明
  • 第2节,本规范的检查方法
  • 第3节,未满足本规范的修改建议
  • 第4节,验证是否满足本规范

补充:

此规范在执行过程中,可能存在未考虑周全的地方。请大家积极反馈意见,在实施过程中不断补充与完善。

1. 本规范的说明

目前,大部分OP单测的精度是float32,而且误差阈值没有完全统一。为了进一步保证OP的正确性,提出OP单测精度升级到float64的规范。

所有继承OpTest的OP单测,会根据inputs的类型推断单测精度。如果OP单测的精度是float32,应该将精度升级到float64,同时通过统一误差阈值的前向和反向检查。

具体来说,OP单测的inputs会包含多个输入,将所有输入的最高精度推断为该单测的精度,即float64>float32>float16>int64>int32>int16>int8>bool。当OP单测的精度升级为float64后:

  • 前向检查的绝对误差阈值会统一为atol=0
  • 反向检查的相对误差阈值会统一为max_relative_error=1e-7,即在继承OpTest的单测中设置误差阈值都是无效的。注意,虽然统一 max_relative_error=1e-7,但是在单测反向检查中,实质是根据需要检查的数值大小使用分段的阈值,具体为:
    • 如果数值小于1e-10,要求绝对误差小于1e-10;
    • 如果数值在1e-10到1e-8之间,要求相对误差小于1e-3;
    • 如果数值在1e-8到1e-6之间,要求相对误差小于1e-5;
    • 如果数值大于1e-6,要求相对误差小于1e-7。

2. 本规范的检查方法

所有继承OpTest的OP单测,会根据inputs的类型推断单测精度。

  • 如果单测精度是float32,在单测结束后会发现没有执行float64精度的check_grad,进行报错提醒。报错信息如 AssertionError: This test of ** op needs check_grad with fp64 precision.
  • 如果单测精度是float64,前向检查的绝对误差阈值统一为atol=0,反向检查的相对误差阈值统一为max_relative_error=1e-7,然后执行单测前向和反向检查。当无法通过标准误差阈值的检查,进行报错提醒,报错信息如 AssertionError: ** Variable ** max gradient diff ** over limit 1e-7

特殊情况:

  • 当单测被skip_check_grad_ci装饰,会为单测增加no_need_check_grad成员变量,跳过必须执行float64精度check_grad的检查。
  • 当OP没有反向计算,会自动跳过必须执行float64精度check_grad的检查。

3. 未满足本规范的修改建议

当OP单测没有满足本规范,可以参考以下建议进行修改:

  • 如果该OP单测不需要调用OpTest基类的检查函数,则可以修改该OP单测的父类为unittest.TestCase。请参考示例
  • 如果该OP单测的精度为float32,请参考“1. 本规范的说明”,将该单测精度升级为float64,即修改单测inputs中的输入类型为float64。然后参考“4.验证是否满足本规范”进行验证。请参考示例
  • 如果该OP单测精度为float64,但是不能通过统一误差阈值的前向和反向检查,则需要定位并修改OP内部计算的错误,然后参考“4.验证是否满足本规范”进行验证。
  • 如果该OP因为特殊原因无法进行梯度检查或者无法达到标准误差阈值的要求,请使用skip_check_grad_ci装饰器,并描述原因。使用该装饰器需要特定人员审核。请参考示例

4. 验证是否满足本规范

对精度从float32升级到float64的OP单测进行验证:

  • 将该OP从白名单(python/paddle/fluid/tests/unittests/white_list/op_accuracy_white_list.py中的NO_FP64_CHECK_GRAD_OP_LIST)删除;
  • 在本地或者提交PR执行该单测;
  • 如果执行没有错误,则验证该OP单测满足本规范。如果报错提示无法通过统一误差阈值的前向和反向检查,则需要参考“3. 未满足本规范的修改建议”继续修改。

对精度为float64、无法通过标准误差阈值检查的OP单测进行验证:

对于修复单测满足本规范的PR,在review之前,请将该OP从对应的白名单中删除。

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

Clone this wiki locally