| --- |
| license: apache-2.0 |
| language: |
| - en |
| tags: |
| - llama |
| - from-scratch |
| - legal |
| - finance |
| pipeline_tag: text-generation |
| --- |
| |
| # slm-125m-base |
|
|
| A **125M-parameter, Llama-style, decoder-only language model**, pretrained |
| **completely from scratch** (fresh weights, fresh 16K byte-level BPE |
| tokenizer) on a domain-specific corpus of US case law, SEC filings, and |
| general web text. |
|
|
| This is a **base completer, not a chat model** — give it a passage prefix and |
| it continues it. It has not been instruction-tuned, aligned, or fine-tuned for |
| any downstream task. |
|
|
| ## Architecture |
|
|
| | | | |
| |---|---| |
| | Parameters | ~125M | |
| | Layers | 12 | |
| | Hidden size | 768 | |
| | Attention heads | 12 (head dim 64), plain MHA | |
| | MLP | SwiGLU, inner 3072 | |
| | Normalization | RMSNorm, pre-norm | |
| | Position embeddings | RoPE | |
| | Context length | 1024 | |
| | Vocab | 16,384 (fresh byte-level BPE, no OOV token ever) | |
| | Embeddings | tied | |
|
|
| ## Training data |
|
|
| ~3.53B packed tokens across three sources, deduplicated (MinHash-LSH on the |
| legal corpus) and decontaminated against the LexGLUE/CaseHOLD held-out splits: |
|
|
| | Source | Tokens | Share | |
| |---|---|---| |
| | `HFforLegal/case-law` (US case law, `us` split) | ~1.1B | 31% | |
| | `PleIAs/SEC` (SEC filings) | ~2.0B | 57% | |
| | `HuggingFaceFW/fineweb-edu` (general web text) | ~1.0B | 28% | |
|
|
| (Shares don't sum to 100% due to rounding; case-law's split was capped at its |
| full-dataset ceiling, not a target percentage — see the build's `docs/01-data.md`.) |
|
|
| ## Training |
|
|
| AdamW (β 0.9/0.95, weight decay 0.1), linear warmup + cosine LR, bf16 |
| (autocast, fp32 master weights), single-node DDP across 8x H100. Trained to |
| step 7,500 (~4.1B tokens processed, more than one full epoch over the |
| training set) before the run was stopped. |
|
|
| ## Evaluation |
|
|
| **Held-out validation perplexity: 10.14** (full validation set, 34,513 |
| windows). This is the honest headline metric at this scale — not MMLU or |
| similar benchmarks, which are near-random for a 125M model. |
|
|
| Perplexity varies a lot by domain, reflecting the training mix: |
|
|
| | Domain | Perplexity | |
| |---|---| |
| | SEC filings | ~6.0 | |
| | Case law | ~15.3 | |
| | General web text (fineweb-edu) | ~27.4 | |
|
|
| The model is noticeably better at the two legal/financial domains it mostly |
| trained on than at general web text. |
|
|
| ## Usage |
|
|
| ```python |
| from transformers import AutoModelForCausalLM, AutoTokenizer |
| |
| tokenizer = AutoTokenizer.from_pretrained("mickey5k/slm-125m-base") |
| model = AutoModelForCausalLM.from_pretrained("mickey5k/slm-125m-base") |
| |
| prompt = "The court held that" |
| input_ids = tokenizer(prompt, return_tensors="pt").input_ids |
| output_ids = model.generate( |
| input_ids, |
| max_new_tokens=100, |
| min_new_tokens=20, # a base model can emit EOS almost immediately otherwise |
| do_sample=True, |
| temperature=0.8, |
| top_p=0.9, |
| top_k=50, |
| ) |
| print(tokenizer.decode(output_ids[0], skip_special_tokens=True)) |
| ``` |
|
|
| ## Limitations |
|
|
| - **Base completer, not instruction-tuned.** It continues text; it does not |
| follow instructions or answer questions in a chat format. |
| - **Domain-skewed.** Strongest on legal/financial register, weaker on general |
| text (see per-domain perplexity above). |
| - **Small.** 125M parameters is far below the scale where benchmark-style |
| reasoning emerges — evaluate it on perplexity/completion quality, not |
| accuracy benchmarks. |
| - **Training was cost-capped**, not run to convergence — see the build's |
| `docs/05-pretrain.md` for the full training log and the reasoning behind |
| stopping at step 7,500. |
|
|