Skip to content

【快乐开源】Paddle Tensor 规范化 #69082

@HydrogenSulfate

Description

@HydrogenSulfate

1. 背景

Python 用户在进行数值计算、数据科学、机器学习和深度学习时,拥有广泛的库和框架可供选择。每年都会出现推动这些领域发展的新框架。这些活动和创造力意外地导致了多维数组(或称张量)库的碎片化,而多维数组库正是这些领域中的基础数据结构。选择包括 NumPy、Tensorflow、PyTorch、Dask、JAX、CuPy、MXNet、Xarray 等。
这些库的 API 大体相似,但也有足够多的差异,因此编写适用于多个(或所有)库的代码非常困难。为了解决数组构造和使用方式中的常见问题,此数组 API 标准专门为其指定了相应的 API 接口。

  • NumPy 的发展与数组库碎片化
    • Python 中第一个用于数值和科学计算的库是 Numeric,开发于 20 世纪 90 年代中期。
    • 21 世纪初期,第二个类似的库 Numarray 诞生。
    • 2005 年,NumPy 问世,取代了 Numeric 和 Numarray,解决了当时的碎片化问题。
    • 大约十年来,NumPy 是唯一广泛使用的数组库。
  • 新库涌现与碎片化加剧
    • 在过去的 5 年里,主要是由于新硬件的出现和深度学习的兴起,出现了许多其他库,导致碎片化更加严重。
    • 新库中的概念和 API 经常受到旧库的启发(或复制自旧库),然后进行更改或改进以满足新的需求和用例。
    • 各个库的作者讨论了各种想法,然而,在此数组API标准出现之前,从未有过认真的尝试来协调所有库,以避免碎片化,并达成一个通用的API标准。
  • 数组API标准的起源与发展
    • 这个数组API标准的想法,是在2019至2020年期间,通过维护人员之间的多次深入对话,逐渐酝酿并形成的。
    • 很快我们就发现,当前碎片化的现状无法通过编写新的“参考库”来有效解决,这与2005年的情况大相径庭,现在有太多不同的用例和太多的利益相关者,而且创新速度太快了。
    • 2020 年 5 月,Python 数据 API 标准联盟召集了一组初始维护人员,开始起草数组 API 的规范,该规范可以被每个现有的数组和张量库采用。
    • 最终产生了描述该 API 的文档。

通过标准化 Paddle Tensor 的功能及行为(即确保遵循统一的 Tensor 接口规范),可以有效解决这一问题,这也是 pytorch、tensorflow、jax 在当前开发进程中已经遵守的开发规范:Python array API standard v2023.12

1. 涉及范围

  • 函数、方法、类和其他对象的名称。
  • 函数签名,包括类型注释。
  • 函数和方法的语义。即预期输出包括数值结果的精度和数据类型。
  • 存在nan's、inf's、空数组(即包括一个或多个大小为 的维度的数组0)的语义。
  • 选角规则、广播、索引
  • 数据交换。即用于将一种数组类型转换为另一种类型的协议,可能共享内存。
  • 设备支持。

image

2. 设计目标

  • 使使用数组的库可以开始使用多种类型的数组作为输入。
  • 实现在 API 标准的核心功能之上构建的代码的更多共享和重用。
  • 对于新数组库的作者,提供一个可以按原样采用的具体 API,而不是每个作者必须决定从哪里借用什么以及在何处偏离。
  • 当用户从一个数组库切换到另一个数组库时,减少用户的学习曲线。

3. 任务列表

