Kermt Monitor
NVIDIAOfficialPublished by NVIDIA
- Skill
- Tool integration
- Software development
- Apache-2.0
- Medium risk
AutoGineer summary
Written by AutoGineer from the skill’s own files, not by the author
kermt-monitor is a utility designed to track the execution state of detached KERMT workflows. By reading the run manifest and querying the container runtime, it provides visibility into active pretraining or fine-tuning processes. It parses log files to extract progress metrics such as epochs, steps, and validation loss, and can optionally stream live logs or output structured status reports for automated workflows.
What it does
- Reads run configuration from a specified run directory.
- Queries container status and state via docker.
- Identifies and tails relevant log files based on the workflow type.
- Parses and summarizes progress metrics like epoch, step, and validation loss.
- Displays final test metrics for completed fine-tuning tasks.
- Provides optional structured JSON output for integration with other agents.
When to use it
- When you need to check the status of a detached KERMT pretrain or finetune run.
- When you want to monitor training progress metrics like validation loss over time.
- When you need to verify if a containerized training job is still running or has exited.
- When you need to extract final test results from a completed fine-tuning run.
Advantages
- Provides a unified view of container state and training progress.
- Automates the parsing of complex log files into human-readable summaries.
- Supports both interactive monitoring and structured data output for agent automation.
- Requires no additional compute resources as it only performs read operations.
Usage examples
- “kermt-monitor runs/continue-pretrain_2026-05-17T10-23Z”
- Displays the current container status, training progress, and recent log entries for the specified run.
- “kermt-monitor runs/finetune_2026-05-18T09-00Z --follow”
- Streams the live logs of the fine-tuning run to the terminal until the user manually stops the process.
- “kermt-monitor runs/finetune_2026-05-18T09-00Z --json”
- Outputs a structured JSON report containing the run status and progress metrics for programmatic use.
Install
Download the skill as a ZIP:
https://autogineer.com/agent-skills/nvidia/kermt-monitor/downloadUnzip it into the cross-client skills folder of your project:
mkdir -p .agents/skills && unzip kermt-monitor.zip -d .agents/skills
Documentation by NVIDIA
kermt-monitor
Companion skill for any KERMT workflow that runs detached: the three pretrain
skills (kermt-continue-pretrain, kermt-pretrain-scratch,
kermt-add-cmim-pretrain) plus kermt-finetune. kermt-infer and
kermt-embed run blocking by default and don't need this skill, but if a
user launches them detached on purpose the monitor still works (the
workflow-dispatch in step 4 handles unknown workflows by tailing the
most-recent log file in the run dir). Reads the run directory's run.json,
queries docker for the container's state, surfaces the latest progress,
and either tails or follows the log.
Hardware requirements
None. This skill only reads disk + queries docker; no GPU compute.
Inputs
One of:
<run-dir>— a positional argument pointing at the directory containingrun.json(e.g.runs/continue-pretrain_2026-05-17T10-23Z). Preferred.--container <name-or-id>— direct container reference; the skill still readsrun.jsonfrom the run dir referenced inside the container's inspect output if available, but works degraded-mode without it.
Optional:
--lines N— number of trailing log lines to print (default 50).--follow— streamdocker logs -funtil ^C. Useful for "watch the loss". Without it, the skill is one-shot and exits.--json— emit a structured status report instead of human-readable text. Useful when the parent agent wants to take downstream action.
Workflow
Let RUN_DIR=$1 (or whatever path the user supplies).
Locate the manifest.
MANIFEST=$RUN_DIR/run.jsonRefuse to proceed if it doesn't exist; surface a helpful message pointing the user at the run-dir convention (
runs/<workflow>_<ts>/).Parse the manifest (Python helper):
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)Query docker for container state.
docker ps --filter "name=$container_name" --format \ '{{.ID}}\t{{.Status}}\t{{.CreatedAt}}'If absent, fall back to
docker inspect $container_name --format '{{.State.Status}} (exit {{.State.ExitCode}})'to see whether the container exited (ok or failed) or was removed (--rmafter exit).Find the live log file.
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) ;; esacThe manifest's
workflowfield disambiguates pretrain (pretrain_ddp.log) from finetune (finetune.log). Other workflows fall back to the most-recently-modified.login$logs_dir.Show the latest progress.
tail -n $LINES $LOGfor the raw recent output.Parse the last few progress lines and surface a human-friendly summary. The format differs per workflow:
Pretrain: epoch / step / val_loss
Current epoch: 12/100 step: 4523/9000 val_loss: 0.832 (best 0.821 @ step 4100)Finetune: fold / epoch / val_<metric> (e.g. val_mae for regression, val_auc for classification — read
args_applied.metricfrom run.json)Fold 0 epoch 12/30 val_mae 0.187 (best 0.182 @ epoch 9)
Wall-clock: 1h 23m since started_at; ETA ~6h remaining.
Final test-metrics block (finetune, on completion). If
workflowisfinetuneAND the container has exited cleanly (State.Status=exited,ExitCode=0) AND$RUN_DIR/ckpt/fold_*/test_result.csvexists, parse it and emit a per-task metric table:Final test metrics (per task): Target MAE HLM_clearance 0.187 RLM_clearance 0.213 MDR1-MDCK_efflux 0.241 solubility_pH6.8 0.156The metric column matches
args_applied.metric(mae for regression, auc for classification, etc.). For multi-fold or ensemble runs, average across folds/models and note± stdif std > 0. Skip silently if notest_result.csvexists (run incomplete or no test split was emitted).If
--follow, stream live logs.docker logs -f $container_nameWraps until ^C.
Stop / cleanup hints (printed at end of one-shot mode):
To stop: docker stop $container_name To remove: docker rm $container_name To re-run: `$(jq -r .cmd_replay $MANIFEST)`
Hard rules
Read-only on the user's data. Never modify
run.json, never touch the container's checkpoint dir. The monitor only inspects.Don't kill the container without explicit user instruction. If the user asks to stop, run
docker stop; if they ask to abandon, leave it running and just exit.Don't pull or modify the kermt image. The monitor only reads.
JSON output mode is non-interactive. Skip the "press ^C to exit" prompts and emit a single JSON document so the parent agent can pipe it.
Note on container_name plumbing
The run.json schema as currently written does not yet include the launched
container name — kermt_run_detached prints it to stdout but the runner
script doesn't capture it into run.json. The monitor falls back to a
filesystem-based lookup: list runs/<workflow>_*/ directories and match by
mtime; or accept --container <name> explicitly. Follow-up: have the
launching skill record container name into run.json before exiting.
Output (text mode, default)
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)Files
- ATTRIBUTION.mdAdded by AutoGineer833 B
- BENCHMARK.md7.5 KiB
- LICENSELicence file added by AutoGineer11.2 KiB
- SKILL.md7.0 KiB
- evals/evals.json4.6 KiB
- skill-card.md4.3 KiB
- skill.oms.sig4.5 KiB
Requirements and compatibility
Written for: Claude Code, OpenAI Codex
Works with: Claude Code, Claude apps, OpenAI Codex, GitHub Copilot, Cursor, Gemini CLI, Kiro, OpenCode, Goose, Amp, Roo Code, JetBrains Junie, Factory Droid, Devin (ex-Windsurf), Mistral Vibe, OpenHands, Letta
“Works with” means the tool reads the open Agent Skills format; a skill written for one tool may use features others lack.
Needs: Needs a command-line tool
The author says: Requires docker and jq. Designed for Claude Code, Codex, and Nemotron.
Security
What our scanner noticed· Medium risk
- Large base64-encoded blobs
A static scan is not a guarantee. Skills are third-party content: review a skill before you let an agent use it.
Attribution and licence
- Published by
- NVIDIA
- Publisher
- NVIDIA (Official)
- Source
- NVIDIA/skills · skills/bionemo-kermt-monitor · commit fce3cca
- Licence
- Apache License 2.0 (redistribution allowed)
- LICENSE (added by AutoGineer from LICENSE-APACHE)
- ATTRIBUTION.md (written by AutoGineer)
- Synced
AutoGineer is not affiliated with or endorsed by NVIDIA or NVIDIA.
Download ZIP
The ZIP holds the skill’s files, its licence files and an ATTRIBUTION.md. Download kermt-monitor.zip