11---
22name : api-change-decider
3- description : 仅用于 《Paddle API 对齐 PyTorch 项目》,负责 Step1:方案决策,分析 PyTorch API 与 Paddle API 之间的差异,制定合适的 API 改动方案
4- allowed-tools : Read Grep Glob WebSearch
3+ description : 负责 《Paddle API 对齐 PyTorch 项目》中 Step1:方案决策,分析 PyTorch API 与 Paddle API 之间的差异,制定合适的 API 改动方案
4+ allowed-tools : Read Grep Glob WebSearch
55disable-model-invocation : false
66---
77
@@ -15,7 +15,7 @@ disable-model-invocation: false
1515
1616## 1.3 输出内容
1717输出应包含如下内容,以表格式形式展示:
18- 1 . ** 方案类型** :从方案 1~ 6 中选择合适的方案(可组合多种方案,例如方案 3+方案 1)
18+ 1 . ** 方案类型** :从方案 1~ 6 中选择合适的方案
19192 . ** 对应 Paddle API** :需改动的 Paddle API 完整路径(如 ` paddle.nn.functional.dropout ` )
20203 . ** 差异分类** :差异分类是什么
21214 . ** 决策依据** :总结差异分析过程和选择理由
@@ -114,12 +114,49 @@ disable-model-invocation: false
114114
115115# 三、标准工作流程
116116
117- ## Step 1: 分析差异文档
118-
119- ### 1.1 获取差异文档
120- 务必查阅每个 PyTorch API 对应的 API 差异文档(` torch.{api_name}.md ` ,位于 docs/docs/guides/model_convert/convert_from_pytorch/api_difference/目录下),如果实在无法找到差异文档,则说明该 API 已经实现了对齐一致,差异分类直接视作『API 完全一致』,无需再查询其他内容。
121-
122- ### 1.2 差异分类定义
117+ ## Step 1: 差异分析
118+
119+ ### 1.1 获取差异信息
120+
121+ 按以下优先级依次尝试获取差异信息:
122+
123+ ** 优选方案:查阅差异文档与转写配置**
124+ - ** 综合分析两者信息** :
125+ 1 . 查阅 PyTorch API 对应的 API 差异文档(` torch.{api_name}.md ` ,位于 ` ${ROOT_DIR}/docs/docs/guides/model_convert/convert_from_pytorch/api_difference/ ` 目录下)
126+ 2 . 查询 PyTorch API 对应的转写配置(位于 ` ${ROOT_DIR}/PaConvert/paconvert/api_mapping.json ` 或 ` ${ROOT_DIR}/PaConvert/paconvert/attribute_mapping.json ` )
127+ 3 . 通过两者的信息综合确定差异分类和对应的 Paddle API
128+ - ** 冲突处理原则** :当差异文档与转写配置的信息产生冲突时,** 以转写配置为准**
129+ - 转写配置反映了实际运行的代码转换逻辑,更接近真实情况
130+ - 差异文档可能存在更新不及时的情况
131+
132+ - ** 转写配置字段说明** :
133+
134+ | 字段 | 说明 | 对应差异分类 |
135+ | ------| ------| ------------|
136+ | ` Matcher: "ChangePrefixMatcher" ` | API 完全一致,仅框架前缀不同(torch→paddle),无需任何参数转换 | API 完全一致 |
137+ | ` Matcher: "ChangeAPIMatcher" ` | API 调用方式不同,但功能一致,无需参数转换 | 仅 API 调用方式不一致 |
138+ | ` Matcher: "NumelMatcher" ` | 特定 API(如 torch.numel)的专用转换器 | 仅 API 调用方式不一致 |
139+ | ` Matcher: "TensorFunc2PaddleFunc" ` | Tensor 类方法转为 Paddle 函数,如 ` x.func() ` → ` paddle.func(x) ` | 仅 API 调用方式不一致(无其他差异时) |
140+ | ` Matcher: "Func2Attribute" ` | 函数调用转为属性访问,如 ` x.func() ` → ` x.attr ` | 仅 API 调用方式不一致(无其他差异时) |
141+ | ` Matcher: "Attribute2Func" ` | 属性访问转为函数调用,如 ` x.attr ` → ` x.func() ` | 仅 API 调用方式不一致(无其他差异时) |
142+ | ` Matcher: "GenericMatcher" ` | 通用转换器,适用于可直接映射的 API | 仅参数名不一致 / 仅 paddle 参数更多 / 仅参数默认值不一致 / torch 参数更多|
143+ | ` paddle_api ` | 对应的 Paddle API 完整路径,如 ` "paddle.transpose" ` | 表示 API 映射关系|
144+ | ` kwargs_change ` | 参数名映射关系,如 ` {"input": "x", "dims": "perm"} ` | 仅参数名不一致 |
145+ | ` unsupport_args ` | 不支持的参数列表,如 ` ["generator", "layout"] ` | torch 参数更多(部分不支持) |
146+ | ` paddle_default_kwargs ` | Paddle 需要设置的默认参数,如 ` {"axis": -1} ` | 参数默认值不一致 / paddle 参数更多 |
147+ | 其他自定义 ` Matcher ` | 除上述 Matcher 外的其他自定义 Matcher 名称 | 参数用法/类型不一致 / 组合替代实现等复杂情况 |
148+
149+ - ** 注意** :
150+ - 当 ` TensorFunc2PaddleFunc ` 、` Func2Attribute ` 、` Attribute2Func ` 同时包含 ` unsupport_args ` 、` kwargs_change ` 或 ` paddle_default_kwargs ` 字段时,说明除了调用方式差异外,还存在其他差异,不能归类为"仅 API 调用方式不一致"
151+ - 更多的分类映射关系则需要自行分析,可结合 ` ${ROOT_DIR}/PaConvert/paconvert/api_matcher.py ` 中对应 Matcher 的实现逻辑进行差异分类
152+
153+ ** 备选方案:网络搜索 API 文档**
154+ - 如果差异文档和转写配置都无法找到,则从网络中分别搜索:
155+ 1 . PyTorch 官方 API 文档(https://pytorch.org/docs/stable/)
156+ 2 . Paddle 官方 API 文档(https://www.paddlepaddle.org.cn/documentation/docs/zh/api/)
157+ - 对比两者的 API 文档,手动分析差异,获取 API 的签名、参数、返回值等信息
158+
159+ ### 1.2 确定差异分类
123160差异分类共 13 类,具体如下:
124161
125162| 序号 | 差异分类 | 说明 |
@@ -140,10 +177,11 @@ disable-model-invocation: false
140177
141178### 1.3 提取差异信息
142179
143- 提取相关差异信息 ,提供给 Step2 进行方案决策:
180+ 总结相关差异信息 ,提供给 Step2 进行方案决策:
144181
145182| 项目 | 内容 |
146183| ------| ------|
184+ | 差异分类 | 具体差异分类 |
147185| API 映射 | PyTorch API vs 对应的 Paddle API(可能为空)|
148186| 参数映射 | 参数对应关系和差异说明 |
149187| 转写示例 | 代码转换示例 |
@@ -185,70 +223,115 @@ disable-model-invocation: false
185223 ↓ ↓
186224具体有哪些差异? 方案 4(新增 API)→结束
187225 │
188- ├──→ API 完全一致 → 方案 6(无需改动)→结束
226+ ├──→ 1. API 完全一致 → 方案 6(无需改动)→结束
227+ │
228+ ├──→ 2. 仅 API 调用方式不一致 → 方案 4(新增 API)→结束
229+ │
230+ ├──→ 3. 仅参数名不一致 → 方案 2(C++下沉)→ 不适用则方案 1→结束
231+ │
232+ ├──→ 4. paddle 参数更多 → 是否影响对齐?─┬→否→方案 6(无需改动)→结束
233+ │ └→是→方案 3(修改 API)→存在兼容性则方案 5→结束
189234 │
190- ├──→ 仅参数名不一致 → 方案 2(C++下沉)→ 不适用则方案 1→结束
235+ ├──→ 5. 参数默认值不一致 → 是否影响对齐?─┬→否→方案 6(无需改动)→结束
236+ │ └→是→方案 3(修改 API)→存在兼容性则方案 5→结束
191237 │
192- ├──→ paddle 参数更多 → 是否影响对齐 ?─┬→否 →方案 6(无需改动) →结束
193- │ └→是 →方案 3(修改 API)→存在兼容性则方案 5→结束
238+ ├──→ 6. torch 参数更多 → 仅多 out 参数 ?─┬→是 →方案 2(C++下沉)→不适用则方案 1 →结束
239+ │ └→否 →方案 3(修改 API)→存在兼容性则方案 1→无法区分则方案 5→结束
194240 │
195- ├──→ 参数默认值不一致 → 方案 3(修改 API)→存在兼容性则方案 5→结束
241+ ├──→ 7. 输入参数用法不一致 → 方案 3(修改 API)→存在兼容性则方案 1→无法区分则方案 5→结束
196242 │
197- ├──→ torch 参数更多 → 仅多 out 参数?─┬→是→方案 2(C++下沉)→不适用则方案 3→存在兼容性则方案 1→无法区分则方案 5→结束
198- │ └→否→方案 3(修改 API)→存在兼容性则方案 1→无法区分则方案 5→结束
243+ ├──→ 8. 输入参数类型不一致 → 方案 3(修改 API)→存在兼容性则方案 1→无法区分则方案 5→结束
199244 │
200- ├──→ 输入参数用法/类型不一致 → 方案 3(修改 API)→存在兼容性则方案 1→无法区分则方案 5 →结束
245+ ├──→ 9. 返回参数类型不一致 → 方案 5(新增 compat 类型 API) →结束
201246 │
202- └──→ 返回参数类型不一致 → 方案 5(新增 compat 类型 API)→结束
247+ ├──→ 10. 组合替代实现 → 方案 4(新增 API)→结束
248+ │
249+ ├──→ 11. 可删除 → 方案 6(无需改动)→结束
250+ │
251+ ├──→ 12. API 别名 → 方案 4(新增 API)→结束
252+ │
253+ └──→ 13. 功能缺失 → 方案 4(新增 API)→结束
203254```
204255
205256### 2.4 详细决策规则
206257
207- ** 前置判断** :以下规则均基于 ** API 相对引用路径一致** 的前提。只要 API 相对引用路径不一致,直接选择** 方案 4(新增 API)** ,无需进入后续判断 。
258+ ** 前置判断** :分类 3 ~ 10 判定规则均基于 ** API 相对引用路径一致** 的前提。只要 API 相对引用路径不一致,直接选择** 方案 4(新增 API)** ,无需进行如下判断 。
208259
209260#### 1. API 完全一致
210261- ** 决策** :方案 6(无需改动)
211262
212- #### 2. 仅参数名不一致
263+ #### 2. 仅 API 调用方式不一致
264+ - ** 决策** :方案 4(新增 API)
265+ - ** 说明** :API 相对引用路径不一致,但参数完全相同,需要新增 API 来实现路径对齐
266+
267+ #### 3. 仅参数名不一致
213268- ** 优先级 1** :方案 2(C++下沉)
214- - ** 适用条件** :满足方案 2 适用条件(见第三部分定义 )
269+ - ** 适用条件** :满足方案 2 适用条件(见第二部分定义 )
215270 - ** 优势** :性能最优
216271- ** 优先级 2** :方案 1(Python 装饰器)
217272 - ** 适用条件** :不满足方案 2 适用条件
218273
219- #### 3 . paddle 参数更多
274+ #### 4 . paddle 参数更多
220275- ** 判断** :额外参数是否影响对齐
221- - ** 否** (如默认参数 ,Paddle 保持默认即可)→ 方案 6(无需改动)
276+ - ** 否** (例如默认参数 ,Paddle 保持默认即可)→ 方案 6(无需改动)
222277 - ** 是** → 方案 3(修改 API)
223278 - ** 存在兼容性** → 方案 5(新增 compat 类型 API)
224279
225- #### 4. 参数默认值不一致
226- - ** 优先级 1** :方案 3(修改 API)
227- - ** 回退** :存在兼容性 → 方案 5(新增 compat 类型 API)
280+ #### 5. 参数默认值不一致
281+ - ** 判断** :不一致的默认值是否影响对齐
282+ - ** 否** (例如不影响结果的参数)→ 方案 6(无需改动)
283+ - ** 是** → 方案 3(修改 API)
284+ - ** 存在兼容性** → 方案 5(新增 compat 类型 API)
228285
229- #### 5 . torch 参数更多
286+ #### 6 . torch 参数更多
230287- ** 子判断** :是否仅多 out 参数
231- - ** 是** → 方案 2(C++下沉)
232- - ** 不适用** → 方案 3(修改 API)→ 存在兼容性则方案 1→ 无法区分则方案 5
233- - ** 否** → 方案 3(修改 API)→ 存在兼容性则方案 1→ 无法区分则方案 5
288+ - ** 是** :
289+ - ** 优先级 1** :方案 2(C++下沉)
290+ - ** 适用条件** :满足方案 2 适用条件(见第二部分定义)
291+ - ** 优势** :性能最优
292+ - ** 优先级 2** :方案 1(Python 装饰器)
293+ - ** 适用条件** :方案 2 不适用时
294+ - ** 否** :
295+ - ** 优先级 1** :方案 3(修改 API)
296+ - ** 存在兼容性** → 方案 1(Python 装饰器)
297+ - ** 无法区分两套签名** → 方案 5(新增 compat 类型 API)
298+
299+ #### 7. 输入参数用法不一致
300+ - ** 优先级 1** :方案 3(修改 API)
301+ - ** 存在兼容性** → 方案 1(Python 装饰器)
302+ - ** 无法区分两套签名** → 方案 5(新增 compat 类型 API)
234303
235- #### 6. 输入参数用法/类型不一致
304+ #### 8. 输入参数类型不一致
236305- ** 优先级 1** :方案 3(修改 API)
237306 - ** 存在兼容性** → 方案 1(Python 装饰器)
238307 - ** 无法区分两套签名** → 方案 5(新增 compat 类型 API)
239308
240- #### 7 . 返回参数类型不一致
309+ #### 9 . 返回参数类型不一致
241310- ** 唯一决策** :方案 5(新增 compat 类型 API)
242311- ** 原因** :
243- - ❌ 方案 3:修改返回值必然不兼容
244- - ❌ 方案 1:装饰器只能根据输入区分,无法区分返回值差异
312+ - ❌ 方案 3:修改返回值必然存在兼容性问题
313+ - ❌ 方案 1:装饰器只能根据输入区分两套签名,返回值不一致无法区分两套签名
245314 - ✅ 方案 5:在 compat 路径下新增,不影响原 API
246315
247- ### 2.5 方案组合说明
316+ #### 10. 组合替代实现
317+ - ** 决策** :方案 4(新增 API)
318+ - ** 说明** :PyTorch API 需要多个 Paddle API 组合实现,通过新增 API 实现组合计算逻辑
319+
320+ #### 11. 可删除
321+ - ** 决策** :方案 6(无需改动)
322+ - ** 说明** :PyTorch API 在 Paddle 中可直接删除,无需开发
323+
324+ #### 12. API 别名
325+ - ** 决策** :方案 4(新增 API)
326+ - ** 说明** :为 PyTorch 别名 API 新增对应的 Paddle 别名 API
327+
328+ #### 13. 功能缺失
329+ - ** 决策** :方案 4(新增 API)
330+ - ** 说明** :Paddle 暂无等效实现,需要新增 API 来实现该功能
331+
332+ # 四、注意事项
248333
249- > ** 重要提醒** :一个 API 可能涉及多种差异分类,需要综合分析所有差异点,可以组合多种方案来消除所有差异点。
334+ 1 . 严格按标准工作流程执行,杜绝自行臆断和跳过步骤
335+ 2 . 所有路径使用 ` ${ROOT_DIR} ` 变量表示根目录,需自行替换为实际路径
250336
251- ** 示例** :` torch.frexp ` 存在"仅参数名不同"和"仅多 out 参数"两个差异点
252- - ** 组合方案** :方案 3 + 方案 1
253- - 方案 3:在末尾添加 out 参数(带默认值 None),消除"仅多 out 参数"差异
254- - 方案 1:支持参数名不同的重载,消除"仅参数名不同"差异
337+ # 五、常见问题处理
0 commit comments