pypto-precision-compare
PyPTO 算子精度问题调试技能。提供两种精度对比方法:文件保存方法(使用 pypto.pass_verify_save 和 torch.save)和二分对比方法(使用检查点 tensor)。当需要调试 PyPTO 算子精度、定位精度差异来源、进行中间结果对比时使用此技能。
SKILL.mdops/pypto-precision-compare/SKILL.md
GitHubPyPTO 算子精度对比技能
提供两种精度对比方法,用于快速定位 PyPTO 算子中导致精度问题的具体 op。
执行逻辑
当用户调用本技能时,首先检查用户是否指定了 mode 参数:
情况一:关键词触发模式(手动干预)
如果用户描述中包含以下关键词,则跳过所有判断,直接执行对应的子技能:
| 关键词 | 触发模式 | 执行子技能 |
|---|---|---|
精度工具、精度对比、文件保存、pass_verify_save |
mode="verify" |
precision-verify |
| Pass精度、Pass校验、PreCheck、PostCheck | mode="pass" |
precision-pass |
| 二分、上板二分、检查点tensor | mode="binary" |
precision-binary-search |
示例触发语句:
- "用精度工具方式调试" → 直接调用
precision-verify - "用Pass精度校验" → 直接调用
precision-pass - "用二分方式定位" → 直接调用
precision-binary-search - "用文件保存方法对比" → 直接调用
precision-verify
注意:此时假设用户已经明确知道问题所在,不需要再执行 tensor_graph 校验流程。
情况二:未指定模式(全自动)
如果用户未指定 mode(或 mode="auto"),则执行标准决策树流程:
步骤 1:开启 tensor_graph 校验
⚠️ 编译安装(关键步骤,必须严格执行):
执行算子之前,必须先进行编译:
python3 -m pip install . --verbose
在 PyPTO 算子实现文件中配置 verify_options,开启 tensor_graph 校验:
verify_options = {
"enable_pass_verify": True,
"pass_verify_save_tensor": True, # 保存中间tensor数据用于分析
"pass_verify_pass_filter": [] # tensor_graph 校验中跳过pass校验
}
@pypto.frontend.jit(verify_options=verify_options)
def your_kernel(...)
设置 Golden 数据(必须严格按照计算 golden → 设置 golden → 执行算子顺序):
# 计算 golden
torch_output = torch.add(input_data0, input_data1)
# 设置 golden(必须放在 pypto 算子运行前设置!此处torch的数据必须在cpu上)
pypto.set_verify_golden_data(goldens=[None, None, torch_output.cpu()])
# 执行 pypto 算子
pypto_output = your_kernel(input_data0, input_data1)
步骤 2:查看 tensor_graph 校验结果
运行测试后,查看校验结果(output 目录会在执行命令的当前路径下生成):
# 查看最新 verify 目录
ls -lt output/output_*/verify_* | head -n 1
# 查看 tensor_graph 校验结果
cat output/output_*/verify_*/interpreter.log
打开 interpreter.log 文件,查看校验状态。
如果执行遇到以下报错:
| 问题现象 | 可能原因 | 解决方案 |
|---|---|---|
| aicore error / MPU 地址访问无效 | NPU 卡资源冲突或状态异常 | 1. 更换 TILE_FWK_DEVICE_ID 到空闲卡<br>2. 重新执行 |
| verify 日志无内容 | Golden 数据未设置或顺序错误 | 确保"计算 golden → 设置 golden → 执行算子"顺序,检查set_verify_golden_data输入输出是否匹配 |
移除 tensor_graph 校验配置
确认 tensor_graph 有校验结果后,移除校验配置:
# 移除 verify_options 配置
@pypto.frontend.jit() # 移除 verify_options 参数
def your_kernel(...)
# 移除 golden 数据设置代码
# 删除: pypto.set_verify_golden_data(...)
步骤 3:根据校验结果选择调试路线
查看 Tensor Graph 校验结果
│
├── Tensor Graph FAIL → 使用精度工具对比法保存中间结果比对,找出首个失败的 op
│ 参考 → precision-verify/SKILL.md
│
└── Tensor Graph PASS → 进行 Pass 校验,找到首个出错的 Pass,dump Pass 数据对比
│
├── Pass 校验 FAIL → 定位出错的 Pass/OP
│ 参考 → precision-pass/SKILL.md
│
└── Pass 校验 PASS → 上板二分定位,找到首个出错的 op
参考 → precision-binary-search/SKILL.md
情况 A:tensor_graph Verify FAIL → 前端代码问题
| 项目 | 说明 |
|---|---|
| 日志特征 | [VERIFY]:ErrCode: FB4001! tensor_graph Verify for 1 data view list index 0 result FAILED |
| 错误码 | 0xB4001U(VERIFY_RESULT_MISMATCH) |
| 原因 | 前端代码书写问题,构图阶段已出错 |
| 处理 | 使用 精度工具对比法 定位首个失败的 op |
操作步骤:
- 阅读 precision-verify/SKILL.md 了解详细步骤
- 在 kernel 中添加
pypto.pass_verify_save()调用 - 在 golden 中添加
torch.save()调用 - 运行测试生成数据
- 使用对比工具分析结果,找出首个不匹配的检查点
情况 B:tensor_graph Verify PASS → Pass 精度校验
| 项目 | 说明 |
|---|---|
| 日志特征 | tensor_graph 验证 PASS,需进一步定位精度问题来源 |
| 原因 | 问题可能在 Pass、Codegen 或 Machine 执行阶段 |
| 处理 | 使用 Pass 精度校验定位问题 Pass,如未定位则上板二分 |
操作步骤:
- 阅读 precision-pass/SKILL.md 了解详细步骤
- 配置 PreCheck/PostCheck 开启 Pass 级别验证
- 分析验证结果,定位问题 Pass
- 若 Pass 校验未定位问题,继续使用上板二分方法
情况 C:Pass 校验未定位问题 → 上板二分定位
| 项目 | 说明 |
|---|---|
| 日志特征 | 前两种方式定位未发现明显问题,但上板结果与 golden 不一致 |
| 原因 | 问题可能在 Codegen 或 Machine 执行阶段 |
| 处理 | 添加中间变量的返回输出,二分对比上板数据找到首个出错的 op |
操作步骤:
- 阅读 precision-binary-search/SKILL.md 了解详细步骤
- 修改 kernel 函数签名,添加检查点 tensor 参数
- 修改 golden 函数,返回检查点数据
- 修改测试函数,创建检查点 tensor 并对比
- 从关键计算点开始,二分定位精度问题,直到找到具体出错的 op
步骤 4:子技能执行完成后的处理
- 如果子技能返回"已定位到问题 op/Pass" → 结束,汇报问题位置
- 如果子技能返回"需要继续 Pass 校验" → 调用
precision-pass - 如果子技能返回"需要继续二分" → 调用
precision-binary-search
方法对比
| 特性 | 精度工具对比法 | Pass 精度校验法 | 二分对比法 |
|---|---|---|---|
| 实现方式 | 使用 pypto.pass_verify_save() 保存到文件,使用 torch.save() 保存 golden |
使用 PreCheck/PostCheck、pass_compare 和上板比对 | 使用检查点 tensor 作为输入参数,在内存中直接对比 |
| 适用场景 | Tensor Graph 校验失败,需要快速定位首个失败的 op | Tensor Graph 校验通过,定位问题 Pass | Tensor Graph 和 Pass 校验通过,需上板真实数据 |
| 定位粒度 | Op 级别 | Pass 级别 | Op 级别 |
| 代码修改 | 不需要修改 kernel 函数签名 | 配置验证开关 | 需要修改 kernel 函数签名,添加检查点参数 |
| 使用难度 | 简单,只需添加检查点调用 | 中等,需配置和上板比对 | 较复杂,需要管理检查点 tensor |
参考资料
- PyPTO API:
https://raw.gitcode.com/cann/pypto/raw/master/docs/zh/api/ - pass_verify_save API:
https://raw.gitcode.com/cann/pypto/raw/master/docs/zh/api/others/pypto-pass_verify_save.md