11# PaddleAPITest
22
3- ******
4-
53## 1. 项目背景
64
7- 正确性是Paddle质量的基石,影响业务训练、推理,影响用户对Paddle的信赖。至关重要。
8- 如何主动发现Paddle存在的质量问题,给予修复。而不是被动等用户反馈后,再修复。是一个质量上的难题。
9- API是Paddle的“窗口”,PaddleAPITest通过整理API级的300余万条case(本项目称之为配置 / api config),使用case驱动Paddle不同内核机制执行API,可成为Paddle内核机制、算子正确性的“扫描仪”。
5+ 正确性是 PaddlePaddle 框架质量的基石,影响业务训练、推理的效果,影响用户对 Paddle 的信赖。如何主动发现 Paddle 存在的质量问题并及时修复,而不是被动等用户反馈后再修复,是一个亟待解决的质量难题。
106
11- PaddleAPITest主要工作思路如下:
7+ API 是 Paddle 的 “窗口”,PaddleAPITest 通过整理超过 300 万条 API 级别的测试用例(本项目称为配置 / api config),利用这些用例驱动 Paddle 的不同内核机制执行 API,从而成为 Paddle 内核机制和算子正确性的 “扫描仪”。
128
13- 1 . 在Paddle开发Trace API机制,具体见 https://github.com/PaddlePaddle/Paddle/pull/70752 ,用于抓取API调用配置,下面是一个配置例子 :
9+ PaddleAPITest 主要工作思路如下 :
1410
11+ 1 . 在 Paddle 中开发 Trace API 机制(具体实现见 [ PR #70752 ] ( https://github.com/PaddlePaddle/Paddle/pull/70752 ) ),用于抓取 API 调用配置。以下是一个配置示例:
1512```
1613paddle.concat(tuple(Tensor([31376, 768],"float32"),Tensor([1, 768],"float32"),), axis=0, )
1714```
1815
19- 2 . 在所有Paddle单元测试 (CI)、集成测试 (CE)流水线中,抓取所有Paddle API的调用配置,形成了PaddleAPITest /tester/api_config下以 " CI_CE_config" 的配置集。对以上配置集进行去重、排序并对测试结果进行梳理得到了 api_config 下各个目录的配置集。
16+ 2 . 在所有 Paddle 单元测试 (CI)和集成测试 (CE)流水线中,抓取所有 Paddle API 的调用配置,形成了 ` PaddleAPITest /tester/api_config ` 下的 ` CI_CE_config ` 的配置集。对配置集进行去重、排序,并对测试结果进行梳理,得到了 ` api_config ` 下各个目录的配置集。
2017
21- 3 . 在 PaddleAPITest 中开发一套** 引擎** ,加载配置集,初始化相应Tensor,调用相应API执行前 /反向测试。
18+ 3 . 在 PaddleAPITest 中开发一套 ** 引擎** ,用于加载配置集,初始化相应 Tensor,并调用相应的 API 执行前 /反向测试。
2219
23- 4 . 对采集到的配置集进行shape篡改,得到了 "big_tensor"、 "0_size" 开头的配置集。
20+ 4 . 对采集到的配置集进行 shape 篡改,生成了以 ` "big_tensor" ` 和 ` "0_size" ` 开头的配置集。
2421
25- 5 . 对于精度正确性,在 PaddleAPITest 中开发一套** 转换工具** ,在调用Paddle API测试的同时,等同的调用Torch API,做精度对比测试 。
22+ 5 . 对于精度正确性,在 PaddleAPITest 中开发一套 ** 转换工具** ,在调用 Paddle API 测试的同时,等效地调用 Torch API,进行精度对比测试 。
2623
27- 6 . 对于内核测试,可通过继承APITestBase,开发针对某内核的测试引擎。被测对象可以是:Kernel精度、Kernel性能、Kernel显存 、动态图、静态图、动转静、组合算子、CINN、Paddle2ONNX、GPU、CPU、XPU、NPU、OneDNN、TRT等等 。
24+ 6 . 对于内核测试,可通过继承 ` APITestBase ` ,开发针对特定内核的测试引擎。测试对象包括:Kernel 精度、Kernel 性能、Kernel 显存 、动态图、静态图、动转静、组合算子、CINN、Paddle2ONNX、GPU、CPU、XPU、NPU、OneDNN、TRT 等等 。
2825
2926## 2. 项目结构
3027
31- ``` python
28+ ``` bash
3229├── tester
33- │ ├── accuracy.py
3430│ ├── api_config
31+ │ ├── paddle_to_torch
3532│ ├── base.py
36- │ ├── paddle_cinn_vs_dygraph.py
3733│ ├── paddle_only.py
38- │ └── paddle_to_torch
34+ │ ├── accuracy.py
35+ │ └── paddle_cinn_vs_dygraph.py
36+ ├── report
3937├── test_pipline
4038├── tools
4139├── engine.py
4240├── engineV2.py
4341├── engineV3.py
44- ├── report
4542└── run-example.sh
4643```
4744
48- 目前项目结构主要分为 report 和 tester 文件夹,report 用于储存内核报错的 api 信息,tester 用于测试配置的正确性和存放配置测试结果。
45+ 项目结构主要分为 ` report ` 和 ` tester ` 文件夹,` report ` 用于存储内核报错的 api 信息,` tester ` 用于测试配置的正确性和存放配置测试结果。
4946
50- engineV2.py 及配合的 run-example.sh 是目前运行本项目的主要工具, engineV3.py 目前由百度内部开发测试使用, engine.py 是最早的引擎,相较 engineV2.py 吞吐量低,在少量配置时可使用。
47+ ** engineV2.py** 及配套的 ` run-example.sh ` 是目前运行本项目的主要工具; ** engineV3.py** 目前由百度内部开发测试使用; ** engine.py** 是最早的引擎,相较 ` engineV2.py ` 吞吐量低,在少量配置时可使用。
5148
52491 . report 介绍
5350 - 0size_tensor_cpu 存放进行在 cpu 上进行精度测试/引擎解析能力测试(accuracy / paddle_only)结果。
@@ -58,7 +55,6 @@ engineV2.py 及配合的 run-example.sh 是目前运行本项目的主要工具
5855 - cinn 存放 paddle 静态编译器与动态图方式进行精度对比测试结果。
5956 - fresh_report 存放引擎补齐(paddle_only)和精度转换(accuracy)两个任务中,出现的内核报错或者精度报错。
6057
61-
62582 . tester 介绍
6359
6460 * api_config 目录存放配置目录的管理情况和相关脚本工具,各配置目录下的文本命名语义一致,参考 5_accuracy 中的 txt 命名含义:
@@ -86,133 +82,127 @@ engineV2.py 及配合的 run-example.sh 是目前运行本项目的主要工具
8682 * to_0_size* .py 是篡改为 0-size 配置的工具
8783 * to_big_size\* .py 是篡改为大形状张量的配置的工具。
8884
89- * tester/paddle2torch/是转换能力的核心代码。介绍详见 [ 4.paddle2torch转换] ( #4-paddle2torch转换 )
85+ * tester/paddle2torch/ 是转换能力的核心代码。介绍详见 [ 4.paddle2torch转换] ( #4-paddle2torch转换 )
9086
91- 3 . tools文件夹中存放了一些实用的工具,例如move_config可以用来批量的移动配置,详见 [ move_config-README.md ] ( ./tools/move_config-README.md ) 。
87+ 3 . tools 文件夹中存放了一些实用的工具,例如 move_config.py 可以用来批量的移动配置,error_stat.py 可以一键解析错误日志等 。
9288
9389## 3. 使用介绍
9490
9591### 环境配置
9692
97- 运行环境分为** cpu** 环境与** gpu** 环境,cpu和gpu上运行的结果** 可能存在差异** ,即存在cpu上能够正确运行,但gpu上报错的情况。因此需要根据需求正确安装环境。
98-
99- [ PaddlePaddle 安装链接] ( https://www.paddlepaddle.org.cn/install/quick )
100-
101- 若需要本地编译paddle,可参考链接:https://www.paddlepaddle.org.cn/documentation/docs/zh/install/compile/linux-compile-by-make.html
102-
103- 测试CPU除了通过上述链接安装CPU的最新develop包之外,还可使用如下指令设置Paddle工作在CPU模式:
93+ 建议在虚拟环境或 docker 中进行开发,并正确安装 python 与 nvidia 驱动。
10494
95+ PaddlePaddle 框架运行环境分为 ** CPU** 环境与 ** GPU** 环境,CPU 和 GPU 上运行的结果 ** 可能存在差异** ,即存在 GPU 上能够正确运行,但 CPU 上报错的情况。请正确安装 * paddlepaddle-gpu* 环境,选择 develop 版本:
96+ - [ 使用 pip 快速安装 paddle] ( https://www.paddlepaddle.org.cn/install/quick?docurl=/documentation/docs/zh/develop/install/pip/linux-pip.html )
97+ - 或者运行命令(cuda>=11.8):
98+ ``` bash
99+ pip install --pre paddlepaddle-gpu -i https://www.paddlepaddle.org.cn/packages/nightly/cu118/
105100```
106- paddle.device.set_device("cpu")
101+ - 若需要本地编译 Paddle,可参考链接:[ Linux 下使用 ninja 从源码编译] ( https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/install/compile/linux-compile-by-ninja.html )
102+
103+ 安装 PaddleAPITest 项目其他依赖项:
104+ - [ 使用 pip 快速安装 torch] ( https://pytorch.org/get-started/locally/ )
105+ ``` bash
106+ pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118
107+ pip install func_timeout pebble pynvml
107108```
108109
109- ### 使用说明
110+ paddle 与 torch 的部分依赖项可能发生冲突,请先安装 paddlepaddle-gpu 再安装 torch。重新安装请添加 ` --force-reinstall ` 参数。
110111
111- #### A. engine v1
112+ ### 使用说明
112113
113- 所有测试前, ** 必须创建 ** 一个目录:PaddleAPITest/tester/api_config/test_log/,用于存放测试所产生的测试结果和checkpoint。
114+ #### A. engineV1
114115
115- PaddleAPITest目前支持paddle_only、accuracy、paddle_cinn三种测试:
116+ 测试时, ` tester/api_config/test_log ` 文件夹用于存放测试所产生的测试结果和 checkpoint。
116117
117- > paddle_only,用于单纯把配置在Paddle动态图跑一遍,验证PaddleAPITest 引擎** 是否支持** 该配置。
118- >
119- > accuracy,用于将Paddle API的前反向与** Torch** 的前反向做精度对比测试。
120- >
121- > paddle_cinn,用于Paddle动态图与Paddle静态图编译器做精度对比测试。
118+ PaddleAPITest 目前支持 ` paddle_only ` 、` accuracy ` 、` paddle_cinn ` 三种测试:
122119
123- 当测试** 单个配置** 时,可使用下面的代码,--api_config中输入待测试的配置内容:
120+ - ** paddle_only** ,用于单独将 Paddle 动态图跑一遍,验证 paddle 框架以及 PaddleAPITest 引擎** 是否支持** 该配置。
121+ - ** accuracy** ,用于将 Paddle API 的前反向与 ** Torch** 的前反向做精度对比测试。
122+ - ** paddle_cinn** ,用于将 Paddle 动态图与 Paddle 静态图编译器做精度对比测试。
124123
125- 仅测试paddle ** 是否支持 ** :
124+ 当测试 ** 单个配置 ** 时,可使用下面的代码, ` --api_config ` 中输入待测试的配置内容 :
126125
127- ```
126+ - 仅测试 paddle ** 是否支持** :
127+ ``` bash
128128python engine.py --paddle_only=True --api_config=' paddle.abs(Tensor([1, 100],"float64"), )'
129129```
130130
131- 测试输出** 是否准确** :
132-
133- ```
131+ - 测试输出** 是否准确** :
132+ ``` bash
134133python engine.py --accuracy=True --api_config=' paddle.abs(Tensor([1, 100],"float64"), )'
135134```
135+ - 动态图和静态图测试:
136136
137- 动态图和静态图测试:
138-
139- ```
137+ ``` bash
140138python engine.py --paddle_cinn=True --api_config=' paddle.abs(Tensor([1, 100],"float64"), )'
141139```
142140
143- ** 值得注意** 的是配置txt中统一使用双引号",因此建议--api_config=''使用单引号,或在配置中手动添加转义斜杠\
141+ > [ !NOTE]
142+ > ** 注意** : 配置 txt 中统一使用双引号 ` " ` ,因此建议 ` --api_config='' ` 使用单引号,或在配置中手动添加转义斜杠 ` \ ` 。
144143
145- 当需要测试的配置数目较多时,手动单次输入将** 非常低效** ,这种情况下可以使用如下所示的** 批量测试** 指令,将配置保存在一个txt中,并将指令中的路径设置为txt的路径即可:
146-
147- ```
144+ 当需要测试的配置数目较多时,手动单次输入将** 非常低效** ,这种情况下可以使用如下所示的** 批量测试** 指令,将配置保存在一个 txt 中,并将指令中的路径设置为 txt 的路径即可:
145+ ``` bash
148146python engine.py --api_config_file=/host_home/wanghuan29/PaddleAPITest/tester/api_config/api_config.txt --accuracy=True > tester/api_config/test_log/log.log 2>&1
149147
150148python engine.py --api_config_file=/host_home/wanghuan29/PaddleAPITest/tester/api_config/api_config.txt --paddle_only=True > tester/api_config/test_log/log.log 2>&1
151149
152150python engine.py --api_config_file=/host_home/wanghuan29/PaddleAPITest/tester/api_config/api_config.txt --paddle_cinn=True > tester/api_config/test_log/log.log 2>&1
153151```
154152
155- 当测试配置中有** 精度不统一** 的情况,需要精度转换时,直接运行测试可能会报错,可加入--test_amp=True
156-
153+ 当测试配置中有** 精度不统一** 的情况,需要精度转换时,直接运行测试可能会报错,可加入` --test_amp=True ` 。
157154
158- #### B. engine v2
155+ #### B. engineV2
159156
160157` engineV2.py ` 是为 PaddleAPITest 项目设计的高性能测试框架,支持多 GPU 并行执行,具备负载均衡、超时处理和崩溃恢复能力。相比原始的 ` engine.py ` 实现,它能显著提升 Paddle API 配置测试效率,加速比约为 5-10 倍。
161158
162159功能特性:
163-
164160- ** 多 GPU 并行** :拥有灵活的 * gpus 相关参数* ,可配置多 GPU 并行测试,支持任务跨 GPU 动态分发
165161- ** 进程级并行** :基于 Pebble 库的 ProcessPool 进程池实现,支持进程的高效并行,每张 GPU 可拥有多个 worker
166162- ** 动态负载均衡** :新的子进程自动分配至负载最轻 GPU,计算资源最优利用
167163- ** 超时/崩溃恢复** :由张量大小推断执行时限(梯度阈值),主动杀死 coredump 进程,自动检测并重启死亡进程
168164
169- 以精度测试为例,配置文件路径为 ` tester/api_config/api_config_temp.txt ` ,输出日志路径为 ` tester/api_config/test_log ` :
170-
171- ** 多进程多 GPU 模式** :
165+ 以精度测试为例,配置文件路径为 ` tester/api_config/api_config_tmp.txt ` ,输出日志路径为 ` tester/api_config/test_log ` :
172166
167+ ** 多 GPU 多进程模式** :
173168``` bash
174- python engineV2.py --accuracy=True --api_config_file=" tester/api_config/api_config_temp .txt" --num_gpus=8 --num_workers_per_gpu=1 >> " tester/api_config/test_log/log.log" 2>&1
169+ python engineV2.py --accuracy=True --api_config_file=" tester/api_config/api_config_tmp .txt" --num_gpus=8 --num_workers_per_gpu=- 1 >> " tester/api_config/test_log/log.log" 2>&1
175170```
176171
177- ** 单进程多 GPU 模式** :
178-
172+ ** 多 GPU 单进程模式** :
179173``` bash
180- python engineV2.py --accuracy=True --api_config_file=" tester/api_config/api_config_temp .txt" --num_gpus=0 >> " tester/api_config/test_log/log.log" 2>&1
174+ python engineV2.py --accuracy=True --api_config_file=" tester/api_config/api_config_tmp .txt" --num_gpus=8 >> " tester/api_config/test_log/log.log" 2>&1
181175```
182176
183- ** 单进程单 GPU 模式** :
184-
177+ ** 单 GPU 单进程模式** :
185178``` bash
186- export CUDA_VISIBLE_DEVICES=" "
187- python engineV2.py --accuracy=True --api_config_file=" tester/api_config/api_config_temp .txt" --num_gpus=0 >> " tester/api_config/test_log/log.log" 2>&1
179+ export CUDA_VISIBLE_DEVICES=" 0 "
180+ python engineV2.py --accuracy=True --api_config_file=" tester/api_config/api_config_tmp .txt" --num_gpus=0 >> " tester/api_config/test_log/log.log" 2>&1
188181```
189182
190183** 使用 run.sh 脚本** :
191-
192184``` bash
193185# chmod +x run.sh
194186./run.sh
195187```
188+ 该脚本使用参数:` NUM_GPUS=-1, NUM_WORKERS_PER_GPU=-1 ` ,在后台运行程序,可在修改 ` run.sh ` 参数后使用。说明文档详见:[ engineV2-README.md] ( engineV2-README.md )
196189
197- 该脚本使用参数:NUM_GPUS=-1, NUM_WORKERS_PER_GPU=-1,在后台运行程序,可在修改 ` run.sh ` 参数后使用
198-
199- 其说明文档详见 [ engineV2.md] ( ./engineV2.md )
190+ #### C. engineV3
200191
192+ 暂无介绍
201193
202194## 4. paddle2torch转换
203195
204196Paddle2Torch 是一个专注于将 PaddlePaddle API 转换为 PyTorch 对应实现的知识工具库,属于 [ PaddleAPITest] ( https://github.com/PFCCLab/PaddleAPITest ) 项目的核心组成模块。本模块通过解析 PaddlePaddle API 调用,使用预定义的转换规则与动态代码生成,实现从 PaddlePaddle 到 PyTorch 的自动转换。转换过程将确保代码的语义一致性。
205197
206198本模块具有精简强悍的架构,仅由三个组件构成:
207-
208199- * 转换引擎 converter.py*
209200- * 转换配置 mapping.json*
210201- * 转换规则 rules.py*
211202
212203代码已完全进行解耦,可以非常容易地迁移至其他代码中。本模块通过 ** 转换配置** 与 ** 转换规则** 管理 API 映射关系,因此支持开发者灵活扩展新的 API 转换能力。
213204
214- 本模块的典型应用场景包括:模型迁移、跨框架验证、混合编程等,可为深度学习开发者提供跨框架的互操作性解决方案。
215-
216- 现在转换工具已基本完成对PaddleAPI的转换。
205+ 本模块的典型应用场景包括:模型迁移、跨框架验证、混合编程等,可为深度学习开发者提供跨框架的互操作性解决方案。现在转换工具已基本完成对PaddleAPI的转换。说明文档详见:[ paddle_to_torch/README.md] ( tester/paddle_to_torch/README.md )
217206
218- 其说明文档详见 [ paddle2torch.md] ( ./tester/paddle_to_torch/paddle2torch.md )
207+ > [ !TIP]
208+ > 本 README 已经过 *** 文心一言 4.5 Turbo*** 润色
0 commit comments