- Notifications
You must be signed in to change notification settings - Fork 5.9k
【快乐开源】Paddle Tensor 规范化二期 API 支持 0-size Tensor No.5:paddle.broadcast_tensors #71788
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
【快乐开源】Paddle Tensor 规范化二期 API 支持 0-size Tensor No.5:paddle.broadcast_tensors #71788
Conversation
| 你的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.
添加单个输入和0-size情况下的单测
| @cangtianhuang 你的PR可能还加一些单测, 以及删除掉一些原有的单测,比如原来kernel没有支持int8类型,所以预期报错,但是你的PR里全部类型都支持了,所以你需要删除掉这类断言单测。 Paddle/test/legacy_test/test_broadcast_tensors_op.py Lines 383 to 407 in cc707ac
|
原来如此,非常感谢!😘我将修改它。 |
| @HydrogenSulfate Check approval (pull_request) 不通过😭 |
Approval 系类的首次不通过是正常的,因为是需要团队研发手动approve然后rerun才能通过的,建议关注下其它单测相关的检查 |
| @HydrogenSulfate 您好!我发现 测试用例: import paddle tensor1 = paddle.to_tensor([], dtype=paddle.complex64).reshape([0]) tensor2 = paddle.to_tensor(0.0, dtype=paddle.float32) tensor3 = paddle.to_tensor([], dtype=paddle.bool).reshape([0, 0]) paddle.broadcast_tensors([tensor1, tensor2, tensor3])kernel_data_type 解析为最大的 // paddle\phi\api\lib\data_transform.cc inline bool NeedTransformDataType(const DataType& input, const DataType& target, const TransformFlag& transform_flag) { return input != target && (transform_flag.need_trans_data_type() || ((target == DataType::COMPLEX64 || target == DataType::COMPLEX128) && (input != DataType::INT32 && input != DataType::INT64 && input != DataType::BOOL))); }目前没有什么好的解决办法。能否为 TransformFlag 增加 disable_trans_dtype 标记,但是这需要修改 ops.yaml 的解析逻辑,可能更麻烦…… |
这个是否暂时先认为不允许多种dtype作为输入?多种dtype的问题可能会在Q2进行讨论解决。 |
噢噢……是的,如果要改的话,改动的幅度会很大。在 #69908 中我认领的 的测试用例是多 dtype 的😖 我可以先关闭这个PR,并在另一个 PR 中提交仅对 0-size tensor 和 单输入 的支持。 |
这个可以在https://github.com/HydrogenSulfate/array-api-compat/blob/support_paddle/array_api_compat/paddle/_aliases.py这里单独写一个同名函数,在函数内处理下多dtype的情况,然后paddle框架目前就暂时只支持单个dtype好了 |
| 明白了,我将关闭这个 PR 。array_api_compat 库需要提交 PR 吗? |
可以先提交到我的这个仓库里 |
PR Category
Operator Mechanism
PR Types
Bug fixes
Description
该 pr 修复了
paddle.broadcast_tensors,为其增加了对 0-size tenosr、单个tensor、tensors 间不同 dtype 的支持。在此之前,使用array_api_tests/test_data_type_functions.py::test_broadcast_arrays将会引发形状不匹配、输入张量数量不足、数据类型不一致等问题。具体修改如下:
删除了
kernels/cpu/broadcast_tensors_kernel.cc与kernels/gpu/broadcast_tensors_kernel.cc,增加了与硬件和数据无关的内核注册kernels/broadcast_tensors_kernel.cc因为
broadcast_tensors允许多数据类型广播至同一形状(参考pytorch、numpy),BroadcastTensorsKernel应该是数据类型无关的,因此删除其模板 typename T,并增加数据分发函数DispatchBroadcast,以复用ApplyBroadcast函数将
PADDLE_ENFORCE_GT改为PADDLE_ENFORCE_GE以支持单个 Tensor删除
ops.yaml关于broadcast_tensors的data_type,增加了data_transformskip_transform,使其与数据类型无关,避免类型提升。修改编译后,测试结果如下: