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数据格式