File size: 6,540 Bytes
c1b66a7
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3b8f190
 
c1b66a7
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
---
tags:
  - time-series
  - time-series-question-answering
  - captioning
  - multimodal
  - grpo
base_model:
  - Qwen/Qwen3-4B-Instruct-2507
  - AutonLab/MOMENT-1-base
---

# TS-Align

**TS-Align** aligns multivariate time series with a language model for **numeric metric
question-answering and captioning**. A frozen [MOMENT](https://huggingface.co/AutonLab/MOMENT-1-base)
time-series encoder feeds a fully fine-tuned
[Qwen3-4B-Instruct](https://huggingface.co/Qwen/Qwen3-4B-Instruct-2507) through a per-channel
("2-tunnel") projection with attention pooling, trained end-to-end with GRPO reinforcement
learning against verifiable metric and caption rewards.

This repository is a **self-contained benchmark bundle**: the trained TS-Align checkpoints,
the canonical evaluation data, and a reproduction harness for every baseline we compare against.

## Contents

| Path | What |
|---|---|
| `Models/4level_grpo_min2/` | TS-Align checkpoint — metric-QA + captioning |
| `Models/joint_grpo_min2/`  | TS-Align checkpoint — metric-QA + captioning + TSQA (jointly trained) |
| `Models/<peer>/`           | third-party baselines — **placeholder only** (weights not redistributed) |
| `Benchmark_eval/`          | canonical evaluation inputs + scorers (`TS_Caption_test`, `TSQA`, `ChatTS_test`) |
| `Benchmarks/`              | source datasets and their provenance — see [`Benchmarks/README.md`](Benchmarks/README.md) |
| `results/`                 | one reproduction bundle per evaluated model (runner + `run.sh` + `README`) |

## Trained checkpoints

Both checkpoints share the same architecture — **MOMENT-1-base** (frozen encoder) +
**Qwen3-4B-Instruct-2507** (fully fine-tuned), joined by a 2-tunnel per-channel projection
(1-layer, 8-head channel transformer) with attention pooling gated at
`channel_pool_attn_min = 2`. Trained with GRPO (2000 steps, PATRA-balanced caption reward,
split-wise Gaussian tolerance σ = {univar 0.5, bivar 0.5, multivar 1.0}).

| checkpoint | training tasks |
|---|---|
| `4level_grpo_min2` | metric-QA + captioning |
| `joint_grpo_min2`  | metric-QA + captioning + TSQA (joint) |

Each `best-checkpoint/` holds:

- `model-state-0000{1..6}.pt` — the trainable weights (Qwen + projection + special-token
  embeddings). The MOMENT encoder is frozen and **not** shipped; load it from its base repo.
- `tokenizer/` — the Qwen tokenizer with 4 added special tokens: `<ts>` `</ts>` `<scale>` `</scale>`.
- `training.pt`**metadata only** (≈1.6 KB: shard manifest, special-token ids, trainer
  scalars). The optimizer state is intentionally not included.

### How to load

You need the two base models plus the TS-Align inference code:

- MOMENT-1-base — <https://huggingface.co/AutonLab/MOMENT-1-base>
- Qwen3-4B-Instruct-2507 — <https://huggingface.co/Qwen/Qwen3-4B-Instruct-2507>
- TS-Align loader — `infer/infer_local.py` in the companion `ts-align-rl` code repository

`load_checkpoint` reads `training.pt` for the shard manifest and special-token ids, then loads
the `model-state-*.pt` shards onto a freshly built MOMENT + Qwen3-4B model:

```bash
python infer/infer_local.py \
  --moment-path <path>/MOMENT-1-base \
  --llm-path    <path>/Qwen3-4B-Instruct-2507 \
  --tokenizer-path  Models/joint_grpo_min2/best-checkpoint/tokenizer \
  --checkpoint-path Models/joint_grpo_min2/best-checkpoint/training.pt \
  --channel-pool-attn-min-channels 2 \
  --series "10,12,11,13,12,14,13,15" \
  --prompt "<ts></ts> What is the mean of this series?"
```

## Baseline placeholders

`Models/<peer>/` — ChatTS-14B, GPT-OSS-20B, Qwen2.5-7B-Instruct, Qwen3-8B, Qwen3-14B,
TimeOmni-1-7B, ITFormer-7B, MOMENT-1-large, Mistral-7B-v0.3, Time-MQA-Mistral-7B — each contain
only a `PLACE_MODEL_FILE_HERE.txt`. These are third-party models we do not redistribute:
download each from its official source and drop the weights in place to reproduce.

## Reproducing the benchmarks

Every evaluated model has a bundle under `results/<model>/` with a `run.sh`, an `_infer/`
harness, and its own README. Inputs are read from `Benchmark_eval/`; scoring uses a multi-kernel
tolerance metric for numeric QA, precision/recall for captions, and RougeL/accuracy for TSQA.
Predictions and scores are regenerated by the runners and are not checked in.

Caption precision/recall uses an NLP-extraction step: **GLM-5.1** (temperature=0, the same un-tuned prompt for all models) reads each caption and extracts the numeric value it predicts for each mentioned metric. The prompt provides GLM with the metric key **and an explanation of its statistical property**, so it can align free-text mentions to the correct ground-truth metrics; extracted values are then scored against the ground truth under the same tolerance kernel (precision = correct / extracted, recall = ground-truth metrics correctly covered). Extractor: `Benchmark_eval/TS_Caption_test/extract_metrics_withdef.py` with the key→explanation map `metric_defs.json`.

Provenance for the third-party benchmarks is documented in
[`Benchmarks/README.md`](Benchmarks/README.md); `TS_Caption_test` is our own out-of-sample set.

## Notes

- Large files (checkpoint shards, evaluation data) are stored with **Git LFS**.
- The `training.pt.full_bak` optimizer states are kept locally only and are not published.

## License

This repository's **own content** — the fine-tuned TS-Align checkpoints
(`Models/4level_grpo_min2/`, `Models/joint_grpo_min2/`) and the `TS_Caption_test` evaluation set
— is **not yet released under a license** (all rights reserved by the authors for now).

All **third-party components** keep their original licenses:

### Models
| Model | Original license |
|---|---|
| Qwen3-4B-Instruct-2507, Qwen2.5-7B-Instruct, Qwen3-8B, Qwen3-14B | Apache-2.0 |
| MOMENT-1-base, MOMENT-1-large | MIT |
| GPT-OSS-20B | Apache-2.0 |
| ChatTS-14B | Apache-2.0 |
| TimeOmni-1-7B | Apache-2.0 |
| Mistral-7B-v0.3 (and its bnb-4bit quantization) | Apache-2.0 |
| Time-MQA-Mistral-7B (LoRA adapter) | see the Time-MQA project |
| ITFormer-7B | see the model's original repository |

### Datasets
| Dataset | Original license |
|---|---|
| TSQA (Time-MQA) | Apache-2.0 |
| ChatTS_test (ChatTS) | composite, per source component (e.g. NAB: Apache-2.0, Weather: CC-BY-4.0); see the ChatTS release (Zenodo `14349206`) |
| MTBench (Yale GGLab) | see the dataset's Hugging Face page |
| TimeSeriesExam (CMU Auton Lab) | see the dataset's original source |

Sources and links for every dataset are in [`Benchmarks/README.md`](Benchmarks/README.md).