From 233daf8c818353384fce7c581f7536bbe95c432f Mon Sep 17 00:00:00 2001 From: thunder95 <290844930@qq.com> Date: Tue, 9 Aug 2022 13:09:54 +0800 Subject: [PATCH 1/8] erfinv --- .../20220805_erfinv_op_optimization.md | 88 +++++++++++++++++++ 1 file changed, 88 insertions(+) create mode 100644 rfcs/OPs-Perf/20220805_erfinv_op_optimization.md diff --git a/rfcs/OPs-Perf/20220805_erfinv_op_optimization.md b/rfcs/OPs-Perf/20220805_erfinv_op_optimization.md new file mode 100644 index 000000000..acb595885 --- /dev/null +++ b/rfcs/OPs-Perf/20220805_erfinv_op_optimization.md @@ -0,0 +1,88 @@ +# erfinv OP性能优化设计文档 + + +| 基本信息 | 内容 | +| ------------------------------------------------------------ |--------------------------------------| +| 提交作者 | thunder95 | +| 提交时间 | 2022-08-05 | +| 版本号 | V1.0 | +| 依赖飞桨版本 | PaddleDevelop | +| 文件名 | 20220805_erfinv_optimization.md
| + + +# 1 背景与意义 + +目前Paddle中的Erfinv是通过Eigen组合实现,没有用到一些性能优化的技巧,存在性能优化的空间。 + +## 1.1 飞桨现状 + +当前性能如下表(基于PaddlePaddle develop分支): + +目前的实现有一定的性能优化空间,可以加入一些性能优化的技巧。当前forward性能如下表: + +| Case No. | device | input_shape | input_type | Paddle Perf(ms) | +|---|---|---|---|---| +| 1 | RTX 2070s | [-1L, 204800L] | float32 | 0.1438 | +| 2 | RTX 2070s |[10L, 20L, 30L, 40L, 5L, 6L] | float64 8| 8.6485 | + +API文档 https://www.paddlepaddle.org.cn/documentation/docs/zh/api/paddle/erfinv_cn.html#erfinv + +## 1.2 业内方案调研 + +Pytorch中对Erfinv算子的实现基于GPU计算, forward整体性能如下(基于pytorch v1.12): + +| Case No. | device | input_shape | input_type | Paddle Perf(ms) | +|---|---|---|---|---| +| 1 | RTX 2070s | [-1L, 204800L] | float32 | 0.0677 | +| 2 | RTX 2070s |[10L, 20L, 30L, 40L, 5L, 6L] | float64 | 2.7904 | + +## 1.3 对比分析 + +目前Paddle与Pytorch的API设计方案几乎相同,两种case下测试pytorch性能更优,理论上可以通过向量化读取和写入等手段进行优化,进一步提升算子性能。 + +# 2 设计方案与性能预期 + +## 2.1 关键模块与性能提升点 + +通过使用飞桨内部的Elementwise Kernel来进行计算。通过向量化读取、向量化写入以及gpu_launch_config.h中的线程配置方法对算子进行优化,预计提升1.2倍。 + +## 2.2 Host端计算流程 + +通过gpu_launch_config.h中的线程配置方法配置1D线程。 + +## 2.4 Device端计算流程 + +设备端通过kps::ReadData和kps::WriteData对数据进行读写,再对每个值进行erfinv计算。 + +# 3 测试和验收的考量 + +参考:[算子性能优化验收标准](http://agroup.baidu.com/paddle-perf/md/article/4892913) + + + +# 4 可行性分析和排期规划 + +时间和开发排期规划,主要milestone + +| No. | 开发内容 | 预期时间 | +|---|---|---| +| 1 | 理清Paddle中OP设计思路,同类产品中最佳设计方案 | 2022-08-05 | +| 2 | 完成开发文档设计 | 2022-08-08 | +| 3 | ndtri函数开发 | 2022-08-09 | +| 3 | 完成代码开发工作,并通过线程CI测试 | 2022-08-10 | + + + +# 5 影响面 + +待优化的算子独立运行,不涉及其他算子和模块的修改,API设计与之前保持一致。 + + +# 名词解释 + + +# 附件及参考资料 + +[1]. [OP Benchmark使用指南](https://github.com/PaddlePaddle/benchmark/blob/master/api/README.md) + + From 36f32a3e5705bb3099d6d5c1d5b7a00d78caca29 Mon Sep 17 00:00:00 2001 From: thunder95 <290844930@qq.com> Date: Tue, 9 Aug 2022 13:12:52 +0800 Subject: [PATCH 2/8] false commit --- .../20220805_erfinv_op_optimization.md | 88 ------------------- 1 file changed, 88 deletions(-) delete mode 100644 rfcs/OPs-Perf/20220805_erfinv_op_optimization.md diff --git a/rfcs/OPs-Perf/20220805_erfinv_op_optimization.md b/rfcs/OPs-Perf/20220805_erfinv_op_optimization.md deleted file mode 100644 index acb595885..000000000 --- a/rfcs/OPs-Perf/20220805_erfinv_op_optimization.md +++ /dev/null @@ -1,88 +0,0 @@ -# erfinv OP性能优化设计文档 - - -| 基本信息 | 内容 | -| ------------------------------------------------------------ |--------------------------------------| -| 提交作者 | thunder95 | -| 提交时间 | 2022-08-05 | -| 版本号 | V1.0 | -| 依赖飞桨版本 | PaddleDevelop | -| 文件名 | 20220805_erfinv_optimization.md
| - - -# 1 背景与意义 - -目前Paddle中的Erfinv是通过Eigen组合实现,没有用到一些性能优化的技巧,存在性能优化的空间。 - -## 1.1 飞桨现状 - -当前性能如下表(基于PaddlePaddle develop分支): - -目前的实现有一定的性能优化空间,可以加入一些性能优化的技巧。当前forward性能如下表: - -| Case No. | device | input_shape | input_type | Paddle Perf(ms) | -|---|---|---|---|---| -| 1 | RTX 2070s | [-1L, 204800L] | float32 | 0.1438 | -| 2 | RTX 2070s |[10L, 20L, 30L, 40L, 5L, 6L] | float64 8| 8.6485 | - -API文档 https://www.paddlepaddle.org.cn/documentation/docs/zh/api/paddle/erfinv_cn.html#erfinv - -## 1.2 业内方案调研 - -Pytorch中对Erfinv算子的实现基于GPU计算, forward整体性能如下(基于pytorch v1.12): - -| Case No. | device | input_shape | input_type | Paddle Perf(ms) | -|---|---|---|---|---| -| 1 | RTX 2070s | [-1L, 204800L] | float32 | 0.0677 | -| 2 | RTX 2070s |[10L, 20L, 30L, 40L, 5L, 6L] | float64 | 2.7904 | - -## 1.3 对比分析 - -目前Paddle与Pytorch的API设计方案几乎相同,两种case下测试pytorch性能更优,理论上可以通过向量化读取和写入等手段进行优化,进一步提升算子性能。 - -# 2 设计方案与性能预期 - -## 2.1 关键模块与性能提升点 - -通过使用飞桨内部的Elementwise Kernel来进行计算。通过向量化读取、向量化写入以及gpu_launch_config.h中的线程配置方法对算子进行优化,预计提升1.2倍。 - -## 2.2 Host端计算流程 - -通过gpu_launch_config.h中的线程配置方法配置1D线程。 - -## 2.4 Device端计算流程 - -设备端通过kps::ReadData和kps::WriteData对数据进行读写,再对每个值进行erfinv计算。 - -# 3 测试和验收的考量 - -参考:[算子性能优化验收标准](http://agroup.baidu.com/paddle-perf/md/article/4892913) - - - -# 4 可行性分析和排期规划 - -时间和开发排期规划,主要milestone - -| No. | 开发内容 | 预期时间 | -|---|---|---| -| 1 | 理清Paddle中OP设计思路,同类产品中最佳设计方案 | 2022-08-05 | -| 2 | 完成开发文档设计 | 2022-08-08 | -| 3 | ndtri函数开发 | 2022-08-09 | -| 3 | 完成代码开发工作,并通过线程CI测试 | 2022-08-10 | - - - -# 5 影响面 - -待优化的算子独立运行,不涉及其他算子和模块的修改,API设计与之前保持一致。 - - -# 名词解释 - - -# 附件及参考资料 - -[1]. [OP Benchmark使用指南](https://github.com/PaddlePaddle/benchmark/blob/master/api/README.md) - - From 23da46be0ab9fc2274ce90788cb797ce38ae1d38 Mon Sep 17 00:00:00 2001 From: thunder95 <290844930@qq.com> Date: Tue, 9 Aug 2022 13:54:23 +0800 Subject: [PATCH 3/8] erfinv --- .../20220805_erfinv_op_optimization.md | 88 +++++++++++++++++++ 1 file changed, 88 insertions(+) create mode 100644 rfcs/OPs-Perf/20220805_erfinv_op_optimization.md diff --git a/rfcs/OPs-Perf/20220805_erfinv_op_optimization.md b/rfcs/OPs-Perf/20220805_erfinv_op_optimization.md new file mode 100644 index 000000000..acb595885 --- /dev/null +++ b/rfcs/OPs-Perf/20220805_erfinv_op_optimization.md @@ -0,0 +1,88 @@ +# erfinv OP性能优化设计文档 + + +| 基本信息 | 内容 | +| ------------------------------------------------------------ |--------------------------------------| +| 提交作者 | thunder95 | +| 提交时间 | 2022-08-05 | +| 版本号 | V1.0 | +| 依赖飞桨版本 | PaddleDevelop | +| 文件名 | 20220805_erfinv_optimization.md
| + + +# 1 背景与意义 + +目前Paddle中的Erfinv是通过Eigen组合实现,没有用到一些性能优化的技巧,存在性能优化的空间。 + +## 1.1 飞桨现状 + +当前性能如下表(基于PaddlePaddle develop分支): + +目前的实现有一定的性能优化空间,可以加入一些性能优化的技巧。当前forward性能如下表: + +| Case No. | device | input_shape | input_type | Paddle Perf(ms) | +|---|---|---|---|---| +| 1 | RTX 2070s | [-1L, 204800L] | float32 | 0.1438 | +| 2 | RTX 2070s |[10L, 20L, 30L, 40L, 5L, 6L] | float64 8| 8.6485 | + +API文档 https://www.paddlepaddle.org.cn/documentation/docs/zh/api/paddle/erfinv_cn.html#erfinv + +## 1.2 业内方案调研 + +Pytorch中对Erfinv算子的实现基于GPU计算, forward整体性能如下(基于pytorch v1.12): + +| Case No. | device | input_shape | input_type | Paddle Perf(ms) | +|---|---|---|---|---| +| 1 | RTX 2070s | [-1L, 204800L] | float32 | 0.0677 | +| 2 | RTX 2070s |[10L, 20L, 30L, 40L, 5L, 6L] | float64 | 2.7904 | + +## 1.3 对比分析 + +目前Paddle与Pytorch的API设计方案几乎相同,两种case下测试pytorch性能更优,理论上可以通过向量化读取和写入等手段进行优化,进一步提升算子性能。 + +# 2 设计方案与性能预期 + +## 2.1 关键模块与性能提升点 + +通过使用飞桨内部的Elementwise Kernel来进行计算。通过向量化读取、向量化写入以及gpu_launch_config.h中的线程配置方法对算子进行优化,预计提升1.2倍。 + +## 2.2 Host端计算流程 + +通过gpu_launch_config.h中的线程配置方法配置1D线程。 + +## 2.4 Device端计算流程 + +设备端通过kps::ReadData和kps::WriteData对数据进行读写,再对每个值进行erfinv计算。 + +# 3 测试和验收的考量 + +参考:[算子性能优化验收标准](http://agroup.baidu.com/paddle-perf/md/article/4892913) + + + +# 4 可行性分析和排期规划 + +时间和开发排期规划,主要milestone + +| No. | 开发内容 | 预期时间 | +|---|---|---| +| 1 | 理清Paddle中OP设计思路,同类产品中最佳设计方案 | 2022-08-05 | +| 2 | 完成开发文档设计 | 2022-08-08 | +| 3 | ndtri函数开发 | 2022-08-09 | +| 3 | 完成代码开发工作,并通过线程CI测试 | 2022-08-10 | + + + +# 5 影响面 + +待优化的算子独立运行,不涉及其他算子和模块的修改,API设计与之前保持一致。 + + +# 名词解释 + + +# 附件及参考资料 + +[1]. [OP Benchmark使用指南](https://github.com/PaddlePaddle/benchmark/blob/master/api/README.md) + + From e3dc6b8c5af8a996376be677a4040f5e6c730bf1 Mon Sep 17 00:00:00 2001 From: thunder95 <290844930@qq.com> Date: Tue, 9 Aug 2022 13:56:06 +0800 Subject: [PATCH 4/8] false commit --- .../20220805_erfinv_op_optimization.md | 88 ------------------- 1 file changed, 88 deletions(-) delete mode 100644 rfcs/OPs-Perf/20220805_erfinv_op_optimization.md diff --git a/rfcs/OPs-Perf/20220805_erfinv_op_optimization.md b/rfcs/OPs-Perf/20220805_erfinv_op_optimization.md deleted file mode 100644 index acb595885..000000000 --- a/rfcs/OPs-Perf/20220805_erfinv_op_optimization.md +++ /dev/null @@ -1,88 +0,0 @@ -# erfinv OP性能优化设计文档 - - -| 基本信息 | 内容 | -| ------------------------------------------------------------ |--------------------------------------| -| 提交作者 | thunder95 | -| 提交时间 | 2022-08-05 | -| 版本号 | V1.0 | -| 依赖飞桨版本 | PaddleDevelop | -| 文件名 | 20220805_erfinv_optimization.md
| - - -# 1 背景与意义 - -目前Paddle中的Erfinv是通过Eigen组合实现,没有用到一些性能优化的技巧,存在性能优化的空间。 - -## 1.1 飞桨现状 - -当前性能如下表(基于PaddlePaddle develop分支): - -目前的实现有一定的性能优化空间,可以加入一些性能优化的技巧。当前forward性能如下表: - -| Case No. | device | input_shape | input_type | Paddle Perf(ms) | -|---|---|---|---|---| -| 1 | RTX 2070s | [-1L, 204800L] | float32 | 0.1438 | -| 2 | RTX 2070s |[10L, 20L, 30L, 40L, 5L, 6L] | float64 8| 8.6485 | - -API文档 https://www.paddlepaddle.org.cn/documentation/docs/zh/api/paddle/erfinv_cn.html#erfinv - -## 1.2 业内方案调研 - -Pytorch中对Erfinv算子的实现基于GPU计算, forward整体性能如下(基于pytorch v1.12): - -| Case No. | device | input_shape | input_type | Paddle Perf(ms) | -|---|---|---|---|---| -| 1 | RTX 2070s | [-1L, 204800L] | float32 | 0.0677 | -| 2 | RTX 2070s |[10L, 20L, 30L, 40L, 5L, 6L] | float64 | 2.7904 | - -## 1.3 对比分析 - -目前Paddle与Pytorch的API设计方案几乎相同,两种case下测试pytorch性能更优,理论上可以通过向量化读取和写入等手段进行优化,进一步提升算子性能。 - -# 2 设计方案与性能预期 - -## 2.1 关键模块与性能提升点 - -通过使用飞桨内部的Elementwise Kernel来进行计算。通过向量化读取、向量化写入以及gpu_launch_config.h中的线程配置方法对算子进行优化,预计提升1.2倍。 - -## 2.2 Host端计算流程 - -通过gpu_launch_config.h中的线程配置方法配置1D线程。 - -## 2.4 Device端计算流程 - -设备端通过kps::ReadData和kps::WriteData对数据进行读写,再对每个值进行erfinv计算。 - -# 3 测试和验收的考量 - -参考:[算子性能优化验收标准](http://agroup.baidu.com/paddle-perf/md/article/4892913) - - - -# 4 可行性分析和排期规划 - -时间和开发排期规划,主要milestone - -| No. | 开发内容 | 预期时间 | -|---|---|---| -| 1 | 理清Paddle中OP设计思路,同类产品中最佳设计方案 | 2022-08-05 | -| 2 | 完成开发文档设计 | 2022-08-08 | -| 3 | ndtri函数开发 | 2022-08-09 | -| 3 | 完成代码开发工作,并通过线程CI测试 | 2022-08-10 | - - - -# 5 影响面 - -待优化的算子独立运行,不涉及其他算子和模块的修改,API设计与之前保持一致。 - - -# 名词解释 - - -# 附件及参考资料 - -[1]. [OP Benchmark使用指南](https://github.com/PaddlePaddle/benchmark/blob/master/api/README.md) - - From 40b5580db293164913ef4ec0b95b674839eebccc Mon Sep 17 00:00:00 2001 From: thunder95 <290844930@qq.com> Date: Mon, 6 Mar 2023 00:19:50 +0800 Subject: [PATCH 5/8] sparse_is_nan rfc --- ...0305_api_design_for_paddle_sparse_isnan.md | 98 +++++++++++++++++++ 1 file changed, 98 insertions(+) create mode 100644 rfcs/APIs/20230305_api_design_for_paddle_sparse_isnan.md diff --git a/rfcs/APIs/20230305_api_design_for_paddle_sparse_isnan.md b/rfcs/APIs/20230305_api_design_for_paddle_sparse_isnan.md new file mode 100644 index 000000000..37e2a030a --- /dev/null +++ b/rfcs/APIs/20230305_api_design_for_paddle_sparse_isnan.md @@ -0,0 +1,98 @@ +# paddle.sparse.is_nan 设计文档 + +| API名称 | paddle.sparse.is_nan | +| ------------------------------------------------------------ | ------------------------------------------------- | +| 提交作者 | thunder95 | +| 提交时间 | 2023-03-05 | +| 版本号 | V1.0 | +| 依赖飞桨版本 | Develop | +| 文件名 | 20230305_api_design_for_paddle_sparse_isnan.md
| + + +# 一、概述 + +## 1、相关背景 + +is_nan 是一个检查输入稀疏 Tensor 的每一个值是否为 +/-NaN 。目前在 PaddlePaddle 种,没有稀疏涨量的is_nan计算逻辑。 +针对 Paddle 的两种稀疏 Tensor 格式 COO 与 CSR ,都需新增 reshape 的计算逻辑,一共需要新增 2个 kernel 的前向与反向。 + +## 2、功能目标 + +在飞桨中增加 paddle.sparse.is_nan API。 + +## 3、意义 + +飞桨将支持 paddle.sparse.is_nan API。 + +# 二、飞桨现状 + +目前飞桨还没有稀疏张量的 is_nan 操作。 + + +# 三、业内方案调研 + +Pytorch, Tensorflow, Scipy都没有直接实现对稀疏张量的 is_nan 的一元操作。 + +# 四、对比分析 + +Pytorch, Tensorflow, Scipy虽然对于稠密张量支持is_nan操作,但都没有直接实现对稀疏张量的 is_nan 的一元操作。 +在 PaddlePaddle 中将对这个算子操作进行支持。 + +# 五、设计思路与实现方案 + +## 命名与参数设计 + +sparse is_nan 这个稀疏张量上的方法的命名和参数不需要额外设计,在 paddle/phi/api/yaml 下新增注册该算子的前向和反向。 + +## 底层OP设计 + +新增两个 Kernel: + +``` cpp +SparseCooTensor IsnanCoo(const Context& dev_ctx,const SparseCooTensor& x) { + SparseCooTensor coo; + IsnanCooKernel(dev_ctx, x, shape, &coo); + return coo; +} +``` + +```cpp +SparseCsrTensor IsnanCsr(const Context& dev_ctx,const SparseCsrTensor& x) { + SparseCsrTensor csr; + IsnanCsrKernel(dev_ctx, x, shape, &csr); + return csr; +} +``` + +在前向推理中,一元操作的实现较简单,取出 DenseTensor 类型的 non_zero_elements() 后,逐元素进行 is_nan 操作,并创建新的稀疏张量即可。 +在反向梯度传播里, 只对+/-NaN的元素进行梯度为1.0的数值进行反向传播,对于非NaN数值的元素设置梯度为0.0. + +## API实现方案 + +在 Paddle repo 的 python/paddle/sparse/unary.py 文件中新增api: + +```cpp +@dygraph_only +def is_nan(x, name=None): + return _C_ops.sparse_is_nan(x) +``` + +# 六、测试和验收的考量 + +测试考虑的case如下: + +- 数值正确性 + +# 七、可行性分析和排期规划 + +前两周实现代码、文档和测试。 + +第三周进行 Code Review 和继续迭代。 + +# 八、影响面 + +对其它模块没有影响。 + +# 名词解释 + +# 附件及参考资料 From b1681e7fb078c534df25eed5191f008bb8456765 Mon Sep 17 00:00:00 2001 From: thunder95 <290844930@qq.com> Date: Fri, 10 Mar 2023 01:10:16 +0800 Subject: [PATCH 6/8] upd --- ...0305_api_design_for_paddle_sparse_isnan.md | 66 ++++++++++++------- 1 file changed, 44 insertions(+), 22 deletions(-) diff --git a/rfcs/APIs/20230305_api_design_for_paddle_sparse_isnan.md b/rfcs/APIs/20230305_api_design_for_paddle_sparse_isnan.md index 37e2a030a..ab9851f9e 100644 --- a/rfcs/APIs/20230305_api_design_for_paddle_sparse_isnan.md +++ b/rfcs/APIs/20230305_api_design_for_paddle_sparse_isnan.md @@ -13,8 +13,8 @@ ## 1、相关背景 -is_nan 是一个检查输入稀疏 Tensor 的每一个值是否为 +/-NaN 。目前在 PaddlePaddle 种,没有稀疏涨量的is_nan计算逻辑。 -针对 Paddle 的两种稀疏 Tensor 格式 COO 与 CSR ,都需新增 reshape 的计算逻辑,一共需要新增 2个 kernel 的前向与反向。 +is_nan 检查输入Tensor 的每一个值是否为 +/-NaN, 并返回布尔型结果。目前在 PaddlePaddle 中,对于稀疏Tensor还没有支持isnan的API。 +针对 Paddle 的两种稀疏 Tensor 格式 COO 与 CSR ,都需新增 isnan 的计算逻辑,一共需要新增 2个 kernel 的前向。 ## 2、功能目标 @@ -31,57 +31,79 @@ is_nan 是一个检查输入稀疏 Tensor 的每一个值是否为 +/-NaN 。 # 三、业内方案调研 -Pytorch, Tensorflow, Scipy都没有直接实现对稀疏张量的 is_nan 的一元操作。 +Tensorflow, Scipy都没有直接实现对稀疏张量的 is_nan 的一元操作。 + +Pytorch对于很多zero-preserving unary function支持COO/CSR/CSC/BSR/CSR等多种数据格式的稀疏张量计算,其中也包括isnan,可直接使用dense tensor中的torch.isnan API。 + +``` python +import torch +t = torch.tensor([[[0., 0], [1., 2.]], [[0., 0], [3., float('nan')]]]) +x = t.to_sparse(sparse_dim=2) +torch.isnan(x) +``` # 四、对比分析 -Pytorch, Tensorflow, Scipy虽然对于稠密张量支持is_nan操作,但都没有直接实现对稀疏张量的 is_nan 的一元操作。 -在 PaddlePaddle 中将对这个算子操作进行支持。 +Tensorflow, Scipy虽然对于稠密张量支持is_nan操作,但都没有直接实现对稀疏张量的 is_nan 的一元操作。 +在 PaddlePaddle 中可以参考Pytorch将对这个算子操作进行支持。 + # 五、设计思路与实现方案 ## 命名与参数设计 -sparse is_nan 这个稀疏张量上的方法的命名和参数不需要额外设计,在 paddle/phi/api/yaml 下新增注册该算子的前向和反向。 +sparse is_nan 这个稀疏张量上的方法的命名和参数不需要额外设计,由于在判断isnan时,此处不可导,所以不考虑反向算子的实现。在 paddle/phi/api/yaml 下新增注册该算子的前向。 +``` yaml + - op : isnan + args : (Tensor x) + output : Tensor(out) + infer_meta : + func : IsfiniteInferMeta + param: [x] + kernel : + func : isnan_coo{sparse_coo -> sparse_coo}, + isnan_csr{sparse_csr -> sparse_csr} + layout : x + backward : null +``` ## 底层OP设计 新增两个 Kernel: ``` cpp -SparseCooTensor IsnanCoo(const Context& dev_ctx,const SparseCooTensor& x) { - SparseCooTensor coo; - IsnanCooKernel(dev_ctx, x, shape, &coo); - return coo; -} -``` +IsnanCooKernel(const Context& dev_ctx, + const SparseCooTensor& x, + SparseCooTensor* out) -```cpp -SparseCsrTensor IsnanCsr(const Context& dev_ctx,const SparseCsrTensor& x) { - SparseCsrTensor csr; - IsnanCsrKernel(dev_ctx, x, shape, &csr); - return csr; -} +IsnanCsrKernel(const Context& dev_ctx, + const SparseCsrTensor& x, + SparseCsrTensor* out) ``` 在前向推理中,一元操作的实现较简单,取出 DenseTensor 类型的 non_zero_elements() 后,逐元素进行 is_nan 操作,并创建新的稀疏张量即可。 -在反向梯度传播里, 只对+/-NaN的元素进行梯度为1.0的数值进行反向传播,对于非NaN数值的元素设置梯度为0.0. + + ## API实现方案 -在 Paddle repo 的 python/paddle/sparse/unary.py 文件中新增api: +参考unary_kernel.cc中其他一元算子的实现,可以批量注册复用dense kernel。 + +在 Paddle repo 的 python/paddle/sparse/unary.py 文件中新增api, 支持静态图和动态图: ```cpp -@dygraph_only def is_nan(x, name=None): return _C_ops.sparse_is_nan(x) ``` # 六、测试和验收的考量 -测试考虑的case如下: +新增单测代码 python/paddle/fluid/tests/unittests/test_sparse_is_nan.py, 测试考虑的case如下: - 数值正确性 +- COO和CSR数据格式 +- 不同输入tensor的数据类型下检查输出结果 +- 计算结果与dense tensor进行比较 # 七、可行性分析和排期规划 From 14e8390da067080576a50ae45697f1fd62d9721c Mon Sep 17 00:00:00 2001 From: thunder95 <290844930@qq.com> Date: Fri, 10 Mar 2023 01:20:44 +0800 Subject: [PATCH 7/8] =?UTF-8?q?upd=EF=BC=92?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- rfcs/APIs/20230305_api_design_for_paddle_sparse_isnan.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/rfcs/APIs/20230305_api_design_for_paddle_sparse_isnan.md b/rfcs/APIs/20230305_api_design_for_paddle_sparse_isnan.md index ab9851f9e..35e7639cc 100644 --- a/rfcs/APIs/20230305_api_design_for_paddle_sparse_isnan.md +++ b/rfcs/APIs/20230305_api_design_for_paddle_sparse_isnan.md @@ -53,6 +53,10 @@ Tensorflow, Scipy虽然对于稠密张量支持is_nan操作,但都没有直接 ## 命名与参数设计 sparse is_nan 这个稀疏张量上的方法的命名和参数不需要额外设计,由于在判断isnan时,此处不可导,所以不考虑反向算子的实现。在 paddle/phi/api/yaml 下新增注册该算子的前向。 + +API命名为paddle.sparse.is_nan, 接口参数支持两个参数,x (Tensor) - 输入的 Tensor,数据类型为:float16、float32、float64、int32、int64。 +name (str,可选) - 具体用法请参见 Name,一般无需设置,默认值为 None。 + ``` yaml - op : isnan args : (Tensor x) From 67b78724605b36b83531c46ccc987773795c7d92 Mon Sep 17 00:00:00 2001 From: thunder95 <290844930@qq.com> Date: Fri, 10 Mar 2023 22:56:16 +0800 Subject: [PATCH 8/8] is_nan to isnan --- ...0305_api_design_for_paddle_sparse_isnan.md | 31 +++++++++---------- 1 file changed, 15 insertions(+), 16 deletions(-) diff --git a/rfcs/APIs/20230305_api_design_for_paddle_sparse_isnan.md b/rfcs/APIs/20230305_api_design_for_paddle_sparse_isnan.md index 35e7639cc..afebee8bf 100644 --- a/rfcs/APIs/20230305_api_design_for_paddle_sparse_isnan.md +++ b/rfcs/APIs/20230305_api_design_for_paddle_sparse_isnan.md @@ -1,6 +1,6 @@ -# paddle.sparse.is_nan 设计文档 +# paddle.sparse.isnan 设计文档 -| API名称 | paddle.sparse.is_nan | +| API名称 | paddle.sparse.isnan | | ------------------------------------------------------------ | ------------------------------------------------- | | 提交作者 | thunder95 | | 提交时间 | 2023-03-05 | @@ -13,25 +13,25 @@ ## 1、相关背景 -is_nan 检查输入Tensor 的每一个值是否为 +/-NaN, 并返回布尔型结果。目前在 PaddlePaddle 中,对于稀疏Tensor还没有支持isnan的API。 +isnan 检查输入Tensor 的每一个值是否为 +/-NaN, 并返回布尔型结果。目前在 PaddlePaddle 中,对于稀疏Tensor还没有支持isnan的API。 针对 Paddle 的两种稀疏 Tensor 格式 COO 与 CSR ,都需新增 isnan 的计算逻辑,一共需要新增 2个 kernel 的前向。 ## 2、功能目标 -在飞桨中增加 paddle.sparse.is_nan API。 +在飞桨中增加 paddle.sparse.isnan API。 ## 3、意义 -飞桨将支持 paddle.sparse.is_nan API。 +飞桨将支持 paddle.sparse.isnan API。 # 二、飞桨现状 -目前飞桨还没有稀疏张量的 is_nan 操作。 +目前飞桨还没有稀疏张量的 isnan 操作。 # 三、业内方案调研 -Tensorflow, Scipy都没有直接实现对稀疏张量的 is_nan 的一元操作。 +Tensorflow, Scipy都没有直接实现对稀疏张量的 isnan 的一元操作。 Pytorch对于很多zero-preserving unary function支持COO/CSR/CSC/BSR/CSR等多种数据格式的稀疏张量计算,其中也包括isnan,可直接使用dense tensor中的torch.isnan API。 @@ -44,7 +44,7 @@ torch.isnan(x) # 四、对比分析 -Tensorflow, Scipy虽然对于稠密张量支持is_nan操作,但都没有直接实现对稀疏张量的 is_nan 的一元操作。 +Tensorflow, Scipy虽然对于稠密张量支持isnan操作,但都没有直接实现对稀疏张量的 isnan 的一元操作。 在 PaddlePaddle 中可以参考Pytorch将对这个算子操作进行支持。 @@ -52,9 +52,9 @@ Tensorflow, Scipy虽然对于稠密张量支持is_nan操作,但都没有直接 ## 命名与参数设计 -sparse is_nan 这个稀疏张量上的方法的命名和参数不需要额外设计,由于在判断isnan时,此处不可导,所以不考虑反向算子的实现。在 paddle/phi/api/yaml 下新增注册该算子的前向。 +sparse isnan 这个稀疏张量上的方法的命名和参数不需要额外设计,由于在判断isnan时,此处不可导,所以不考虑反向算子的实现。在 paddle/phi/api/yaml 下新增注册该算子的前向。 -API命名为paddle.sparse.is_nan, 接口参数支持两个参数,x (Tensor) - 输入的 Tensor,数据类型为:float16、float32、float64、int32、int64。 +API命名为paddle.sparse.isnan, 接口参数支持两个参数,x (Tensor) - 输入的 Tensor,数据类型为:float16、float32、float64、int32、int64。 name (str,可选) - 具体用法请参见 Name,一般无需设置,默认值为 None。 ``` yaml @@ -62,13 +62,12 @@ name (str,可选) - 具体用法请参见 Name,一般无需设置,默认 args : (Tensor x) output : Tensor(out) infer_meta : - func : IsfiniteInferMeta + func : UnchangedInferMeta param: [x] kernel : func : isnan_coo{sparse_coo -> sparse_coo}, isnan_csr{sparse_csr -> sparse_csr} layout : x - backward : null ``` ## 底层OP设计 @@ -85,7 +84,7 @@ IsnanCsrKernel(const Context& dev_ctx, SparseCsrTensor* out) ``` -在前向推理中,一元操作的实现较简单,取出 DenseTensor 类型的 non_zero_elements() 后,逐元素进行 is_nan 操作,并创建新的稀疏张量即可。 +在前向推理中,一元操作的实现较简单,取出 DenseTensor 类型的 non_zero_elements() 后,逐元素进行 isnan 操作,并创建新的稀疏张量即可。 @@ -96,13 +95,13 @@ IsnanCsrKernel(const Context& dev_ctx, 在 Paddle repo 的 python/paddle/sparse/unary.py 文件中新增api, 支持静态图和动态图: ```cpp -def is_nan(x, name=None): - return _C_ops.sparse_is_nan(x) +def isnan(x, name=None): + return _C_ops.sparse_isnan(x) ``` # 六、测试和验收的考量 -新增单测代码 python/paddle/fluid/tests/unittests/test_sparse_is_nan.py, 测试考虑的case如下: +新增单测代码 python/paddle/fluid/tests/unittests/test_sparse_isnan.py, 测试考虑的case如下: - 数值正确性 - COO和CSR数据格式