Skip to content

Data types of generic Op must be fully registered

Aurelius84 edited this page Dec 25, 2019 · 4 revisions

OP书写规范:通用类Op数据类型须注册完整


Data types of generic Op must be fully registered(English Version))


规范概要:

  • 第1节,背景
  • 第2节,通用类Op特征
  • 第3节,CI相关说明

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

1.背景

目前,paddle框架中的Op均通过REGISTER_OP_CPU_KERNELREGISTER_OP_CUDA_KERNEL宏,注册Op在CPU或GPU上支持的数据类型。由于Op的功能需求和使用场景各不相同,不同Op支持的数据类型也有所差别,如conv2d卷积只需支持float和double类型,sum Op需要支持intint64_tfloatdouble多种数据类型。

诸如sum类的op,计算逻辑不依赖于特定的数据类型,称为通用类Op。通用类Op支持的数据类型必须注册完整,至少支持intint64_tfloatdouble四种数据类型。

2.通用类Op特征

通用类Op主要具有如下特征:

  1. 数学操作函数类Op
  • 包括常用的abs、round、部分三角函数、elementwise相关的op;部分激活函数、数值比较Op。
    • 取绝对值:fluid.layers.abs(x)
    • 指数计算:fluid.layers.pow(x, ...)
    • 三角函数:fluid.layers.acos(x)
    • 元素操作:elementwise_addelementwise_mulelementwise_div
    • ReLU激活:fluid.layers.relu(x,...)
    • 值判断类:fluid.layers.less_than(x, y,...)
  1. Reduce操作或索引相关Op
  • 包括按axis参数进行reduce计算,或对输入进行索引(index)操作的相关Op。
    • 取索引值:fluid.layers.argmin(x,axis=0)
    • 求最小值:fluid.layers.reduce_min(input, ...)
    • 均值运算:fluid.layers.reduce_mean(input,...)
    • topk操作:fluid.layers.top(input, ...)
    • 排序操作:fluid.layers.argsort(input,...)
  1. Tensor生成或其他变换相关的Op
  • 主要包括类似fill_batch_like、fill_constant等生成自定义value和shape的Tensor相关Op,以及对Tensor进行flatten、reshape、reverse等相关操作的Op。
    • fill操作:fluid.layers.fill_constant_batch_size_like(input, shape,dtype, ...)
    • reshape:fluid.layers.reshape(x, shape)
    • 赋值操作:fluid.layers.assign(input,..)
    • mask操作:fluid.layers.sequence_mask(x,...)
    • squeeze操作:fluid.layers.squeeze(x, ...)

如何判断一个Op是否为通用类Op呢?可以参考如下三条原则:

  1. Op计算逻辑不强依赖于特定的数据类型

常见的loss类Op,input常为预测的概率分布,输出的loss为float和double类型,因此不需要注册int32和int64类型(但输入的label要支持这两种类型);但诸如pow、elementwise相关的Op,计算逻辑与数据类型解耦,故须至少注册以上四种类型。

  1. Op操作与输入Tensor的数据区无关

如Tensor的reshape、squeeze、mask、flatten等变换类Op,至少注册四种类型。

  1. 参考其他框架Op支持的数据类型

可以参考具有相同功能实现的其他框架的Op实现,对齐kernel支持的数据类型。

3.CI相关说明

目前已在 PR_CI_CPU_Py2中开启本规范的增量检查。若新增OP未同时注册int/int64_t,float/double,或上述四种类型,会导致该检查不通过。

类型注册要求细节:

支持类型 状态 说明
int/int64_t/float/double 允许 注册完整
int/int64_t 允许 仅支持整型
float/double 允许 仅支持浮点型
float 禁止 也需支持double
int 禁止 也需支持int64_t

Build Log中会出现类似如下的报错信息:

[08:49:34]	[Step 1/1] ****************
[08:49:34]	[Step 1/1] 0. You must have one RD (Aurelius84 (Recommend) or liym27 or zhhsplendid)approval for the data_type registration of new operator. More data_type of new operator should be registered in your PR. Please make sure that both float/double (or int/int64_t) have been registered.
[08:49:34]	[Step 1/1]  For more details, please click [https://github.com/PaddlePaddle/Paddle/wiki/Data-types-of-generic-Op-must-be-fully-registered].
[08:49:34]	[Step 1/1] 
[08:49:34]	[Step 1/1] There are 1 approved errors.
[08:49:34]	[Step 1/1] ****************
[08:49:36]	[Step 1/1] expand_test_a only supports [int float] now, but lacks [double int64_t].
[08:49:36]	[Step 1/1] expand_test_b only supports [int double float] now, but lacks [int64_t].
[08:49:36]	[Step 1/1] expand_test_c only supports [float] now, but lacks [double].
[08:49:42]	[Step 1/1] Process exited with code 1

请根据报错信息修改代码,以达到兼容性升级的目的。如果确认无法兼容性升级,请找相关审批人(CI Build Log中有审批人名单)审核并需要至少一个approval。

如果想本地复现该CI检测过程,请根据以下步骤:

  1. 拉取develop分支代码,编译并安装Paddle
  2. 打印develop分支的所有Op已注册的数据类型列表,执行
    python tools/check_op_register_type.py > OP_TYPE_DEV.spec
  3. 拉取PR分支代码,编译并安装Paddle
  4. 打印PR所在分支的所有Op已注册的数据类型列表,执行
    python tools/check_op_register_type.py > OP_TYPE_PR.spec
  5. 对比两个spec(两个文件的顺序不能交换),执行
    python tools/check_op_register_type.py OP_TYPE_DEV.spec OP_TYPE_PR.spec

若遇到问题,请联系 @Aurelius84

Clone this wiki locally