Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
PR types
Others
PR changes
Others
Describe
Pcard-67003
本PR作为飞桨快乐开源活动issue #51292 的示范例子,为
top_k
算子的输出参数indices
注册数据类型DataType。以下为修复
top_k
算子注册信息的过程,参与任务的开发者可参照实现对其它算子注册信息的修复:1. 阅读kernel实现
在 paddle/phi/kernels目录下找到top_k算子的kernel代码,可以发现
TopKKernel
函数有out
和indices
两个输出Tensor,分别表示查找到的top-k结果以及对应的索引信息;其中out
的数据类型与kernel类型一致,但indices
的数据类型int64_t
与kernel类型不一致,需要进行注册。我们可以通过kernel中分配内存(
Alloc
或HostAlloc
)的操作,来判断一个输出Tensor的DataType信息。若在分配内存时传入kernel实例化的模板参数T
,则表示该输出Tensor数据类型与kernel一致,这种情况不需要专门做注册(未注册的参数数据类型默认与kernel相同);若分配内存时传入与T
不同的模板参数,则表示该输出Tensor数据类型与kernel不一致,需要做注册。除了通过阅读代码进行判断,也可以查阅算子对应的API文档,文档中一般都会说明输出参数的数据类型。
2. 添加注册信息
判断出
top_k
的indices
参数需要注册数据类型后,找到top_k
的kernel注册代码,在注册宏的花括号{}
中设置输出参数的数据类型:kernel->OutputAt()
中传入注册DataType的输出参数编号,编号从0开始,按kernel函数声明中的位置依次递增。如top_k
kernel的第0个输出为out
,第1个输出为indices
。注意:本PR代码中DataType使用了
paddle::experimental::
命名空间,这是算子库项目开发初期使用的命名空间。paddle::experimental::DataType
与phi::DataType
是等价的,后续按规范要求,需要统一成phi::DataType
。存量代码的改造工作正在进行中,增量代码需直接使用phi::DataType
。在添加注册信息时,若该算子分开注册了多种类型的kernel,对于每种kernel都需要添加上输出参数的数据类型。如
top_k
算子在cpu/top_k_kernel.cc
、gpu/top_k_kernel.cu
和xpu/top_k_kernel.cc中
分别注册了cpu、gpu和xpu三种kernel,需要在这三处注册代码中都分别添加数据类型注册。一般来说,一个算子至少会分开注册cpu、gpu和xpu三种不同的后端设备类型,某些算子还会分开注册不同的DataType和Layout类型。由于静态图中通过黑名单机制对一些未规范注册DataType的算子屏蔽了全静态选kernel功能,在完成算子的DataType注册后,请顺手将其从黑名单中移除。
有些算子的输出数据类型是无法静态确定的,需要根据一些输入信息进行推导,此时可对该参数注册
UNDEFINED
类型。注册UNDEFINED
的参数需要通过InferMeta进行推导,因此,若对某个参数注册了UNDEFINED
,你需要确保该算子的InferMeta已被正确地实现和注册。具体地,你需要:(1)在paddle/phi/infermeta/目录下找到该算子的InferMeta实现,检查该算子的InferMeta中是否正确实现了
UNDEFINED
参数的DataType推导逻辑,若未实现或实现有误,则需要你对相关逻辑进行修复。关于InferMeta的实现,可参考《开发C++算子》文档中实现InferMeta函数一节。(2)在paddle/fluid/operators/目录下找到该算子的注册信息,确保该算子的InferShape已迁移成phi下的InferMeta。若一个算子的InferShape已迁移,则该算子不会实现InferShape函数,且在算子注册时会注册
xxxInferShapeFunction
的信息;若未迁移,则需要你对该算子的InferShape进行迁移。关于InferShape的迁移,可参考PR #39517 。3. 代码测试
本次任务不需要专门新写单测进行验证,在完成问题修复后,找到修复算子对应的单测,运行该单测进行验证即可。算子的单测通常被命名为
test_xxx_op
的形式,如test_top_k_op
。如果你在本地无法找到算子对应的单测,可以在编译通过后提交PR跑CI测试,CI系统会对对应算子的单测进行测试,并反馈给你测试失败的单测列表。