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 3】API 开发任务合集 #44073

Closed
Ligoml opened this issue Jul 4, 2022 · 2 comments
Closed

【PaddlePaddle Hackathon 3】API 开发任务合集 #44073

Ligoml opened this issue Jul 4, 2022 · 2 comments

Comments

@Ligoml
Copy link
Contributor

Ligoml commented Jul 4, 2022

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

为飞桨框架新增一系列 API,提交流程请参考 新增API 开发&提交流程,开发请参考 贡献指南,任务列表如下,其他说明事项在任务列表后:

No.1:为 Paddle 新增 finfo API

  • 任务难度:基础
  • 详细描述: finfo计算浮点数类型的数值限制,输入参数为 Paddle 浮点数类型(paddle.float16/paddle.float32/paddle.float64/paddle.complex64/paddle.complex128),返回包含下表属性对象。此任务目标是为 Paddle 新增 finfo API,调用路径为 paddle.finfo。要求通过 pybind 方式直接将 C++ 层实现绑定到 Python,无需开发 Paddle Kernel,可以参考 paddle/fluid/pybind/pybind.cc 中代码。更详细内容可以参考 numpy.finfo
属性 类型 描述
bits int 该类型占用的 bit 数
eps float 该类型所能表示的 epsilon 值,即满足1.0 + eps != 1.0的最小值,参考 numpy.finfo
min float 该类型能表示的最小值
max float 该类型能表示最大值
tiny float 该类型所能表示的最小正数
resolution float 该类型十进制形式精度 10**-precision. 其中 precision 为 IEEE754 标准中该类型有效数字位数

No.2:为 Paddle 新增 iinfo API

  • 任务难度:基础
  • 详细描述: iinfo 计算整数类型的数值限制,输入参数为 Paddle 整数类型(paddle.int8/paddle.uint8/paddle.int16/paddle.int32/paddle.int64),返回包含下表中的属性对象,此任务目标是为 Paddle 新增 iinfo API,调用路径为 paddle.iinfo 。要求通过 pybind 方式直接将 C++ 层实现绑定到 Python,无需开发 Paddle Kernel, 可以参考 paddle/fluid/pybind/pybind.cc 中代码。
属性 类型 描述
bits int 占用 bit 数
max int 最大数
min int 最小数

No.3:为 Paddle 新增 cdist API

  • 任务难度:基础

  • 详细描述:cdist API 是 dist 的拓展。dist API 用于计算两个输入 Tensor 的 p 范数(p-norm),计算结果为形状为 [1] 的 Tensor,而 cdist API 则用于计算两个输入 Tensor 的所有行向量对的 p 范数(p-norm),输出结果的形状和两个 Tensor 乘积的形状一致。此任务的目标是在 Paddle 框架中,新增 cdist API,调用路径为:paddle.cdist。

  • 提交内容

  • 技术要求

    • 熟悉 p 范数(p-norm)计算原理;
    • 熟悉 Paddle 动静态图下数学计算过程;
    • 熟练掌握 C++、CUDA、Python。

No.4:为 Paddle 新增 cummax API

No.5:为 Paddle 新增 bucketize API

  • 任务难度:基础

  • 详细描述:paddle.bucketize 为 paddle.searchsorted 的sorted_sequence 在1维情况下的特例。比如输入数据 x = paddle.to_tensor([[0, 8, 4, 16], [-1, 2, 8, 4]]),sorted_sequence=paddle.to_tensor([2, 4, 8, 16]),则 paddle.bucketize(x, sorted_sequence) 或 x.bucketize(sorted_sequence) 得到 [[0, 2, 1, 3], [0, 0, 2, 1]],paddle.bucketize(x, sorted_sequence, right=True) 或 x.bucketize(sorted_sequence, right=True) 得到 [[0, 3, 2, 4], [0, 1, 3, 2]] 。此API需支持的调用路径为:paddle.bucketize 和 Tensor.bucketize。

  • 提交内容

  • 技术要求

    • 熟悉 paddle.searchsorted 的计算逻辑;
    • 熟练掌握 Python。

No.6:为 Paddle 新增 trapezoid API

  • 任务难度:基础

  • 详细描述:实现 trapezoid rule 的算法,支持输入N 维 Tensor,在指定的某一维实现 trapezoid rule 算法。比如输入数据 y = paddle.to_tensor([[2, 4, 8], [3, 5, 9]]),x = paddle.tensor([[1, 2, 3], [3, 4, 5]]),则 paddle.trapezoid(y, x, axis=-1)) 或 y.trapezoid(x, axis=-1) 得到 [9, 11],同时 paddle.trapezoid(y, x, axis=0)) 或 y.trapezoid(x, axis=0) 得到 [5, 9, 17] 。此 API 需支持的调用路径为:paddle.trapezoid 和 Tensor.trapezoid 。

  • 提交内容

  • 技术要求

    • 熟悉 trapezoid 算法逻辑;
    • 熟练掌握 Python,及 Tensor 切片操作。

