Skip to content

Commit afde4e5

Browse files
authored
docs:update README (#124)
1 parent e36d1f4 commit afde4e5

7 files changed

Lines changed: 102 additions & 12 deletions

File tree

.github/workflows/lint.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,9 +21,9 @@ jobs:
2121
uses: actions/setup-python@v4
2222
with:
2323
python-version: '3.10'
24-
- name: Install dependencies
24+
- name: Install pre-commit
2525
run: |
2626
python -m pip install --upgrade pip
27-
make install
27+
pip install pre-commit
2828
- name: Run lint
2929
run: make lint

README.md

Lines changed: 45 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,18 +6,27 @@
66

77
PaDiff 是基于 PaddlePaddle 与 PyTorch 的模型精度对齐工具。传入 Paddle 和 Torch 模型,对齐训练中间结果以及训练后的模型权重,并提示精度 diff 第一次出现的位置。
88

9+
本工具支持通过以下方法进行对比(任选其一):
10+
11+
- 通过单行命令,自动完成 PaDiff 代码注入 --> 生成临时运行脚本 --> 自动运行 --> 监控运行过程并 dump 数据 --> 自动对比并返回结果。
12+
这种方式不需要手动修改代码,只需要妥善设置配置文件。但使用此方法时需要将 `paddlepaddle``torch` 包安装在**同一环境**中,可能会出现版本冲突
13+
14+
- 手动修改 Paddle 和 PyTorch 脚本,并在**分别**运行(不需要同时)这两个脚本,根据脚本 PaDiff 会分别监控运行过程并 dump 数据,最后手动调用 API 接口对比数据,得到对齐结果。两次运行可以在**两个环境**中,但每个环境中都需要同时存在 `paddlepaddle``torch`
15+
16+
- 参考[旧版本特性(v0.2版本)](#旧版本特性(v0.2版本)) 使用 auto_diff 接口进行对齐,这种方法需要将 Paddle 和 PyTorch 放在同一个文件中,同时将 `paddlepaddle``torch` 包安装在同一环境中,不仅两个模型的运行过程耦合,代码修改量也比较大,因此**不推荐**此用法
17+
918

1019
## 安装
1120

12-
当前推荐通过源码安装,本工具需要安装 `paddlepaddle``torch`但这两个包的版本可能存在冲突。建议通过如下命令安装后,根据 [paddlepaddle官网](https://www.paddlepaddle.org.cn/install/quick?docurl=/documentation/docs/zh/develop/install/pip/linux-pip.html)[pytorch官网](https://pytorch.org/get-started/locally/) 自行安装 `paddlepaddle``torch`
21+
当前推荐通过源码安装,本工具依赖 `paddlepaddle``torch`但在同一个环境中安装这两个包时,可能存在依赖冲突。请通过如下命令安装本工具后,根据 [paddlepaddle官网](https://www.paddlepaddle.org.cn/install/quick?docurl=/documentation/docs/zh/develop/install/pip/linux-pip.html)[pytorch官网](https://pytorch.org/get-started/locally/) 自行安装 `paddlepaddle``torch`
1322

1423
```sh
1524
python -m pip install -e . -i https://pypi.tuna.tsinghua.edu.cn/simple
1625
```
1726

1827
## 快速开始
1928

20-
### 使用单行命令对齐(支持前反向对齐)
29+
### 使用单行命令对齐
2130

2231
将命令写入配置文件后,通过如下命令运行
2332

@@ -27,7 +36,40 @@ python -m padiff.cli --config padiff_config.yaml
2736

2837
完整文件示例请参考 [配置文件说明文档](docs/CLIConfig.md),同时,运行命令前,请运行 `python -m padiff.cli -h` 获取更详细的参数说明。
2938

30-
### log 设置
39+
### 在不同环境中手动运行
40+
41+
![PaDiff 运行原理示意图](docs/imgs/flow.png)
42+
43+
如上图所示,PaDiff 支持分别监控 Paddle 和 PyTorch 模型的运行流程,并自动捕获输出、参数梯度、权重等信息。手动修改脚本,仅需找到原代码中模型被调用的代码,使用 `with PaDiffGuard(...)` 包裹,然后分别运行两个项目中的模型训练/推理脚本即可。
44+
45+
`PaDiffGuard` 参数说明请参考 [PaDiffGuard API](docs/api/PaDiffGuard.md)
46+
47+
在两个项目运行结束后,会在两个项目生成 "your_project/padiff_dump/model_name" 的目录,该目录下会保存一些用于对比的数据文件。
48+
49+
之后按照如下脚本,手动调用 `compare_dumps(...)` 进行比较。
50+
51+
```python
52+
# compare_dumps.py
53+
from padiff.utils import logger
54+
from padiff import compare_dumps
55+
56+
if __name__ == "__main__":
57+
logger.reset_dir( "./padiff_log")
58+
59+
cfg = {
60+
"atol": 1e-6,
61+
"rtol": 1e-4,
62+
"compare_mode": "abs_mean",
63+
"action_name": "loose_equal",
64+
}
65+
66+
pt_dump_path = "torch_proj/padiff_dump/model_torch"
67+
pd_dump_path = "paddle_proj/padiff_dump/model_paddle"
68+
compare_dumps(pt_dump_path, pd_dump_path, cfg)
69+
```
70+
71+
72+
## log 设置
3173

3274
#### 开启 debug 模式
3375

docs/CLIConfig.md

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -25,10 +25,10 @@
2525

2626
| 参数 | 类型 | 必需 | 默认值 | 说明 |
2727
| ------------------- | ------------ | ---- | ------ | ---------------------------------------------------- |
28-
| `align_depth` | int or "inf" || "inf" | 对齐的深度。"inf" 表示最细粒度 |
28+
| `align_depth` | int or "inf" || "inf" | 对齐的深度。"inf" 表示检查所有层 |
2929
| `single_step_mode` | string || null | 单步对齐模式 ("forward", "backward", "both") |
30-
| `load_init_weights` | bool || false | 是否自动对齐初始化权重,若已手动对齐,请设置为 false |
31-
| `load_first_inputs` | bool || false | 是否自动第一次的输入,若已手动对齐,请设置为 false |
30+
| `load_init_weights` | bool || false | 是否对齐对齐初始化权重,若已手动对齐,请设置为 false |
31+
| `load_first_inputs` | bool || false | 是否自动第一轮输入,若已手动对齐,请设置为 false |
3232
| `max_calls` | int || 1 | 最大前反向调用次数 |
3333
| `black_list` | list || [] | 不参与对齐的层名列表,列表内元素为 str 类型 |
3434
| `keys_mapping` | dict || null | 模型参数名映射字典,键和值分别为 Paddle/PyTorch 参数名 |
@@ -196,8 +196,13 @@ compare_dumps(pt_dump_path, pd_dump_path, cfg)
196196
- 控制模型输出结果的对比精度和模式
197197
- atol: 绝对误差容忍度 (default: 1e-6)
198198
- rtol: 相对误差容忍度 (default: 1e-6)
199-
- compare_mode: 对比模式,具体内容请看对应文档。可选值: mean, strict, abs_mean, 默认值: "mean"
200-
- action_name: 对比行为,具体内容请看对应文档。可选值: equal, loose_equal, 默认值: "equal"
199+
- compare_mode: 对比模式,可选值: mean, strict, abs_mean, 默认值: "mean"
200+
- mean: 比较传入数据的均值
201+
- strict: 直接比较传入数据
202+
- abs_mean: 比较传入数据的绝对值的均值
203+
- action_name: 对比行为,可选值: equal, loose_equal, 默认值: "equal"
204+
- equal: 进行严格的对比,比如会对输出的个数、shape 都进行检查
205+
- loose_equal: 较为宽松的对比,会尝试尽可能多的匹配数据,比如两个模型某层的输出数量分别为 1 和 3 ,会对第一个输出进行比较,同时在两个数据的形状不匹配时会尝试 transpose 或 reshape。仅在该层所有数据都无法匹配时报错。
201206

202207
```
203208
COMPARE:

docs/api/PaDiffGuard.md

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
# PaDiffGuard API 文档
2+
3+
`PaDiffGuard` 是一个上下文管理器(Context Manager),用于在深度学习模型的前向和反向传播过程中自动进行模型对齐检查。它通过拦截计算过程,比较不同框架(如 PyTorch 和 PaddlePaddle)或同一框架下不同实现的中间结果、权重和梯度,以确保它们的行为一致。
4+
5+
## 参数
6+
7+
| 参数 | 类型 | 必需 | 默认值 | 说明 |
8+
| :--- | :--- | :--- | :--- | :--- |
9+
| `model` | `paddle.nn.Layer` or `torch.nn.Module` || - | 需要进行对齐检查的主模型实例。 |
10+
| `optimizer` | `paddle.optimizer` or `torch.optim` || `null` |`model` 配对的优化器实例。<br><br>**当反向传播不能被 `PaDiffGuard` 包裹时**:如果传递此参数,`PaDiffGuard` 会包装其 `step()` 方法以确保梯度更新的一致性。<br><br>**当反向传播可以被 `PaDiffGuard` 包裹时**:梯度一旦更新就会被自动获取,此时不需要传递此参数。 |
11+
| `name` | `string` || `"model"` | 为当前 `model` 指定一个名称,该名称将用于日志记录和结果文件的命名。 |
12+
| `align_depth` | `int` or `"inf"` || `"inf"` | 对齐的深度。<br><br>- 可以是一个整数,表示只检查前 N 层。<br>- 也可以是 `"inf"`,表示检查所有层。 |
13+
| `single_step_mode` | `string` || `null` | 单步对齐模式,可选值为 `"forward"`, `"backward"`, `"both"`。<br><br>在此模式下,`PaDiffGuard` 会从 `base_dump_path` 加载参考数据进行比对。 |
14+
| `load_init_weights` | `bool` || `false` | 是否从 `base_dump_path` 加载初始化权重。<br><br>若已手动对齐初始化权重,请设置为 `false`|
15+
| `load_first_inputs` | `bool` || `false` | 是否从 `base_dump_path` 加载第一轮输入。<br><br>若已手动对齐输入,请设置为 `false`|
16+
| `base_dump_path` | `string` || `null` | 基准数据的根目录路径。<br><br>当 `load_init_weights``load_first_inputs``single_step_mode` 被启用时,此参数必须提供。 |
17+
| `framework` | `string` || `null` | 指定模型所属的框架,可选值为 `"paddle"``"torch"`。<br><br>用于指导如何处理特定框架的数据,当 `load_first_inputs` 被启用时,此参数必须提供。 |
18+
| `seed` | `int` || `42` | 设置随机种子,以确保对齐过程中的随机行为是可复现的。 |
19+
| `max_calls` | `int` || `1` | 最大前/反向调用次数。<br><br>达到上限后,会强制退出整个程序。例如,前向对齐时应该设置为 `1`|
20+
| `black_list` | `list[str]` || `[]` | 不参与对齐的层名列表,列表内元素为 `str` 类型。 |
21+
| `keys_mapping` | `dict` or `Callable` || `null` | 模型参数名映射,可以为:<br><br>- **字典形式**:键和值分别为 Paddle/PyTorch 的参数名。<br>- **可调用函数**:如 `lambda name: name.replace('model_pt', 'model_pa')`|
22+
23+
## 用法
24+
25+
```python
26+
from padiff import PaDiffGuard
27+
28+
with PaDiffGuard(
29+
model=model,
30+
optimizer=optimizer,
31+
name="my_model",
32+
):
33+
out = model(input_data)
34+
loss = loss_fn(out, target)
35+
loss.backward()
36+
optimizer.step()
37+
38+
```
39+
``` python
40+
trainer = SFTTrainer(...)
41+
with PaDiffGuard(trainer.model, name='model_name'):
42+
trainer.train()
43+
```

docs/imgs/flow.png

141 KB
Loading

pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[tool.black]
22
line-length = 119
3-
target_version = ['py37', 'py38', 'py39', 'py310']
3+
target_version = ['py38', 'py39', 'py310', 'py311']
44
exclude = ['.flake8']
55

66
[tool.pytest.ini_options]

requirements.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
# paddlepaddle-gpu>=3.0
22
# torch>=2.6
3+
# torchvision
34
pre-commit
45
pytest
56
parameterized
67
pytest-cov
78
regex
89
pytest-xdist
9-
torchvision
1010
graphviz
1111
numpy
1212
coverage

0 commit comments

Comments
 (0)