From 9d5c8dbc6c1c4ebdd2721e9a632d84c5326a123e Mon Sep 17 00:00:00 2001 From: zhouwei25 Date: Fri, 12 Jun 2026 14:53:19 +0000 Subject: [PATCH] [API Compatibility] det/pinverse/addcdiv/addcdiv_/imag/real/scatter_reduce_/sign_/LogSoftmax/Flatten/kl_div/nll_loss/pack_padded_sequence/pad_packed_sequence/weight_norm/inv/pinv/bernoulli_/fmod/fmod_ Edit By AI Agent Co-Authored-By: Claude Opus 4.6 --- .github/CODEOWNERS | 2 +- docs/api/paddle/bernoulli__cn.rst | 4 + docs/api/paddle/imag_cn.rst | 2 +- docs/api/paddle/linalg/det_cn.rst | 2 +- docs/api/paddle/linalg/inv_cn.rst | 2 +- docs/api/paddle/linalg/pinv_cn.rst | 2 +- docs/api/paddle/nn/Flatten_cn.rst | 4 +- docs/api/paddle/nn/LogSoftmax_cn.rst | 2 +- docs/api/paddle/nn/functional/kl_div_cn.rst | 4 +- docs/api/paddle/nn/functional/nll_loss_cn.rst | 2 +- docs/api/paddle/nn/utils/weight_norm_cn.rst | 2 +- docs/api/paddle/real_cn.rst | 2 +- .../api_compatibility/.claude/CLAUDE.md | 43 ++++++----- .../.claude/skills/add-new-api/SKILL.md | 2 +- .../add-new-api/references/new_cpp_op.md | 2 +- .../add-new-api/references/new_python_api.md | 2 +- .../skills/add-new-compat-api/SKILL.md | 2 +- .../.claude/skills/api-compatibility/SKILL.md | 77 +++++++------------ .../SKILL.md | 8 +- .../.claude/skills/cpp-sink/SKILL.md | 2 +- .../.claude/skills/create-pr/SKILL.md | 6 +- .../.claude/skills/modify-origin-api/SKILL.md | 2 +- .../.claude/skills/python-decorator/SKILL.md | 4 +- .../SKILL.md | 10 +-- .../SKILL.md | 60 ++++++++------- .../SKILL.md | 6 +- .../coding_agent/api_compatibility/README.md | 38 ++++----- .../input_args_type_diff/torch.Tensor.fmod.md | 23 ++++-- .../torch.Tensor.fmod_.md | 23 ++++-- .../invok_only_diff/torch.Tensor.imag.md | 8 +- .../invok_only_diff/torch.Tensor.real.md | 8 +- .../torch_more_args/torch.fmod.md | 35 ++++++--- 32 files changed, 202 insertions(+), 189 deletions(-) rename docs/dev_guides/coding_agent/api_compatibility/.claude/skills/{add-compatibility-test => compatibility-test}/SKILL.md (96%) rename docs/dev_guides/coding_agent/api_compatibility/.claude/skills/{pytorch-alignment-validator => pytorch-test}/SKILL.md (97%) rename docs/dev_guides/coding_agent/api_compatibility/.claude/skills/{api-change-decider => select-solution}/SKILL.md (92%) rename docs/dev_guides/coding_agent/api_compatibility/.claude/skills/{api-docs-updater => update-docs}/SKILL.md (96%) diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 5981374dc60..cbe548af006 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -1,2 +1,2 @@ # Paddle API Docs -docs/api/paddle @jzhang533 @sunzhongkai588 @mattheliu @Echo-Nie +docs/api/paddle @jzhang533 @sunzhongkai588 @mattheliu @Echo-Nie @zhwesky2010 diff --git a/docs/api/paddle/bernoulli__cn.rst b/docs/api/paddle/bernoulli__cn.rst index 99370f9f26b..550b32b0113 100644 --- a/docs/api/paddle/bernoulli__cn.rst +++ b/docs/api/paddle/bernoulli__cn.rst @@ -10,3 +10,7 @@ Inplace 版本的 :ref:`cn_api_paddle_bernoulli` API,对输入 x 采用 Inplac 更多关于 inplace 操作的介绍请参考 `3.1.3 原位(Inplace)操作和非原位操作的区别`_ 了解详情。 .. _3.1.3 原位(Inplace)操作和非原位操作的区别: https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/guides/beginner/tensor_cn.html#id3 + +.. note:: + + 参数名 ``input`` 可替代 ``x``,如 ``bernoulli_(input=tensor_x)`` 等价于 ``bernoulli_(x=tensor_x)``。 diff --git a/docs/api/paddle/imag_cn.rst b/docs/api/paddle/imag_cn.rst index d7872722371..5f15f51a4b5 100644 --- a/docs/api/paddle/imag_cn.rst +++ b/docs/api/paddle/imag_cn.rst @@ -10,7 +10,7 @@ imag 参数 :::::::::::: - - **x** (Tensor) - 输入的 Tensor,其数据类型可以为 complex64 或 complex128。 + - **x** (Tensor) - 输入的 Tensor,其数据类型可以为 complex64 或 complex128。别名 ``input``。 - **name** (str,可选) - 具体用法请参见 :ref:`api_guide_Name`,一般无需设置,默认值为 None。 返回 diff --git a/docs/api/paddle/linalg/det_cn.rst b/docs/api/paddle/linalg/det_cn.rst index 1a7597e1c1a..dcb0e78ef65 100644 --- a/docs/api/paddle/linalg/det_cn.rst +++ b/docs/api/paddle/linalg/det_cn.rst @@ -9,7 +9,7 @@ det 参数 :::::::::::: - - **x** (Tensor):输入一个或批量矩阵。``x`` 的形状应为 ``[*, M, M]``,其中 ``*`` 为零或更大的批次维度,数据类型支持 float32、float64。 + - **x** (Tensor):输入一个或批量矩阵。``x`` 的形状应为 ``[*, M, M]``,其中 ``*`` 为零或更大的批次维度,数据类型支持 float32、float64。别名 ``input``。 返回 :::::::::::: diff --git a/docs/api/paddle/linalg/inv_cn.rst b/docs/api/paddle/linalg/inv_cn.rst index 964e2ef5045..020db048ce6 100644 --- a/docs/api/paddle/linalg/inv_cn.rst +++ b/docs/api/paddle/linalg/inv_cn.rst @@ -10,7 +10,7 @@ inv 参数 ::::::::: - - **x** (Tensor) – 输入 Tensor,最后两维的大小必须相等。如果输入 Tensor 的维数大于 2,则被视为 2-D 矩阵的批次(batch)。支持的数据类型:float32,float64。 + - **x** (Tensor) – 输入 Tensor,最后两维的大小必须相等。如果输入 Tensor 的维数大于 2,则被视为 2-D 矩阵的批次(batch)。支持的数据类型:float32,float64。别名 ``input``。 - **name** (str,可选) - 具体用法请参见 :ref:`api_guide_Name`,一般无需设置,默认值为 None。 返回 diff --git a/docs/api/paddle/linalg/pinv_cn.rst b/docs/api/paddle/linalg/pinv_cn.rst index a4d3ea4eda9..03939d08c2b 100644 --- a/docs/api/paddle/linalg/pinv_cn.rst +++ b/docs/api/paddle/linalg/pinv_cn.rst @@ -12,7 +12,7 @@ pinv 参数 ::::::::: - - **x** (Tensor):输入变量,类型为 Tensor,数据类型为 float32、float64、complex64、complex12,形状为(M, N)或(B, M, N)。 + - **x** (Tensor):输入变量,类型为 Tensor,数据类型为 float32、float64、complex64、complex12,形状为(M, N)或(B, M, N)。别名 ``input``。 - **rcond** (float64,可选):奇异值(特征值)被截断的阈值,奇异值(特征值)小于 rcond * 最大奇异值时会被置为 0,默认值为 1e-15。 - **hermitian** (bool,可选):是否为 ``hermitian`` 矩阵或者实对称矩阵,默认值为 False。 - **name** (str,可选) - 具体用法请参见 :ref:`api_guide_Name`,一般无需设置,默认值为 None。 diff --git a/docs/api/paddle/nn/Flatten_cn.rst b/docs/api/paddle/nn/Flatten_cn.rst index af961c40c65..c591ef7059c 100644 --- a/docs/api/paddle/nn/Flatten_cn.rst +++ b/docs/api/paddle/nn/Flatten_cn.rst @@ -13,8 +13,8 @@ Flatten 参数 :::::::::::: - - **start_axis** (int,可选) - 展开的起始维度,默认值为 1。 - - **stop_axis** (int,可选) - 展开的结束维度,默认值为-1。 + - **start_axis** (int,可选) - 展开的起始维度,默认值为 1。别名 ``start_dim``。 + - **stop_axis** (int,可选) - 展开的结束维度,默认值为-1。别名 ``end_dim``。 返回 :::::::::::: diff --git a/docs/api/paddle/nn/LogSoftmax_cn.rst b/docs/api/paddle/nn/LogSoftmax_cn.rst index d8780786f78..f70cf3529b8 100644 --- a/docs/api/paddle/nn/LogSoftmax_cn.rst +++ b/docs/api/paddle/nn/LogSoftmax_cn.rst @@ -15,7 +15,7 @@ LogSoftmax 激活层,计算公式如下: 参数 ::::::::: - - **axis** (int,可选) - 指定对输入 Tensor 进行运算的轴。``axis`` 的有效范围是[-D, D),D 是输入 Tensor 的维度,``axis`` 为负值时与 :math:`axis + D` 等价。默认值为-1。 + - **axis** (int,可选) - 指定对输入 Tensor 进行运算的轴。``axis`` 的有效范围是[-D, D),D 是输入 Tensor 的维度,``axis`` 为负值时与 :math:`axis + D` 等价。默认值为-1。别名 ``dim``。 - **name** (str,可选) - 具体用法请参见 :ref:`api_guide_Name`,一般无需设置,默认值为 None。 形状 diff --git a/docs/api/paddle/nn/functional/kl_div_cn.rst b/docs/api/paddle/nn/functional/kl_div_cn.rst index 5ac2bc19425..e8f59fd67e7 100644 --- a/docs/api/paddle/nn/functional/kl_div_cn.rst +++ b/docs/api/paddle/nn/functional/kl_div_cn.rst @@ -33,8 +33,8 @@ kL 发散损失计算如下: 参数 ::::::::: - **input** (Tensor) - KL 散度损失算子的输入 Tensor。维度为[N, \*]的多维 Tensor,其中 N 是批大小,\*表示任何数量的附加维度,数据类型为 float32 或 float64。 - - **label** (Tensor) - KL 散度损失算子的 Tensor。与输入 ``input`` 的维度和数据类型一致的多维 Tensor。 - - **reduction** (str,可选) - 要应用于输出的 reduction 类型,可用类型为‘none’ | ‘batchmean’ | ‘mean’ | ‘sum’,‘none’表示无 reduction,‘batchmean’ 表示输出的总和除以批大小,‘mean’ 表示所有输出的平均值,‘sum’表示输出的总和。 + - **label** (Tensor) - KL 散度损失算子的 Tensor。与输入 ``input`` 的维度和数据类型一致的多维 Tensor。别名 ``target``。 + - **reduction** (str,可选) - 要应用于输出的 reduction 类型,可用类型为’none’ | ‘batchmean’ | ‘mean’ | ‘sum’,’none’表示无 reduction,’batchmean’ 表示输出的总和除以批大小,’mean’ 表示所有输出的平均值,’sum’表示输出的总和。 - **log_target** (bool,可选) - 表示输入的 ``label`` 变量是否属于 log 空间。默认值为 False,表示不属于。 - **name** (str,可选) - 具体用法请参见 :ref:`api_guide_Name`,一般无需设置,默认值为 None。 diff --git a/docs/api/paddle/nn/functional/nll_loss_cn.rst b/docs/api/paddle/nn/functional/nll_loss_cn.rst index 67c84f0d4c9..8f4f0980ab3 100644 --- a/docs/api/paddle/nn/functional/nll_loss_cn.rst +++ b/docs/api/paddle/nn/functional/nll_loss_cn.rst @@ -9,7 +9,7 @@ nll_loss 参数 ::::::::: - **input** (Tensor) - 输入 ``Tensor``,其形状为 :math:`[N, C]`,其中 ``C`` 为类别数。但是对于多维度的情形下,它的形状为 :math:`[N, C, d_1, d_2, ..., d_K]`。数据类型为 float32 或 float64。 - - **label** (Tensor) - 输入 x 对应的标签值。其形状为 :math:`[N,]` 或者 :math:`[N, d_1, d_2, ..., d_K]`,数据类型为 int64。 + - **label** (Tensor) - 输入 x 对应的标签值。其形状为 :math:`[N,]` 或者 :math:`[N, d_1, d_2, ..., d_K]`,数据类型为 int64。别名 ``target``。 - **weight** (Tensor,可选) - 手动指定每个类别的权重。其默认为 ``None``。如果提供该参数的话,长度必须为 ``num_classes``。数据类型为 float32 或 float64。 - **ignore_index** (int,可选) - 指定一个忽略的标签值,此标签值不参与计算。默认值为-100。数据类型为 int64。 - **reduction** (str,可选) - 指定应用于输出结果的计算方式,可选值有:``none``、``mean``、``sum``。默认为 ``mean``,计算 ``mini-batch`` loss 均值。设置为 ``sum`` 时,计算 ``mini-batch`` loss 的总和。设置为 ``none`` 时,则返回 loss Tensor。数据类型为 string。 diff --git a/docs/api/paddle/nn/utils/weight_norm_cn.rst b/docs/api/paddle/nn/utils/weight_norm_cn.rst index 4c75e2abbd2..3569cefbdd2 100644 --- a/docs/api/paddle/nn/utils/weight_norm_cn.rst +++ b/docs/api/paddle/nn/utils/weight_norm_cn.rst @@ -15,7 +15,7 @@ weight_norm 参数 :::::::::::: - - **layer** (paddle.nn.Layer) - 要添加权重归一化的层。 + - **layer** (paddle.nn.Layer) - 要添加权重归一化的层。别名 ``module``。 - **name** (str,可选) - 权重参数的名字。默认值为 ``weight``。 - **dim** (int|None,可选) - 进行归一化操作的切片所在维度,是小于权重 Tensor rank 的非负数。比如卷积的权重 shape 是 [cout,cin,kh,kw] , rank 是 4,则 dim 可以选 0,1,2,3;fc 的权重 shape 是 [cout,cin] ,rank 是 2,dim 可以选 0,1。如果为 None 就对所有维度上的元素做归一化。默认:0。 diff --git a/docs/api/paddle/real_cn.rst b/docs/api/paddle/real_cn.rst index d90252e3a3c..5c22ad48175 100644 --- a/docs/api/paddle/real_cn.rst +++ b/docs/api/paddle/real_cn.rst @@ -10,7 +10,7 @@ real 参数 :::::::::::: - - **x** (Tensor) - 输入 Tensor,其数据类型可以为 complex64 或 complex128。 + - **x** (Tensor) - 输入 Tensor,其数据类型可以为 complex64 或 complex128。别名 ``input``。 - **name** (str,可选) - 具体用法请参见 :ref:`api_guide_Name`,一般无需设置,默认值为 None。 返回 diff --git a/docs/dev_guides/coding_agent/api_compatibility/.claude/CLAUDE.md b/docs/dev_guides/coding_agent/api_compatibility/.claude/CLAUDE.md index 31c7b763265..13e2aa5962b 100644 --- a/docs/dev_guides/coding_agent/api_compatibility/.claude/CLAUDE.md +++ b/docs/dev_guides/coding_agent/api_compatibility/.claude/CLAUDE.md @@ -1,5 +1,11 @@ # Paddle API 对齐 PyTorch 项目 +## 执行原则(最高优先级) + +1. **直接执行**:全程静默执行,禁止向用户询问或讨论,在完成任务前不要停下来等待下一步指令 +2. **自主判断**:分析、判断、选择均由模型独立完成 +3. **自动处理异常**:遇到错误按回退规则自动处理,失败 3 次自动放弃该 API + ## 项目目标 使 Paddle API 与 PyTorch API 行为完全对齐。对于任意 PyTorch API 用法,只需将 `torch.*` 替换为 `paddle.*`,计算结果完全一致。 @@ -11,9 +17,9 @@ | 工作目录 | 完整路径 | 内容说明 | 对应步骤 | |---------|---------|---------|---------------| -| Paddle | `${ROOT_DIR}/Paddle` | Paddle 框架源码仓库,包含所有 Paddle API 的实现 | Step2:代码修改 + Step3:兼容测试 | -| PaConvert | `${ROOT_DIR}/PaConvert` | PyTorch 转换工具仓库,包含所有 Pytorch 单元测试 | Step4:对齐验证 | -| docs | `${ROOT_DIR}/docs` | Paddle 文档仓库,包含所有 Paddle API 中文文档 | Step5:文档更新 | +| Paddle | `${ROOT_DIR}/Paddle` | Paddle 框架源码仓库,包含所有 Paddle API 的实现 | Step2 代码修改 + Step3 兼容测试 | +| PaConvert | `${ROOT_DIR}/PaConvert` | PyTorch 转换工具仓库,包含所有 Pytorch 单元测试 | Step4 Pytorch 测试 | +| docs | `${ROOT_DIR}/docs` | Paddle 文档仓库,包含所有 Paddle API 中文文档 | Step5 更新文档 | ## 常用文件位置 @@ -97,34 +103,31 @@ void AtanKernel(const Context& dev_ctx, const DenseTensor& x, DenseTensor* out) ## 工作流程 ### 流程概览 -| Step | 名称 | 对应 Skill | 核心任务 | +| Step | 名称 | 调用对应 Skill | 核心任务 | |------|------|-----------|----------| -| Step1 | 方案决策 | `/api-change-decider` | 分析差异,选择修改方案 | -| Step2 | 代码修改 | `/python-decorator` `/cpp-sink` `/modify-origin-api` `/add-new-api` `/add-new-compat-api` | 按方案修改 Paddle 代码 | -| Step3 | 兼容测试 | `/add-compatibility-test` | 添加兼容性单测并运行 | -| Step4 | 对齐验证 | `/pytorch-alignment-validator` | 编写 PyTorch 单测验证对齐 | -| Step5 | 文档更新 | `/api-docs-updater` | 更新中文文档和差异文档 | +| Step1 | 选择方案 | `/select-solution` | 分析差异,选择修改方案 | +| Step2 | 代码修改 | `/python-decorator` `/cpp-sink` `/modify-origin-api` `/add-new-api` `/add-new-compat-api` | 按方案修改 Paddle 代码 | +| Step3 | 兼容测试 | `/compatibility-test` | 添加兼容性单测并运行 | +| Step4 | Pytorch 测试 | `/pytorch-test` | 编写 PyTorch 单测验证对齐 | +| Step5 | 更新文档 | `/update-docs` | 更新中文文档和差异文档 | ### 流程重要约束 1. **批量处理**:每个 Step 对**所有 API** 完成后才进入下一步 2. **正向推进**:必须按 Step1 → Step2 → Step3 → Step4 → Step5 顺序执行,禁止跳过 -3. **异常回退**:Step3/Step4 失败时回退到对应步骤重新执行 -4. **放弃规则**:回退 3 次以上仍失败,标记为"未对齐"并放弃,需完整回退所有修改 - -### Step 通过标准 -- Step3:单测可运行通过 -- Step4:API 可配置为 `ChangePrefixMatcher` - +3. **异常回退**:Step3/Step4 无法通过时回退到对应步骤重新执行,必须满足以下通过标准: + - Step3:单测可运行通过 + - Step4:API 可配置为 `ChangePrefixMatcher` +4. **放弃规则**:若某个 API 回退 3 次以上仍失败,标记为"未对齐"并放弃该 API,需完整回退该 API 的所有修改,避免"修改了但没改对"的中间状态 ## 注意事项 -1. 严格按标准工作流程执行,杜绝自行臆断和跳过步骤 -2. 每次修改代码后必须重新编译:在 `${ROOT_DIR}/Paddle/build` 目录下执行编译,否则修改不会生效 +1. 每次修改 Paddle 代码后必须重新编译,否则修改不会生效: ```bash cd ${ROOT_DIR}/Paddle/build - cmake .. && make -j$(nproc) + cmake .. && make -j$(nproc) > compile.log 2>&1 ``` - - 无需重装,直接生效(勿执行 setup/install 等安装操作) + - 无需重装,编译完成直接生效(勿执行 setup/install 等安装操作) - 勿删除 build 目录(否则增量编译失效,编译时间极长) +2. 不要在 API 文档字符串中强调"PyTorch 风格"、"PyTorch 签名"、"PyTorch 适配"等 Pytorch 相关内容 ## 忽略参数规则 分析差异时,以下参数直接忽略: diff --git a/docs/dev_guides/coding_agent/api_compatibility/.claude/skills/add-new-api/SKILL.md b/docs/dev_guides/coding_agent/api_compatibility/.claude/skills/add-new-api/SKILL.md index 680050a34a9..0eb50b9565b 100644 --- a/docs/dev_guides/coding_agent/api_compatibility/.claude/skills/add-new-api/SKILL.md +++ b/docs/dev_guides/coding_agent/api_compatibility/.claude/skills/add-new-api/SKILL.md @@ -1,6 +1,6 @@ --- name: add-new-api -description: 负责《Paddle API 对齐 PyTorch 项目》中 Step2:API 代码修改,实施『新增 API』方案。通过新增 Paddle API(新增 API 别名、新增 Python 层 API、新增 C++算子),覆盖 Pytorch API 调用路径,实现与 PyTorch API 行为对齐。 +description: 负责《Paddle API 对齐 PyTorch 项目》中 Step2 代码修改,实施『新增 API』方案。通过新增 Paddle API(新增 API 别名、新增 Python 层 API、新增 C++算子),覆盖 Pytorch API 调用路径,实现与 PyTorch API 行为对齐。 context: fork disable-model-invocation: false --- diff --git a/docs/dev_guides/coding_agent/api_compatibility/.claude/skills/add-new-api/references/new_cpp_op.md b/docs/dev_guides/coding_agent/api_compatibility/.claude/skills/add-new-api/references/new_cpp_op.md index ff3e569c698..1a6f0ca3db5 100644 --- a/docs/dev_guides/coding_agent/api_compatibility/.claude/skills/add-new-api/references/new_cpp_op.md +++ b/docs/dev_guides/coding_agent/api_compatibility/.claude/skills/add-new-api/references/new_cpp_op.md @@ -393,7 +393,7 @@ class TestTraceOp(OpTest): ```bash cd ${ROOT_DIR}/Paddle/build -cmake .. && make -j$(nproc) +cmake .. && make -j$(nproc) > compile.log 2>&1 python test_xxx_op.py ``` diff --git a/docs/dev_guides/coding_agent/api_compatibility/.claude/skills/add-new-api/references/new_python_api.md b/docs/dev_guides/coding_agent/api_compatibility/.claude/skills/add-new-api/references/new_python_api.md index 837b3833207..4c623eed8bc 100644 --- a/docs/dev_guides/coding_agent/api_compatibility/.claude/skills/add-new-api/references/new_python_api.md +++ b/docs/dev_guides/coding_agent/api_compatibility/.claude/skills/add-new-api/references/new_python_api.md @@ -160,7 +160,7 @@ class TestHardtanhAPI(unittest.TestCase): ```bash cd ${ROOT_DIR}/Paddle/build -cmake .. && make -j$(nproc) +cmake .. && make -j$(nproc) > compile.log 2>&1 python test_xxx.py ``` diff --git a/docs/dev_guides/coding_agent/api_compatibility/.claude/skills/add-new-compat-api/SKILL.md b/docs/dev_guides/coding_agent/api_compatibility/.claude/skills/add-new-compat-api/SKILL.md index c6de8f8613f..5cce5cb051a 100644 --- a/docs/dev_guides/coding_agent/api_compatibility/.claude/skills/add-new-compat-api/SKILL.md +++ b/docs/dev_guides/coding_agent/api_compatibility/.claude/skills/add-new-compat-api/SKILL.md @@ -1,6 +1,6 @@ --- name: add-new-compat-api -description: 负责《Paddle API 对齐 PyTorch 项目》中 Step2:API 代码修改,实施『新增 compat 类型 API』方案。在 `paddle.compat` 命名空间下新增 API,实现与 PyTorch API 行为对齐。 +description: 负责《Paddle API 对齐 PyTorch 项目》中 Step2 代码修改,实施『新增 compat 类型 API』方案。在 `paddle.compat` 命名空间下新增 API,实现与 PyTorch API 行为对齐。 context: fork disable-model-invocation: false --- diff --git a/docs/dev_guides/coding_agent/api_compatibility/.claude/skills/api-compatibility/SKILL.md b/docs/dev_guides/coding_agent/api_compatibility/.claude/skills/api-compatibility/SKILL.md index 3d76ccafbfe..18e8015360b 100644 --- a/docs/dev_guides/coding_agent/api_compatibility/.claude/skills/api-compatibility/SKILL.md +++ b/docs/dev_guides/coding_agent/api_compatibility/.claude/skills/api-compatibility/SKILL.md @@ -140,21 +140,20 @@ x = paddle.to_tensor([1.0, -2.0, 3.0]) print(paddle.abs(x)) ``` - # 三、整体工作流程 ## 流程概览 ``` -输入 API 列表 → Step1:所有 API 方案决策 → Step2:所有 API 代码修改 → Step3:所有 API 兼容测试 → Step4:所有 API 对齐验证 → Step5:所有 API 文档更新 → 全部完成(流程全自动推进,不用询问) +输入 API 列表 → Step1:所有 API 选择方案 → Step2:所有 API 代码修改 → Step3:所有 API 兼容测试 → Step4:所有 API Pytorch 测试 → Step5:所有 API 更新文档 → 全部完成 ``` 具体如下: -### Step 1:方案决策(调用 `/api-change-decider` skill) +### Step 1:选择方案(调用 `/select-solution` skill) Step 1.1: 获取差异信息 Step 1.2: 提取差异信息 - Step 1.3: 方案决策 + Step 1.3: 选择方案 ### Step 2:代码修改 -根据 Step1 的方案决策结果,**按方案分组**,依次调用对应 skill,同一方案的所有 API 在一个 skill 调用中批量处理。 +根据 Step1 的方案选择结果,**按方案分组**,依次调用对应 skill,同一方案的所有 API 在一个 skill 调用中批量处理。 **各方案步骤**: #### 方案 1:Python 装饰器(调用 `/python-decorator` skill) @@ -172,48 +171,36 @@ print(paddle.abs(x)) #### 方案 4:新增 API(调用 `/add-new-api` skill) #### 方案 5:新增 compat 类型 API(调用 `/add-new-compat-api` skill) -### Step 3:兼容测试(调用 `/add-compatibility-test` skill) +### Step 3:兼容测试(调用 `/compatibility-test` skill) Step 3.1: 编写测试用例 Step 3.2: 编译并运行单测(每次修改代码均需执行编译) -### Step 4:对齐验证(调用 `/pytorch-alignment-validator` skill) +### Step 4:Pytorch 测试(调用 `/pytorch-test` skill) Step 4.1: 标记已完成的 API Step 4.2: 增加测试用例 Step 4.3: 编译并运行单测(每次修改代码均需执行编译) -### Step 5:文档更新(调用 `/api-docs-updater` skill) +### Step 5:更新文档(调用 `/update-docs` skill) ## 流程重要约束 -1. 接收用户输入的待对齐 API 列表(如 `torch.argmax`, `torch.log2`, `torch.logsumexp`) -2. **批量处理模式**:依次执行,每个 Step 结束后才进入下一个 Step - - Step1:对**所有 API**进行方案决策 - - Step2:对**所有 API**进行代码修改 - - Step3:对**所有 API**进行兼容测试 - - Step4:对**所有 API**进行对齐验证 - - Step5:对**所有 API**进行文档更新 -3. **流程正向推进原则** - - 正常情况下必须遵循 Step1 → Step2 → Step3 → Step4 → Step5 的顺序 - - 每个步骤完成后,才能进入下一步骤,禁止跳过任何步骤 -4. **异常回退原则** - - 当 Step3 或 Step4 无法通过时,则需要执行回退(Step3 的通过标准是单测可运行通过,Step4 的通过标准是 API 可配置为 ChangePrefixMatcher): - * 若判断为方案选择错误 → 回退到 Step1 重新决策 - * 若判断为代码实现有误 → 回退到 Step2 调整实现方式 - - 回退后需从该步骤重新按流程向前推进,例如回退到 Step2,则重新执行 Step2 → Step3 → Step4 → Step5 -5. **允许放弃部分 API**(合理分配精力,最大化成功率): - - 当某个 API 异常回退 3 次以上仍无法通过,则放弃该 API,在最终对齐结果统计表中标记该 API 为"未对齐",并简要说明放弃原因 - - 必须完整回退该 API 的所有修改,确保项目处于干净状态,不得保留任何 API"修改了但没改对"的中间状态 -6. 所有 API 都完成 5 个步骤(除被放弃外)后,任务结束 +1. 批量处理:每个 Step 对**所有 API**完成后才进入下一步 +2. 正向推进:必须按 Step1 → Step2 → Step3 → Step4 → Step5 顺序执行,禁止跳过 +3. 异常回退: + - Step3/Step4 无法通过时自动回退(Step3 通过标准:单测可运行通过;Step4 通过标准:API 可配置为 ChangePrefixMatcher) + - 选择方案错误 → 回退到 Step1;代码实现有误 → 回退到 Step2 + - 回退后从该步骤重新向前推进 +4. 放弃规则:某个 API 回退 3 次以上仍失败,标记为"未对齐"并完整回退所有修改 ## 工作示例 假设待对齐 API 为 `torch.argmax`: ``` -1. Step1: 方案决策 → 得到『方案 2:C++下沉』 +1. Step1: 选择方案 → 得到『方案 2:C++下沉』 2. Step2: 代码修改 → 修改 Paddle 目录文件,将 paddle.argmax 下沉到 C++ 3. Step3: 兼容测试 → 在 Paddle 目录添加兼容性单测,编译并运行验证 -4. Step4: 对齐验证 → 修改 PaConvert 目录文件,编写 Pytorch 单元测试,对比测试,验证对齐 -5. Step5: 文档更新 → 修改 docs 目录文件,更新 paddle.argmax 文档 +4. Step4: Pytorch 测试 → 修改 PaConvert 目录文件,编写 Pytorch 单元测试,对比测试,验证对齐 +5. Step5: 更新文档 → 修改 docs 目录文件,更新 paddle.argmax 文档 ``` # 四、各 Skill 说明 @@ -238,15 +225,15 @@ print(paddle.abs(x)) | Skill | 对应步骤 | |-------|--------| -| `/api-change-decider` | Step1:方案决策 | -| `/python-decorator` | Step2:方案 1 Python 装饰器 | -| `/cpp-sink` | Step2:方案 2 C++下沉 | -| `/modify-origin-api` | Step2:方案 3 修改原有 API | -| `/add-new-api` | Step2:方案 4 新增 API | -| `/add-new-compat-api` | Step2:方案 5 新增 compat API | -| `/add-compatibility-test` | Step3:兼容测试 | -| `/pytorch-alignment-validator` | Step4:对齐验证 | -| `/api-docs-updater` | Step5:文档更新 | +| `/select-solution` | Step1 选择方案 | +| `/python-decorator` | Step2 方案 1 Python 装饰器 | +| `/cpp-sink` | Step2 方案 2 C++下沉 | +| `/modify-origin-api` | Step2 方案 3 修改原有 API | +| `/add-new-api` | Step2 方案 4 新增 API | +| `/add-new-compat-api` | Step2 方案 5 新增 compat API | +| `/compatibility-test` | Step3 兼容测试 | +| `/pytorch-test` | Step4 Pytorch 测试 | +| `/update-docs` | Step5 更新文档 | # 五、自进化机制 @@ -289,14 +276,4 @@ mod = remainder ### Q2:Inplace API 如何实现? -内部所有操作都必须使用 inplace 方法(`scale_`、`add_` 等),不能用 `*`、`+` 等非 inplace 操作。 - -**错误**: -```python -mv_result = mv_result * alpha # 创建新 tensor -``` - -**正确**: -```python -mv_result.scale_(alpha) # inplace 修改 -``` +与输入 input 相关的所有操作都必须使用 inplace 方法(`scale_`、`add_` 等),不能用 `*`、`+` 等非 inplace 操作。可以参考 addcdiv_的实现。 diff --git a/docs/dev_guides/coding_agent/api_compatibility/.claude/skills/add-compatibility-test/SKILL.md b/docs/dev_guides/coding_agent/api_compatibility/.claude/skills/compatibility-test/SKILL.md similarity index 96% rename from docs/dev_guides/coding_agent/api_compatibility/.claude/skills/add-compatibility-test/SKILL.md rename to docs/dev_guides/coding_agent/api_compatibility/.claude/skills/compatibility-test/SKILL.md index abe3ac01bc3..a512d890410 100644 --- a/docs/dev_guides/coding_agent/api_compatibility/.claude/skills/add-compatibility-test/SKILL.md +++ b/docs/dev_guides/coding_agent/api_compatibility/.claude/skills/compatibility-test/SKILL.md @@ -1,6 +1,6 @@ --- -name: add-compatibility-test -description: 负责《Paddle API 对齐 PyTorch 项目》中 Step3:兼容性测试,为已修改的 Paddle API 添加兼容性单测并执行验证,确保 API 的 Paddle 用法与 PyTorch 用法均能正常工作。 +name: compatibility-test +description: 负责《Paddle API 对齐 PyTorch 项目》中 Step3 兼容测试,为已修改的 Paddle API 添加兼容性单测并执行验证,确保 API 的 Paddle 用法与 PyTorch 用法均能正常工作。 disable-model-invocation: false --- @@ -131,7 +131,7 @@ if paddle.device.is_compiled_with_cuda(): ```bash cd ${ROOT_DIR}/Paddle/build -cmake .. && make -j$(nproc) +cmake .. && make -j$(nproc) > compile.log 2>&1 python test_xxx.py ``` @@ -197,7 +197,7 @@ self.dtype = np.float32 - 回退后再进入本步骤(Step3),则只需执行:编译并运行,其他步骤无需执行 3. **若判断为方案选择错误**(如当前方案不适用、底层不支持等): - - 回退到总步骤 Step1(方案决策)重新决策 + - 回退到总步骤 Step1(选择方案)重新选择 - 回退后再进入本步骤(Step3),则只需执行:编译并运行,其他步骤无需执行 # 五、常见问题处理 diff --git a/docs/dev_guides/coding_agent/api_compatibility/.claude/skills/cpp-sink/SKILL.md b/docs/dev_guides/coding_agent/api_compatibility/.claude/skills/cpp-sink/SKILL.md index f55981afbb5..be7ebe28b08 100644 --- a/docs/dev_guides/coding_agent/api_compatibility/.claude/skills/cpp-sink/SKILL.md +++ b/docs/dev_guides/coding_agent/api_compatibility/.claude/skills/cpp-sink/SKILL.md @@ -1,6 +1,6 @@ --- name: cpp-sink -description: 负责《Paddle API 对齐 PyTorch 项目》中 Step2:API 代码修改,实施『C++下沉』方案。通过将 Python API 下沉至 C++层,可以减少 Python 装饰器带来的性能开销,提升 API 调度效率。 +description: 负责《Paddle API 对齐 PyTorch 项目》中 Step2 代码修改,实施『C++下沉』方案。通过将 Python API 下沉至 C++层,可以减少 Python 装饰器带来的性能开销,提升 API 调度效率。 context: fork disable-model-invocation: false --- diff --git a/docs/dev_guides/coding_agent/api_compatibility/.claude/skills/create-pr/SKILL.md b/docs/dev_guides/coding_agent/api_compatibility/.claude/skills/create-pr/SKILL.md index 23f948cd3d3..00d7b70045c 100644 --- a/docs/dev_guides/coding_agent/api_compatibility/.claude/skills/create-pr/SKILL.md +++ b/docs/dev_guides/coding_agent/api_compatibility/.claude/skills/create-pr/SKILL.md @@ -1,7 +1,6 @@ --- name: create-pr description: 负责《Paddle API 对齐 PyTorch 项目》中代码提交,分别对 Paddle、PaConvert、Docs 三个仓库创建或更新 Pull Request -allowed-tools: Bash(git *) disable-model-invocation: false --- @@ -28,7 +27,7 @@ disable-model-invocation: false ### 渠道 1:从上下文或用户输入获取 从以下来源获取 API 名单: -- **从上下文获取**:从 api-change-decider、python-decorator、cpp-sink 等前序步骤的上下文中自动提取 API 名单 +- **从上下文获取**:从 select-solution、python-decorator、cpp-sink 等前序步骤的上下文中自动提取 API 名单 - **从用户输入获取**:用户直接提供 PyTorch API 名单,例如:`torch.relu`、`torch.sigmoid`、`torch.tanh` 等 ### 渠道 2:从仓库改动分析获取 @@ -295,8 +294,7 @@ EOF 4. **pre-commit hook**:如果失败,修复问题后重新 add 和 commit 5. **分支推送**:所有改动必须推送到 upstream 的 claude 分支 6. **PR 操作**:确保 PR 创建或更新成功,失败需修正后重试 -7. **历史经验**:复盘记忆中的历史易错点,避免重复犯错 -8. **安全约束**:禁止在 SKILL 中添加任何网络代理设置的内容,发现代码 Diff 中包含网络代理设置需立即删除并拒绝提交 +7. **安全约束**:禁止在 SKILL 中添加任何网络代理设置的内容,发现代码 Diff 中包含网络代理设置需立即删除并拒绝提交 # 四、常见问题处理 diff --git a/docs/dev_guides/coding_agent/api_compatibility/.claude/skills/modify-origin-api/SKILL.md b/docs/dev_guides/coding_agent/api_compatibility/.claude/skills/modify-origin-api/SKILL.md index 52ff2ec4c1c..67004dba066 100644 --- a/docs/dev_guides/coding_agent/api_compatibility/.claude/skills/modify-origin-api/SKILL.md +++ b/docs/dev_guides/coding_agent/api_compatibility/.claude/skills/modify-origin-api/SKILL.md @@ -1,6 +1,6 @@ --- name: modify-origin-api -description: 负责《Paddle API 对齐 PyTorch 项目》中 Step2:API 代码修改,实施『修改原有 API』方案。通过修改原有 Paddle API 的实现(新增参数、扩展参数类型/功能),使 Paddle API 与 PyTorch API 行为对齐,同时保持后向兼容性。 +description: 负责《Paddle API 对齐 PyTorch 项目》中 Step2 代码修改,实施『修改原有 API』方案。通过修改原有 Paddle API 的实现(新增参数、扩展参数类型/功能),使 Paddle API 与 PyTorch API 行为对齐,同时保持后向兼容性。 context: fork disable-model-invocation: false --- diff --git a/docs/dev_guides/coding_agent/api_compatibility/.claude/skills/python-decorator/SKILL.md b/docs/dev_guides/coding_agent/api_compatibility/.claude/skills/python-decorator/SKILL.md index 2cdf1f7c492..ba25f734431 100644 --- a/docs/dev_guides/coding_agent/api_compatibility/.claude/skills/python-decorator/SKILL.md +++ b/docs/dev_guides/coding_agent/api_compatibility/.claude/skills/python-decorator/SKILL.md @@ -1,6 +1,6 @@ --- name: python-decorator -description: 负责《Paddle API 对齐 PyTorch 项目》中 Step2:API 代码修改,实施『Python 装饰器』方案。通过 Python 装饰器,在 Python 层为 Paddle API 实现参数名称、参数顺序、参数类型和参数用法的重载,实现 PyTorch 风格的 API 调用,并保持 Paddle API 的向后兼容性。 +description: 负责《Paddle API 对齐 PyTorch 项目》中 Step2 代码修改,实施『Python 装饰器』方案。通过 Python 装饰器,在 Python 层为 Paddle API 实现参数名称、参数顺序、参数类型和参数用法的重载,实现 PyTorch 风格的 API 调用,并保持 Paddle API 的向后兼容性。 context: fork disable-model-invocation: false --- @@ -42,7 +42,7 @@ Paddle 现有装饰器统一位于 `${ROOT_DIR}/Paddle/python/paddle/utils/decor --- -### 场景决策表 +### 场景选择表 | 差异类型 | 参数顺序 | 参数个数 | 参数用法 | 推荐方案 | |---------|--------|--------|--------|--------| diff --git a/docs/dev_guides/coding_agent/api_compatibility/.claude/skills/pytorch-alignment-validator/SKILL.md b/docs/dev_guides/coding_agent/api_compatibility/.claude/skills/pytorch-test/SKILL.md similarity index 97% rename from docs/dev_guides/coding_agent/api_compatibility/.claude/skills/pytorch-alignment-validator/SKILL.md rename to docs/dev_guides/coding_agent/api_compatibility/.claude/skills/pytorch-test/SKILL.md index 6542402a311..0ea02d52bd9 100644 --- a/docs/dev_guides/coding_agent/api_compatibility/.claude/skills/pytorch-alignment-validator/SKILL.md +++ b/docs/dev_guides/coding_agent/api_compatibility/.claude/skills/pytorch-test/SKILL.md @@ -1,6 +1,6 @@ --- -name: pytorch-alignment-validator -description: 负责《Paddle API 对齐 PyTorch 项目》中 Step4:对齐验证,基于 PaConvert 工具验证 Paddle API 与 PyTorch API 是否用法完全对齐一致 +name: pytorch-test +description: 负责《Paddle API 对齐 PyTorch 项目》中 Step4 Pytorch 测试,基于 PaConvert 工具验证 Paddle API 与 PyTorch API 是否用法完全对齐一致 disable-model-invocation: false --- @@ -9,7 +9,7 @@ disable-model-invocation: false 请严格按以下 Step 依次执行,不要自行修改或跳过 Step: ## Step 1: 标记已完成的 API -1. 定位文件:`${ROOT_DIR}/PaConvert/paconvert/api_mapping.json` +1. 定位文件:`${ROOT_DIR}/PaConvert/paconvert/api_mapping.json` 或 `${ROOT_DIR}/PaConvert/paconvert/attribute_mapping.json` 2. 将已完成的 PyTorch API 的 Matcher 设置为`ChangePrefixMatcher`,其他字段全部删除掉 **注意**: @@ -128,7 +128,7 @@ def test_case_7(): ```bash cd ${ROOT_DIR}/Paddle/build -cmake .. && make -j$(nproc) +cmake .. && make -j$(nproc) > compile.log 2>&1 cd ${ROOT_DIR}/PaConvert/ python -m pytest tests/test_.py ``` @@ -160,7 +160,7 @@ python -m pytest tests/test_.py - 回退后再进入本步骤(Step4),则只需执行:运行单元测试,其他步骤无需执行 3. **若判断为方案选择错误**(如当前方案不适用、底层不支持等): - - 回退到总步骤 Step1(方案决策)重新决策 + - 回退到总步骤 Step1(选择方案)重新选择 - 回退后再进入本步骤(Step4),则只需执行:运行单元测试,其他步骤无需执行 # 四、常见问题处理 diff --git a/docs/dev_guides/coding_agent/api_compatibility/.claude/skills/api-change-decider/SKILL.md b/docs/dev_guides/coding_agent/api_compatibility/.claude/skills/select-solution/SKILL.md similarity index 92% rename from docs/dev_guides/coding_agent/api_compatibility/.claude/skills/api-change-decider/SKILL.md rename to docs/dev_guides/coding_agent/api_compatibility/.claude/skills/select-solution/SKILL.md index fb61ec7649b..f9f34f48d3e 100644 --- a/docs/dev_guides/coding_agent/api_compatibility/.claude/skills/api-change-decider/SKILL.md +++ b/docs/dev_guides/coding_agent/api_compatibility/.claude/skills/select-solution/SKILL.md @@ -1,6 +1,6 @@ --- -name: api-change-decider -description: 负责《Paddle API 对齐 PyTorch 项目》中 Step1:方案决策,分析 PyTorch API 与 Paddle API 之间的差异,制定合适的 API 改动方案 +name: select-solution +description: 负责《Paddle API 对齐 PyTorch 项目》中 Step1 选择方案,分析 PyTorch API 与 Paddle API 之间的差异,制定合适的 API 改动方案 disable-model-invocation: false --- @@ -110,13 +110,11 @@ disable-model-invocation: false ## Step 1: 获取差异信息 -两种优先级是"二选一"而非"两者都要",一旦获取完整信息立即停止: +**三种信息源均需获取,综合判断**,且遵循以下核心原则: -### 优先级 1:查阅差异文档和转写配置 +**信息更新延迟说明**:可能存在 Paddle 源码已修改,但差异文档或转写配置还未来得及更新的情况。因此需要综合三种信息源判断,源码反映真实情况。 -包含两个信息源,需要综合两者来提取差异信息: - -#### 1.1 查阅差异文档 +### 信息 1:差异文档 **查阅路径**: ``` @@ -124,14 +122,14 @@ ${ROOT_DIR}/docs/docs/guides/model_convert/convert_from_pytorch/api_difference/t ``` **注意事项**: -- **文档可能滞后或有误**:发现问题时应自行分析,或结合转写配置/源码进一步确认 +- **文档可能滞后或有误**:发现问题时应自行分析,或结合转写配置/Paddle 源码进一步确认 - **标题不代表全部**:一个 API 可能涉及多种差异,文档标题仅反映主要分类,**必须通读完整参数映射表提取所有差异**,不能仅看标题 - **忽略参数规则**: - torch 侧忽略:`generator`、`memory_format`、`layout` - paddle 侧忽略:`name` - 其他参数不可忽略 -#### 1.2 查阅转写配置 +### 信息 2:转写配置 **查阅路径**: ``` @@ -159,12 +157,18 @@ ${ROOT_DIR}/PaConvert/paconvert/attribute_mapping.json **注意**:更多 Matcher 类型可参考 `api_matcher.py` 源码分析。 -### 优先级 2:自行获取 API 信息 +### 信息 3:源码分析 -当优先级 1 无法获取完整差异信息时,通过多种方式自行获取 PyTorch API 和 Paddle API 的信息,进行对比分析。 +自行获取 PyTorch API 和 Paddle API 的信息,进行对比分析。 获取方式请参考`api-compatibility/SKILL.md` 中的「API 信息获取方式」内容。 +### 综合判定规则 + +1. **优先级规则**:若任意一种信息源判定为"API 完全一致",则最终结果为"API 完全一致" +2. **多数一致规则**:若多种信息源对同一差异点有一致的判定,采纳该判定 +3. **源码优先规则**:当信息源之间判定不一致时,以源码分析结果为准(源码反映真实情况) + ## Step 2:提取差异信息 根据获取到的 PyTorch API 与 Paddle API 信息,提取以下内容: @@ -194,7 +198,7 @@ ${ROOT_DIR}/PaConvert/paconvert/attribute_mapping.json | 12 | API 别名 | PyTorch API 是其他 API 的别名 | | 13 | 功能缺失 | Paddle 暂无等效实现 | -## Step 3: 方案决策 +## Step 3: 方案选择 ### 3.1 判断 API 路径一致性 @@ -217,18 +221,18 @@ python -c "import paddle; paddle.addmv" # AttributeError → 路径不 python -c "import paddle; paddle.Tensor.addmv_" # AttributeError → 路径不一致 ``` -**输出**:记录路径一致性结果(一致/不一致),用于选择决策表。 +**输出**:记录路径一致性结果(一致/不一致),用于选择流程图。 -### 3.2 执行决策流程 +### 3.2 执行选择流程 -根据 3.1 的路径一致性结果选择决策流程图:**路径不一致** → 决策流程图 A;**路径一致** → 决策流程图 B。 +根据 3.1 的路径一致性结果选择流程图:**路径不一致** → 选择流程图 A;**路径一致** → 选择流程图 B。 **针对每个差异分类独立执行流程图**,得到对应方案: - 仅一个差异分类 → 直接输出该方案 - 多个差异分类 → 按 3.3 规则组合 -**决策流程图 A:路径不一致** +**选择流程图 A:路径不一致** ``` API 路径不一致 @@ -288,7 +292,7 @@ API 路径不一致 └──→ 13. 功能缺失 → 方案 4(新增 Python 层 API 或 C++ 算子)→ 得到方案 ``` -**决策流程图 B:路径一致** +**选择流程图 B:路径一致** ``` API 路径一致 @@ -349,9 +353,9 @@ API 路径一致 ``` -### 3.3 多差异分类组合决策 +### 3.3 多差异分类组合选择 -当 API 存在多个差异分类时,**逐个差异分类独立查决策流程图,再合并方案**。 +当 API 存在多个差异分类时,**逐个差异分类独立查阅流程图,再合并方案**。 **合并规则**: @@ -371,7 +375,7 @@ API 路径一致 # 三、输出要求 -**重要**:本 SKILL 以 agent 模式执行,上下文不共享。完成决策后,必须按以下格式输出完整信息,供后续步骤使用。 +**重要**:本 SKILL 以 agent 模式执行,上下文不共享。完成选择后,必须按以下格式输出完整信息,供后续步骤使用。 ## 输出格式 @@ -391,9 +395,9 @@ API 路径一致 - 额外参数:torch 多出 `xxx, yyy`(如有) - 参数类型:`参数名: torch 类型 vs paddle 类型`(如有) -**方案决策** +**方案选择** - 选择方案:`方案 N(方案名称)` 或 `方案 N1 + 方案 N2` -- 决策依据:`简述选择理由` +- 选择理由:`简述选择理由` - 组合说明:`分别说明各方案解决的差异点`(仅组合方案需要) ``` @@ -416,9 +420,9 @@ API 路径一致 - 参数名映射:`input → x` - 额外参数:torch 多出 `out` -**方案决策** +**方案选择** - 选择方案:方案 2(C++ 下沉) -- 决策依据:API 路径一致;差异为"参数名不同 + 仅多 out 参数",满足方案 2 条件 3;且满足 C++ 下沉全部其他条件(调用 `_C_ops.atan`、无其他 Paddle API 调用、无复杂前处理)。 +- 选择理由:API 路径一致;差异为"参数名不同 + 仅多 out 参数",满足方案 2 条件 3;且满足 C++ 下沉全部其他条件(调用 `_C_ops.atan`、无其他 Paddle API 调用、无复杂前处理)。 ``` **示例 2:组合方案** @@ -438,17 +442,15 @@ API 路径一致 - 参数名映射:`end → stop, steps → num` - 额外参数:torch 多出 `out, device, requires_grad` -**方案决策** +**方案选择** - 选择方案:方案 3 + 方案 1 -- 决策依据:API 路径一致;新增 out/device/requires_grad 参数可保持后向兼容;参数名差异需通过装饰器适配。 +- 选择理由:API 路径一致;新增 out/device/requires_grad 参数可保持后向兼容;参数名差异需通过装饰器适配。 - 组合说明:方案 3 处理 torch 参数更多(新增参数);方案 1 处理参数名不一致。 ``` # 四、注意事项 -1. **严格按标准工作流程执行**,杜绝自行臆断和跳过步骤 -2. 决策前务必检查 Paddle 代码实际状态,差异文档可能滞后,代码反映真实情况(有可能已经完成了 Paddle 代码修改但未更正映射文档) -3. **读取或修改 Python 实现时,忽略静态图部分**(LayerHelper 分支代码不再维护) +**读取或修改 Python 实现时,忽略静态图部分**(LayerHelper 分支代码不再维护) # 五、常见问题处理 diff --git a/docs/dev_guides/coding_agent/api_compatibility/.claude/skills/api-docs-updater/SKILL.md b/docs/dev_guides/coding_agent/api_compatibility/.claude/skills/update-docs/SKILL.md similarity index 96% rename from docs/dev_guides/coding_agent/api_compatibility/.claude/skills/api-docs-updater/SKILL.md rename to docs/dev_guides/coding_agent/api_compatibility/.claude/skills/update-docs/SKILL.md index ad2a9121efb..9c3ea2bd468 100644 --- a/docs/dev_guides/coding_agent/api_compatibility/.claude/skills/api-docs-updater/SKILL.md +++ b/docs/dev_guides/coding_agent/api_compatibility/.claude/skills/update-docs/SKILL.md @@ -1,6 +1,6 @@ --- -name: api-docs-updater -description: 负责《Paddle API 对齐 PyTorch 项目》中 Step5:文档更新,在 API 代码修改完成后,同步更新中文 API 文档,确保文档准确反映 API 的最新行为 +name: update-docs +description: 负责《Paddle API 对齐 PyTorch 项目》中 Step5 更新文档,在 API 代码修改完成后,同步更新中文 API 文档,确保文档准确反映 API 的最新行为 disable-model-invocation: false --- @@ -41,7 +41,7 @@ Step 3. **更新中文文档与英文一致** - Overload 说明内容对应 - out 参数描述对齐 6. **文档描述原则** - - 不要在文档中特别强调"PyTorch 风格"或"PyTorch 签名" + - 不要在文档中强调"PyTorch 风格"、"PyTorch 签名"、"PyTorch 适配"等 Pytorch 相关内容 - 参数别名说明只需简单注明"别名 xxx" # 四、常见修改模式 diff --git a/docs/dev_guides/coding_agent/api_compatibility/README.md b/docs/dev_guides/coding_agent/api_compatibility/README.md index daa4248a4d1..2b67f496946 100644 --- a/docs/dev_guides/coding_agent/api_compatibility/README.md +++ b/docs/dev_guides/coding_agent/api_compatibility/README.md @@ -12,15 +12,15 @@ api_compatibility/ # 本目录 ├── CLAUDE.md # 项目背景(自动加载) └── skills/ # Skill 定义 ├── api-compatibility/ # 总控 - ├── api-change-decider/ # Step1:方案决策 - ├── python-decorator/ # Step2:Python 装饰器 - ├── cpp-sink/ # Step2:C++下沉 - ├── modify-origin-api/ # Step2:修改原有 API - ├── add-new-api/ # Step2:新增 API - ├── add-new-compat-api/ # Step2:新增 compat API - ├── add-compatibility-test/ # Step3:兼容性测试 - ├── pytorch-alignment-validator/ # Step4:对齐验证 - ├── api-docs-updater/ # Step5:文档更新 + ├── select-solution/ # Step1 选择方案 + ├── python-decorator/ # Step2 Python 装饰器 + ├── cpp-sink/ # Step2 C++下沉 + ├── modify-origin-api/ # Step2 修改原有 API + ├── add-new-api/ # Step2 新增 API + ├── add-new-compat-api/ # Step2 新增 compat API + ├── compatibility-test/ # Step3 兼容测试 + ├── pytorch-test/ # Step4 Pytorch 测试 + ├── update-docs/ # Step5 更新文档 └── create-pr/ # 提交 PR ``` @@ -37,13 +37,13 @@ api_compatibility/ # 本目录 ``` ## 安装 +PROJECT_ROOT 需提前下载 `Paddle/`、`PaConvert/`、`docs/` 三个子目录。 ```bash -./install.sh /path/to/PROJECT_ROOT +./install.sh ${PROJECT_ROOT} +export PYTHONPATH="${PROJECT_ROOT}/Paddle/build/python:${env:PYTHONPATH}" ``` -PROJECT_ROOT 需包含 `Paddle/`、`PaConvert/`、`docs/` 三个子目录。 - ## 使用方式 **总控 Skill(推荐)**: @@ -53,18 +53,18 @@ PROJECT_ROOT 需包含 `Paddle/`、`PaConvert/`、`docs/` 三个子目录。 **单独调用 Skill**: ```bash -/api-change-decider torch.atan # Step1: 方案决策 -/cpp-sink torch.atan # Step2: 代码修改 -/add-compatibility-test torch.atan # Step3: 兼容测试 -/pytorch-alignment-validator torch.atan # Step4: 对齐验证 -/api-docs-updater torch.atan # Step5: 文档更新 -/create-pr torch.atan # 提交 PR +/select-solution torch.atan # Step1: 选择方案 +/cpp-sink torch.atan # Step2: 代码修改 +/compatibility-test torch.atan # Step3: 兼容测试 +/pytorch-test torch.atan # Step4: Pytorch 测试 +/update-docs torch.atan # Step5: 更新文档 +/create-pr torch.atan # 提交 PR ``` ## 工作流程 ``` -Step1 方案决策 → Step2 代码修改 → Step3 兼容测试 → Step4 对齐验证 → Step5 文档更新 +Step1 选择方案 → Step2 代码修改 → Step3 兼容测试 → Step4 Pytorch 测试 → Step5 更新文档 ``` ## 详细文档 diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/input_args_type_diff/torch.Tensor.fmod.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/input_args_type_diff/torch.Tensor.fmod.md index 3454e885b10..2ca09cc2654 100644 --- a/docs/guides/model_convert/convert_from_pytorch/api_difference/input_args_type_diff/torch.Tensor.fmod.md +++ b/docs/guides/model_convert/convert_from_pytorch/api_difference/input_args_type_diff/torch.Tensor.fmod.md @@ -1,28 +1,37 @@ -## [ 输入参数类型不一致 ]torch.Tensor.fmod +## [ 输入参数类型一致 ]torch.Tensor.fmod ### [torch.Tensor.fmod](https://docs.pytorch.org/docs/stable/generated/torch.Tensor.fmod.html#torch.Tensor.fmod) ```python torch.Tensor.fmod(other) ``` -### [paddle.Tensor.mod](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/Tensor__upper_cn.html#mod-y-name-none) +### [paddle.Tensor.fmod](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/Tensor_cn.html#fmod) ```python -paddle.Tensor.mod(y, name=None) +paddle.Tensor.fmod(y, name=None) ``` -其中,PyTorch 与 Paddle 的 `other` 参数所支持类型不一致,具体如下: +PyTorch 与 Paddle 的 `other` 参数所支持类型一致,均支持 Tensor 和 Python Number 类型。 ### 参数映射 | PyTorch | PaddlePaddle | 备注 | | ------- | ------------ | ----------------------------- | -| other | y | 多维 Tensor,PyTorch 支持 Tensor 和 Python Number,Paddle 仅支持 Tensor,需要转写。 | +| other | y | 多维 Tensor 或 Python Number,两者均支持。 | ### 转写示例 -#### other +#### other 为 Tensor +```python +# PyTorch 写法 +result = x.fmod(other=y) + +# Paddle 写法 +result = x.fmod(y=y) +``` + +#### other 为标量 ```python # PyTorch 写法 result = x.fmod(other=2.) # Paddle 写法 -result = x.mod(y=paddle.to_tensor(2.)) +result = x.fmod(y=2.) ``` diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/input_args_type_diff/torch.Tensor.fmod_.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/input_args_type_diff/torch.Tensor.fmod_.md index b5d45590ccb..338745e88c2 100644 --- a/docs/guides/model_convert/convert_from_pytorch/api_difference/input_args_type_diff/torch.Tensor.fmod_.md +++ b/docs/guides/model_convert/convert_from_pytorch/api_difference/input_args_type_diff/torch.Tensor.fmod_.md @@ -1,28 +1,37 @@ -## [ 输入参数类型不一致 ]torch.Tensor.fmod_ +## [ 输入参数类型一致 ]torch.Tensor.fmod_ ### [torch.Tensor.fmod\_](https://docs.pytorch.org/docs/stable/generated/torch.Tensor.fmod_.html#torch.Tensor.fmod_) ```python torch.Tensor.fmod_(other) ``` -### [paddle.Tensor.mod_]() +### [paddle.Tensor.fmod\_](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/Tensor_cn.html#fmod) ```python -paddle.Tensor.mod_(y, name=None) +paddle.Tensor.fmod_(y, name=None) ``` -其中,PyTorch 与 Paddle 的 `other` 参数所支持类型不一致,具体如下: +PyTorch 与 Paddle 的 `other` 参数所支持类型一致,均支持 Tensor 和 Python Number 类型。 ### 参数映射 | PyTorch | PaddlePaddle | 备注 | | ------- | ------------ | ----------------------------- | -| other | y | 多维 Tensor,PyTorch 支持 Tensor 和 Python Number,Paddle 仅支持 Tensor,需要转写。 | +| other | y | 多维 Tensor 或 Python Number,两者均支持。 | ### 转写示例 -#### other +#### other 为 Tensor +```python +# PyTorch 写法 +x.fmod_(other=y) + +# Paddle 写法 +x.fmod_(y=y) +``` + +#### other 为标量 ```python # PyTorch 写法 x.fmod_(other=2.) # Paddle 写法 -x.mod_(y=paddle.to_tensor(2.)) +x.fmod_(y=2.) ``` diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.Tensor.imag.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.Tensor.imag.md index b62c103f114..76451682258 100644 --- a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.Tensor.imag.md +++ b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.Tensor.imag.md @@ -1,4 +1,4 @@ -## [ 仅 API 调用方式不一致 ]torch.Tensor.imag +## [ API 完全一致 ]torch.Tensor.imag ### [torch.Tensor.imag](https://docs.pytorch.org/docs/stable/generated/torch.Tensor.imag.html#torch.Tensor.imag) @@ -9,10 +9,10 @@ torch.Tensor.imag ### [paddle.Tensor.imag](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/Tensor__upper_cn.html#imag-name-none) ```python -paddle.Tensor.imag(name=None) +paddle.Tensor.imag ``` -两者功能一致,但调用方式不一致,具体如下: +两者功能一致,调用方式完全一致,无需转写。 ### 转写示例 @@ -21,5 +21,5 @@ paddle.Tensor.imag(name=None) result = src.imag # Paddle 写法 -result = src.imag() +result = src.imag ``` diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.Tensor.real.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.Tensor.real.md index 63075a4e2d7..d6f3c036a42 100644 --- a/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.Tensor.real.md +++ b/docs/guides/model_convert/convert_from_pytorch/api_difference/invok_only_diff/torch.Tensor.real.md @@ -1,4 +1,4 @@ -## [ 仅 API 调用方式不一致 ]torch.Tensor.real +## [ API 完全一致 ]torch.Tensor.real ### [torch.Tensor.real](https://docs.pytorch.org/docs/stable/generated/torch.Tensor.real.html#torch.Tensor.real) @@ -9,10 +9,10 @@ torch.Tensor.real ### [paddle.Tensor.real](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/Tensor__upper_cn.html#real-name-none) ```python -paddle.Tensor.real(name=None) +paddle.Tensor.real ``` -两者功能一致,但调用方式不一致,具体如下: +两者功能一致,调用方式完全一致,无需转写。 ### 转写示例 @@ -21,5 +21,5 @@ paddle.Tensor.real(name=None) result = src.real # Paddle 写法 -result = src.real() +result = src.real ``` diff --git a/docs/guides/model_convert/convert_from_pytorch/api_difference/torch_more_args/torch.fmod.md b/docs/guides/model_convert/convert_from_pytorch/api_difference/torch_more_args/torch.fmod.md index c63c2d13d3d..1301a2067bf 100644 --- a/docs/guides/model_convert/convert_from_pytorch/api_difference/torch_more_args/torch.fmod.md +++ b/docs/guides/model_convert/convert_from_pytorch/api_difference/torch_more_args/torch.fmod.md @@ -1,4 +1,4 @@ -## [ torch 参数更多 ]torch.fmod +## [ 参数一致 ]torch.fmod ### [torch.fmod](https://docs.pytorch.org/docs/stable/generated/torch.fmod.html#torch.fmod) ```python torch.fmod(input, @@ -7,29 +7,40 @@ torch.fmod(input, out=None) ``` -### [paddle.mod](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/mod_cn.html#paddle.mod) +### [paddle.fmod](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/fmod_cn.html#paddle.fmod) ```python -paddle.mod(x, +paddle.fmod(x, y, - name=None) + name=None, + *, + out=None) ``` -PyTorch 相比 Paddle 支持更多其他参数,具体如下: +PyTorch 与 Paddle 参数完全一致,均支持 Tensor 和 Python Number 类型的输入。 + ### 参数映射 | PyTorch | PaddlePaddle | 备注 | | ------------- | ------------ | ------------------------------------------------------ | -| input | x | 表示输入的被除数 ,仅参数名不一致。 | -| other | y | 表示输入的除数, PyTorch 可以为 Tensor 或 scalar,Paddle 只能为 Tensor 。 | -| out | - | 表示输出的 Tensor , Paddle 无此参数,需要转写。 | - +| input | x | 表示输入的被除数,仅参数名不一致。 | +| other | y | 表示输入的除数,两者均支持 Tensor 和 scalar 类型。 | +| out | out | 表示输出的 Tensor,两者均支持。 | ### 转写示例 -#### out:指定输出 +#### 参数名差异 +```python +# PyTorch 写法 +result = torch.fmod(input=x, other=y) + +# Paddle 写法 +result = paddle.fmod(x=x, y=y) +``` + +#### out 参数 ```python # PyTorch 写法 -torch.fmod([3, 5], [1, 2], out=y) +torch.fmod(x, y, out=output) # Paddle 写法 -paddle.assign(paddle.mod([3, 5], [1, 2]), y) +paddle.fmod(x, y, out=output) ```