关于 monitor-experiment
monitor-experiment 是用于检查运行中实验并收集日志、结果文件和指标的科研技能。它会对照基线汇总原始结果,并指出仍在运行或数值异常等情况。
主要功能
- 01检查远程及 Modal 任务
- 02收集 screen 输出和 JSON 结果
- 03按配置提取 W&B 指标
- 04对照基线比较结果
- 05报告运行状态和潜在问题
适用场景
- 01检查远程实验是否完成
- 02将实验指标与基线比较
- 03查看训练曲线和运行状态
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ wanshuiyin/ auto-claude-code-research-in-sleep --skill monitor-experiment安装后在 Claude Code 中输入/monitor-experiment确认已加载。
详细介绍
监控实验结果
⏱ 这里适合采用外部节奏。 此技能会等待外部事实(任务完成/进度),因此很适合作为
/loop/CronCreate的使用场景:唤醒时读取状态,并且只自行判断可由机器检查的完成情况(退出代码、文件是否存在、是否记录了纪元)——绝不判断质量。这是shared-references/external-cadence.md中介绍的附加式外部等待模式。 如果这里的定时等待结束后要执行判定步骤(例如随后审核结果),请在等待结束后只执行一次该判定,而不是每个计时周期都重新执行。
监控:$ARGUMENTS
工作流
步骤 1:检查正在运行的任务
SSH 服务:
ssh <server> "screen -ls"
Vast.ai 实例(从 vast-instances.json 读取 ssh_host、ssh_port):
ssh -p <PORT> root@<HOST> "screen -ls"
同时检查 Vast.ai 实例状态:
vastai show instances
Modal(当 CLAUDE.md 中配置了 gpu: modal 时):
modal app list # List running/recent apps
modal app logs <app> # Stream logs from a running app
Modal 应用会在任务完成后自动终止——如果列表中没有该应用,说明它已经完成。使用 modal volume ls <volume> 或本地输出检查结果。
步骤 2:收集各个 Screen 的输出
对于每个 Screen 会话,截取最后 N 行:
ssh <server> "screen -S <name> -X hardcopy /tmp/screen_<name>.txt && tail -50 /tmp/screen_<name>.txt"
如果 hardcopy 失败,请检查日志文件或 tee 输出。
步骤 3:检查 JSON 结果文件
ssh <server> "ls -lt <results_dir>/*.json 2>/dev/null | head -20"
如果存在 JSON 结果,请获取并解析:
ssh <server> "cat <results_dir>/<latest>.json"
步骤 3.5:提取 W&B 指标(当 CLAUDE.md 中配置了 wandb: true 时)
如果 CLAUDE.md 中未设置 wandb 或其值为 false,则完全跳过此步骤。
通过 Python API 从 Weights & Biases 提取训练曲线和指标:
# List recent runs in the project
ssh <server> "python3 -c \"
import wandb
api = wandb.Api()
runs = api.runs('<entity>/<project>', per_page=10)
for r in runs:
print(f'{r.id} {r.state} {r.name} {r.summary.get(\"eval/loss\", \"N/A\")}')
\""
# Pull specific metrics from a run (last 50 steps)
ssh <server> "python3 -c \"
import wandb, json
api = wandb.Api()
run = api.run('<entity>/<project>/<run_id>')
history = list(run.scan_history(keys=['train/loss', 'eval/loss', 'eval/ppl', 'train/lr'], page_size=50))
print(json.dumps(history[-10:], indent=2))
\""
# Pull run summary (final metrics)
ssh <server> "python3 -c \"
import wandb, json
api = wandb.Api()
run = api.run('<entity>/<project>/<run_id>')
print(json.dumps(dict(run.summary), indent=2, default=str))
\""
需要提取的内容:
- 训练损失曲线——是否收敛、发散或进入平台期?
- 评估指标——最新检查点的损失、PPL、准确率
- 学习率——学习率计划是否符合预期?
- GPU 内存——是否存在 OOM 风险?
- 运行状态——运行中/已完成/已崩溃?
W&B 仪表板链接(在给用户的摘要中附上):
https://wandb.ai/<entity>/<project>/runs/<run_id>
与仅查看 Screen 输出相比,这能为自动审核循环提供更丰富的信号,包括训练动态、损失曲线和指标随时间的变化趋势。
步骤 4:总结结果
使用对比表格呈现结果:
| Experiment | Metric | Delta vs Baseline | Status |
|-----------|--------|-------------------|--------|
| Baseline | X.XX | — | done |
| Method A | X.XX | +Y.Y | done |
步骤 5:解读
- 与已知基线进行比较
- 标记异常结果(负向增量、NaN、发散)
- 根据发现提出后续步骤建议
步骤 6:飞书通知(如果已配置)
收集结果后,检查 ~/.claude/feishu.json:
- 发送
experiment_done通知:结果摘要表、与基线的差异 - 如果配置文件不存在或模式为
"off":完全跳过(不执行任何操作)
关键规则
- 始终先展示原始数值,再进行解读
- 与正确的基线(相同配置)进行比较
- 注明实验是否仍在运行(检查进度条、迭代次数)
- 如果结果看起来异常,先检查训练日志中的错误,再下结论
- Vast.ai 成本注意事项:监控 Vast.ai 实例时,报告运行成本(运行小时数 *
vast-instances.json中的 $/小时)。如果实例上的所有实验都已完成,提醒用户运行/vast-gpu destroy <instance_id>停止计费 - Modal 成本注意事项:Modal 会自动缩容至零——空闲时不计费。报告 Modal 运行结果时,注明实际执行时间和预估成本(运行时间 * 所用 GPU 层级的 $/小时)。无需执行清理操作