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 _indfix runs 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 _g1 re-run is what ships as toto_ft_precise_fixtrain.
  • The Toto adapters carry no summary.json; only per-epoch loss history survived.
Downloads last month

-

Downloads are not tracked for this model. How to track
Inference Providers NEW
This model isn't deployed by any Inference Provider. πŸ™‹ Ask for provider support

Model tree for nz00shuuuu/TimeRLM-TSLM-Checkpoints

Adapter
(1)
this model