No.7:为 Paddle 新增 MultivariateNormal API

  • 任务难度:基础

  • 详细描述:MultivariateNormal 为表示多元正态分布的类,用于多元正态分布的概率统计与随机采样,至少包括如下方法:

    • mean计算均值;
    • variance计算方差 ;
    • sample随机采样;
    • rsample 重参数化采样;
    • prob 概率密度;
    • log_prob对数概率密度;
    • entropy 熵计算;

上述方法可能无法全部支持,需要设计中说明不支持原因,抛出NotImplementedError异常即可。

此任务的目标是在 Paddle 框架中,基于现有概率分布方案进行扩展,新增 MultivariateNormal API,调用路径为:paddle.distribution.MultivariateNormal 。类签名及各个方法签名,请通过调研 Paddle 及业界实现惯例进行设计。要求代码风格及设计思路与已有概率分布保持一致,参考 Paddle/python/paddle/distribution

No.8:为 Paddle 新增 Gumbel API

  • 任务难度:基础

  • 详细描述:Gumbel 表示耿贝尔分布的类,用于耿贝尔分布的概率统计与随机采样,至少包括如下方法:

    • mean计算均值;
    • variance计算方差 ;
    • sample随机采样;
    • rsample 重参数化采样;
    • prob 概率密度;
    • log_prob对数概率密度;
    • entropy 熵计算;

上述方法可能无法全部支持,需要设计中说明不支持原因,抛出NotImplementedError异常即可。

此任务的目标是在 Paddle 框架中,基于现有概率分布方案进行扩展,新增 Gumbel API,调用路径为:paddle.distribution.Gumbel 。类签名及各个方法签名,请通过调研 Paddle 及业界实现惯例进行设计。要求代码风格及设计思路与已有概率分布保持一致,参考 Paddle/python/paddle/distribution

No.9:为 Paddle 新增 Laplace API

  • 任务难度:基础

  • 详细描述:Laplace 用于 Laplace 分布的概率统计与随机采样,至少包括如下方法:

    • mean计算均值;
    • variance计算方差 ;
    • sample随机采样;
    • rsample 重参数化采样;
    • prob 概率密度;
    • log_prob对数概率密度;
    • entropy 熵计算;

上述方法可能无法全部支持,需要设计中说明不支持原因,抛出NotImplementedError异常即可。

此任务的目标是在 Paddle 框架中,基于现有概率分布方案进行扩展,新增 Laplace API,调用路径为:paddle.distribution.Laplace 。类签名及各个方法签名,请通过调研 Paddle 及业界实现惯例进行设计。要求代码风格及设计思路与已有概率分布保持一致,参考 Paddle/python/paddle/distribution

No.10:为 Paddle 新增 LogNormal API

  • 任务难度:基础

  • 详细描述:LogNormal 用于 LogNormal 分布的概率统计与随机采样,至少包括如下方法:

    • mean计算均值;
    • variance计算方差 ;
    • sample随机采样;
    • rsample 重参数化采样;
    • prob 概率密度;
    • log_prob对数概率密度;
    • entropy 熵计算;

上述方法可能无法全部支持,需要设计中说明不支持原因,抛出NotImplementedError异常即可。

此任务的目标是在 Paddle 框架中,基于现有概率分布方案进行扩展,新增 LogNormal API,调用路径为:paddle.distribution.LogNormal 。类签名及各个方法签名,请通过调研 Paddle 及业界实现惯例进行设计。要求代码风格及设计思路与已有概率分布保持一致,参考 Paddle/python/paddle/distribution

No.11:为 Paddle 新增 multi_margin_loss API

  • 任务难度:基础
  • 详细描述:multi_margin_loss 是用于多分类问题的 Hinge loss。给定一个 2D 的 Tensor input,形状为 (N, C), N 是 batch_size, C 是类别数,这可以视为对每个类别的评分。再给定一个 1D 的 int Tensor, target,形状为 (N,), 表示真实的类别标签(target 中每一个值都满足 0 <= target[i] < C)。

对于一个样本来说(这里不考虑 batch, 所以 input 是一个形状为 (C,) 的向量),target 就是一个整数。给定一个浮点数 margin,
x 中每一个类别的评分对应的 loss 为

