-
Notifications
You must be signed in to change notification settings - Fork 5.6k
OP Input Output Attribute Compatibility Modification
OP Input/Output/Attribute Compatibility Modification(English Version)
规范概要:
- 第1节,背景
- 第2节,Input/Output/Attribute兼容性修改
- 第3节,CI相关说明
补充说明:
规范在执行过程中,可能会发现现有规范未考虑到的方面,需要在实施过程中不断补充与完善,也请大家积极反馈意见。
目前,存在用户使用新版本的Paddle预测库加载旧版本训练的模型的情况。为了保证模型被顺利加载,开发者在OP新增、删除或者修改Input、Output、Attribute时须保证新旧版本兼容(见官网说明)。
从 2.2rc 版本开始,算子组成可以横向分为 Def(definition)、Quant(quantization)、Extra三部分。
Def | 算子的原生定义 |
Quant | 算子的量化扩展 |
Extra | 算子的运行时内部扩展 |
其中,Def部分是所有paddle后端都需要支持的算子功能,也是paddle算子的对外标准;Quant部分代表了算子的量化扩展;Extra部分表示一些运行态信息以及某些特殊后端的扩展,不会对外暴露,对其的修改不属于算子升级。对于正常的fp32模型,只会包含了算子的Def部分,Quant和Extra在模型导出时会被裁剪掉;对于量化模型,只会包含算子的Def和Quant部分,Extra部分在模型导出时会被裁剪掉。简单地说,对Extra部分的修改不会影响到算子的兼容性,非Extra部分的修改则必须考虑兼容性问题。
为了保证兼容性,OP中属于非Extra部分的Input、Output、Attribute不允许被修改(文档除外)或删除,可以新增,但是新增的Input,Output必须设置AsDispensable,新增的Attribute必须设置默认值。
OP的Input、Output、Attribute的增删改通常是在OpMaker
类中的Make()
函数里,如slice
OP(仅展示SliceOpMaker
的部分代码):
class SliceOpMaker : public framework::OpProtoAndCheckerMaker {
public:
void Make() override {
AddInput("Input", "(Tensor) Tensor of data to extract slices from.");
AddInput("EndsTensor","(Tensor<int32>, optional) If provided, slice will use this.It has the highest priority of EndsTensor, EndsTensorList and attr(ends).").AsDispensable()
AddOutput("Out", "Sliced data tensor.");
AddAttr<std::vector<int>>("starts","(list<int>) Starting indices of corresponding axis in `axes`").SetDefault({});
}
}
- Input/Output:
类型 | 默认值 | 设置方式 | |
---|---|---|---|
duplicable | bool | flase | 通过.AsDuplicable() 设置为true |
intermediate | bool | flase | 通过.AsIntermediate() 设置为true |
dispensable | bool | flase | 通过.AsDispensable() 设置为true |
extra | bool | flase | 通过.AsExtra() 设置为true |
quant | bool | flase | 通过.AsQuant() 设置为true |
- Attribute:
类型 | 默认值 | 设置方式 | |
---|---|---|---|
type | int | 无 | 由函数AddAttr<T> 的模板参数T 决定设置,是T 对应的AttrTypeID值。 |
generated | bool | false | 函数AddAttr<T>() 的第3个参数 |
default value | 由type字段决定 | 无 | 通过.SetDefault() 来设置 |
extra | bool | flase | 通过.AsExtra() 设置为true |
quant | bool | flase | 通过.AsQuant() 设置为true |
对于extra为true的Input/Output/Attribute的修改没有兼容性要求。非extra的Input/Output/Attribute修改,则必须满足以下要求:
新增 | 删除 | 修改 | |
---|---|---|---|
Input | 允许,但dispensable必须为true | 禁止 | 禁止 |
Output | 允许,但dispensable必须为true | 禁止 | 禁止 |
Attribute | 允许,但须设置默认值 | 禁止 | 禁止 |
目前已在 PR_CI_CPU_Py2
中开启本规范的检查,若修改OP的Input/Output/Attribute导致该检查不通过,Build Log中会出现类似如下的报错信息:
------------------------------
Op desc error for the changes of Inputs/Outputs/Attrs of OPs:
For OP 'slice':
* The added Input 'Out_test_2' is not dispensable.
* The Input 'EndsTensorList' is deleted.
* The arg 'dispensable' of Input 'EndsTensor' is changed: from 'True' to 'False'.
* The arg 'default_value' of Attr 'starts' is changed: from '{} to '{1}'.
------------------------------
请根据报错信息修改代码,以达到兼容性升级的目的。如果确认无法兼容性升级,请找相关审批人(CI Build Log中有审批人名单)审核并需要至少一个approval。
如果想本地复现该CI检测过程,请根据以下步骤:
- 拉取develop分支代码,编译并安装Paddle
- 打印develop分支的op desc,执行
python tools/print_op_desc.py > OP_DESC_DEV.spec
- 拉取PR分支代码,编译并安装Paddle
- 打印PR分支的op desc,执行
python tools/print_op_desc.py > OP_DESC_PR.spec
- 对比两个op desc(两个文件的顺序不能交换),执行
python tools/check_op_desc.py OP_DESC_DEV.spec OP_DESC_PR.spec
若遇到问题,请联系 @winter-wang。