File size: 7,525 Bytes
6470e71 e51178b 6470e71 3bc8b78 6470e71 ed74514 6470e71 3bc8b78 6470e71 | 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 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 | ---
license: mit
library_name: pytorch
tags:
- log-analysis
- anomaly-detection
- security
- transformer
- gpt
- language-model
- from-scratch
pipeline_tag: text-generation
---
# LogSentry-LM
A small, from-scratch **GPT-style language model** trained on real server logs to
(1) autoregressively complete log lines and (2) **detect anomalous log lines** by
how "surprised" the model is by them (perplexity-based scoring).
It is a compact, educational decoder-only Transformer (~2M parameters) built with
plain PyTorch β no `transformers` modeling class β intended for learning and for
lightweight log anomaly detection.
> π **Try the live demo:** https://log-sentry-lm.streamlit.app/ β paste log lines
> and see them scored in real time.
## Model details
- **Architecture:** decoder-only Transformer (GPT-style), causal self-attention,
pre-norm residual blocks, learned token + positional embeddings.
- **Size:** `d_model=128`, `n_heads=4`, `n_layers=3`, `max_seq_len=128` (~2.03M params).
- **Tokenizer:** Byte-Pair Encoding (`tokenizers`), vocab β 5.5k.
- **Training data:** combined **Loghub** samples β Linux + Apache + OpenSSH
(`*_2k.log`, ~6k lines total).
- **Objective:** next-token prediction (cross-entropy).
- **Framework:** PyTorch (trained on Apple Silicon MPS).
## Files in this repo
| File | Purpose |
| --- | --- |
| `logsentry_lm.pt` | Trained weights + anomaly threshold + config |
| `log_tokenizer.json` | BPE tokenizer |
| `architecture.py` | Transformer building blocks |
| `dataset.py` | Tokenizer loader + dataset |
| `train_and_generate.py` | Model class, training, generation, anomaly scoring |
| `detect_anomalies.py` | Standalone anomaly predictor |
## Usage
> β οΈ This is a **custom architecture**, so `AutoModel.from_pretrained` does **not**
> work. Download the files and load manually:
```python
from huggingface_hub import hf_hub_download
import torch
from train_and_generate import LogSentryLM, score_line
from dataset import build_or_load_tokenizer
repo = "sankath/LogSentry-LM"
ckpt_path = hf_hub_download(repo, "logsentry_lm.pt")
tok_path = hf_hub_download(repo, "log_tokenizer.json")
ckpt = torch.load(ckpt_path, map_location="cpu")
model = LogSentryLM(vocab_size=ckpt["vocab_size"], max_seq_len=ckpt["max_seq_len"])
model.load_state_dict(ckpt["model_state"]); model.eval()
tokenizer = build_or_load_tokenizer(None, tok_path) # loads the cached tokenizer
loss, ppl = score_line(model, tokenizer, "Failed password for root from 1.2.3.4 port 22 ssh2", "cpu")
print("anomaly" if loss > ckpt["threshold"] else "normal", f"(perplexity={ppl:.1f})")
```
## How anomaly detection works
The model learns what *normal* logs look like. A line it cannot predict scores a
high per-token loss (high perplexity) and is flagged as anomalous. The cutoff is
`threshold = mean + 2Β·std` of the training corpus line scores, stored in the
checkpoint. Reference behavior:
| Input | Perplexity | Verdict |
| --- | --- | --- |
| Normal Apache `[notice]` line | ~2 | normal |
| Real SSH login attempt | ~12β16 | borderline |
| Random gibberish / injected text | >100,000 | anomaly |
## Applications & use cases
Because the model learns the "grammar" of normal system logs, it can support a
range of log-analytics and security tasks:
- **Security monitoring / intrusion detection** β flag suspicious log lines
(brute-force SSH attempts, injected commands, malformed requests) that don't
match learned normal patterns. This is the core "sentry" use case.
- **Operational anomaly detection (AIOps)** β surface rare error conditions,
misconfigurations, or failing components before they escalate, by ranking log
lines by how "surprising" they are.
- **Log triage & noise reduction** β instead of reading thousands of lines,
engineers review only the top-scoring (most unusual) ones.
- **Log autocompletion / templating** β suggest or complete log-line formats given
a prefix (useful in tooling and for synthetic log generation for testing).
- **Data-quality / format validation** β detect corrupted, truncated, or
non-conforming log entries in an ingestion pipeline.
- **Education** β a compact, readable reference for how a GPT-style Transformer,
tokenizer, and perplexity-based anomaly scoring work end to end.
### How it can be used
- **Batch scan a log file** β score every line and export the anomalies:
`python detect_anomalies.py --file /var/log/auth.log`
- **Score individual lines** programmatically via `score_line(...)` and compare
against the saved `threshold` (see the usage snippet above).
- **Stream integration** β call the scorer inside a log shipper (Fluent Bit /
Logstash / a Kafka consumer) to tag or route high-perplexity lines in near real
time.
- **Alerting** β wire flagged lines into Slack/email/PagerDuty or a SIEM
(Splunk, Elastic) as an enrichment signal.
- **Retrain on your own logs** β point `LOG_FILE` at your data and run
`train_and_generate.py` to specialize the model to your environment.
## Future scope
Natural next steps to make this research prototype more capable and production-ready:
- **Per-source models & thresholds** β separate models for SSH, Apache, kernel,
etc., removing the single-global-threshold weakness.
- **Session / sequence-level modeling** β detect anomalous *sequences* of events
(e.g. login β privilege escalation β data access), not just single lines.
- **Larger context & scale** β bigger `d_model`, more layers, longer
`max_seq_len`, and training on full Loghub datasets (millions of lines).
- **Template-aware tokenization** β parse logs into templates + variables (Γ la
Drain) so IPs/IDs don't inflate the vocabulary or the anomaly score.
- **Calibrated scoring** β convert raw perplexity into probabilities/severity
levels, with per-line-position attribution ("which token was surprising?").
- **Real-time serving** β expose the scorer as a REST/gRPC service or a Hugging
Face **Space** (Gradio demo) for interactive use.
- **`transformers` integration** β wrap as a `PreTrainedModel` so it loads via
`AutoModel.from_pretrained` and plugs into the standard ecosystem.
- **Evaluation & benchmarking** β measure precision/recall on labeled anomaly
datasets (e.g. BGL, HDFS) against baselines like DeepLog and LogBERT.
- **Explainability & feedback loop** β let analysts confirm/dismiss flags to
continuously refine the threshold and reduce false positives.
## Limitations
- Trained on a **small, mixed** corpus (three log sources). A single global
threshold is imperfect across sources; per-source models/thresholds work better.
- Not production hardened β intended for education and experimentation.
- Small context window (128 tokens) and small vocab; it models line-level, not
session-level, structure.
## Attribution & licensing
- Training data derived from the **[Loghub](https://github.com/logpai/loghub)**
collection (Linux, Apache, OpenSSH samples). Please cite Loghub and consult its
terms for any redistribution of the underlying logs.
- Model code released under the MIT license.
```bibtex
@inproceedings{zhu2023loghub,
title = {Loghub: A Large Collection of System Log
Datasets for AI-driven Log Analytics},
author = {Zhu, Jieming and He, Shilin and He, Pinjia and
Liu, Jinyang and Lyu, Michael R.},
booktitle = {IEEE International Symposium on Software
Reliability Engineering (ISSRE)},
year = {2023}
}
```
|