-
Notifications
You must be signed in to change notification settings - Fork 5.9k
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三部分。
| 模块 | fp32模型导出时是否裁剪 | 量化模型导出时是否裁剪 | 说明 |
|---|---|---|---|
| Def | 否 | 否 | 算子的原生定义,所有paddle后端都需要支持的算子功能,也是paddle算子的对外标准 |
| Quant | 否 | 是 | 算子的量化扩展 |
| Extra | 是 | 是 | 算子的运行时内部扩展 |
对Extra部分的修改不会影响到算子的兼容性,非Extra部分的修改则必须考虑兼容性问题。
为了保证兼容性,OP中属于非Extra部分的Input、Output、Attribute不允许被修改(文档除外)或删除,可以新增,但是新增的Input,Output必须设置AsDispensable,新增的Attribute必须设置默认值。
OP的Input、Output、Attribute的增删改通常是在OpMaker类中的Make()函数里,如sliceOP(仅展示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 | false | 通过.AsDuplicable()设置为true |
| intermediate | bool | false | 通过.AsIntermediate()设置为true |
| dispensable | bool | false | 通过.AsDispensable()设置为true |
| extra | bool | false | 通过.AsExtra()设置为true |
| quant | bool | false | 通过.AsQuant()设置为true |
- Attribute:
| 字段 | 类型 | 默认值 | 设置方式 |
|---|---|---|---|
| type | int | 无 | 由函数AddAttr<T>的模板参数T决定设置,是T对应的AttrTypeID值。 |
| generated | bool | false | 函数AddAttr<T>()的第3个参数 |
| default value | 由type字段决定 | 无 | 通过.SetDefault()来设置 |
| extra | bool | false | 通过.AsExtra()设置为true |
| quant | bool | false | 通过.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。