image

对上述 loss 取平均值

image

其次,还可以为每一个类别赋予一个不同的权重。给定一个可选的一维 Tensor weight,(形状为 (C,), 公式中为 w。那么上述公式中的 loss 改为如下公式:

image

此外这个函数还需要支持 power 的功能,亦即对 loss 计算幂。亦即,对上述单个 loss 取 power.(公式中为 p) . 公式中的 loss 改为如下形式:

image

最后再对多个样本的 loss 进行 reduction. (可以 sum, mean 或者不 reduce)。

No.12:为 Paddle 新增 pairwise_distance API

函数接口为

paddle.nn.functional.pairwise_distance(
	x: Tensor,
	y:Tensor,
	p: float=2.0,
	epsilon: float=1e-6,
	keepdim: bool=False,
	name: str=None)

按照如下的方式计算

p-norm( x - y + epsilon, p, last_dim, keepdim)

其中,p-norm 的计算函数是

image

x 的形状为 (N, D) 或者 (D,), 其中 N 是 batch size, D 是向量的 size. y 同 x。
输出一个 Tensor .
keepdim 为 False 时形状为 (N,) 或者 (),依据输入中是否有 batched vectors 为条件。
keepdim 为 True 时形状为 (N, 1) 或者 (1, ),依据输入中是否有 batched vectors 为条件。

注意事项:

  1. x 和 y 之间需要可以 broadcast 。
  2. p-norm 属于 reduce 类运算,所以 keepdim 的语义需要和其他 reduce 类 API 保持一致。
  3. paddle 目前对 0-d Tensor(形状为 () 的 Tensor 支持有缺陷,所以即使 keep_dim 为 False, 而且 x 和 y 都非 batched, 也返回形状为 (1, ) 的 Tensor 。这是一个权宜之计,其他 API 的行为也类似。
  4. x, y 需要支持浮点数类型。

No.13:为 Paddle 新增 triu_indices API

  • 任务难度:基础

  • 详细描述: triu_indices 能获取一个2维矩阵的上三角元素的索引,其输出 Tensor 的 shape 为[2, N],相当于有两行,第一行为 上三角元素的行索引,第二行为下三角元素的列索引。此任务的目标是在 Paddle 框架中,新增 triu_indices API,调用路径为:paddle.triu_indices。可以参考:paddle.tril_indices

  • 提交内容

  • 技术要求

    • 熟悉 triu_indices 计算上三角索引的算法原理和适用场景;
    • 熟悉 Paddle 动静态图下数学计算过程;
    • 熟悉 Paddle 的 C++/CUDA OP 编写、注册、调用方式;
    • 熟练掌握 C++、Python、CUDA。

No.14:为 Paddle 新增 remainder_ API

No.15:为 Paddle 新增 count_nonzero API

  • 任务难度:基础

  • 详细描述:计算输入中非零元素的个数。此任务的目标是在 Paddle 框架中,新增 count_nonzero API,调用路径为:paddle.count_nonzero 和 Tensor.count_nonzero。

  • 提交内容

  • 技术要求

    • 熟悉 count_nonzero 计算非零元素个数的算法原理和适用场景;
    • 熟悉 Paddle 动静态图下数学计算过程;
    • 熟练掌握 Python。

No.16:为 Paddle 新增 take API

  • 任务难度:基础

  • 详细描述:根据索引返回指定索引上的数据集合。此任务的目标是在 Paddle 框架中,新增 take API,调用路径为:paddle.take 和 Tensor.take。

  • 提交内容

  • 技术要求

    • 熟悉 take 算法原理和适用场景;
    • 熟悉 Paddle 动静态图下数学计算过程;
    • 熟练掌握 Python。

No.17:为 Paddle 新增 sgn API

  • 任务难度:基础

  • 详细描述:对于复数张量,此函数返回一个新的张量,其元素与 input 元素的角度相同且绝对值为 1。对于非复数张量,此函数返回 input 元素的符号。此任务的目标是在 Paddle 框架中,新增 sgn API,调用路径为:paddle.sgn 和 Tensor.sgn。

  • 提交内容

  • 技术要求

    • 熟悉 sgn 符合函数的算法原理和适用场景;
    • 熟悉 Paddle 动静态图下数学计算和复数计算过程;
    • 熟练掌握 Python。

No.18:为 Paddle 新增 frexp API

  • 任务难度:基础

  • 详细描述:将输入分解为尾数张量和指数张量。返回(尾数张量, 指数张量),其中 x = 尾数 * 2**指数。尾数位于开区间 (-1, 1) 中,而二进制指数是有符号整数。此任务的目标是在 Paddle 框架中,新增 frexp API,调用路径为:paddle.frexp 和 Tensor.frexp。

  • 提交内容

  • 技术要求

    • 熟悉 frexp 函数的算法原理和适用场景;
    • 熟练掌握 Python。

No.19:为 Paddle 新增 nexafter API

  • 任务难度:基础

  • 详细描述:将输入后的下一个浮点值返回给其他元素,输入和其他 shape 必须是可广播的。此任务的目标是在 Paddle 框架中,新增 nextafter API,调用路径为:paddle.nextafter 和 Tensor.nextafter。

  • 提交内容

  • 技术要求

    • 熟悉 nextafter 函数的算法原理和适用场景;
    • 熟练掌握 Python。

No.20:为 Paddle 新增 vsplit API

  • 任务难度:基础

  • 详细描述:根据 index 或者section 将输入(一个具有两个或多个维度的张量)垂直拆分为多个张量。每个拆分都是一个输入视图。此任务的目标是在 Paddle 框架中,新增 vsplit API,调用路径为:paddle.vsplit 和 Tensor.vsplit。

  • 提交内容

  • 技术要求

    • 熟悉 vsplit 函数的算法原理和适用场景;
    • 熟练掌握 Python。

No.21:为 Paddle 新增 paddle.incubate.sparse.transpose 稀疏 API

No.22:为 Paddle 新增 paddle.incubate.sparse.reshape 稀疏 API

No.23:为 Paddle 新增 paddle.incubate.sparse.is_same_size 稀疏 API

  • 技术标签:深度学习框架,Python,C++,CUDA

  • 任务难度:基础

  • 详细描述: 针对 Paddle 的两种稀疏 Tensor 格式 COO 与 CSR,都需新增 is_same_size 的计算逻辑,一共需要实现 4种情况下的比较,即 coo 与 dense、csr 与 dense、coo 与 coo、csr 与 csr。

  • 提交内容

  • 技术要求

    • 熟悉稀疏 CSR/COO 存储格式,Paddle 的 SparseCsrTensor/SparseCooTensor 数据结构;
    • 熟悉稀疏 Tensor 的 is_same_size 在 CSR/COO 存储格式下的计算逻辑;
    • 熟练掌握 Python、C++、CUDA 代码编写。

No.24:为 Paddle 新增 paddle.incubate.sparse.nn.Softmax 稀疏 API 的 coo 格式计算逻辑

No.25:为 Paddle 新增 paddle.incubate.sparse.concat 稀疏 API

No.26:为 Paddle 新增 paddle.incubate.sparse.index_select 稀疏 API

No.27:为 Paddle 新增 paddle.incubate.sparse.any 稀疏 API

No.28:为 Paddle 新增 paddle.incubate.sparse.slice 稀疏 API

No.29:为 Paddle 新增 paddle.incubate.sparse.sum 稀疏 API

No.30:为 Paddle 新增 paddle.incubate.sparse.is_nan 稀疏 API

合入标准

  • API 设计规范 完成 API 设计文档;
  • API 验收标准 完成 API 功能实现、单测、API文档;
  • 稀疏 API 任务需符合稀疏 OP 的特殊开发规范(如有):
    • 【yaml规则】:写到同一个 yaml api,不要写多个,yaml 需支持调度
    • 【kernel名规则】:[计算名] + 异构后缀,例如 matmul_csr_dense、softmax_csr、softmax_coo
    • 【文件名规则】:sparse/xx_kernel.cc,sparse/xx_kernel.cu,以目录区分,文件名与dense保持一致

参考内容

答疑交流

  • 如果在开发中对于上述任务有任何问题,欢迎在本 ISSUE 下留言交流。
  • 对于开发中的共性问题,在活动过程中,会定期组织答疑,请关注官网&QQ群的通知,及时参与。
@Ligoml Ligoml assigned Ligoml and unassigned From00 Jul 4, 2022
@PaddlePaddle PaddlePaddle deleted a comment from paddle-bot-old bot Jul 4, 2022
@SigureMo

This comment was marked as outdated.

@paddle-bot
Copy link

paddle-bot bot commented Jul 18, 2023

Since you haven't replied for more than a year, we have closed this issue/pr.
If the problem is not solved or there is a follow-up one, please reopen it at any time and we will continue to follow up.
由于您超过一年未回复,我们将关闭这个issue/pr。
若问题未解决或有后续问题,请随时重新打开,我们会继续跟进。

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

3 participants