-
Notifications
You must be signed in to change notification settings - Fork 5.6k
Data types of generic Op must be fully registered
Data types of generic Op must be fully registered(English Version))
规范概要:
- 第1节,背景
- 第2节,通用类Op特征
- 第3节,CI相关说明
补充说明:
此规范在执行过程中,可能存在未考虑周全的地方。请大家积极反馈意见,在实施过程中不断补充与完善。
目前,paddle框架中的Op均通过REGISTER_OP_CPU_KERNEL
和REGISTER_OP_CUDA_KERNEL
宏,注册Op在CPU或GPU上支持的数据类型。由于Op的功能需求和使用场景各不相同,不同Op支持的数据类型也有所差别,如conv2d卷积只需支持float和double类型,sum Op需要支持int
、int64_t
、float
、double
多种数据类型。
诸如sum类的op,计算逻辑不依赖于特定的数据类型,称为通用类Op。通用类Op支持的数据类型必须注册完整,至少支持int
、int64_t
、float
和double
四种数据类型。
- 数学操作函数类Op
- 包括常用的abs、round、部分三角函数、elementwise相关的op;部分激活函数、数值比较Op。
- 取绝对值:
fluid.layers.abs(x)
- 指数计算:
fluid.layers.pow(x, ...)
- 三角函数:
fluid.layers.acos(x)
- 元素操作:
elementwise_add
、elementwise_mul
、elementwise_div
等 - ReLU激活:
fluid.layers.relu(x,...)
- 值判断类:
fluid.layers.less_than(x, y,...)
等
- 取绝对值:
- 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,...)
- 取索引值:
- 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, ...)
- fill操作:
- Op计算逻辑不强依赖于特定的数据类型
常见的loss类Op,input常为预测的概率分布,输出的loss为float和double类型,因此不需要注册int32和int64类型(但输入的label要支持这两种类型);但诸如pow、elementwise相关的Op,计算逻辑与数据类型解耦,故须至少注册以上四种类型。
- Op操作与输入Tensor的数据区无关
如Tensor的reshape、squeeze、mask、flatten等变换类Op,至少注册四种类型。
- 参考其他框架Op支持的数据类型
可以参考具有相同功能实现的其他框架的Op实现,对齐kernel支持的数据类型。
目前已在 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检测过程,请根据以下步骤:
- 拉取develop分支代码,编译并安装Paddle
- 打印develop分支的所有Op已注册的数据类型列表,执行
python tools/check_op_register_type.py > OP_TYPE_DEV.spec
- 拉取PR分支代码,编译并安装Paddle
- 打印PR所在分支的所有Op已注册的数据类型列表,执行
python tools/check_op_register_type.py > OP_TYPE_PR.spec
- 对比两个spec(两个文件的顺序不能交换),执行
python tools/check_op_register_type.py OP_TYPE_DEV.spec OP_TYPE_PR.spec
若遇到问题,请联系 @Aurelius84。