Stage 5: 训练 (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 --verifyStep 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_001WandB 是硬要求
绝不设 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' Entertmux 持久化
所有训练都在 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 信息
| 属性 | 值 |
|---|---|
| 默认 Gate | auto |
| 为什么 | 训练完成是客观事实,不需要评审 |
| 通过条件 | 所有计划实验完成且有 WandB 记录 |
错误处理 / 回退
| 情况 | 处理方式 |
|---|---|
| 训练 OOM | Coder 调整 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.yaml | Checkpoint 追踪 |
| WandB runs | 完整训练指标 |
findings.md 更新 | 训练过程中的发现 |
status.yaml 更新 | training_status 字段 |
进入下一阶段的条件
- 所有计划实验完成
- 每个实验有对应的 WandB run
- 最佳 checkpoint 已保存
- 关键指标已记录