Repository navigation
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参数 |
目前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,感谢 |
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.
在静态图模式下,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修改内容如下: