Skip to content

OP Input Output Attribute Compatibility Modification

王明冬 edited this page Oct 12, 2021 · 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时须保证新旧版本兼容(见官网说明)。

从 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必须设置默认值。

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 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 允许,但须设置默认值 禁止 禁止

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。

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

  1. 拉取develop分支代码,编译并安装Paddle
  2. 打印develop分支的op desc,执行
    python tools/print_op_desc.py > OP_DESC_DEV.spec
  3. 拉取PR分支代码,编译并安装Paddle
  4. 打印PR分支的op desc,执行
    python tools/print_op_desc.py > OP_DESC_PR.spec
  5. 对比两个op desc(两个文件的顺序不能交换),执行
    python tools/check_op_desc.py OP_DESC_DEV.spec OP_DESC_PR.spec

若遇到问题,请联系 @winter-wang

Clone this wiki locally