-
Notifications
You must be signed in to change notification settings - Fork 271
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[Hackathon 2 No.22 ]Add RFC for task 22 (add API paddle.index_add) #127
[Hackathon 2 No.22 ]Add RFC for task 22 (add API paddle.index_add) #127
Conversation
PR格式检查通过,你的PR将接受Paddle专家以及开源社区的review,请及时关注PR动态。 |
|
||
index在指定轴上含索引下标的list of int, tuple of int 或者 1-D Tensor。 | ||
|
||
added_value是待相加的数据,参数类型支持bool, int, float。 |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
我们希望 axis 能支持输入一个整数,或者一个 0D 的整形 Tensor,这样,如果 axis 是其他运算的结果,也能被支持。
add_value 我们希望支持 bool, int, float, complex 之类的 python scalar, 也能支持和 x 数据类型相同的 Tensor (只要它的形状可以 broadcast 到指定出来的形状)。而且当 add_value 是一个 Tensor 的时候,它的梯度也需要能正常回传。达到类似 numpy 切片 +=
的效果。
import numpy as np
x = np.random.randn(2, 3)
x[:, [0: 2]] += 10 # ok, python scalalr
x[:, [0, 2]] += np.array(10) # ok, 0d array
x[:, [0, 2]] += np.array([1000, 1000]) # ok (2,) broadcast to (2, 2)
预期能实现这些
import paddle
x = paddle.randn([2, 3])
paddle.index_add(x, 1, [0, 2], 10) # ok add_value accepts python scalar
paddle.index_add(x, 1, [0, 2], paddle.to_tensor(10, dtype=paddle.float32)) # ok add_value accepts 0D Tensor
paddle.index_add(x, 1, paddle.to_tensor([0, 2]), paddle.to_tensor([100.0, 100.0])) # ok, index & add_value accept Tensors, add_value can be broadcast to the slice's shape
(反向的部分未写出示例。)
你可能需要了解一下,如何让一个参数既支持 python scalar, 也能支持 Tensor 以实现灵活的语义。Hint: 在 paddle 的 op 设计中存在 Input 和 Attribute 的区别。你可以参考
paddle/fluid/operators/scale_op.cc
和 paddle/phi/kernels/cpu/scale_kernel.cc
和 paddle/phi/ops/compat/scale_sig.cc
来实现。另外考虑到需要 add_value 也需要梯度回传,你可能需要实现两个 kernel, 然后在 python 接口根据 add_value 是不是一个 Tensor 来调用不同的 kernel.
如果有遇到问题,欢迎咨询。
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
给了一些建议,功能设计上有一些不同意见~
感谢Paddle专家详细的回复,我尽快修改完后重新提交 |
对应的实现代码的PR:
PaddlePaddle/Paddle#42475