| --- |
| license: cc-by-sa-3.0 |
| language: en |
| tags: |
| - text-generation |
| - instruction-tuning |
| - from-scratch |
| - pytorch |
| datasets: |
| - databricks/databricks-dolly-15k |
| --- |
| |
| # SmoLLM-109M-instruct |
|
|
| A **109M-parameter, Llama-style language model built entirely from scratch** β custom BPE tokenizer, RoPE, RMSNorm, SwiGLU, and multi-head causal attention β pretrained on FineWeb-Edu and instruction-tuned on `databricks-dolly-15k`. |
|
|
| This is the **instruction-following** variant. For the raw base model, see [SmoLLM-109M-base](https://huggingface.co/rohit-upadhya/SmoLLM-109M-base). |
|
|
| ## Prompt template |
|
|
| This model uses a **custom chat template**. Format inputs exactly like this (note the trailing space after `[ASSISTANT]`): |
|
|
| ``` |
| [SYSTEM] You are a helpful bot [/SYSTEM] |
| [USER] your question here [/USER] |
| [ASSISTANT] |
| ``` |
|
|
| The model was trained to emit `[EOS]` at the end of each response, so it terminates on its own for focused questions. |
|
|
| ## Evaluation |
|
|
| | Metric | Value | |
| |---|---| |
| | Perplexity (WikiText-2 test) | 80.27 | |
| | Base model perplexity | 74.57 | |
| | Tokens evaluated | 290,889 | |
|
|
| Instruction-tuning shifts the model toward the chat format, so raw-text perplexity rises slightly (74.6 β 80.3). The small gap indicates base language ability was preserved β no catastrophic forgetting. |
|
|
| ## Usage |
|
|
| This is a **custom architecture**, not a `transformers` `AutoModel`. Clone the repo for the model code, then load the weights from this repo. |
|
|
| **1. Clone and set up** (uses [uv](https://github.com/astral-sh/uv)): |
|
|
| ```bash |
| git clone https://github.com/rohit-upadhya/smol-llm.git |
| cd smol-llm |
| uv sync |
| ``` |
|
|
| **2. Create `run.py` in the repo root:** |
|
|
| ```python |
| from huggingface_hub import hf_hub_download |
| from src.inference.inference import Inference |
| |
| repo = "rohit-upadhya/SmoLLM-109M-instruct" |
| weights = hf_hub_download(repo, "pytorch_model.bin") |
| tokenizer = hf_hub_download(repo, "tokenizer.json") |
| |
| inf = Inference(model_name_or_path=weights, tokenizer_path=tokenizer) |
| |
| prompt = ( |
| "[SYSTEM] You are a helpful bot [/SYSTEM]\n" |
| "[USER] What is machine learning? [/USER]\n" |
| "[ASSISTANT] " |
| ) |
| print(inf.generate(prompt, max_tokens=100, temperature=0.7, |
| top_k=50, top_p=0.95, repetition_penalty=1.2)) |
| ``` |
|
|
| **3. Run it:** |
|
|
| ```bash |
| uv run python run.py |
| ``` |
|
|
| `hf_hub_download` pulls the weights and tokenizer straight from this repo β no manual downloads needed. |
|
|
| ## Example outputs |
|
|
| **What is machine learning?** |
| > Machine Learning (ML) is the branch of computer science that focuses on building models and algorithms to perform tasks more efficiently, in order to create better services. |
|
|
| **Why is exercise important?** |
| > Exercise can help people who suffer from depression and anxiety. Exercise releases endorphins which may reduce symptoms of stress, depression, and anxiety. |
|
|
| **List three colors.** |
| > Red, Green and Blue |
|
|
| Real, unedited generations (temperature 0.8). The model is fluent and stops cleanly on focused questions β but at 109M parameters it will **confidently hallucinate facts** (inventing dates, people, or details). Treat it as a demonstration of small-model instruction-following, not a knowledge source. |
|
|
| ## Architecture |
|
|
| | | | |
| |---|---| |
| | Parameters | 109.5M | |
| | Layers | 12 | |
| | Hidden dim | 768 | |
| | Attention heads | 12 | |
| | Context length | 512 | |
| | Tokenizer | Custom BPE (~32k vocab) | |
| | Components | RoPE, RMSNorm, SwiGLU, multi-head causal attention | |
|
|
| ## Training |
|
|
| - **Base:** pretrained from scratch on FineWeb-Edu (`sample-10BT`), Chinchilla-optimal token budget (~20 tokens/param, ~2.2B tokens). |
| - **EOS continued-pretraining:** additional continued-pretraining to install end-of-sequence behavior at document boundaries (the base model originally never learned to stop). |
| - **Instruction tuning:** SFT on `databricks-dolly-15k` with prompt-token masking (loss computed only on response tokens) and `[EOS]`-terminated responses. LR 2e-5, cosine schedule, best checkpoint selected at epoch 2 by held-out eval loss (before overfitting onset). |
|
|
| ## Recommended decoding |
|
|
| ```python |
| generate(prompt, max_tokens=100, temperature=0.7, |
| top_k=50, top_p=0.95, repetition_penalty=1.2) |
| ``` |
|
|
| ## Limitations |
|
|
| - **109M parameters** β fluent but factually unreliable. Strong at short, focused generation; weak on facts, multi-step reasoning, and summarization. |
| - **In-context induction is weak** β relies on frequency-based memorization rather than in-context pattern learning. |
| - **Open-ended prompts ramble** β vague prompts give no natural stopping point, so termination is less reliable than for focused questions. |
| - Built as an **educational / research artifact** to understand LLM mechanics from the ground up, not for production use. |
|
|
| ## Links |
|
|
| - Author: Rohit Upadhya |
| - GitHub: https://github.com/rohit-upadhya/smol-llm |