|
| 1 | +--- |
| 2 | +name: api-mapping-verifier |
| 3 | +description: '按需验证单个或批次 API 的映射准确性,基于 Step 2-1 追踪方法深入 PyTorch 实现链路。支持发现问题、给出修复建议、执行修复。' |
| 4 | +argument-hint: '目标 API 名(如 abs)或批次名(P0/P1/P2/P3/P4/P5)' |
| 5 | +--- |
| 6 | + |
| 7 | +# API 映射表按需验证 Skill |
| 8 | + |
| 9 | +基于 Step 2-1 方法论的按需验证工作流,用于验证单个 API 或批次 API 的映射分类是否准确。 |
| 10 | + |
| 11 | +## 何时使用 |
| 12 | + |
| 13 | +- 怀疑某个 API 的映射分类不正确 |
| 14 | +- 新增 compat 接口后验证映射表是否需要更新 |
| 15 | +- 排查具体 API 的兼容性差异 |
| 16 | +- 验证 Paddle 新增实现是否已正确映射 |
| 17 | + |
| 18 | +## 输入参数 |
| 19 | + |
| 20 | +| 参数 | 类型 | 默认值 | 说明 | |
| 21 | +|------|------|--------|------| |
| 22 | +| `op` | string | — | 单个 API 名称(如 `abs`) | |
| 23 | +| `batch` | string | — | 验证批次:P0/P1/P2/P3/P4/P5 | |
| 24 | +| `pytorch_src_dir` | string | `D:/Lenovo/pytorch` | PyTorch 源码路径(用于追踪 kernel) | |
| 25 | +| `paddle_src_dir` | string | `D:/Lenovo/Paddle` | Paddle 源码路径 | |
| 26 | +| `libtorch_ops_dir` | string | `D:/Lenovo/libtorch/include/ATen/ops` | libtorch 头文件路径 | |
| 27 | + |
| 28 | +**注意**:`op` 和 `batch` 二选一,同时传入时优先 `op`。 |
| 29 | + |
| 30 | +## 输出产物 |
| 31 | + |
| 32 | +1. **验证结果 JSON** — 结构化追踪记录 |
| 33 | +2. **终端输出** — 人类可读的结果摘要 |
| 34 | +3. **修复建议** — 基于验证状态的具体操作建议 |
| 35 | + |
| 36 | +## 工作流 |
| 37 | + |
| 38 | +> **核心原则**:脚本只负责**定位**和**提取表层信息**(头文件签名、kernel 文件路径),**具体 C++ 实现逻辑的审核由 Agent 逐一阅读源码完成**。 |
| 39 | +
|
| 40 | +### Step 1. 脚本定位(自动化) |
| 41 | + |
| 42 | +脚本通过 `verify_api_mapping.py` 完成以下工作: |
| 43 | + |
| 44 | +```bash |
| 45 | +cd "$PCAT_ROOT/doc/mapping" |
| 46 | +# 单 API |
| 47 | +python verify_api_mapping.py --op "$op" |
| 48 | +# 批次 |
| 49 | +python verify_api_mapping.py --batch "$batch" |
| 50 | +``` |
| 51 | + |
| 52 | +脚本输出: |
| 53 | +- 验证状态(verified_compat / verified_api_h_only / alias_candidate / ...) |
| 54 | +- **PyTorch kernel 实现文件路径**(如 `aten/src/ATen/native/UnaryOps.cpp:543`) |
| 55 | +- **Paddle kernel 实现文件路径**(如 `paddle/phi/kernels/cpu/abs_kernel.cc:25`) |
| 56 | +- 头文件签名对比结果 |
| 57 | + |
| 58 | +### Step 2. Agent 源码审核(核心步骤) |
| 59 | + |
| 60 | +**根据脚本定位的文件路径,逐一阅读 C++ 实现文件**,对比以下维度: |
| 61 | + |
| 62 | +#### 2.1 必须阅读的源码位置 |
| 63 | + |
| 64 | +| 框架 | 文件类型 | 典型路径示例 | |
| 65 | +|------|---------|-------------| |
| 66 | +| PyTorch | CPU kernel | `aten/src/ATen/native/cpu/UnaryOpsKernel.cpp` | |
| 67 | +| PyTorch | CUDA kernel | `aten/src/ATen/native/cuda/AbsKernel.cu` | |
| 68 | +| PyTorch | 高层封装 | `aten/src/ATen/native/UnaryOps.cpp` | |
| 69 | +| Paddle | CPU kernel | `paddle/phi/kernels/cpu/abs_kernel.cc` | |
| 70 | +| Paddle | CUDA kernel | `paddle/phi/kernels/gpu/abs_kernel.cu` | |
| 71 | +| Paddle | Functor | `paddle/phi/kernels/funcs/activation_functor.h` | |
| 72 | + |
| 73 | +#### 2.2 审核检查清单 |
| 74 | + |
| 75 | +| 检查项 | PyTorch 关注点 | Paddle 关注点 | 差异影响 | |
| 76 | +|--------|--------------|--------------|---------| |
| 77 | +| **核心数学运算** | 实际调用的函数(`std::abs`, `sum_stub` 等) | Functor 中的运算(`Acos<T>`, `SumFunctor`) | 数学语义是否一致 | |
| 78 | +| **数据类型处理** | `AT_DISPATCH_*` 宏、complex 分支 | `if constexpr`、float16 特化 | dtype 支持范围是否一致 | |
| 79 | +| **空张量处理** | `TensorIterator.numel() == 0` | `if (x.numel() == 0)` | 边界行为是否一致 | |
| 80 | +| **精度累积** | `should_use_acc_buffer`、中间 float 缓冲 | `Cast` 到 float32 | 低精度输入结果是否一致 | |
| 81 | +| **非连续张量** | `TensorIterator` 自动处理 | 是否检查 `is_contiguous()` | 布局敏感操作是否有差异 | |
| 82 | +| **异常/断言** | `TORCH_CHECK`、`AT_ASSERT` | `PADDLE_ENFORCE` | 异常触发时机是否一致 | |
| 83 | +| **in-place 限制** | complex 禁止、维度检查 | 是否由上层框架处理 | in-place 语义是否一致 | |
| 84 | +| **向量化实现** | AVX512、Vectorized | Eigen 向量化 | 性能差异,不影响语义 | |
| 85 | + |
| 86 | +#### 2.3 审核结论模板 |
| 87 | + |
| 88 | +对每 个 API,填写以下审核记录: |
| 89 | + |
| 90 | +```markdown |
| 91 | +## at::<op_name> 源码审核 |
| 92 | + |
| 93 | +**PyTorch 实现**(文件:行号): |
| 94 | +```cpp |
| 95 | +// 粘贴核心实现代码 |
| 96 | +``` |
| 97 | + |
| 98 | +**Paddle 实现**(文件:行号): |
| 99 | +```cpp |
| 100 | +// 粘贴核心实现代码 |
| 101 | +``` |
| 102 | + |
| 103 | +**审核结论**: |
| 104 | + |
| 105 | +| 维度 | PyTorch | Paddle | 差异 | |
| 106 | +|------|---------|--------|------| |
| 107 | +| 核心运算 | ... | ... | ... | |
| 108 | +| 数据类型 | ... | ... | ... | |
| 109 | +| 边界条件 | ... | ... | ... | |
| 110 | +| 异常语义 | ... | ... | ... | |
| 111 | + |
| 112 | +**风险评级**:低 / 中 / 高 |
| 113 | +**理由**:... |
| 114 | +``` |
| 115 | + |
| 116 | +### Step 3. 头文件签名对比(脚本辅助) |
| 117 | + |
| 118 | +脚本对比签名层面的差异: |
| 119 | + |
| 120 | +| 验证状态 | 含义 | 修复建议 | |
| 121 | +|----------|------|----------| |
| 122 | +| `verified_compat` | compat 层已实现 | 需Agent 审核实现逻辑 | |
| 123 | +| `verified_api_h_only` | api.h 有实现,compat 层未封装 | 可考虑添加 compat 层封装 | |
| 124 | +| `alias_candidate` | 发现别名映射候选 | 需 Agent 确认别名语义等价 | |
| 125 | +| `kernel_only` | kernel 已注册但未暴露到 api.h | 需 Paddle 侧暴露到 api.h | |
| 126 | +| `truly_missing` | 真正缺失 | 确认是否真的无对应实现 | |
| 127 | + |
| 128 | +### Step 4. 修复建议与执行 |
| 129 | + |
| 130 | +**场景 A:`verified_api_h_only` → 应添加 compat 层** |
| 131 | +- 参考同类型 API 的 compat 层实现模板 |
| 132 | +- 建议创建 `paddle/phi/api/include/compat/ATen/ops/<op>.h` |
| 133 | + |
| 134 | +**场景 B:分类错误 → 应修正映射表** |
| 135 | +- 结合源码审核结论,判断当前分类是否准确 |
| 136 | +- 给出 `fix_mapping.py` 的修复参数 |
| 137 | + |
| 138 | +**场景 C:发现实现语义差异 → 更新文档** |
| 139 | +- 在映射表备注中注明差异(如 `at::abs` 的非连续张量处理差异) |
| 140 | +- 更新差异文档 |
| 141 | + |
| 142 | +执行修复: |
| 143 | +1. 更新 `cpp_api_alias_mapping.json`(如需) |
| 144 | +2. 运行 `fix_mapping.py` 更新映射表 |
| 145 | +3. 删除/更新相关差异文档 |
| 146 | +4. 重新运行验证确认修复成功 |
| 147 | + |
| 148 | +## 决策分支 |
| 149 | + |
| 150 | +### 分支 A:验证通过(verified_compat) |
| 151 | +- 输出追踪详情供参考 |
| 152 | +- 无需修复 |
| 153 | + |
| 154 | +### 分支 B:api.h 有实现但 compat 层未封装 |
| 155 | +- 给出 compat 层封装模板 |
| 156 | +- 用户确认后创建 compat 头文件 |
| 157 | + |
| 158 | +### 分支 C:发现别名候选 |
| 159 | +- 给出别名映射建议 |
| 160 | +- 用户确认后更新别名映射文件 |
| 161 | + |
| 162 | +### 分支 D:真正缺失 |
| 163 | +- 检查是否有组合实现方案 |
| 164 | +- 记录到"功能缺失"跟踪列表 |
| 165 | + |
| 166 | +## 使用示例 |
| 167 | + |
| 168 | +```bash |
| 169 | +# 验证单个 API |
| 170 | +/api-mapping-verifier --op abs |
| 171 | + |
| 172 | +# 验证批次 |
| 173 | +/api-mapping-verifier --batch P0_exact_match |
| 174 | + |
| 175 | +# 验证并自动修复 |
| 176 | +/api-mapping-verifier --batch P1_name_diff --auto_fix |
| 177 | +``` |
| 178 | + |
| 179 | +## 质量标准 |
| 180 | + |
| 181 | +1. **追踪完整**:展示从 libtorch 声明到 kernel 实现的完整链路 |
| 182 | +2. **建议具体**:给出可直接执行的修复操作,不只是描述问题 |
| 183 | +3. **可验证**:修复后必须重新验证确认 |
| 184 | + |
| 185 | +## 与 api-mapping-updater 的区别 |
| 186 | + |
| 187 | +| | api-mapping-verifier | api-mapping-updater | |
| 188 | +|--|---------------------|---------------------| |
| 189 | +| 触发方式 | 按需(用户指定 API) | 定期(cron/schedule) | |
| 190 | +| 验证范围 | 单个 API 或单批次 | 全量或大批次 | |
| 191 | +| 修复策略 | 用户确认后执行 | 高置信度自动修复 | |
| 192 | +| 输出 | 终端摘要 + 追踪详情 | 完整报告 + 审核队列 | |
| 193 | +| 典型场景 | 排查具体问题 | 定期维护 | |
0 commit comments