Self-supervised anomaly detection model for power plant predictive maintenance.
Detects sensor anomalies and predicts equipment failures across thermal units, wind turbines, solar panels, batteries, and EMS/SCADA systems — all from a single model.
Architecture
A 5.2M parameter Transformer built on state-of-the-art time series anomaly detection research:
This model is pre-trained via self-supervised learning. For best results on your specific plant:
python
1from torch.optim import AdamW
23# 1. Collect 1-2 weeks of NORMAL operating data4# 2. Format as windows: [num_windows, n_channels, 512]5# 3. Fine-tune (the model learns YOUR plant's normal patterns):67optimizer = AdamW(model.parameters(), lr=1e-5, weight_decay=0.01)89model.train()10for epoch inrange(10):11for batch in your_dataloader:12 result = model(13 batch['data'],# [B, channels, 512]14 batch['asset_type'],# [B] integer 0-415 training=True16)17 loss = result['loss']18 loss.backward()19 optimizer.step()20 optimizer.zero_grad()21print(f"Epoch {epoch+1}: loss={loss.item():.4f}")2223# Save fine-tuned model24torch.save({'msd': model.state_dict(),'C': config},'model_finetuned.pt')
Data Preparation Tips
Sampling rate: Match your SCADA historian (typically 1-10 second intervals)
Window size: 512 timesteps = ~8.5 minutes at 1s sampling, ~85 minutes at 10s
Channel ordering: Keep consistent channel ordering across windows
Padding: If you have fewer sensors than the model's max (64), pad with zeros
Normal data only: For fine-tuning, use ONLY data from normal operating periods
Architecture Details
Parameter
Value
Total parameters
5,162,433
Context length
512 timesteps
Patch length
16
Patch stride
8
Number of patches
63
Transformer dimension
256
Attention heads
8
Encoder layers
6
FFN dimension
1024
Max channels
64
Asset types
5 (thermal, wind, solar, battery, SCADA)
Integration with Existing Systems
SCADA/EMS Integration
python
1# Real-time scoring loop2import time
34whileTrue:5# Read latest 512 samples from SCADA historian6 data = read_scada_historian(n_samples=512, channels=sensor_list)78# Convert to tensor9 x = torch.tensor(data, dtype=torch.float32).unsqueeze(0)10 at = torch.tensor([asset_type_id])1112# Score13 scores = model.get_anomaly_scores(x, at)14 max_score = scores['combined_score'].max().item()1516# Alert if threshold exceeded17if max_score >0.7:18 send_alarm(f"Anomaly detected! Score: {max_score:.2f}")1920 time.sleep(60)# Check every minute
With Chronos for Forecasting + Anomaly Detection
For a complementary approach using forecasting-based anomaly detection:
python
1# pip install chronos-forecasting2from chronos import BaseChronosPipeline
34# Use Chronos for forecasting, this model for pattern anomalies5chronos = BaseChronosPipeline.from_pretrained("amazon/chronos-bolt-base")67# Forecast next values8forecast = chronos.predict(sensor_series[-512:], prediction_length=48)9p10, p50, p90 = forecast[0,0], forecast[0,1], forecast[0,2]1011# Anomaly = actual outside prediction interval OR this model flags anomaly12chronos_anomaly =(actual > p90.numpy())|(actual < p10.numpy())13transformer_anomaly = model_scores >0.61415# Combined detection: either method flags it16is_anomaly = chronos_anomaly | transformer_anomaly
Research Background
This model synthesizes insights from the following papers:
AnomalyBERT (Jungmin Ryu et al., 2023) — Self-supervised Transformer for time series anomaly detection using data degradation. F1=0.854 on SWaT industrial benchmark.
PatchTST (Yuqi Nie et al., ICLR 2023) — Patch-based Transformer for time series. Channel-independent processing with RevIN normalization enables handling variable sensor counts.
TimeRCD (THU-SAIL, 2025) — Zero-shot foundation model for anomaly detection. Dual-head (reconstruction + anomaly scoring) architecture improves anomaly-normal separation.
MOMENT (CMU AutonLab, ICML 2024) — Time series foundation model. Demonstrated that pre-training on diverse time series transfers well to industrial anomaly detection.
THEMIS (2024) — Uses Chronos encoder embeddings for zero-shot anomaly detection via spectral scoring. F1=78.8% on NASA MSL without any training.