PaddlePaddle/Paddle

飞桨框架API易用性提升开源任务

zhwesky2010 opened this issue · 40 comments

整体背景

大家好,为了提升模型迁移的效率,我们建设了 代码自动转换工具: PaddlePaddle Code Convert Toolkits,为了降低 代码自动转换工具 中转换规则Matcher的开发难度,我们需要对部分框架API的功能和易用性进行增强。

🍻 你需要做的是

我们已将任务记录在《在线任务明细表》,一共55个任务,其中 问题描述 这一列阐述了当前Paddle API的问题;修改方案 这一列阐述了该API的升级修改思路,即你需要开发的内容;预计成本 这一列阐述了该任务的预估难度及成本。大家可根据这三列信息,来评估和选择自己适合的任务,并自由认领任务,认领时直接在本issue下回复 任务ID 即可,欢迎大家来认领任务和提PR ~

✨ 注意:

  1. 该任务时间:PR 截止合入时间是2024/3/31。

  2. 开发流程与Paddle代码贡献流程完全一致,可参考Paddle官网文档:代码贡献流程

  3. API修改时,请注意同时修改 API中文文档(位于doc repo中)API英文文档

  4. PR请先通过CI检查后再发起review,避免增加不必要的review成本。

  5. PR标题格式:No.1~35 paddle.xxx易用性提升PR描述需要附上本issue,在提交PR后我们会内部指派reviewer,由该reviewer负责合入。

  6. 历史上的 good first issue 列表,也欢迎来提 PR 解决~ 欢迎联系花花加入社区,和我们一起快乐开源

image


Overall Background:

Hello everyone, in order to improve the efficiency of model migration, we have built a code auto-conversion tool: PaddlePaddle Code Convert Toolkits. To reduce the development difficulty of conversion rules Matcher in the code auto-conversion tool, we need to enhance the functionality and usability of some framework APIs.

What You Need to Do:

We have recorded the tasks in the Online Task Details, totaling 35 tasks. The "Issue" column explains the current issues with the Paddle API, the "Solution" column outlines the upgrade and modification approach for that API, which is what you need to develop. The "Workload Estimate" column describes the estimated difficulty and cost of the task. You can evaluate and choose tasks that suit you based on these three columns and freely claim tasks. When claiming a task, simply reply with the task ID in this issue. Welcome everyone to claim tasks and submit PRs~

Note:

  1. The deadline for this task: The PR deadline for merging is October 31, 2023.
  2. The development process is completely consistent with the Paddle code contribution process. You can refer to the Paddle official website documentation: Code Contribution Process.
  3. When modifying APIs, please remember to update the API Chinese documentation (located in the doc repo) and API English documentation at the same time.
  4. Please initiate a review only after passing the CI checks to avoid unnecessary review costs.
  5. PR Title Format: No.1~35 paddle.xxx usability improvement. PR descriptions should include a reference to this issue. After submitting a PR, we will internally assign a reviewer responsible for merging.
  6. List of historical good first issues is also welcome for PR solutions~ Feel free to contact Hua Hua to join the community and enjoy open source together!

🍻 任务列表(整体进度 8/34)

按 merge 的时间顺序,排名不分先后: @XavierZXY (1) @Liyulingyue (1) @enkilee (1) @YibinLiu666 (4)

任务 ID 认领人 Github Paddle PR 链接 中文文档 链接(如有)
01 ✅(2023/8/29) @XavierZXY #56681 #56736 PaddlePaddle/docs#6148
02
03✅(2023/8/29) @Liyulingyue #56470 #56728 PaddlePaddle/docs#6147
04
05✅(2023/10/17) @enkilee #56761
06✅ 验证后发现是参数的随机初始化导致结果不同,无需修改
07✅(2023/12/22) @YibinLiu666 #60084 PaddlePaddle/docs#6415
08
09✅(2023/11/13) @YibinLiu666 #58632 PaddlePaddle/docs#6291
10 @YibinLiu666
11
12
13
14 @YibinLiu666
15
16
17
18
19
20
21 @YibinLiu666 #60275
22
23
24
25
26
27✅(2023/12/4) @YibinLiu666 #59163
28
29
30
31
32
33 ✅(2023/12/19) @YibinLiu666 #60054
34
GreatV commented

@snorfyang 任务明细表还没更新,估计还需要一段时间。

