7.5 KiB
自动化实验闭环 (Automation Pipeline)
本文档说明赛题 #16 项目的自动化实验闭环:将 DRL 调度策略调优从手工调参转化为可复现、可扩展、可并行化的实验流程。
一、设计目标
DRL 调度策略训练有 3 个痛点:
- 超参敏感:lr/网络深度/seed 的小幅变化即可让 val mean_ratio 在 1.02 ↔ 1.49 之间漂移,单次试验不可信。
- 训练耗时:CPU 上单次 100 iter 约 45 min,串行枚举不可接受。
- 决策依赖跨试验历史:是否换种子、是否做 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_from:warm 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.py 的 AttentionDecoder 在原双线性打分上叠加多头 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_once 每 eval_every=20 iter 在 val 集评测 mean_ratio:
- 连续
patience次未刷新 best → 早停(省算力) critic_loss爆炸或 val_ratio 不降 → 标记diverged=True,登记到 scoreboard 供剪枝
历史试验中 cp_lb、lr=1e-3、seed=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:统一评测协议与结果说明