ONNX
chronos2 / README.md
hombit's picture
Upload README.md with huggingface_hub
3157e1f verified
|
Raw
History Blame Contribute Delete
3.58 kB
# Chronos 2
**Part of the [light-curve](https://github.com/light-curve) family of open-source tools for astronomical time-series analysis.**
Available from Python via the [`light-curve`](https://light-curve.snad.space/) package: `pip install light-curve`. Documentation: [light-curve.snad.space](https://light-curve.snad.space/).
## Paper
Ansari et al., 2025. "Chronos-2: Learning the Language of Time Series." Amazon Web Services.
```bibtex
@misc{ansari2025chronos2,
title = {Chronos-2: Learning the Language of Time Series},
author = {Abdul Fatir Ansari and others},
year = {2025},
url = {https://huggingface.co/amazon/chronos-2},
}
```
## Original model
HuggingFace: https://huggingface.co/amazon/chronos-2
Package: `chronos-forecasting==2.3.0` (pip-installable, no code submodule)
Weights are pinned to commit
[`29ec3766`](https://huggingface.co/amazon/chronos-2/commit/29ec3766d36d6f73f0696f85560a422f50e8498c)
of the HF repo, so the export is fully reproducible regardless of upstream
changes to `main`.
## License
Apache 2.0
## Model overview
Chronos 2 is a 120 M-parameter encoder-only time series foundation model trained on a
large corpus of real and synthetic time series data. It maps a sequence of scalar
observations into a sequence of patch embeddings via a T5-style transformer encoder.
The architecture uses non-overlapping patches of size 16 and instance normalisation
with arcsinh transformation.
## Irregular-sampling strategy
Following the [StarEmbed benchmark](https://arxiv.org/abs/2510.06200), timestamps are
**not** passed to Chronos 2. The model encodes relative position implicitly via
sequential patch indices (scaled by the context length), so light curves are treated as
equally spaced in observation order. Left-padding with NaN marks unused context
positions.
## Passband encoding
Chronos 2's `embed()` API accepts only magnitude values; there is **no built-in
passband channel**. Multi-band data can be embedded per-band separately, or stacked as
multiple variates (shape `[n_bands, seq_len]`). Explicit `lg(λ)` injection would
require direct calls to `model.encode()` with a custom input tensor — the architecture
has no dedicated wavelength embedding layer.
## Inputs
| Tensor | Shape | dtype | Description |
|--------|-------|-------|-------------|
| `context` | `[batch, seq]` | float32 | Magnitude values; NaN marks left-padded positions |
Both `batch` and `seq` are **dynamic** axes. `seq` must be a multiple of the patch
size (16) and may be anything up to the model's native context of 8192 (512 patches).
Inference cost scales with `seq`, so shorter series are proportionally cheaper — there is
no fixed window and no truncation. Pad each batch to a common multiple of 16 with NaN.
## Outputs (ONNX)
| Name | Shape | Description |
|------|-------|-------------|
| `mean` | `[batch, 768]` | Masked mean pool over valid context patches |
| `sequence` | `[batch, seq/16, 768]` | Per-patch encoder hidden states |
## Preprocessing steps
1. Select observations (time-sorted magnitudes).
2. Optionally cap to the last 8192 observations (the model's native context).
3. Left-pad each series to a common length that is a multiple of 16, using NaN.
4. Pass the `[batch, seq]` float32 tensor to the ONNX model.
Instance normalisation (mean subtraction, std scaling, arcsinh) is applied internally
by the model.
## Weights
Source: https://huggingface.co/amazon/chronos-2 (loaded automatically via
`Chronos2Pipeline.from_pretrained`, pinned to revision
`29ec3766d36d6f73f0696f85560a422f50e8498c`)