August 5, 2026
Performance
- Spool writes are about 45x faster. 2,000 sequential batch writes dropped from 16.7 seconds to 373 ms, or 8.3 ms to 187 microseconds per write. The writer keeps a running byte total instead of rescanning the spool directory on every write.
- About 80% less per-step overhead in the PyTorch hook, from 91 to 19 microseconds per optimizer step at ResNet50 scale, returning roughly 72 ms per 1,000-step epoch. Applies to runs with snapshots enabled and a model registered through
ci.watch(). - CUDA event objects are pooled rather than allocated per timed span, and pending-event draining runs on a cadence instead of on every operation.
- Constant-cost flush path, with bounded memory if the flush thread stalls.
Diagnostics
ci.health()now reportsswallowed_error_countandswallowed_errors, so instrumentation that quietly stops collecting is visible rather than looking like a model with nothing to report.
Bug Fixes
- Fixed diverged runs invalidating an entire batch of profiling data. Non-finite values are written as strict JSON with a companion field naming the value.
- Fixed GPU timings intermittently missing from spans when kernels finished after the flush tick.
- Fixed long epochs being split into several when an epoch ran past the step-count fallback. Two real epochs were previously reported as four.
- Fixed
flush_now()ignoring your configured spool directory and size cap. - Fixed orphaned temp files never counting toward the spool cap or being reclaimed.
- Fixed unserializable values in
attrsbreaking batch writes. - Fixed warnings printed into your training log when a model diverged.
May 7, 2026
Initial Release
The Cirron Python SDK is now generally available on PyPI. It is a profiler that attaches to the running process with one line, captures what’s happening inside training and inference, and writes open artifacts that work standalone or stream to the platform.ci.profile(): one line, no scope wrapping
- Auto-detects PyTorch, TensorFlow / Keras, and HuggingFace Transformers and installs hooks without scope wrappers or callbacks
- Same zero-touch experience for
Trainer.train(),model.fit(), and plain training loops
What gets captured automatically
- Per-epoch and per-batch wall time, GPU seconds, and memory peak
- Weight and gradient statistics (mean, std, norm, histogram) per epoch
- DataLoader stall time broken out from compute time
ci.mark()for user metrics alongside the auto-captured signals
ci.load(): unified data loader
- Returns pandas, polars, Arrow, or
datasets.Datasetbased on the optional extras installed - Reads from local files, object storage (S3, GCS, Azure Blob), and SQL warehouses (Postgres, MySQL, Databricks, Snowflake)
@ci.inference: serving instrumentation
- Decorator-based capture of p50 / p95 / p99 latency, throughput, error rate, and cost-per-request
- Token counts and time-to-first-token surface automatically for LLM endpoints
Local-first, platform-optional
- Writes structured JSON spans and safetensors snapshots to
./.cirron/with no credentials required - Set
CIRRON_API_KEYto stream to the platform; pipeline, deployment, and run context are injected automatically inside Cirron-managed environments - Snapshot modes for full, sampled, and stats-only captures