diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..7d18a54 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,52 @@ +# Changelog + +All notable changes to Emry are documented here. The format follows +[Keep a Changelog](https://keepachangelog.com/), and Emry adheres to +[Semantic Versioning](https://semver.org/). + +## [0.2.0] - 2026-07-07 + +A big batch of backward-compatible features. Upgrading from 0.1.0 requires no +code changes — everything below is additive, and existing defaults are unchanged +(the dashboard still binds loopback with no auth unless you opt in). + +### Added + +- **GPU telemetry.** When an NVIDIA GPU is present, Emry auto-samples + `nvidia-smi` and charts GPU utilization, memory, and temperature alongside your + metrics. On by default; `gpu=False` to disable. +- **NaN/Inf alerts.** Pass `alert_webhook=` (or set `EMRY_ALERT_WEBHOOK`) to get a + Slack/Discord/generic-webhook ping the moment a metric goes non-finite — + fire-once-per-metric, off the training thread, never blocking the loop. +- **Weights & Biases export.** `emry.to_wandb(run_dir, ...)` (or + `python -m emry.export_wandb`) replays a finished run into a W&B run. `wandb` is + an optional extra: `pip install emry[wandb]`. +- **Checkpoint markers.** `run.checkpoint(path, step)` records checkpoint events, + rendered as markers on both dashboards. +- **Multi-run project dashboard.** `emry web --project ./logs` overlays every run + in a log directory on one chart for sweep comparison. +- **SLURM sidecar helper.** `emry slurm-wrap --project NAME -- ` starts the + sidecar engine, points your command at it, and drains/cleans up on exit — + collapsing the batch-script boilerplate into one line. +- **Web dashboard auth + TLS.** `--auth-token` (or `EMRY_AUTH_TOKEN`) requires a + bearer token on every route except `/healthz`; `--tls-cert`/`--tls-key` serve + HTTPS from your own PEM files; `--host` sets the bind address (default + loopback). All opt-in. +- **Role-based access (RBAC).** `--viewer-token` grants read-only access to + single-run dashboards; the multi-run `--project` overlay requires the + full-access `--auth-token` (admin). +- **Kubernetes deployment.** A multi-stage `Dockerfile` and a Helm chart under + `deploy/helm/emry` (Deployment, Service, optional Ingress + auth Secret). +- **Terminal-dashboard parity.** `emry watch` gained the step-based chart axis, + phase bands, checkpoint markers, and a `--compare` baseline overlay — full + parity with the web dashboard. + +### Changed + +- Socket/stream observers now receive a metric name table, so live consumers show + real metric names instead of `m{id}` placeholders. +- Minimum supported Rust version raised to 1.88 (ratatui 0.30); this affects + building from source only, not installing the wheel. + +[0.2.0]: https://github.com/femboyisp/emry/releases/tag/v0.2.0 +[0.1.0]: https://github.com/femboyisp/emry/releases/tag/v0.1.0 diff --git a/Cargo.lock b/Cargo.lock index b7235db..e639a2f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -809,7 +809,7 @@ checksum = "91622ff5e7162018101f2fea40d6ebf4a78bbe5a49736a2020649edf9693679e" [[package]] name = "emry-cli" -version = "0.1.0" +version = "0.2.0" dependencies = [ "clap", "crossbeam-channel", @@ -824,7 +824,7 @@ dependencies = [ [[package]] name = "emry-core" -version = "0.1.0" +version = "0.2.0" dependencies = [ "criterion", "crossbeam-channel", @@ -838,7 +838,7 @@ dependencies = [ [[package]] name = "emry-engine" -version = "0.1.0" +version = "0.2.0" dependencies = [ "criterion", "crossbeam-channel", @@ -850,7 +850,7 @@ dependencies = [ [[package]] name = "emry-ingest" -version = "0.1.0" +version = "0.2.0" dependencies = [ "emry-core", "rmp-serde", @@ -861,7 +861,7 @@ dependencies = [ [[package]] name = "emry-py" -version = "0.1.0" +version = "0.2.0" dependencies = [ "emry-core", "emry-engine", @@ -871,7 +871,7 @@ dependencies = [ [[package]] name = "emry-store" -version = "0.1.0" +version = "0.2.0" dependencies = [ "arrow-array", "arrow-schema", @@ -886,7 +886,7 @@ dependencies = [ [[package]] name = "emry-tui" -version = "0.1.0" +version = "0.2.0" dependencies = [ "crossbeam-channel", "emry-core", @@ -898,7 +898,7 @@ dependencies = [ [[package]] name = "emry-web" -version = "0.1.0" +version = "0.2.0" dependencies = [ "axum", "axum-server", diff --git a/Cargo.toml b/Cargo.toml index 82fa781..41b9d1f 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -12,7 +12,7 @@ members = [ ] [workspace.package] -version = "0.1.0" +version = "0.2.0" edition = "2021" license = "Apache-2.0" rust-version = "1.88" diff --git a/crates/emry-py/src/lib.rs b/crates/emry-py/src/lib.rs index bd805f9..7c92145 100644 --- a/crates/emry-py/src/lib.rs +++ b/crates/emry-py/src/lib.rs @@ -164,6 +164,7 @@ mod tests { #[test] fn version_matches_cargo_package() { - assert_eq!(emry_version(), "0.1.0"); + // Tracks the crate version automatically, so a release bump needs no edit. + assert_eq!(emry_version(), env!("CARGO_PKG_VERSION")); } } diff --git a/pyproject.toml b/pyproject.toml index 1e271f6..e407612 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "maturin" [project] name = "emry" -version = "0.1.0" +version = "0.2.0" description = "Gentle observability for long training runs" readme = "README.md" requires-python = ">=3.10" diff --git a/python/emry/__init__.py b/python/emry/__init__.py index 72eb8e6..d103b97 100644 --- a/python/emry/__init__.py +++ b/python/emry/__init__.py @@ -5,6 +5,6 @@ from emry.phase import Phase from emry.run import Run, run -__version__ = "0.1.0" +__version__ = "0.2.0" __all__ = ["DeployMode", "Phase", "Run", "run", "to_wandb", "__version__"] diff --git a/python/tests/test_version.py b/python/tests/test_version.py index 42630f5..c68fbc6 100644 --- a/python/tests/test_version.py +++ b/python/tests/test_version.py @@ -7,4 +7,4 @@ def test_version_is_string() -> None: assert isinstance(emry.__version__, str) - assert emry.__version__ == "0.1.0" + assert emry.__version__ == "0.2.0"