在线任务明细表链接是不是错了 @zhwesky2010

你好,已更新在线任务明细表

GreatV commented

认领

序号 api 认领人 PR
26 paddle.linalg.solve @GreatV

认领

序号 api 认领人 PR
12 paddle.nn.utils.parameters_to_vector @enkilee #56761

@Ningsir 任务22的API paddle.distributed.rpc.shutdown 是之前你贡献的,请问有时间来增强功能么?

认领2

认领15-19

认领21

认领10 11

任务 No.14 中的问题:

  1. Pytorch margin 可以为负数。Pytorch 在文档上写的 margin 是 non-negative,但是可以传入负数,且正常计算不报错。Paddle 中加入了报错。
  2. 计算的 distance 可以为负数。Pytorch 中 anchor 与 positive 和 negative 分别计算出的 distance 可以为负数。Paddle 中同样也加入了判断会报错。
    以上两个问题的修改与 Pytorch 对齐即可吗

任务 No.14 中的问题:

  1. Pytorch margin 可以为负数。Pytorch 在文档上写的 margin 是 non-negative,但是可以传入负数,且正常计算不报错。Paddle 中加入了报错。
  2. 计算的 distance 可以为负数。Pytorch 中 anchor 与 positive 和 negative 分别计算出的 distance 可以为负数。Paddle 中同样也加入了判断会报错。
    以上两个问题的修改与 Pytorch 对齐即可吗

关于你说的这两个差异,需要看下torch可以设置为负数是否合理,如果合理的话paddle也是应该支持的

除了这两个差异外,https://github.com/PaddlePaddle/PaConvert/blob/master/tests/test_nn_functional_triplet_margin_with_distance_loss.py#L22-L79 这几个case计算出的结果,pytorch与paddle不同,还需要看下是否paddle计算得不对

任务 No.14 中的问题:

  1. Pytorch margin 可以为负数。Pytorch 在文档上写的 margin 是 non-negative,但是可以传入负数,且正常计算不报错。Paddle 中加入了报错。
  2. 计算的 distance 可以为负数。Pytorch 中 anchor 与 positive 和 negative 分别计算出的 distance 可以为负数。Paddle 中同样也加入了判断会报错。
    以上两个问题的修改与 Pytorch 对齐即可吗

关于你说的这两个差异,需要看下torch可以设置为负数是否合理,如果合理的话paddle也是应该支持的

除了这两个差异外,https://github.com/PaddlePaddle/PaConvert/blob/master/tests/test_nn_functional_triplet_margin_with_distance_loss.py#L22-L79 这几个case计算出的结果,pytorch与paddle不同,还需要看下是否paddle计算得不对

我认为错误是测试文件中的 nn.Embeddings 生成的随机数与 Paddle 下生成的数据不同导致的。在固定 numpy 种子数,将 numpy 数据同时转为 torch 和 Paddle 下数据测试结果都是一致的。

image

另外 torch 的文档中都提到了,关于 Margin 和 distance_function 都是非负的(non-negative),但是代码中没有加入判断。

认领任务01

序号 api 认领人 PR 中文文档
1 paddle.diff @XavierZXY #56681 #6148

任务 No.14 中的问题:

  1. Pytorch margin 可以为负数。Pytorch 在文档上写的 margin 是 non-negative,但是可以传入负数,且正常计算不报错。Paddle 中加入了报错。
  2. 计算的 distance 可以为负数。Pytorch 中 anchor 与 positive 和 negative 分别计算出的 distance 可以为负数。Paddle 中同样也加入了判断会报错。
    以上两个问题的修改与 Pytorch 对齐即可吗

关于你说的这两个差异,需要看下torch可以设置为负数是否合理,如果合理的话paddle也是应该支持的
除了这两个差异外,https://github.com/PaddlePaddle/PaConvert/blob/master/tests/test_nn_functional_triplet_margin_with_distance_loss.py#L22-L79 这几个case计算出的结果,pytorch与paddle不同,还需要看下是否paddle计算得不对

我认为错误是测试文件中的 nn.Embeddings 生成的随机数与 Paddle 下生成的数据不同导致的。在固定 numpy 种子数,将 numpy 数据同时转为 torch 和 Paddle 下数据测试结果都是一致的。

image

