日报 — 2026-02-20

今日概览

  • 做了什么: 完成 STAIG fusion 专项对比实验,并为 run_benchmark.py 添加 embedding 缓存读写支持
  • 怎么做的: 通过临时脚本隔离测试 staig_fusion,结合 CacheManager 复用 pipeline 已有缓存基础设施进行改造
  • 有什么用: 消除了独立评估脚本引入 bug 的风险,run_benchmark.py 现可直接加载已缓存 embeddings(秒级),同时支持自定义缓存名(如 scan_uni2)做全 fusion 对比

对 MIHD 项目的 STAIG fusion 进行专项测试,发现 eval_scan_fusion.py 中存在双重归一化 bug,并在 run_benchmark.py 中引入 pipeline 级别的 embedding 缓存机制。

今日任务

架构与策略

  • STAIG fusion 预处理差异调查 — 确认 staig_fusion 从未在 151673 上正式运行;发现 eval_scan_fusion.py 未传 staig_alignment_config,导致 STAIGTrainer 内部再次 StandardScaler,出现双重归一化 bug。
  • run_benchmark.py 添加 embedding 缓存读取/写入 — 引入 CacheManager,在 gene/vision encoding 前先检查 embeddings_cache/;命中则直接加载(跳过 encoder 实例化),未命中则提取后保存缓存。支持 override 强制重提取,支持任意 vision_encoder 名(放宽 argparse choices),vision 缓存分 standard/freq/staig_strict 三种 variant。
  • STAIG fusion 专项对比实验(151673) — 中断2小时长任务,单独跑 staig_fusion × {UNI2_raw, SCAN(UNI2)},结果:ARI 分别为 0.3929 / 0.3880,几乎持平。原因是 STAIG 内部 StandardScaler+PCA 预处理抵消了 SCAN 的优化效果。

问题与解决方案

关键问题

1. eval_scan_fusion.py 中 staig_fusion 存在双重归一化 bug(staig_alignment_config 未传递)

解决方案: 调查发现根本原因后,决定直接使用 run_benchmark.py(已正确传递 staig_alignment_config),而非修复独立脚本

关键洞察: 在已有正确实现的基础上复用,比修复 bug 更可靠;缓存的是归一化前的 raw embeddings,post-encoder normalization 在加载后执行才是正确顺序

2. run_benchmark.py 每次都重新实例化 encoder 提取 embeddings,即使 pipeline 已有缓存

解决方案: 集成 pipeline/cache_manager.py 的 CacheManager,在 encoding 前优先从缓存加载,提取后写入缓存

关键洞察: pipeline 两阶段架构的缓存基础设施可以直接复用,无需重新造轮子

一般问题

3. eval_scan_fusion.py 长任务跑 2 小时未结束,无法在合理时间内获得结果

解决方案: kill 长任务,创建临时脚本 _test_staig_scan.py 单独测试 staig_fusion,约 30 秒出结果

关键洞察: 将全量对比(18 种组合)拆解为单方法专项测试,可快速验证假设

人类思路 vs AI 思路

战略层面

解决 eval_scan_fusion.py bug 的策略

角色 思路
人类 为什么不直接用原本的 benchmark script?提出用已有的 run_benchmark.py 而非修复独立脚本
AI 计划修复 eval_scan_fusion.py 中的 staig_alignment_config 传递问题,准备加入 build_effective_staig_profile 调用

差异分析: 人类从架构层面思考,优先复用已验证的实现;AI 聚焦于修复已有脚本中的具体 bug,未跳出当前方案框架

run_benchmark.py 与 pipeline 缓存的关系

角色 思路
人类 期望 run_benchmark.py 应该和 pipeline 一样支持缓存读取,认为这是合理的设计预期
AI 最初将 run_benchmark.py 和 pipeline 视为独立系统,认为 run_benchmark.py 不需要缓存

差异分析: 人类有更清晰的系统设计预期(统一缓存);AI 需要人类明确指出后才意识到设计缺陷并实现

AI 局限性

重要局限

  • 在发现 staig_fusion bug 后,倾向于修复独立脚本而非推荐使用已有正确实现,需要人类主动提出才转换思路
  • 未主动发现 run_benchmark.py 缺少 pipeline 级别缓存支持这一设计缺陷,需要人类明确指出后才开始实现

一般局限

  • 长时间等待(约 2 小时)才提示用户任务可能不会结束,未能更早判断超时并建议中断

今日收获

核心收获

  • STAIG fusion 内部 StandardScaler+PCA 预处理会吸收外部 embedding 优化效果(SCAN vs UNI2_raw ARI 差异仅 0.005),说明 STAIG 对 vision embedding 的鲁棒性来自其自带的归一化流程
  • 在复杂实验系统中,应优先复用已有的、经过验证的工具路径(如 run_benchmark.py),独立脚本容易引入预处理不一致等隐蔽 bug
  • embedding 缓存应保存归一化前的 raw embeddings,post-encoder normalization 在加载后执行,这是 pipeline 设计的正确模式,确保不同调用路径结果一致

会话摘要

🔄 STAIG fusion 专项测试与预处理差异调查 18:06:33.022 | claude_code 会话从继续运行 eval_scan_fusion.py 开始,但长任务(2小时+)被中断,转为单独测试 staig_fusion。结果显示 UNI2_raw vs SCAN(UNI2) 的 ARI 几乎相同(0.393 vs 0.388),原因是 STAIG 内部预处理抵消了 SCAN 优化。后续调查发现 eval_scan_fusion.py 存在双重归一化 bug,且 staig_fusion 从未在 151673 上正式运行。人类提出直接使用 run_benchmark.py 并为其添加缓存支持的更优方案,会话以计划制定结束。

✅ 为 run_benchmark.py 实现 embedding 缓存读写机制 21:22:59.238 | claude_code 按照预定计划实现了 run_benchmark.py 的 embedding 缓存支持:引入 CacheManager,在 gene/vision encoding 前检查缓存,命中直接加载;未命中则提取后写入缓存。vision 缓存支持 standard/freq/staig_strict 三种 variant,argparse 放宽了 vision_encoder 的 choices 限制,两处调用点都传入了 override 参数。语法验证通过,CacheManager import 正常,缓存已包含 pca/mlp/scgpt gene 和 uni2/hipt/resnet50/uni vision embeddings。

Token 用量

总览

指标 数值
总 Token 19,315,584
输入 Token 42,559
输出 Token 5,886
Cache 创建 1,847,937
Cache 读取 17,419,202
Cache 命中率 90.4%
总费用 (USD) $10.0013

模型明细

模型 输入 输出 Cache 创建 Cache 读取 费用 占比
claude-haiku-4-5-20251001 27,101 1,112 1,208,807 10,978,447 $2.6415 26.4%
claude-opus-4-6 15,453 4,769 620,974 6,409,204 $7.2822 72.8%
claude-sonnet-4-6 5 5 18,156 31,551 $0.0776 0.8%

各设备用量

设备 总 Token 输入 输出 费用
DCC 2,363,322 11,314 159 $0.5498
tianhe 16,952,262 31,245 5,727 $9.4515