jysdqhxxdybdygjszyglddff/docs/AUTOMATION.md

7.5 KiB
Raw Permalink Blame History

自动化实验闭环 (Automation Pipeline)

本文档说明赛题 #16 项目的自动化实验闭环:将 DRL 调度策略调优从手工调参转化为可复现、可扩展、可并行化的实验流程。

一、设计目标

DRL 调度策略训练有 3 个痛点:

  1. 超参敏感lr/网络深度/seed 的小幅变化即可让 val mean_ratio 在 1.02 ↔ 1.49 之间漂移,单次试验不可信。
  2. 训练耗时CPU 上单次 100 iter 约 45 min串行枚举不可接受。
  3. 决策依赖跨试验历史:是否换种子、是否做 warm start、是否剪枝某方向需要读全部历史结果才能判断。

针对这 3 个痛点,本项目实现了一个自动化实验闭环:由实验控制器集中管理变体选择与结果分析,独立 Python 执行进程负责训练和评测,结构化记分牌负责状态同步。

二、核心组件

2.1 记分牌(swarm/scoreboard.json + swarm/scoreboard.py

跨会话持久化的实验数据库,记录:

  • 当前最佳 (best.ratio / best.ckpt / best.config / best.timestamp)
  • 全部历史试验id / overrides / ratio / iters / elapsed / warm_started / diverged / stopped_early / timestamp

提供 load / save / record_trial / append_log / best_ratio API。每次试验完成后自动登记并判断是否刷新最佳。scripts/final_eval.py 直接读 best.ckpt 出 test 集。

2.2 试验执行器(swarm/run_trial.py

最小执行单元一条命令完成「base config + overrides 深合并 → 训练 → 评测 → 落盘 ckpt + summary → 登记 scoreboard」

python swarm/run_trial.py \
  --id <trial_id> \
  --overrides '{"model":{"hidden":128,"n_layers":3},"ppo":{"lr":0.0001}}' \
  --iters 120 \
  --init_from results/swarm/<prev>/best.pt \
  --seed 42 --patience 8 \
  --note "假设说明"

支持的开关(无需改代码即可覆盖试验空间):

  • --overrides:对 configs/train_ppo.yaml 做深合并 patch
  • --init_fromwarm start 起点 checkpoint
  • --seed:覆盖训练种子
  • --patience:连续 N 次 eval 不降即 early-stop

2.3 假设驱动迭代日志(swarm/ITERATION_LOG.md

人类可读的实验流水,每次试验完成后自动追加一行。每轮分析再追加一段「假设-结果-结论」结构化总结,形成科研闭环:

[H<编号>] 假设:<下一变体 + 理由,引用历史 trial>
  预期:<ratio 预期区间>
  执行run_trial --id <id> --overrides '<json>' --iters <N> [--init_from <ckpt>]
  结果ratio=<X> → 结论:<更新认知>

参考日志中已有的 5 轮结构化分析warm start 抹平种子差异、attention 首次持平、跨种子续训突破等)。

2.4 Warm Start 链式微调

train_once(init_ckpt=path) 在训练前先 ActorCritic.load_state_dict,再做 PPO 微调。这让训练可以分阶段:

T001_base (1.131) → hidden128 (1.092) → h128_l3 (1.087)
   → h128l3_80 (1.086, 长训练) → ws_s42_lr1e4 (1.053, warm+lr1e-4)
   → ws2_lr5e5 (1.047, 链式降 lr) → ws3_s7b (1.022, seed7 链)
   → ws4_s7x42 (1.018, 跨种子续训) → ws5_x42 (在跑)

核心收益

  • warm start + 低 lr 微调比从同 iter 数从头训更优F=1.0528 < D=1.0599
  • 跨种子 warm start 可抹平种子差异seed7 单独从 1.0803 → warm 续训后 1.0222

2.5 Attention 解码集成strict=False 加载)

src/sched/policies/rl/model.pyAttentionDecoder 在原双线性打分上叠加多头 cross-attention 残差:

scores = bilinear(task, node) + α · multi_head_cross_attn(task_query, node_key_value)

关键工程细节α 初始化为 0旧 checkpoint 用 strict=False 加载时 attention 分支被 α 门控屏蔽,输出严格等于原双线性策略。这保证了:

  • 旧 checkpoint 可无伤 warm start
  • attention 分支可随训练逐步发育(α 渐涨)
  • 不会因新增模块导致旧试验失效

2.6 Early-Stopping + 发散检测

train_onceeval_every=20 iter 在 val 集评测 mean_ratio

  • 连续 patience 次未刷新 best → 早停(省算力)
  • critic_loss 爆炸或 val_ratio 不降 → 标记 diverged=True,登记到 scoreboard 供剪枝

历史试验中 cp_lblr=1e-3seed=1 等发散种子都被自动捕获并剪枝,避免后续方向重复试错。

2.7 文件锁并行调度

run_trial.py 末尾用 fcntl.flock(scoreboard.lock, LOCK_EX) 保证多个执行进程并行时 scoreboard 写入原子:

with open(lock_path, "w") as lockf:
    fcntl.flock(lockf, fcntl.LOCK_EX)
    sb = load(); record_trial(sb, trial); save(sb); append_log(trial, improved)

6 核机器上 3 个执行进程 × OMP_NUM_THREADS=2 并行不超卖,独立 --id 即独立 out_dir,互不干扰。

三、工作流:决策集中,执行下沉

┌─────────────────────────────────────────────────┐
│ 实验控制器                                         │
│  读 scoreboard + ITERATION_LOG → 提假设          │
│  → 选 1-3 个变体 → 启动试验 → 收结果 → 写日志     │
└────────────────────┬────────────────────────────┘
                     │ nohup python3 swarm/run_trial.py ... &
            ┌────────┴────────┐
            ▼                 ▼
      ┌──────────┐      ┌──────────┐
      │ 试验 1    │      │ 试验 2    │   (×N 并行,独立 out_dir)
      │ run_trial │      │ run_trial │
      └─────┬────┘      └─────┬────┘
            │  fcntl.flock  │
            └───────┬───────┘
                    ▼
            scoreboard.json + ITERATION_LOG.md
  • 决策(读历史、选变体、分析结果)由主控完成;
  • 执行(训练 + 评测 + 落盘 + 登记)全部由 Python 进程完成,降低主控开销;
  • 深度审查 / 算法改造(如新增 attention 解码)才偶尔下沉到子任务。

四、可复现性

# 0. 装依赖 + 生数据
bash scripts/deploy/run_swarm_server.sh

# 1. 跑 baseline
python swarm/run_trial.py --id T001_base --iters 80

# 2. 自动化变体迭代(任选)
python swarm/run_trial.py --id h128_l3 \
  --overrides '{"model":{"hidden":128,"n_layers":3}}' --iters 80

python swarm/run_trial.py --id ws_s42_lr1e4 \
  --overrides '{"model":{"hidden":128,"n_layers":3},"ppo":{"lr":0.0001}}' \
  --iters 100 --init_from results/swarm/h128l3_80/best.pt --seed 42

# 3. 出 test 结果
python scripts/final_eval.py   # 读 scoreboard.best.ckpt

每步落盘 results/swarm/<id>/{best.pt, summary.json, train_log.json},可独立审查。

五、已实现 vs 待实现

能力 状态
记分牌(持久化 + 自动登记)
Warm start 链式微调
Early-stopping + 发散检测
文件锁并行调度
Attention 解码(α 门控热启动)
多 seed 稳定化
跨种子 warm start 续训
假设驱动迭代日志
模型集成top-K 平均) 待实现
数据规模翻倍 / 课程学习 待实现

六、相关资料

  • swarm/ITERATION_LOG.md实际迭代流水37+ 试验)
  • swarm/scoreboard.json:机器可读的全部试验记录
  • docs/EVALUATION.md:统一评测协议与结果说明