另外 torch 的文档中都提到了,关于 Margin 和 distance_function 都是非负的(non-negative),但是代码中没有加入判断。

@yangguohao 单测中应该也没有用到随机数吧?下面又改成固定的值了
infoflow 2023-08-29 12-03-40

@zhwesky2010 nn.Embedding(1000, 128) 应该是相当于随机创建了一个 shape=(1000, 128)的数据(我不太清楚 Embedding 的实现)。下面的代码即使固定了 x,多次运行,每次的值都是不同的。

import paddle.nn as nn
import paddle

x = paddle.to_tensor(1)
embeddings = nn.Embedding(2,3)
print(embeddings(x))

@zhwesky2010 nn.Embedding(1000, 128) 应该是相当于随机创建了一个 shape=(1000, 128)的数据(我不太清楚 Embedding 的实现)。下面的代码即使固定了 x,多次运行,每次的值都是不同的。

import paddle.nn as nn
import paddle

x = paddle.to_tensor(1)
embeddings = nn.Embedding(2,3)
print(embeddings(x))

@yangguohao 确实是nn.Embedding(2,3)的weight随机初始化的原因,导致结果不同,改成了固定的随机数,输出结果一致,那这个任务14就直接close吧。

@zhwesky2010 nn.Embedding(1000, 128) 应该是相当于随机创建了一个 shape=(1000, 128)的数据(我不太清楚 Embedding 的实现)。下面的代码即使固定了 x,多次运行,每次的值都是不同的。

import paddle.nn as nn
import paddle

x = paddle.to_tensor(1)
embeddings = nn.Embedding(2,3)
print(embeddings(x))

@yangguohao 确实是nn.Embedding(2,3)的weight随机初始化的原因,导致结果不同,改成了固定的随机数,输出结果一致,那这个任务14就直接close吧。

好的😊

认领13

8和25好像是同一个?

《在线任务明细表》

嗯对的,8和25是同一个,合并一下

Claim 3

Also, if 8 and 25 are merged then please update the table with the same (currently only 8 is showing claimed)

@akshatvishu We update the English Online Task Details and issue descrption.

@akshatvishu We update the English Online Task Details and issue descrption.

Much appreciated! Thanks for doing it!

Of course, I am willing to contribute in any way thats possible. Can you provide more info on that, the links you provided has informations only in Chinese.

@dhanush-2501 We update the English Online Task Details and issue descrption.

认领18

认领35

任务 No.35 中的问题:
paddle pool 的gpu实现是调用的cudnn接口,但是cudnn中的pool没有dilation这个参数

任务 No.35 中的问题: paddle pool 的gpu实现是调用的cudnn接口,但是cudnn中的pool没有dilation这个参数

pool的GPU算子实现,是自行编写的cuda 核函数,这个在哪里看到的cudnn调用呢?如果是自行编写的cuda函数,就可以自定义的修改增强逻辑了。

infoflow 2023-11-15 17-36-47

任务 No.35 中的问题: paddle pool 的gpu实现是调用的cudnn接口,但是cudnn中的pool没有dilation这个参数

pool的GPU算子实现,是自行编写的cuda 核函数,这个在哪里看到的cudnn调用呢?如果是自行编写的cuda函数,就可以自定义的修改增强逻辑了。

我看maxpool调用的c op是在https://github.com/PaddlePaddle/Paddle/blob/develop/paddle/phi/api/yaml/legacy_ops.yaml 这个里面定义的pool2d,然后我看https://github.com/PaddlePaddle/Paddle/blob/develop/paddle/phi/kernels/pool_kernel.h 里面有个Pool2dGPUDNNKernel的接口也被注册到pool2d,这个实现是用cudnn实现的。

认领43、51

任务 No.35 中的问题: paddle pool 的gpu实现是调用的cudnn接口,但是cudnn中的pool没有dilation这个参数

pool的GPU算子实现,是自行编写的cuda 核函数,这个在哪里看到的cudnn调用呢?如果是自行编写的cuda函数,就可以自定义的修改增强逻辑了。

我看maxpool调用的c op是在https://github.com/PaddlePaddle/Paddle/blob/develop/paddle/phi/api/yaml/legacy_ops.yaml 这个里面定义的pool2d,然后我看https://github.com/PaddlePaddle/Paddle/blob/develop/paddle/phi/kernels/pool_kernel.h 里面有个Pool2dGPUDNNKernel的接口也被注册到pool2d,这个实现是用cudnn实现的。

