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

【PaddlePaddle Hackathon 2】59、为 Paddle 添加稀疏算子divide #40272

Closed
TCChenlong opened this issue Mar 8, 2022 · 8 comments
Closed

Comments

@TCChenlong
Copy link
Contributor

TCChenlong commented Mar 8, 2022

(此 ISSUE 为 PaddlePaddle Hackathon 第二期活动的任务 ISSUE,更多详见 【PaddlePaddle Hackathon 第二期】任务总览

【任务说明】

  • 任务标题:为 Paddle 添加稀疏算子divide
  • 技术标签:深度学习框架,c++, python
  • 任务难度:中等
  • 详细描述: divide 是一个基础除法运算操作,目前 Paddle 中还没有 sparse 的除法算子。本任务的目标是在 Paddle中添加 sparse.divide 算子,实现输入是两个SparseCooTensor或者两个SparseCsrTensor逐元素相除的功能。调用路径:paddle.sparse.divide。

【提交内容】

【技术要求】

  • 了解 Paddle 算子开发流程
  • 熟练掌握 C++,Python

【参考内容】

【答疑交流】

  • 如果在开发中对于上述任务有任何问题,欢迎在本 ISSUE 下留言交流。
  • 对于开发中的共性问题,在活动过程中,会定期组织答疑,请大家关注官网&QQ群的通知,及时参与。
@paddle-bot-old
Copy link

paddle-bot-old bot commented Mar 8, 2022

您好,我们已经收到了您的问题,会安排技术人员尽快解答您的问题,请耐心等待。请您再次检查是否提供了清晰的问题描述、复现代码、环境&版本、报错信息等。同时,您也可以通过查看官网API文档常见问题历史IssueAI社区来寻求解答。祝您生活愉快~

Hi! We've received your issue and please be patient to get responded. We will arrange technicians to answer your questions as soon as possible. Please make sure that you have posted enough message to demo your request. You may also check out the APIFAQGithub Issue and AI community to get the answer.Have a nice day!

@gsq7474741
Copy link
Contributor

@zkh2016 您好,我看到torch目前只支持sparse tensor对scalar进行除法,

RuntimeError: sparse division only supports division by a scalar (got shape [6, 6] for argument 'other')

不知此处任务要求实现的逐元素除法在两个对应元素都为0的时候怎么处理

@zkh2016
Copy link
Contributor

zkh2016 commented Apr 13, 2022

@zkh2016 您好,我看到torch目前只支持sparse tensor对scalar进行除法,

RuntimeError: sparse division only supports division by a scalar (got shape [6, 6] for argument 'other')

不知此处任务要求实现的逐元素除法在两个对应元素都为0的时候怎么处理

可以参考paddle.divide,out = paddle.divide(x, y),当y中有0的时候,对应位置返回inf。C++端可以参考DivideKernel和DivideFunctor的处理。

@gsq7474741
Copy link
Contributor

@zkh2016 您好,我看到torch目前只支持sparse tensor对scalar进行除法,

RuntimeError: sparse division only supports division by a scalar (got shape [6, 6] for argument 'other')

不知此处任务要求实现的逐元素除法在两个对应元素都为0的时候怎么处理

可以参考paddle.divide,out = paddle.divide(x, y),当y中有0的时候,对应位置返回inf。C++端可以参考DivideKernel和DivideFunctor的处理。

@zkh2016 经过测试,x不为0而y为0的位置会得到inf,和dense tensor没有区别,问题是两个稀疏tensor对应都为0的位置,如果按dense的算法除出来是nan,但是稀疏tensor压缩了0元素,不会对x, y都为0的位置进行运算,所以还原成dense tensor后本应为nan的位置会还原成0,无法实现这样的返回,例如

在dense中:
[1, 0]     /   [1, 0]   =    [1, nan]
[0, 2]         [0, 1]         [nan, 2]

在sparse中:
[1, 0]     /   [1, 0]   =    [1, 0]
[0, 2]         [0, 1]         [0, 2]

因为实际运算中是:
[1, 2]  /  [1, 1]  =  [1, 2]
还原成dense就会填充0

请问这里怎么处理,还是说这种两个稀疏tensor对应位置为0的除法是没有意义的,忽略即可
感谢解答

@zkh2016
Copy link
Contributor

zkh2016 commented Apr 13, 2022

@zkh2016 您好,我看到torch目前只支持sparse tensor对scalar进行除法,

RuntimeError: sparse division only supports division by a scalar (got shape [6, 6] for argument 'other')

不知此处任务要求实现的逐元素除法在两个对应元素都为0的时候怎么处理

可以参考paddle.divide,out = paddle.divide(x, y),当y中有0的时候,对应位置返回inf。C++端可以参考DivideKernel和DivideFunctor的处理。

@zkh2016 经过测试,x不为0而y为0的位置会得到inf,和dense tensor没有区别,问题是两个稀疏tensor对应都为0的位置,如果按dense的算法除出来是nan,但是稀疏tensor压缩了0元素,不会对x, y都为0的位置进行运算,所以还原成dense tensor后本应为nan的位置会还原成0,无法实现这样的返回,例如

在dense中:
[1, 0]     /   [1, 0]   =    [1, nan]
[0, 2]         [0, 1]         [nan, 2]

在sparse中:
[1, 0]     /   [1, 0]   =    [1, 0]
[0, 2]         [0, 1]         [0, 2]

因为实际运算中是:
[1, 2]  /  [1, 1]  =  [1, 2]
还原成dense就会填充0

请问这里怎么处理,还是说这种两个稀疏tensor对应位置为0的除法是没有意义的,忽略即可 感谢解答

这里应该是要保持elementwise除法的原本定义,sparse的除法应该把0考虑进去,[1, 0] / [1, 0] 这个应该等于[1, nan]。

@gsq7474741
Copy link
Contributor

@zkh2016 您好,我看到torch目前只支持sparse tensor对scalar进行除法,

RuntimeError: sparse division only supports division by a scalar (got shape [6, 6] for argument 'other')

不知此处任务要求实现的逐元素除法在两个对应元素都为0的时候怎么处理

可以参考paddle.divide,out = paddle.divide(x, y),当y中有0的时候,对应位置返回inf。C++端可以参考DivideKernel和DivideFunctor的处理。

@zkh2016 经过测试,x不为0而y为0的位置会得到inf,和dense tensor没有区别,问题是两个稀疏tensor对应都为0的位置,如果按dense的算法除出来是nan,但是稀疏tensor压缩了0元素,不会对x, y都为0的位置进行运算,所以还原成dense tensor后本应为nan的位置会还原成0,无法实现这样的返回,例如

在dense中:
[1, 0]     /   [1, 0]   =    [1, nan]
[0, 2]         [0, 1]         [nan, 2]

在sparse中:
[1, 0]     /   [1, 0]   =    [1, 0]
[0, 2]         [0, 1]         [0, 2]

因为实际运算中是:
[1, 2]  /  [1, 1]  =  [1, 2]
还原成dense就会填充0

请问这里怎么处理,还是说这种两个稀疏tensor对应位置为0的除法是没有意义的,忽略即可 感谢解答

这里应该是要保持elementwise除法的原本定义,sparse的除法应该把0考虑进去,[1, 0] / [1, 0] 这个应该等于[1, nan]。

问题1:这样的话在大规模稀疏tensor下要在结果中对每个xy都为0的位置存入nan,是否丧失了稀疏tensor压缩存储空间,提高运算效率的初衷
问题2:如果要保留除法本身定义的话,可否实现为:xy都转换为dense进行一般elementwise除法,然后再把结果转回稀疏tensor

@zkh2016
Copy link
Contributor

zkh2016 commented Apr 14, 2022

问题1:这样的话在大规模稀疏tensor下要在结果中对每个xy都为0的位置存入nan,是否丧失了稀疏tensor压缩存储空间,提高运算效率的初衷

sparse不应该改变基础的计算规则,计算结果应该和dense的一致,既然是逐元素除法就应该把每个元素都考虑进去的。有些sparse计算结果会变成dense的,这个正常。

问题2:如果要保留除法本身定义的话,可否实现为:xy都转换为dense进行一般elementwise除法,然后再把结果转回稀疏tensor

全部转成dense是一种比较容易实现的方法,但是需要多次格式转换,可以思考下只把y转换成dense进行计算是否效率会更高一些。

@gsq7474741
Copy link
Contributor

问题1:这样的话在大规模稀疏tensor下要在结果中对每个xy都为0的位置存入nan,是否丧失了稀疏tensor压缩存储空间,提高运算效率的初衷

sparse不应该改变基础的计算规则,计算结果应该和dense的一致,既然是逐元素除法就应该把每个元素都考虑进去的。有些sparse计算结果会变成dense的,这个正常。

问题2:如果要保留除法本身定义的话,可否实现为:xy都转换为dense进行一般elementwise除法,然后再把结果转回稀疏tensor

全部转成dense是一种比较容易实现的方法,但是需要多次格式转换,可以思考下只把y转换成dense进行计算是否效率会更高一些。

好滴 我研究研究

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

5 participants