用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
直接命令不会经过审查 Prompt;运行前请先检查来源。
npx skills add https://github.com/HorizonRobotics/OE-Skills --skill j6-plugin-graph-diff命令会保持在同一行。复制前请横向滚动并检查完整内容。
想先保存到本地?可下载 SkillsMP 当前能够提供的文件。
基于 SOC 职业分类
正在显示 SKILL.md
| name | j6-plugin-graph-diff |
| description | 对比两份 FX Graph 计算图文件,精确定位计算图结构和算子参数差异,并根据 diff 报告在原始模型代码中找到对应的差异位置。 |
| tools | [{"name":"j6_plugin_graph_diff.py","type":"script","description":"计算图差异对比脚本,解析两个 FX Graph 文件并生成结构化 diff 报告","path":"j6-plugin-graph-diff/j6_plugin_graph_diff.py","required":true}] |
本 Skill 的计算图差异对比必须通过调用外挂脚本 j6_plugin_graph_diff.py 完成,严禁 Agent 自己编写 Python 代码实现 diff 逻辑。
python j6-plugin-graph-diff/j6_plugin_graph_diff.py --file1 ... --file2 ...原因:外挂脚本包含完整的 FX Graph 解析逻辑(节点解析、差异分类、相似度计算等),Agent 自行实现容易遗漏格式兼容性、分类精度等问题。
在调用脚本前,Agent 必须确认两个输入文件路径存在且可读,避免脚本执行失败。
外挂脚本位于:j6-plugin-graph-diff/j6_plugin_graph_diff.py
调用时使用相对路径:
python j6-plugin-graph-diff/j6_plugin_graph_diff.py --file1 <path1> --file2 <path2> -o <output_path>
对比两份 FX Graph 计算图文件(例如评测与导出、训练与推理、不同版本之间的计算图),实现:
本 Skill 采用外挂脚本 + Agent 分析的分工模式:
| 组件 | 职责 | 输入 | 输出 |
|---|---|---|---|
外挂脚本 j6_plugin_graph_diff.py | 计算图差异对比 | 两个 FX Graph 文件 | diff 报告(文本格式) |
| Agent Skill | 源码定位与分析 | diff 报告 + 模型源码 | 源码位置、修复建议 |
重要:Agent 不得自行实现外挂脚本的职责。差异对比必须调用外挂脚本,Agent 只负责解读脚本输出并进行源码定位。
外挂脚本只负责计算图层面的差异对比,不涉及源码分析:
Agent 负责根据 diff 报告进行源码定位和问题分析:
本 Skill 适用于以下场景:
torch.relu → torch.leaky_relu)args=(x, 1) → args=(x, 0.5))| 信息 | 说明 | 示例 |
|---|---|---|
| fx_graph 文件 1 | 第一个计算图文件路径 | graph_before.txt |
| fx_graph 文件 2 | 第二个计算图文件路径 | graph_after.txt |
| 信息 | 说明 | 示例 |
|---|---|---|
| 原始模型代码 | PyTorch 模型定义文件 | model.py |
| 模型类名 | 便于精确定位 | class ResNet |
硬约束:本步骤不可跳过,不可由 Agent 自行替代。必须通过 Bash 工具调用外挂脚本。
# 使用外挂脚本对比两个 FX Graph 文件
python j6-plugin-graph-diff/j6_plugin_graph_diff.py --file1 fx_graph_1.txt --file2 fx_graph_2.txt -o diff_report.txt
Agent 职责:
脚本输出:
Agent 职责:
opcode: 操作类型(call_module, call_function, call_method 等)target: 目标模块/函数名args: 输入参数name: 节点名称关键信息提取:
# 从 diff 报告中提取差异节点
diff_nodes = extract_diff_nodes(diff_report)
for node in diff_nodes:
print(f"节点名: {node.name}")
print(f"操作类型: {node.node_type}")
print(f"目标: {node.target}")
print(f"差异分类: {node.category}")
Agent 职责:
target 和 name 在源码中搜索:
self.xxx = ...)self.xxx(...))定位策略:
call_module 类型节点:
__init__ 中搜索模块定义:self.{name} = ...backbone.layer1.conv):
self.backboneself.layer1forward 中搜索调用:self.{name}(...)call_function 类型节点:
forward 中搜索函数调用:F.{target}(...) 或 torch.{target}(...)call_method 类型节点:
forward 中搜索方法调用:tensor.{target}(...)get_attr 类型节点:
__init__ 或类属性中搜索定义Agent 职责:
================================================================================
FX Graph 计算图对比报告
================================================================================
文件 1: fx_graph_pred.txt (评测)
文件 2: fx_graph_export.txt (导出)
图1总节点数: 1250
图2总节点数: 1248
整体相似度: 98.5%
================================================================================
📍 第一个差异点位置:
文件1 行号: 342
文件2 行号: 340
差异类型: operator_change
📝 差异内容:
文件1: call_function target=torch.relu args=(x41,)
文件2: call_function target=torch.leaky_relu args=(x41,)
📊 差异分类统计
================================================================================
OPERATOR_CHANGE (3 处):
...
PARAMETER_CHANGE (5 处):
...
================================================================================
🔗 源码反向定位 (Agent 分析)
================================================================================
差异点 #1: torch.relu → torch.leaky_relu
差异类型: operator_change
源码位置: model.py:156 (forward 函数)
代码上下文:
154 | def forward(self, x):
155 | x = self.conv(x)
156 | x = F.relu(x) # ← 差异点:评测与导出不一致
157 | return x
修复建议:
- 检查导出配置中是否有算子替换规则
- 确认评测和导出是否使用了不同的模型配置
差异点 #2: Conv2d 参数不一致
差异类型: parameter_change
源码位置: model.py:89 (__init__ 函数)
代码上下文:
87 | def __init__(self):
88 | super().__init__()
89 | self.conv = nn.Conv2d(3, 64, 3, padding=1) # ← padding 参数差异
90 | ...
修复建议:
- 检查导出时的参数配置
- 确认是否为预期的参数调整
差异模式:
torch.relu → torch.leaky_relutorch.add → torch.cat判断标准:
差异模式:
args=(x, 1) → args=(x, 0.5)padding=0 → padding=1kernel_size=3 → kernel_size=5判断标准:
差异模式:
判断标准:
差异模式:
判断标准:
# 用户输入
"对比评测和导出的计算图,看看是否一致"
# Agent 执行流程
1. 【调用脚本】python j6-plugin-graph-diff/j6_plugin_graph_diff.py --file1 fx_graph_pred.txt --file2 fx_graph_export.txt -o diff_report.txt
2. 【分析报告】解析 diff 报告,识别差异类型
3. 【源码定位】对于关键差异节点,在模型源码中定位
4. 【判断预期】根据"评测与导出对比"场景,判断差异是否合理:
- ✅ 无差异:评测和导出一致
- ❌ 算子替换(如 relu → leaky_relu):需排查
- ⚠️ 参数差异:检查配置是否一致
5. 【生成报告】输出综合分析结果
# 用户输入
"对比训练模式和推理模式的计算图差异"
# Agent 执行流程
1. 【调用脚本】生成 diff 报告
2. 【分析报告】重点识别:
- 是否有意外的算子替换(operator_change)
- 是否有参数值异常(parameter_change)
- Dropout、BatchNorm 等训练/推理差异是否正常
3. 【源码定位】在模型源码中找到问题位置
4. 【提供建议】针对异常差异给出修复建议
# 用户输入
"对比两个模型的计算图结构差异"
# Agent 执行流程
1. 【调用脚本】python j6-plugin-graph-diff/j6_plugin_graph_diff.py --file1 model_a_graph.txt --file2 model_b_graph.txt -o diff_report.txt
2. 【分析报告】关注 structure_change 类型的差异
3. 【源码定位】定位到两个模型源码中的对应位置
4. 【生成报告】说明结构差异的具体含义
self.stem_conv → 搜索 self.stem_conv = ...backbone.layer1.conv → 逐层搜索 self.backbone → self.layer1 → self.convtarget=torch.relu → 搜索 F.relu 或 torch.reluj6_plugin_graph_diff.pyj6-plugin-graph-diff/j6_plugin_graph_diff.py(相对于项目根目录)difflib, re, pathlib, dataclasses硬约束:Agent 不得自行实现脚本的差异对比逻辑,必须通过
python j6-plugin-graph-diff/j6_plugin_graph_diff.py调用。
# 基本用法(输出到文件)
python j6-plugin-graph-diff/j6_plugin_graph_diff.py --file1 graph1.txt --file2 graph2.txt -o report.txt