Skip to content
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.13-17:paddle.mean、paddle.sum、paddle.prod、paddle.var、paddle.std #71504

Open
wants to merge 15 commits into
base: develop
Choose a base branch
from

Conversation

cangtianhuang
Copy link

@cangtianhuang cangtianhuang commented Mar 8, 2025

PR Category

Operator Mechanism

PR Types

Bug fixes

Description

该 PR 主要修改了 paddle.meanpaddle.sumpaddle.prodpaddle.varpaddle.stdreduce 方法的相关代码与内核,使其支持处理 0-size Tensor 。C++ 侧修改了多个前向 kernel,但未修改反向 kernel ;Python 侧在 var 方法处做了一个巧妙的小修改。

期望的值:("mean", float("nan")), ("prod", 1), ("std", float("nan")), ("sum", 0), ("var", float("nan")),

具体修改如下:

1. paddle.mean

修改了 phi 库的 C++ 前向 kernel,包括 cpu、kps、onednn、xpu 等多设备。为了增强算子 kernel 的复用,修改集中在了底层的 MeanRawKernel 处。

paddle\phi\kernels\cpu\reduce_mean_kernel.ccpaddle\phi\kernels\kps\reduce_kernel.cupaddle\phi\kernels\onednn\reduce_mean_kernel.ccpaddle\phi\kernels\xpu\reduce_mean_kernel.cc 中,增加了对 0-size Tensor 的处理逻辑。由于输出形状已经由 SumRawInferMeta 正确推断并保存在 DenseTensor* out 中,因此无需增加额外推断逻辑,直接调用 FullKernel,填充 NaN 值并返回。

此外 ,onednn 的 FullKernel (位于 paddle\phi\kernels\onednn\full_kernel.cc)原先不支持 phi::dtype::bfloat16 类型,为其增添了注册类型。

2. paddle.sum

paddle.mean 修改思路一致,修改了 phi 库的 C++ 前向 kernel,修改集中在 SumRawKernel 处。

paddle\phi\kernels\cpu\reduce_sum_kernel.ccpaddle\phi\kernels\kps\reduce_kernel.cupaddle\phi\kernels\onednn\reduce_sum_kernel.ccpaddle\phi\kernels\xpu\reduce_sum_kernel.cc 中,增加了对 0-size Tensor 的处理逻辑,直接调用 FullKernel,填充 0 值并返回。

#70379 中为 SumRawKernel 添加了较多的 0-size Tensor 推断逻辑,我认为这是不必要的并删去了冗余部分。

3. paddle.prod

paddle.mean 修改思路一致,修改了 phi 库的 C++ 前向 kernel,修改集中在 ProdKernel 处。

paddle\phi\kernels\cpu\prod_kernel.ccpaddle\phi\kernels\kps\reduce_kernel.cupaddle\phi\kernels\xpu\prod_kernel.cc 中(onednn 中没有 ProdKernel ),增加了对 0-size Tensor 的处理逻辑,直接调用 FullKernel,填充 1 值并返回。

4. paddle.var

在 C++ 侧, paddle.var 不存在单独的多设备算子,而是由 VarianceKernel 执行并调用 MeanSubtractMultiplyMeanKernel 执行。因此直接在 paddle\phi\kernels\reduce_variance_kernel.cc 处增加了对 0-size Tensor 的处理逻辑,调用 FullKernel 填充 NaN 值并返回。

在 Python 侧,在 python\paddle\tensor\stat.py 中为了确保动静图一致,且保持性能不下降,对无偏时 n > one_const 处做了一个巧妙的修改,使得当 n<=1 时 n 值不变( unbiased = True 时,n=1 无法无偏,n=0out/0 得到期望的 NaN 值; unbiased = False 时,n=0 out/0 也得到期望的 NaN 值),确保形状与数值永远满足期望。

5. paddle.std

在 Python 侧,paddle.std 调用 paddle.var 并开方,对于 0-size Tensor NaN 开方后仍旧为 NaN ,因此代码不变。

经测试, paddle.meanpaddle.sumpaddle.prodpaddle.varpaddle.std 通过了 “0-size tensorAPI 支持 0-size Tensor No.13-17” 的测试。且在 [], [0,], [0, 3], [2, 0, 4] 等多个 0-size Tensor 形状中表现与预期一致。

单测:
image

自己编写的测试:
image

Copy link

paddle-bot bot commented Mar 8, 2025

你的PR提交成功,感谢你对开源项目的贡献!
请关注后续CI自动化测试结果,详情请参考Paddle-CI手册
Your PR has been submitted. Thanks for your contribution!
Please wait for the result of CI firstly. See Paddle CI Manual for details.

@paddle-bot paddle-bot bot added the contributor External developers label Mar 8, 2025
@cangtianhuang
Copy link
Author

python侧的修改降低了api性能……

@cangtianhuang cangtianhuang reopened this Mar 9, 2025
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
contributor External developers
Projects
None yet
Development

Successfully merging this pull request may close these issues.

1 participant