-
Notifications
You must be signed in to change notification settings - Fork 5.6k
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
fix behavior of put_along_axis and take_along_axis 易用性提升No.43 #59163
Conversation
你的PR提交成功,感谢你对开源项目的贡献! |
✅ This PR's description meets the template requirements! |
PR-CE-Framework 没过应该是paddletest里面的put_along_axis以及take_along_axis的测试样例仍然是与numpy对齐导致过不了。但是修改后的算子相比之前在cpu上的性能下降了,我自己能想到优化的地方都进行了优化,能否麻烦reviewer帮忙看看还有哪里可以再改进的。 |
@YibinLiu666 这里pytorch使用的是 index不向输入broadcast 的方式,numpy和paddle使用的是 index向输入broadcast 的方式,因此如果 index和输入没有shape对齐 的情况下,两者结果不一致。 这里就有两个实现版本:1)broadcast版本;2)非broadcast版本。 目前的改动是 直接改成pytorch的非broadcast版本,会有很大的不兼容影响,我建议是否可以增加一个参数: |
已经修改,改动后的kernel是跟以前兼容的,因此只在顶层python接口处添加了broadcast参数 |
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.
目前像这样改了后,还会影响性能吗,理论上不应该影响到性能。
目前CI中没有明显的性能下降,只不过应该还是会有一点点影响,因为之前是默认value的shape跟index的是一样的,而现在不一定一样的,在kernel里面每次还额外计算了value的offset。然后GPU实现里面加了同步操作,这个是因为有时候会对src的同一个位置进行多次修改,比如输入的src是[[0,0,0],[0,0,0]],index是[[0,0,0],[0,0,0],value的值是[[1,2,3],[4,5,6]],axis=1的时候,当i都是0时,index[0,0]和index[0,1]的值都是0,因此src要修改的位置都会是src[0,0],如果没有同步操作的话可能会存在随机性,因为不知道哪个gpu线程先结束,pytorch的行为是保留i,j字典序最大的那个操作,所以我这里同步了一下,只让tid最大的线程修改src |
如果broadcast了,那应该与原本逻辑一致,不应有任何性能上的改变呢。如果没有broadcast,才是新的逻辑。 |
原本的逻辑我认为是存在问题的,首先就是我这里提到的gpu kernel,其次就是求value梯度的过程,之前就是用的gather来求梯度,但是还是相同的情况,如果多个index同时修改src的同一个地址,前面修改的会被最后的修改覆盖,也就是不会用到相关的value,梯度就为0,但是用gather的话被覆盖的value也会有梯度 |
@YibinLiu666 有兴趣把黑客松第6题 【为Paddle增强 put_along_axis API】一起做了么 |
可以呀,只不过我现在还在写27题 |
@zhwesky2010 这个PR能麻烦尽早merge嘛,后面黑客松的第6题得基于这个PR,感谢 |
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.
LGTM
4e4a9fd
to
28aadd6
Compare
@luotao1 涛姐这个PR能先merge了吗,周末不小心把其他代码push到这个分支了,已经revert到研发大哥approve的那个版本了 |
@YibinLiu666 请提交对应的中文文档修改PR |
…Paddle#59163) * fix behavior of put_along_axis and take_along_axis * fix error * fix take_along_axis used in stat * update * fix build error * add test for error * add param broadcast * use origin example * add param include_self * update param name * modify ut * update test case * add error UT * update
@YibinLiu666 你好,这里报出了一些不兼容问题。麻烦看下。 |
能否提供一下这两个pdt文件 |
目前发现是GPU上共享内存最大只能分配100KB左右导致的,数据量太大导致共享内存不够用。我明天提个PR修复一下。 |
@YibinLiu666 API文档也都修一下吧 |
@YibinLiu666 你好,上面的计算问题已经验证修复了。但是发现当shape很大时,性能下降非常多,不是之前说的只有一点点影响: 这个是测试方式,可以看出,反向没有问题,但put_along_axis的3个PR合入后前向的性能变慢了400-500倍,辛苦尽快看一下这个问题,影响比较大~ |
) | ||
|
||
axis_max_size = arr.shape[axis] | ||
if not (indices < axis_max_size).all(): |
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.
在静态图模式下,indices 是一个 Variable/Value,组网阶段是没有值的,这里 not Value()
永远返回 False,也就是永远不会走到下面的分支
我们正在完全禁掉 Value.__bool__
以免发生一些低级错误,目前会在本 PR 改动的这里报错,麻烦修改一下相关代码,不要触发隐式 Value.__bool__
详情见 #60902,可拉取 PR 后运行 test/legacy_test/test_put_along_axis_op.py
复现
考虑到这里组网阶段是无法得知结果的,这个检查可能只能在动态图做,可以考虑改成
-if not (indices < axis_max_size).all():
+if in_dynamic_mode() and not (indices < axis_max_size).all():
PR types
Others
PR changes
Others
Description
#55883
该PR修改内容如下: