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 (viarocm-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 vsHEAD)- last commit message, ID, author, and date
- current branch
- remotes
source_code/diff_upstream_<sha>whenHEADdiffers 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_DIRto use an existing local clone - by default, the test uses
archive/neptune-exporterfrom 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
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
16d437f531030ba13dad96ad6bb049482b2a41d64a8f98c6a317396e9b8b6c0e
|
|
| MD5 |
b8b8503c94c23e5366eb0a42f9295929
|
|
| BLAKE2b-256 |
191024a9f8c6da93848e158a721b5bb6904e00f3fcfd039e35cf1d0c53c5c03a
|
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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
36d519e5a0e91171ae20bfff90a60d9c4c4d7f571a0dafd7ec3ce7731bc7c998
|
|
| MD5 |
fb40a90a9c3eb7b8c3bfe98a2114594f
|
|
| BLAKE2b-256 |
62ae212902a1ddcbf963ade0f1efe1476ce4c113ef16472a9c57ddc70a226e54
|