这个API有CPU、GPU(不适用cudnn)、GPUDNN(使用cudnn)的算子、XPU算子,使用cudnn应该也有办法实现,是将stride、dilation多个参数加工处理后,最终调用的cudnn接口。

任务 No.35 中的问题: paddle pool 的gpu实现是调用的cudnn接口,但是cudnn中的pool没有dilation这个参数

pool的GPU算子实现,是自行编写的cuda 核函数,这个在哪里看到的cudnn调用呢?如果是自行编写的cuda函数,就可以自定义的修改增强逻辑了。

我看maxpool调用的c op是在https://github.com/PaddlePaddle/Paddle/blob/develop/paddle/phi/api/yaml/legacy_ops.yaml 这个里面定义的pool2d,然后我看https://github.com/PaddlePaddle/Paddle/blob/develop/paddle/phi/kernels/pool_kernel.h 里面有个Pool2dGPUDNNKernel的接口也被注册到pool2d,这个实现是用cudnn实现的。

这个API有CPU、GPU(不适用cudnn)、GPUDNN(使用cudnn)的算子、XPU算子,使用cudnn应该也有办法实现,是将stride、dilation多个参数加工处理后,最终调用的cudnn接口。

好的,我再想一下怎么加工处理

关于问题43的问题:
在修复此问题的bug时发现paddle的take_along_axis与torch的gather行为也不一致,不一致的代码如下:
import torch
t = torch.tensor([[1, 2], [3, 4]])
i=torch.tensor([[1]])
result = torch.gather(t,1,i)
torch对应的输出是tensor([[2]]),而paddle输出结果是
Tensor(shape=[2, 1], dtype=int64, place=Place(gpu:0), stop_gradient=True, [[2], [4]])
在完成该任务时需要一起解决吗

关于问题43的问题: 在修复此问题的bug时发现paddle的take_along_axis与torch的gather行为也不一致,不一致的代码如下: import torch t = torch.tensor([[1, 2], [3, 4]]) i=torch.tensor([[1]]) result = torch.gather(t,1,i) torch对应的输出是tensor([[2]]),而paddle输出结果是 Tensor(shape=[2, 1], dtype=int64, place=Place(gpu:0), stop_gradient=True, [[2], [4]]) 在完成该任务时需要一起解决吗

@YibinLiu666 需要一起解决的,应该是之前没有扫描到。

关于任务27、28的问题:
任务27:paddle不支持remove_duplicate,但是支持逻辑几乎一样的 include_sublayers
任务28:paddle不支持memo,但是支持逻辑几乎一样的 layers_set

解决方案:

  1. 忽略该意见
  2. 在文档中补充paddle参数和pytorch参数的等价关系(建议)
  3. 参数改名(不建议,这样之前的用户需要修改代码)
  4. 加入memoremove_duplicate参数,保持与include_sublayerslayers_set的逻辑同步,允许使用pytorch的同名参数(不太建议,加入冗余代码)

请问这两个任务采取哪种解决方案?

关于任务27、28的问题: 任务27:paddle不支持remove_duplicate,但是支持逻辑几乎一样的 include_sublayers 任务28:paddle不支持memo,但是支持逻辑几乎一样的 layers_set

解决方案:

  1. 忽略该意见
  2. 在文档中补充paddle参数和pytorch参数的等价关系(建议)
  3. 参数改名(不建议,这样之前的用户需要修改代码)
  4. 加入memoremove_duplicate参数,保持与include_sublayerslayers_set的逻辑同步,允许使用pytorch的同名参数(不太建议,加入冗余代码)

请问这两个任务采取哪种解决方案?

建议要拿torch代码测试一下,是否完全一致,如果完全一致或者有简单的转写方式,则不需要调整API,写入映射文档中即可。如果差异很大,则需要扩充API的功能才可支持转写。

第6题中 paddle.nn.functional.triplet_margin_with_distance_loss 与torch中不一样的复现代码能否提供一下

第6题中 paddle.nn.functional.triplet_margin_with_distance_loss 与torch中不一样的复现代码能否提供一下

你好,这个验证后发现是参数的随机初始化导致结果不同,无需修改,关闭任务。

认领7、10、14、21