Skip to content

OP Input Output Attribute Compatibility Modification

liym27 edited this page Dec 9, 2019 · 23 revisions

OP修改规范:Input/Output/Attribute只能做兼容修改


OP Input/Output/Attribute Compatibility Modification(English Version)


规范概要:

  • 第1节,背景
  • 第2节,Input/Output/Attribute兼容性修改
  • 第3节,CI相关说明

补充说明:
规范在执行过程中,可能会发现现有规范未考虑到的方面,需要在实施过程中不断补充与完善,也请大家积极反馈意见。

1.背景

目前,存在用户使用新版本的Paddle预测库加载旧版本训练的模型的情况。为了保证模型被顺利加载,开发者在OP新增、删除或者修改Input、Output、Attribute时须保证新旧版本兼容(见官网说明)。

这意味着,需要保证OP的Input、Output、Attribute不能够被修改(文档除外)或删除,可以新增Input、Output和Attribute,但是新增的Input,Output必须设置AsDispensable,新增的Attribute必须设置默认值。

2.Input/Output/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。
  • Attribute:
    • type(int):通过AddAttr<>设置,如AddAttr<std::vector<int>>表示该参数类型是std::vector<int>,type值是std::vector<int>对应的AttrTypeID值。
    • generated (bool):函数AddAttr()的第3个参数,默认false。
    • default value:通过函数.SetDefault()设置默认值,如.SetDefault({})表示该参数默认值是空vector。

修改要求细节:

新增 删除 修改
Input 允许,但dispensable必须为true 禁止 禁止
Output 允许,但dispensable必须为true 禁止 禁止
Attribute 允许,但须设置默认值 禁止 禁止

3.CI相关说明

目前已在 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。

若遇到问题,请联系 @liym27

Clone this wiki locally