序号 难度 任务标题 备注 队伍名称/状态/PR
1 ⭐⭐ 新增 Tensor.mT(作为参考,#68833) 复用已有接口 Tensor.transpose @HydrogenSulfate
2 新增 Tensor.__rfloordiv__ 复用已有接口 Tensor.__floordiv__ @enkilee #69222
3 新增 Tensor.__rmod__ 复用已有接口 Tensor.__mod__ @PolaKuma #69231
@SCUcookie #69689 #69781
4 新增 Tensor.__rmatmul__ 复用已有接口 Tensor.__matmul__ @jincheng23
@LittleHeroZZZX #69406
5 新增 Tensor.__rand__ 复用已有接口 Tensor.__and__ @SCUcookie #69473
6 新增 Tensor.__ror__ 复用已有接口 Tensor.__or__ @mori0umi #69481 #69508
@wwwuyan
@ZHOU05030 #69463
@yangrongxinuser #69469
@jincheng23 #69488
7 新增 Tensor.__rxor__ 复用已有接口 Tensor.__xor__ @yangrongxinuser #69466 #69748 #69779
8 新增 Tensor.__rlshift__ 复用已有接口 Tensor.__lshift__ @MrXnneHang #69348
9 新增 Tensor.__rrshift__ 复用已有接口 Tensor.__rshift__ @MrXnneHang #69348
10 ⭐⭐ 新增 Tensor.__complex__ 新特性,难度中等 @NKNaN #69257
11 ⭐⭐ Tensor.__dlpack__ 新特性,复用 paddle.utils.dlpack.to_dlpack 组合实现 @SCUcookie #69781
12 ⭐⭐⭐ 新增 Tensor.__dlpack_device__ 新特性,但是接口实现不难 @ZHOU05030 #69566 #69632
13 新增 Tensor.__pos__ 直接返回 Tensor 本身即可 @MrXnneHang #69256 #6972
14 新增 Tensor.__lshift__ 复用paddle.tensor.math.bitwise_left_shift @MrXnneHang #69348
15 新增 Tensor.__rshift__ 复用paddle.tensor.math.bitwise_right_shift @MrXnneHang #69348
16 新增 paddle.e 复用 math.e @ndyysheep #69470 #69531 #69667
17 新增 paddle.inf 复用 math.inf @Sylence8 #69464
@kineast #69502 #69542
@jincheng23
18 新增 paddle.nan 复用 math.nan @kineast #69502 #69542
19 新增 paddle.pi 复用 math.pi @wwwuyan #69499 #69548 #69613
20 新增 paddle.newaxis 复用 None @Sylence8 #69464
21 新增 paddle.bitwise_invert
Tensor.bitwise_invert
复用已有接口 Tenosr.__invert__ @MrXnneHang #69197 #6932
22 ⭐⭐ 新增 paddle.less
Tensor.less
新增一个 padlde.less_than/Tensor.less_than 的别名即可 @MrXnneHang #69270 #6972 #6989
23 ⭐⭐⭐⭐⭐⭐⭐⭐ 新增 TensorA[mask] = TensorB 新特性,需要更改 __setitem__的 C++ 实现,添加当 index 是布尔类型,且右侧的输入是 Tensor 时的计算逻辑 @LittleHeroZZZX #69480 #69534
24 ⭐⭐ 新增 paddle.matrix_transpose
新增 paddle.linalg.matrix_transpose
复用 paddle.transpose @PolaKuma #69301 #6970 #6995 #69982
25 ⭐⭐ 新增 paddle.vecdot
paddle.linalg.vecdot
复用 paddle.linalg.dot 即可 @mori0umi
@yangrongxinuser
@PolaKuma #69477
26 ⭐⭐⭐⭐⭐⭐⭐⭐ 新增 paddle.linalg.svdvals 新特性,需要写 C++ Kernel 实现 svdvals 并绑定到 python 上 @aquagull #69528 #69796 #69820 #7001
27 ⭐⭐⭐⭐⭐⭐ 新增 paddle.to_tensor
针对实现了__cuda_array_interface__接口的数组对象(如torch.Tensor)进行适配
新特性,需要写 C++ pybind 函数,并绑定到 python 上 @jincheng23
@aquagull #69913
@ZHOU05030
28 新增 paddle.from_dlpack paddle.utils.dlpack.from_dlpack 别名 @PolaKuma #69361
@GENES-XY
29 新增 paddle.to_dlpack paddle.utils.dlpack.to_dlpack 别名 @PolaKuma #69361
@GENES-XY

4. 认领方式

请大家以 comment 的形式认领任务,如:

【报名】:1、3、12-13

多个任务之间需要使用中文顿号分隔,报名多个连续任务可用横线表示,如 2-5
PR 提交格式:在 PR 的标题中以 【Paddle Tensor No.】 开头,注明任务编号

看板信息

任务方向 任务数量 提交作品 / 任务认领 提交率 完成 完成率
Paddle Tensor 规范化 29 28 / 29 96.55% 28 96.55%

统计信息

排名不分先后 @enkilee (1) @PolaKuma (5) @LittleHeroZZZX (2) @SCUcookie (2) @ZHOU05030 (2) @yangrongxinuser (1) @MrXnneHang (7) @NKNaN (1) @ndyysheep (1) @Sylence8 (2) @kineast (1) @wwwuyan (1) @aquagull (2)

Metadata

Metadata

Type

No type

Projects

Status

Done

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions