Skip to main content

ML experiment tracker

Project description

GoodSeed

ML experiment tracker. Logs metrics and configs to local SQLite files, serves them via a built-in HTTP server, and visualizes them in the browser.

Full documentation at goodseed.ai/docs.

Install

pip install goodseed

Python 3.9+ required.

For development:

pip install -e ".[dev]"

Quick Start

Log metrics and configs from a training script:

import goodseed

run = goodseed.Run(name="my-experiment", tags=["bert"])

# Log configs (single values)
run["learning_rate"] = 0.001
run["batch_size"] = 32

# Log metrics (series of values)
for epoch in range(100):
    loss = train_step()
    run["train/loss"].log(loss, step=epoch)

run.close()

Custom step values:

run["metric"].log(value=acc, step=i)

step is required for series logging via run["path"].log(...).

Batch logging methods are also available:

run.log_configs({"learning_rate": 0.001, "batch_size": 32})
run.log_metrics({"loss": loss, "acc": acc}, step=step)

Your data is saved to a local SQLite file. You can also use with goodseed.Run(...) as run: to close the run automatically.

Storage Modes

The storage parameter controls where data is stored:

  • "cloud" (default) — local SQLite plus background sync to the remote API.
  • "local" — local SQLite only, no remote sync.
  • "disabled" — no storage; all writes are silent no-ops.

Cloud storage syncs data in the background while your training runs. Set the GOODSEED_API_KEY environment variable and use workspace/project format for the project name:

import goodseed

run = goodseed.Run(project="my-workspace/my-project", name="experiment-1")
run["train/loss"].log(0.5, step=0)
run.close()  # blocks until all data is uploaded

For local-only storage (no remote sync):

run = goodseed.Run(storage="local")

You can also set the mode via the GOODSEED_STORAGE environment variable.

Read Data from Server

run = goodseed.Run(project="my-workspace/my-project", run_id="bold-falcon", read_only=True)
data = run.get_metric_data("train/loss")
configs = run.get_configs()

Resume a run

run = goodseed.Run(resume_run_id="bold-falcon")
run["train/loss"].log(0.3, step=123)
run["eval/f1"] = 0.85
run.close()

Monitoring

By default, goodseed automatically captures:

  • stdout / stderr — every print() and warning is logged
  • Tracebacks — captured on unhandled exceptions (status set to failed)
  • CPU & memory — via psutil (installed with goodseed)
  • GPU — NVIDIA (via nvidia-smi) and AMD (via rocm-smi), no pip dependency

Disable any of these with:

run = goodseed.Run(
    capture_stdout=False,
    capture_stderr=False,
    capture_hardware_metrics=False,
    capture_traceback=False,
)

Then view your runs:

goodseed serve

Open the printed link in your browser to see your runs, metrics, and configs.

Coming from Neptune?

You can export your data from neptune.ai and import it into GoodSeed using neptune-exporter. See the migration guide for details.

Configuration

Variable Description
GOODSEED_HOME Data directory (default: ~/.goodseed)
GOODSEED_PROJECT Default project name (default: default)
GOODSEED_RUN_ID Default run ID (overridden by run_id argument)
GOODSEED_API_KEY API key for cloud storage
GOODSEED_STORAGE Storage mode: disabled, local, or cloud (default: cloud)

Git Tracking

By default, Run() auto-tracks Git metadata from the current repository:

  • dirty state
  • source_code/diff (index vs HEAD)
  • last commit message, ID, author, and date
  • current branch
  • remotes
  • source_code/diff_upstream_<sha> when HEAD differs from the remote tracking branch

Specify a custom repository path:

import goodseed

run = goodseed.Run(git_ref=goodseed.GitRef(repository_path="/path/to/repo"))

Disable Git tracking:

import goodseed

run = goodseed.Run(git_ref=False)
# or: run = goodseed.Run(git_ref=goodseed.GitRef.DISABLED)

CLI

goodseed                   # Start the server (default command)
goodseed serve [dir]       # Start the server, optionally from a specific directory
goodseed serve --port 9000 # Use a custom port
goodseed list              # List projects
goodseed list -p default   # List runs in a project
goodseed upload -p <workspace/project> --run-id <run_id>  # Upload one run
goodseed upload -p <workspace/project>                    # Upload all runs

Tests

pip install -e ".[dev]"
pytest tests/ -v

Run the upstream Neptune exporter compatibility E2E test (disabled by default):

GOODSEED_RUN_NEPTUNE_EXPORTER_E2E=1 pytest tests/test_neptune_exporter_e2e.py -v

Optional:

  • set NEPTUNE_EXPORTER_DIR to use an existing local clone
  • by default, the test uses archive/neptune-exporter from this workspace

See DOCS.md for architecture details and API reference.

Beta Notice

GoodSeed is currently in beta. We may introduce breaking changes as we iterate on the product.

In particular, the local SQLite schema and parts of the Python/CLI interface may change in future releases. Depending on the change, upgrading could require migrating or recreating existing local GoodSeed data files (stored under ~/.goodseed by default).

Feedback is very welcome while we stabilize the API. Please open issues with bug reports or feature requests.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

goodseed-0.3.0.tar.gz (189.8 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

goodseed-0.3.0-py3-none-any.whl (53.1 kB view details)

Uploaded Python 3

File details

Details for the file goodseed-0.3.0.tar.gz.

File metadata

  • Download URL: goodseed-0.3.0.tar.gz
  • Upload date:
  • Size: 189.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.3

File hashes

Hashes for goodseed-0.3.0.tar.gz
Algorithm Hash digest
SHA256 16d437f531030ba13dad96ad6bb049482b2a41d64a8f98c6a317396e9b8b6c0e
MD5 b8b8503c94c23e5366eb0a42f9295929
BLAKE2b-256 191024a9f8c6da93848e158a721b5bb6904e00f3fcfd039e35cf1d0c53c5c03a

See more details on using hashes here.

File details

Details for the file goodseed-0.3.0-py3-none-any.whl.

File metadata

  • Download URL: goodseed-0.3.0-py3-none-any.whl
  • Upload date:
  • Size: 53.1 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.3

File hashes

Hashes for goodseed-0.3.0-py3-none-any.whl
Algorithm Hash digest
SHA256 36d519e5a0e91171ae20bfff90a60d9c4c4d7f571a0dafd7ec3ce7731bc7c998
MD5 fb40a90a9c3eb7b8c3bfe98a2114594f
BLAKE2b-256 62ae212902a1ddcbf963ade0f1efe1476ce4c113ef16472a9c57ddc70a226e54

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page