Skip to content

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

@Ligoml

Description

@Ligoml

(此 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群的通知,及时参与。

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions