Skip to content

Stage 4: 训练 (Training)

进入时手里有什么

  • 通过审查的 代码(已同步到远程服务器)
  • 实验配置 文件(exp-*.yaml)
  • 远程服务器的 conda 环境
  • 监控配置(monitoring.yaml)

阶段目标

在远程 GPU 服务器上完成所有计划的训练实验,全程监控,结果上传 WandB。

具体步骤

mermaid
graph TD
    A[确认服务器环境] --> B[Coder: 生成训练脚本]
    B --> C[启动训练 tmux]
    C --> D[watchdog 自动启动]
    D --> E[第一阶段: 主动看守 30min]
    E --> F{一切正常?}
    F -->|是| G[第二阶段: CronCreate 巡检]
    F -->|否| H[诊断修复]
    H --> C
    G --> I{训练完成?}
    I -->|是| J[收集结果]
    I -->|异常| K[编排器介入]
    K --> H
    J --> L[进入 Analysis 阶段]

Step 1: 环境确认

执行者: Coder (Codex)

在远程服务器上确认环境就绪:

bash
# SSH 到服务器
ssh ic2

# 确认代码已同步
ls /data/Jingxuan/fine-grained-recognition/

# 确认 conda 环境
conda activate fine-grained
python -c "import torch; print(torch.cuda.device_count())"

# 确认 GPU 可用
nvidia-smi

# 确认 WandB
wandb login --verify

Step 2: 生成训练脚本

执行者: Coder (Codex)

bash
#!/bin/bash
# run_exp01_baseline.sh

export CUDA_VISIBLE_DEVICES=0,1
export WANDB_PROJECT=fine-grained-research
export WANDB_RUN_GROUP=baseline
export WANDB_API_KEY=wandb_v1_T11n1qb...

cd /data/Jingxuan/fine-grained-recognition/src

python train.py \
  --config configs/baseline.yaml \
  --output_dir output/exp01-baseline \
  --wandb_run baseline_001

WandB 是硬要求

绝不设 WANDB_MODE=offline。违反 = 实验无效。wandb-guard.sh hook 会自动拦截违规命令。

Step 3: 启动训练

在 tmux 中启动训练,保证 SSH 断开后训练继续:

bash
# 创建 tmux session
tmux new-session -d -s train-exp01

# 在 tmux 中运行训练
tmux send-keys -t train-exp01 'bash run_exp01_baseline.sh' Enter

tmux 持久化

所有训练都在 tmux 中运行。这是硬要求 — 直接在 SSH session 中跑训练,断开连接就中断了。

Step 4: 两阶段监控

训练启动后,自动进入两阶段监控。详见 监控系统

第一阶段:主动看守(前 30 分钟)

编排器主动等待,每分钟检查训练状态:

bash
# watchdog 自动启动(由 monitor-hook 触发)
# 输出到 /tmp/jx-monitor/status/summary.txt

# 编排器检查内容:
# - 进程是否存活
# - GPU 利用率是否 > 0
# - loss 是否有限值
# - WandB 是否连接

前 30 分钟最常见的问题:

问题症状处理
CUDA OOM进程崩溃,GPU 显存满减小 batch size
数据路径错误FileNotFoundError修正路径,重启
WandB 超时进程启动慢检查网络,必要时重试
学习率过大loss 前几步就爆炸加 warmup 或降低初始 lr

第二阶段:CronCreate 巡检

看守期一切正常后,切换到定时巡检:

bash
# 设置 CronCreate job(每台服务器只设一个)
# 每 15 分钟检查 watchdog 摘要
# 只在异常时通知编排器

巡检期间,编排器不需要保持 session — 可以去做别的事,或者等下次打开 Claude Code 时再检查。

Step 5: 多实验编排

如果有多个实验要跑,按计划中的顺序执行:

mermaid
graph LR
    E1[实验 1: Baseline] -->|通过| E2[实验 2: 主实验]
    E2 -->|完成| E3[实验 3: FLOPs]
    E2 -->|完成| E4[实验 4: 消融]
    
    style E3 fill:#e8f5e9
    style E4 fill:#e8f5e9

并行执行

独立的实验可以在不同 GPU 上并行运行(ultrawork 模式开启时)。比如实验 3(FLOPs 测量)和实验 4(消融实验)互不依赖,可以同时跑。

Step 6: 收集结果

训练完成后,收集关键指标:

bash
# 从 WandB 获取最终指标
wandb pull <run_id> --output results/

# 保存 checkpoint 信息
# 只保留 latest、best 和重要 milestone
# 失败实验只保留日志/metrics/配置

各 Agent 职责

Agent做什么不做什么
Coder生成训练脚本、环境检查、调试不决定跑什么实验
编排器启动训练、监控协调、错误决策不手动查日志
监控系统健康检查、异常报警不做训练决策

Gate 信息

属性
默认 Gateauto
为什么训练完成是客观事实,不需要评审
通过条件所有计划实验完成且有 WandB 记录

错误处理 / 回退

情况处理方式
训练 OOMCoder 调整 batch size / gradient accumulation
Loss 爆炸降低学习率 / 加 warmup / 加 gradient clipping
训练意外中断从最近 checkpoint 恢复
WandB 断连重启 WandB agent
磁盘空间不足清理旧 checkpoint
Baseline 无法复现记录到 findings.md,检查环境差异
代码 bug 导致训练无效回退到 Implementation 修复
Checkpoint 保留策略
yaml
checkpoints:
  keep:
    - latest          # 最新的
    - best            # 最佳指标的
    - milestones:     # 重要节点
        - epoch_25
        - epoch_50
        - epoch_75
  delete:
    - 所有其他中间 checkpoint
  failed_runs:
    keep: [logs, metrics, config]  # 不保留权重
    delete: [checkpoints]

产出物

文件内容
training/runs.yaml训练运行记录
training/checkpoints.yamlCheckpoint 追踪
WandB runs完整训练指标
findings.md 更新训练过程中的发现
status.yaml 更新training_status 字段

进入下一阶段的条件

  • 所有计划实验完成
  • 每个实验有对应的 WandB run
  • 最佳 checkpoint 已保存
  • 关键指标已记录

AutoResearch — Multi-agent Deep Learning Research System