mcpField
K
kermt-monitor

kermt-monitor

github.com/nvidia-bionemo云与 DevOps502211 次安装2 天前更新
代码仓库

关于 kermt-monitor

kermt-monitor 是用于检查 KERMT 后台工作流的伴随技能,面向运行预训练或微调任务的用户。它读取运行记录、查询 Docker 容器状态并显示日志进度,也可输出结构化状态。

主要功能

  1. 01读取 run.json 运行记录
  2. 02查询 Docker 容器状态
  3. 03显示日志与训练进度
  4. 04跟随输出实时日志
  5. 05输出 JSON 状态报告
  6. 06汇总微调测试指标

适用场景

  1. 01查看后台预训练任务进度
  2. 02跟踪微调运行并读取最终指标
  3. 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(或使用用户提供的路径)。

  1. 定位清单文件。

    MANIFEST=$RUN_DIR/run.json
    

    如果文件不存在,则拒绝继续,并显示有用的提示,告知用户运行目录的约定(runs/<workflow>_<ts>/)。

  2. 解析清单文件(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)
    
  3. 查询 Docker 中的容器状态。

    docker ps --filter "name=$container_name" --format \
        '{{.ID}}\t{{.Status}}\t{{.CreatedAt}}'
    

    如果没有状态信息,则改用 docker inspect $container_name --format '{{.State.Status}} (exit {{.State.ExitCode}})',查看容器是已退出(成功或失败),还是已被移除(退出后使用了 --rm)。

  4. 查找实时日志文件。

    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 文件。

  5. 显示最新进度。

    • 使用 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。
      
  6. 最终测试指标区块(微调,完成时)。 如果 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,则静默跳过(运行未完成或未生成测试集结果)。

  7. 如果使用了 --follow,则持续输出实时日志。

    docker logs -f $container_name
    

    持续运行,直到按下 ^C。

  8. 停止/清理提示(在仅运行一次的模式结束时打印):

    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)

评论

支持 Markdown