关于 kermt-monitor
kermt-monitor 是用于检查 KERMT 后台工作流的伴随技能,面向运行预训练或微调任务的用户。它读取运行记录、查询 Docker 容器状态并显示日志进度,也可输出结构化状态。
主要功能
- 01读取 run.json 运行记录
- 02查询 Docker 容器状态
- 03显示日志与训练进度
- 04跟随输出实时日志
- 05输出 JSON 状态报告
- 06汇总微调测试指标
适用场景
- 01查看后台预训练任务进度
- 02跟踪微调运行并读取最终指标
- 03为上层 Agent 提供结构化任务状态
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ nvidia-bionemo/ bionemo-agent-toolkit --skill kermt-monitor安装后在 Claude Code 中输入/kermt-monitor确认已加载。
附带文件evals/evals.jsonskill-card.md
详细介绍
kermt-monitor
适用于所有以分离模式运行的 KERMT 工作流的配套技能:三个预训练技能(kermt-continue-pretrain、kermt-pretrain-scratch、kermt-add-cmim-pretrain)以及 kermt-finetune。kermt-infer 和 kermt-embed 默认以阻塞模式运行,不需要此技能;但如果用户有意以分离模式启动它们,监控功能仍然有效(步骤 4 中的工作流分发会处理未知工作流,方法是持续读取运行目录中最近修改的日志文件)。读取运行目录的 run.json,查询 Docker 中容器的状态,显示最新进度,然后读取或持续跟踪日志。
硬件要求
无。此技能只读取磁盘并查询 Docker;不需要 GPU 计算。
输入
以下之一:
<run-dir>— 指向包含run.json的目录的位置参数(例如runs/continue-pretrain_2026-05-17T10-23Z)。推荐使用。--container <name-or-id>— 直接指定容器;如果容器的检查输出中包含运行目录路径,此技能仍会读取该目录中的run.json,但没有该文件时也能以降级模式运行。
可选:
--lines N— 要打印的末尾日志行数(默认为 50)。--follow— 持续输出docker logs -f,直到按下 ^C。适用于“监控损失值”。不使用此选项时,技能只运行一次后退出。--json— 输出结构化状态报告,而非人类可读文本。适用于父级 Agent 需要执行后续操作的情况。
工作流
令 RUN_DIR=$1(或使用用户提供的路径)。
-
定位清单文件。
MANIFEST=$RUN_DIR/run.json如果文件不存在,则拒绝继续,并显示有用的提示,告知用户运行目录的约定(
runs/<workflow>_<ts>/)。 -
解析清单文件(Python 辅助程序):
workflow=$(jq -r .workflow $MANIFEST) container_name=... # not directly in run.json today; the skill that # launched stored it in run.json under # container.name during launch (see below note). logs_dir=$(jq -r .logs_dir $MANIFEST) image_tag=$(jq -r .container.image_tag $MANIFEST) started_at=$(jq -r .started_at $MANIFEST) -
查询 Docker 中的容器状态。
docker ps --filter "name=$container_name" --format \ '{{.ID}}\t{{.Status}}\t{{.CreatedAt}}'如果没有状态信息,则改用
docker inspect $container_name --format '{{.State.Status}} (exit {{.State.ExitCode}})',查看容器是已退出(成功或失败),还是已被移除(退出后使用了--rm)。 -
查找实时日志文件。
case "$workflow" in continue-pretrain|pretrain-scratch) LOG=$logs_dir/pretrain_ddp.log ;; finetune) LOG=$logs_dir/finetune.log ;; *) LOG=$(ls -1t $logs_dir/*.log 2>/dev/null | head -n 1) ;; esac清单文件中的
workflow字段用于区分预训练(pretrain_ddp.log)和微调(finetune.log)。其他工作流则回退到$logs_dir中最近修改的.log文件。 -
显示最新进度。
- 使用
tail -n $LINES $LOG输出最近的原始日志。 - 解析最近几行进度信息,并以易读的方式汇总。不同工作流的格式各不相同:
- 预训练:轮次 / 步数 / val_loss
当前轮次:12/100 步数:4523/9000 val_loss:0.832(最佳 0.821,步数 4100) - 微调:折 / 轮次 / val_(例如,回归任务的 val_mae、分类任务的 val_auc——读取 run.json 中的
args_applied.metric)折 0 轮次 12/30 val_mae 0.187(最佳 0.182,轮次 9)
墙上时间:从 started_at 起已运行 1h 23m;预计还需约 6h。 - 预训练:轮次 / 步数 / val_loss
- 使用
-
最终测试指标区块(微调,完成时)。 如果
workflow为finetune,且容器已正常退出(State.Status=exited、ExitCode=0),并且$RUN_DIR/ckpt/fold_*/test_result.csv存在,则解析该文件并输出按任务划分的指标表:Final test metrics (per task): Target MAE HLM_clearance 0.187 RLM_clearance 0.213 MDR1-MDCK_efflux 0.241 solubility_pH6.8 0.156指标列与
args_applied.metric一致(回归任务使用 mae,分类任务使用 auc 等)。对于多折或集成运行,计算各折/模型的平均值;如果 std > 0,则注明± std。如果不存在test_result.csv,则静默跳过(运行未完成或未生成测试集结果)。 -
如果使用了
--follow,则持续输出实时日志。docker logs -f $container_name持续运行,直到按下 ^C。
-
停止/清理提示(在仅运行一次的模式结束时打印):
To stop: docker stop $container_name To remove: docker rm $container_name To re-run: `$(jq -r .cmd_replay $MANIFEST)`
硬性规则
- **对用户数据只读。**绝不修改
run.json,绝不触碰容器的检查点目录。监控器只进行检查。 - **未经用户明确指示,绝不停止容器。**如果用户要求停止,则运行
docker stop;如果用户要求放弃,则让容器继续运行并直接退出。 - **不要拉取或修改 kermt 镜像。**监控器只读取数据。
- **JSON 输出模式为非交互模式。**跳过“按 ^C 退出”的提示,并输出单个 JSON 文档,以便父 Agent 通过管道传递。
关于 container_name 连接的说明
当前编写的 run.json 架构尚未包含已启动的容器名称——kermt_run_detached 会将其输出到 stdout,但运行器脚本不会将其写入 run.json。监控器会回退到基于文件系统的查找方式:列出 runs/<workflow>_*/ 目录并按修改时间匹配;或者显式接受 --container <name>。后续工作:让启动技能在退出前将容器名称写入 run.json。
输出(文本模式,默认)
KERMT continue-pretrain · runs/continue-pretrain_2026-05-17T10-23Z
Container : kermt-continue-pretrain-… (Up 1 hour, status: running)
Image : kermt:latest@sha256:…
Repo : 2fe00f9 (clean)
Started : 2026-05-17T10:23:14Z (1h 23m ago)
Workflow : continue-pretrain, pretrain_mode=hybrid, world_size=2
Latest log (last 50 lines from $LOG):
[Epoch 12/100] step 4523/9000 loss 0.832 lr 1.2e-4
[val] step 4100 val_loss 0.821 (new best)
...
Progress: epoch 12/100, ~12% done. ETA ~6h.
TensorBoard: tensorboard --logdir $RUN_DIR/logs/tb
Replay command: $(jq -r .cmd_replay $RUN_DIR/run.json)