【快乐开源】Paddle Tensor 规范化
本文最后更新于 2024-12-09,文章内容可能已经过时。
【快乐开源】Paddle Tensor 规范化 · Issue #69082 · PaddlePaddle/Paddle
任务背景
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。
涉及范围
函数、方法、类和其他对象的名称。
函数签名,包括类型注释。
函数和方法的语义。即预期输出包括数值结果的精度和数据类型。
存在nan's、inf's、空数组(即包括一个或多个大小为 的维度的数组0)的语义。
选角规则、广播、索引
数据交换。即用于将一种数组类型转换为另一种类型的协议,可能共享内存。
设备支持。
设计目标
使使用数组的库可以开始使用多种类型的数组作为输入。
实现在 API 标准的核心功能之上构建的代码的更多共享和重用。
对于新数组库的作者,提供一个可以按原样采用的具体 API,而不是每个作者必须决定从哪里借用什么以及在何处偏离。
当用户从一个数组库切换到另一个数组库时,减少用户的学习曲线。
开发环境
拉取paddle仓库
git clone https://github.com/PaddlePaddle/Paddle.git
配置docker环境
cd Paddle
docker run --name paddle-dev -v $PWD:/paddle -v /home/moon/data/docker/paddle:/home --network=host -it registry.baidubce.com/paddlepaddle/paddle:latest-dev /bin/bash
其中卷映射:
$PWD:/paddle
:Paddle源码
/home/moon/data/docker/paddle:/home
:需要上传至容器的保存到/home/moon/data/docker/paddle
配置conda环境
# container
wget -c https://repo.anaconda.com/archive/Anaconda3-2023.03-1-Linux-x86_64.sh
bash Anaconda3-2023.03-1-Linux-x86_64.sh
# container
conda create -n paddle python=3.10
conda activate paddle
编译paddle
# container
cd /paddle/python
pip install -r ./requirements.txt -i https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple
cd /paddle
git checkout develop
mkdir -p /paddle/build && cd /paddle/build
pip install protobuf
apt update
apt install patchelf cmake
执行cmake
cd /paddle/build
time cmake .. -DPY_VERSION=3.10 -DWITH_GPU=OFF
执行编译
time make -j$(nproc)
编译whl包
cd /paddle/build/python/dist
pip install -U paddlepaddle-0.0.0-cp310-cp310-linux_x86_64.whl
验证安装
import paddle
paddle.utils.run_check()
示例
python/paddle/base/dygraph/math_op_patch.py
:动态图算子python/paddle/base/dygraph/tensor_patch_methods.py
:需要在此说明不应该使用getattr(self, attr, None)
来获取值的属性名称。python/paddle/jit/sot/opcode_translator/executor/variables/basic.py
:操作计算图python/paddle/pir/math_op_patch.py
:pir下的算子test/legacy_test/test_math_op_patch_pir.py
:单测pir算子test/legacy_test/test_math_op_patch_var_base.py
:单测base中的算子test/sot/test_18_tensor_method.py
:单测sot算子
pip
- 感谢你赐予我前进的力量