| 名称 | tao-run-deft-aoi |
| 描述 | > 针对 NVIDIA TAO VisualChangeNet / ChangeNet PCB 检测模型运行完整的 DEFT AOI 改进循环: 基线评估、RCA、Cosmos AnomalyGen / AMP 合成缺陷、k-NN 挖掘、重新训练和部署门控, 直到满足 FAR / recall KPI 目标。用于提示词,例如“运行 DEFT 循环”、“在召回率=100% 下微调直至 FAR 低于 0.1%” 或“使用 RCA 和合成缺陷改进我的 AOI ChangeNet 模型”;不要用于独立的 TAO 训练、一次性推理、通用异常生成或仅 RCA 分析。 |
| 开源协议 | Apache-2.0 AND CC-BY-4.0 compatibility: 需要 docker + nvidia-container-toolkit。工作流声明额外要求。 metadata: |
| 作者 | NVIDIA Corporation |
| 版本 | “0.1.0” allowed-tools: Read Task Bash Write tags: - application - workflow - deft - aoi - loop |
技能:tao-run-deft-aoi
独立安装? 如果此会话尚未由 TAO 技能库插件初始化,请先运行
tao-setup技能(主机预检、凭据、跨技能发现)。
何时使用此技能
当用户希望代理为 NVIDIA TAO VisualChangeNet / ChangeNet PCB 检测模型运行完整的 DEFT AOI 改进循环:基线评估、RCA、合成缺陷生成、数据挖掘、重新训练和部署门控,直到达到 KPI 目标时,使用此技能。
- “运行 DEFT 循环”
- “微调直到 FAR 低于 0.1% 且召回率=100%”
- “使用 RCA 和合成缺陷改进我的 AOI ChangeNet 模型”
- “迭代训练直到误接受率达到目标”
不要将本技能用于单次独立的 TAO 训练、一次性推理、通用异常生成或仅 RCA 分析。当用户只要求该步骤时,请直接使用相关代理。
基础模型
该循环基于 NVIDIA TAO Visual ChangeNet 分类模型,使用 NVIDIA C-RADIOv2-B 主干,并端到端微调。架构定义在 specs/baseline_spec.yaml 中——该文件为唯一事实来源。所有预训练权重来自 HuggingFace(需要 HF_TOKEN);NGC_KEY 仅用于容器拉取门控。ChangeNet 主干分辨率以及 model.backbone.pretrained_backbone_path 的分阶段文件/HF-URL 回退逻辑由 references/visual-changenet.md 负责。用于 k-NN 挖掘的 SigLIP 由 references/tao-mine-aoi-images.md 负责。AnomalyGen 侧检查点(Cosmos-Predict2、T5、NVDINOV2、C-RADIO-V3、DINOv2-large、SAM2、Qwen3-VL——仅 2B 约 22 GB,含 14B + T5-11b 约 140 GB)位于 <workspace>/augmentation/anomalygen/base_checkpoints/ 下;paidf-anomalygen 容器在首次使用时自动下载。<workspace>/augmentation/anomalygen/datasets/<project>/ 下的 PCB 参考数据集也可自动获取。参见 references/paidf-anomalygen.md。
训练 AutoML 策略
DEFT AOI 拥有迭代数据改进循环、重新训练节奏和 KPI 检查点选择。对于此工作流,即使底层 Visual ChangeNet 模型元数据具有 automl_enabled: true,也绕过模型级 AutoML。
automl_policy: off 是传递给 Visual ChangeNet 技能调用的工作流参数(父级通过 Skill 工具调用 tao-skill-bank:tao-train-visual-changenet 时传递的值),不是 TAO spec 字段。两种情况:
- 直接
docker run visual_changenet train -e <spec>(此工作流实际内联使用的路径):无需操作。TAO 入口点默认是普通训练;AutoML 位于 SDK 编排的不同代码路径后面。实际上,每次直接docker run已是automl_policy: off。 - SDK 编排调度(Brev/SLURM/k8s,SDK 构建命令):向
VisualChangeNetSDK.train(...)或等效运行器参数传递automl_policy: off。SDK 使用它来选择普通训练命令而不是 AutoML 包装器。
切勿将 automl_policy 或 workflow 键添加到 spec YAML。 TAO 的 Hydra ExperimentConfig 架构无法识别这些键,训练任务会在配置合并时失败,报错
Error merging '<spec>.yaml' with schema: Key 'workflow' not in 'ExperimentConfig'。
这仅是工作流级覆盖;不要更改模型元数据,也不要将此策略应用于其他工作流。
启动接收
用户确认要运行此工作流后,询问他们打算在哪个支持的平台上运行。支持的平台为已安装的平台技能——tao-run-on-local-docker(本地 GPU 主机的默认项)、tao-run-on-brev、tao-run-on-slurm 和 tao-run-on-kubernetes。切勿静默默认;如果用户未选择,请询问。
选择平台后,阅读所选平台技能的 SKILL.md,并运行其 Preflight 部分以获取凭据和环境要求。
仅询问与该平台相关的凭据,以及所选工作流需要的模型特定凭据。
代理行为
只有一个用户门:预飞行确认。 打印预飞行摘要(见
references/preflight.md→ Pre-Flight Summary),然后停止并等待用户输入“go”、“yes”、“looks good”或类似的明确批准。在获得批准之前,不要启动任何副作用步骤(docker run、训练、SDG、${RESULTS_DIR}/下的修改)——读取规格、列出文件、docker image inspect以及填充摘要表是可以的。“自主”描述的是此门之后的行为,而非之前。 即使用户的原始提示听起来很紧急(“直接运行它”、“go ahead”),也不要跳过此门——摘要本身就是他们批准前需要看到的产物。门后,技能完全自主。 运行整个循环,无需请求确认。不要在步骤之间暂停。不要问“要我继续吗?”——直接继续。仅在步骤因不可恢复错误或硬停止门触发而失败时停止。在每个步骤里程碑处打印一行状态更新,以便用户跟踪进度。
需要自动模式。 门后循环会持续触发副作用调用(
docker run、${RESULTS_DIR}/写入);如果没有自动接受/旁路权限模式,它会在第一个提示上停顿。请在预飞行摘要中提醒用户在批准前启用自动模式(shift+tab)。障碍恢复。 自己修复可恢复的障碍——缺失镜像(拉取)、未分阶段的 C-RADIO 主干(根据
references/visual-changenet.md分阶段.pth)、缺失 pydeps(venv)、AnomalyGen 资产缺失(paidf 自动获取)——然后恢复你正在进行的预飞行步骤(<blocker> cleared → resuming step N)并继续到摘要。仅对无法修复的事项停止(缺少工作空间/规格/CSV/凭据、空池、泄漏)。修复不是用户门。修订计划。 如果在显示原始摘要后任何运行参数发生变化(用户施加时间限制、覆盖 epoch、更改 max_iterations 等),请始终重新运行预飞行,并在继续前显示更新的摘要。
工作流
按以下顺序执行循环(完整细节请见 references/pipeline-and-state.md → Pipeline + Stage Execution):
- 预飞行。 执行
references/preflight.md中的每项检查。解析工作空间、规格、CSV、检查点、容器镜像。仅在你无法自行解决的缺失输入时硬停止(见## 代理行为→ Blocker recovery)。 - 基线。 如果
deft_state.json已有iterations.baseline.stage_completed == "train"且best_ckpt_path指向存在的文件(上游automl-deft-pipeline从其 Phase 1 AutoML 获胜者预置这些——见其 Phase 1 → Phase 2 交接),则跳过训练子步骤并从预置检查点恢复inference -> evaluate。否则通过调用tao-skill-bank:tao-train-visual-changenet技能运行train -> inference -> evaluate。无论哪种方式,随后通过调用tao-skill-bank:tao-analyze-gaps-visual-changenet执行rca。先阅读references/visual-changenet.md和references/tao-analyze-gaps-visual-changenet.md以了解 DEFT 循环特定参数(挂载、输出目录、deft_state.json更新)。 - 迭代。 对于每次迭代直至
max_iterations,执行 Pipeline 步骤 1-7。在每个步骤之间,重新从磁盘读取results/loop_log.jsonl尾部 +results/deft_state.json——磁盘是规范来源。 - 停止 当 KPI 目标达到、
max_iterations已用尽或硬停止门触发(静默丢弃、AMP 分配不匹配、训练/验证泄漏)时。绝不自动重试硬停止。 - 渲染 每次迭代完成后(以及循环结束时再次)通过生成
reporter子代理(agents/reporter.md)渲染results/DEFT_Loop_Report.html。不进行逐阶段渲染——每个阶段已向loop_log.jsonl追加一行,足以让尾部观察的用户使用;HTML 渲染携带一次迭代的状态,每次迭代一次渲染使每循环 token 成本大致随迭代次数线性增长,而非阶段数。不要内联渲染。
所有流水线阶段都在父上下文中内联运行——父级通过 Skill 工具直接调用底层 tao-skill-bank:* 技能,并通过相应的 references/*.md 文件叠加 DEFT 循环约定。唯一委托的工作是 HTML 报告渲染,由 reporter 子代理在新上下文中处理,因此当父上下文饱和时,循环结束时的渲染绝不会被静默丢弃。见 references/scripts-and-agents.md → Agents 了解 reporter 生成契约。
使用捆绑脚本
通过 run_script() 运行 scripts/ 下的捆绑脚本(当 harness 提供该函数时——这是 Claude Code 插件运行时辅助程序,而非本仓库中定义的函数);否则回退到直接 python。首先将每个路径参数解析为绝对主机路径。切勿通过 echo 或内联 jq 写入 loop_log.jsonl——seq 不变量要求通过 next_seq() 读取活动尾部。参见 references/scripts-and-agents.md 获取完整的 Available Scripts 表、每个脚本的调用示例(run_script() / 直接 python / 进程内)、agents/reporter.md 生成契约、Stage Reference Modules 阶段→技能映射、路径规则不变量以及工作流级 AutoML 策略陷阱。
阶段参考模块
每个流水线阶段映射到技能库中的一个底层技能;匹配的 references/*.md 文件在技能通用说明之上叠加 DEFT 循环约定(挂载、输出目录、deft_state.json 更新、log_stage.py 摘要字符串)。先阅读参考文件,然后通过 Skill 工具调用技能。 如果缺少参考文件,则停止并要求用户重新安装插件。完整的阶段→参考→技能→所有权表见 references/scripts-and-agents.md → Stage Reference Modules。这些阶段:train/evaluate(references/visual-changenet.md)、anomalygen(references/paidf-anomalygen.md)、rca(references/tao-analyze-gaps-visual-changenet.md)、routing(references/tao-route-visual-changenet-samples.md)和 data_mining(references/tao-mine-aoi-images.md)。
路径规则(不变量)。 每个阶段的输出使用 ${RESULTS_DIR}/iter${ITER}/ 下的绝对主机路径,将 <workspace> 以相同路径挂载到容器中,预先创建世界可写目录,并拒绝任何包含 output: /results/... 或 <workspace> 以外路径的配置。
数据、预飞行、流水线和状态参考
| 主题 | 参考 | 内容 |
|---|---|---|
| 自带数据、数据契约、输出布局、增强池 | references/data-layout.md |
无公共 AOI 数据集;完整 <workspace> 输入树、ChangeNet 四列必需 CSV 架构、${RESULTS_DIR}/ 输出树和双源挖掘池表 |
| 预飞行检查、默认值、预飞行摘要模板、运行时估算 | references/preflight.md |
10 项有序预飞行检查、必需输入 max_iterations、所有默认值、完整预飞行摘要表 + 填充命令,以及每次迭代运行时估算 |
| 流水线步骤、状态/日志、阶段执行、报告、运行时行为 | references/pipeline-and-state.md |
基线预置/跳过训练逻辑、7 个迭代流水线步骤、deft_state.json + loop_log.jsonl 架构及 seq 节奏、阶段后检查、每次迭代 HTML 渲染,以及循环结束序列 |
| 捆绑脚本、报告代理、阶段模块、AutoML 陷阱 | references/scripts-and-agents.md |
Available Scripts 表、agents/reporter.md 生成契约、Stage Reference Modules 表、路径规则不变量、AutoML 策略规范陷阱 |
必需输入 — max_iterations。 无默认值;如果未提供,请询问用户,在未提供前不要通过预飞行。如果用户给出时间限制,则使用 references/preflight.md 中每次迭代的运行时数字将其转换为估算的 max_iterations,并显示估算以供确认。所有其他运行参数都有默认值——绝不询问具有默认值的参数。完整默认值列表及用户将在单门中批准的预飞行摘要见 references/preflight.md。
门控
运行完整的预飞行(references/preflight.md),打印预飞行摘要,然后停在唯一用户门前。批准后,运行基线(使用预置/跳过训练逻辑)和 7 步迭代流水线,详细信息见 references/pipeline-and-state.md。
硬停止且绝不自动重试的情况:任何阶段 status=error;训练/验证泄漏(挖掘后对 mining_filter/mining_pool.csv 的迭代中检查,以及组装后对组合 CSV 的检查);挖掘池缺失或零行;CSV 存在性检查失败;静默丢弃;AMP 分配不匹配。当 KPI 目标达到、max_iterations 已用尽或不可恢复的门触发时循环停止。每个终止路径运行循环结束序列:通过 scripts/log_stage.py 追加最终 loop_stop 条目,用 scripts/align_token_usage.py 回填 token 用量,最后一次生成 reporter 代理(trigger="loop-end"),然后运行 scripts/prepare_inference_spec.py——仅在无有效检查点时跳过。每阶段状态节奏(每个阶段一条 loop_log.jsonl 条目,seq=last+1 来自磁盘,磁盘是规范来源,每次迭代和循环结束时各一次 HTML 渲染)详见 references/pipeline-and-state.md。