TimeRLM β TSLM baseline checkpoints on AnomalyXL
Fine-tuned weights for the time-series language model (TSLM) baselines reported in
the TimeRLM work: ChatTS, OpenTSLM-Flamingo, and ITFormer, each built on a
frozen Chronos-2 encoder feeding a
LoRA-tuned Qwen3.5-4B backbone, trained on
AnomalyXL in both its precise (free-form structured answer) and coarse
(multiple-choice) variants. Also included are four LoRA adapters for the Toto
baseline, built on Toto-1.0-QA-Experimental.
Training and evaluation code lives in the TimeRLM repository under sft/tslm/
(TSLM baselines) and sft/toto/ (Toto baseline).
What is stored here, and why
Each original training artifact is a ~9β22 GB best_model.pt holding a complete
model_state: the frozen Chronos-2 encoder, every weight of the base Qwen3.5-4B
backbone, and the trained parts. For ITFormer, the trained parts are 137 MB of a
8.79 GB checkpoint β the other 98% is stock public weights.
So this repository stores only the tensors that training actually changed, plus a
manifest.json describing where every other tensor comes from. reconstruct.py
puts a checkpoint back together from those two ingredients and the public base
models. The result is bitwise identical to the original best_model.pt β not
approximately, not numerically close. Every one of the 12 runs was verified
tensor-by-tensor with torch.equal over the full state dict (633β2804 tensors each)
before upload; verify_release.py reruns that check.
| architecture | trained tensors | shipped | original | what is shipped |
|---|---|---|---|---|
| ChatTS | 176 / 633 | 1.48 GB | 8.66 GB | trained embeddings, MLP projector, LoRA |
| OpenTSLM-Flamingo | 454 / 2804 | 4.92 GB | 12.30 GB | gated cross-attention (3.57 GB), embeddings, Perceiver Resampler, LoRA |
| ITFormer | 113 / 710 | 0.14 GB | 8.79 GB | ITFormer fusion, prefix projectors, LoRA |
ChatTS and Flamingo ship their embedding matrices because both configs set
freeze_lm_embeddings: false; every row of those matrices moved during training, so
none of it is recoverable from stock. ITFormer froze its embeddings, so its
embedding table is reconstructed by slicing the stock matrix to the resized vocabulary.
Optimizer and scheduler state are not included β these are release checkpoints, not
resume points. latest_checkpoint.pt files are likewise omitted.
Quick start
pip install torch safetensors huggingface_hub
huggingface-cli download nz00shuuuu/TimeRLM-TSLM-Checkpoints --local-dir timerlm-tslm
python timerlm-tslm/reconstruct.py \
--run anomaly_xl_itformer_precise_chronos2_qwen35_4b \
--local-dir timerlm-tslm/tslm/anomaly_xl_itformer_precise_chronos2_qwen35_4b \
--out best_model.pt
That writes a best_model.pt the training repository loads directly:
cd sft/tslm
uv run python train.py --config configs/itformer_precise.yaml --eval-only --checkpoint best_model.pt
Or rebuild the state dict in-process, without materialising a .pt:
from reconstruct import rebuild_state_dict
state = rebuild_state_dict("anomaly_xl_itformer_precise_chronos2_qwen35_4b")
model.load_state_dict(state) # model built by sft/tslm/train.py's MODEL_CLASSES
The first call downloads Qwen3.5-4B (9.7 GB) and Chronos-2 (0.24 GB) into your
Hugging Face cache. Subsequent runs reuse them across all 12 checkpoints, which is
the point: you pay for the base weights once, not twelve times.
Verifying the reconstruction yourself
If you have the original best_model.pt, confirm the round trip:
python verify_release.py \
--ckpt /path/to/best_model.pt \
--run-dir tslm/anomaly_xl_itformer_precise_chronos2_qwen35_4b
# compared 710 tensors -> 0 mismatches
# BITWISE IDENTICAL
Without the original, verify_release.py --run-dir ... --self-check confirms that
every manifest entry resolves and that the rebuilt state dict has the expected keys,
shapes, and dtypes.
Layout
tslm/<run_name>/
trained.safetensors tensors training changed
manifest.json per-tensor provenance + key order + training config
summary.json test metrics on the held-out gold shard
history.json per-epoch train/val loss
config.yaml the exact training config
metrics.jsonl step-level metrics
output_logs/ model generations on the test shard
toto/<adapter_name>/
adapter_model.safetensors, adapter_config.json, history.json
reconstruct.py, verify_release.py, extraction_report.json
Run names follow anomaly_xl_{chatts,flamingo,itformer}_{precise,coarse}_chronos2_qwen35_4b[_fixtrain].
Runs
Twelve TSLM runs: three architectures x two variants x two training passes. The two
passes share identical hyperparameters β the configs differ only in whether Weights &
Biases logging was enabled. The _fixtrain pass was run in late July 2026, the
original in mid-June 2026.
test_primary is multiple-choice accuracy for coarse, and the mean per-category
primary metric in [0, 1] for precise.
Precise
| architecture | pass | test_primary | test_loss | best epoch |
|---|---|---|---|---|
| ChatTS | original | 0.0522 | 0.4372 | 1 |
| ChatTS | fixtrain | 0.0773 | 0.4193 | 1 |
| OpenTSLM-Flamingo | original | 0.0941 | 0.4228 | 1 |
| OpenTSLM-Flamingo | fixtrain | 0.0926 | 0.4104 | 4 |
| ITFormer | original | 0.0812 | 0.4073 | 2 |
| ITFormer | fixtrain | 0.0901 | 0.4075 | 2 |
Coarse (multiple choice)
| architecture | pass | test_primary | test_loss | best epoch |
|---|---|---|---|---|
| ChatTS | original | 0.3978 | 0.3370 | 2 |
| ChatTS | fixtrain | 0.3784 | 0.3412 | 2 |
| OpenTSLM-Flamingo | original | 0.3548 | 0.3990 | 2 |
| OpenTSLM-Flamingo | fixtrain | 0.3508 | 0.4797 | 3 |
| ITFormer | original | 0.3508 | 0.3003 | 1 |
| ITFormer | fixtrain | 0.3831 | 0.2891 | 4 |
Per-category breakdowns are in each run's summary.json.
Toto adapters
LoRA adapters for Datadog/Toto-1.0-QA-Experimental β a frozen Toto-Open-Base-1.0
time-series encoder with a Qwen3-VL-32B-Instruct decoder. Rank 16, alpha 32, dropout
0.05, on q_proj and v_proj of the text decoder only. Protocol-matched to the TSLM
baselines above: same epochs, learning rate, weight decay, warmup, patience, and
batch size.
from peft import PeftModel
model = PeftModel.from_pretrained(base, "nz00shuuuu/TimeRLM-TSLM-Checkpoints",
subfolder="toto/toto_ft_precise")
Load the base model from the vlm subfolder of Datadog/Toto-1.0-QA-Experimental.
adapter_config.json records base_model_name_or_path as the Hub id; the training
runs resolved it through a local snapshot of the same revision.
| adapter | variant | best val loss | epochs |
|---|---|---|---|
toto_ft_precise |
precise | 0.3247 | 5 |
toto_ft_coarse |
coarse | 0.2159 | 5 |
toto_ft_precise_fixtrain |
precise | 0.3960 | 5 |
toto_ft_coarse_fixtrain |
coarse | 0.2425 | 3 |
Reproducing training from scratch
cd sft/tslm
uv sync
uv run python train.py --config configs/itformer_precise.yaml
Each run loads Chronos-2 frozen plus Qwen3.5-4B, injects LoRA (r=16, alpha=32) into
the Qwen decoder only, trains up to 5 epochs with early stopping (patience 3 on
validation loss), and evaluates the best checkpoint against the held-out gold shard.
Training data is timeseriesexamXL/datasets/anomalyxl-train/anomalyxl-{precise,coarse}/;
the gold test shard is timeseriesexamXL/datasets/anomalyxl-{precise,coarse}/data.parquet
(800 rows precise, 248 coarse, seed 42). The sft/tslm/ environment pins a
transformers build from git for Qwen3.5 support.
Known gaps
- The
_indfixruns in the source tree are evaluation-only re-runs against a corrected gold shard and produced no weights, so they are not represented here. - One Toto run in the source tree (
toto_ft_precise_fixtrain, non-_g1) never wrote an adapter directory; the_g1re-run is what ships astoto_ft_precise_fixtrain. - The Toto adapters carry no
summary.json; only per-epoch loss history survived.
Model tree for nz00shuuuu/TimeRLM-TSLM-Checkpoints
Base model
Datadog/Toto-Open-Base-1.0