Mini-LLM Assistant 70M

A ~70M parameter conversational assistant trained entirely from scratch with PyTorch โ€” no pretrained weights, no distillation. Tokenizer, pretraining and supervised fine-tuning all belong to the Mini-LLM project.

This repository hosts both the SFT assistant (repository root) and the base model it was fine-tuned from (base/).

Model details

Parameters 69,975,680 (input embedding shared with the output head)
Architecture Llama-style decoder: RMSNorm, RoPE, causal attention, SwiGLU
Context length 512 tokens
Vocabulary 16,384 (BPE)
Pretraining ~1.44B tokens (FineWeb-Edu + Wikipedia), 22,000 steps โ€” base val loss 3.030
Fine-tuning 2 epochs of SFT on Dolly-15k, No Robots, OpenAssistant oasst2, alpaca-cleaned and identity/small-talk examples โ€” val loss 2.718

Base model

The base/ subfolder contains the pretrained checkpoint (mini-llm-base-70M-22000steps.pt) before SFT: 69,975,680 parameters, 16,384-token BPE vocabulary, ~1.44B tokens (FineWeb-Edu + Wikipedia), 22,000 steps โ€” base val loss 3.030. It is a raw completion model, not an assistant: base/ ships without a chat template and without the assistant's sampling defaults.

from transformers import AutoModelForCausalLM, AutoTokenizer

repo = "GautierP/MiniLLM-70M"
tok = AutoTokenizer.from_pretrained(repo, subfolder="base", trust_remote_code=True)
model = AutoModelForCausalLM.from_pretrained(repo, subfolder="base", trust_remote_code=True)

inputs = tok("The capital of France is", return_tensors="pt")
out = model.generate(**inputs, max_new_tokens=64, do_sample=True, temperature=0.8, top_k=50)
print(tok.decode(out[0][inputs["input_ids"].shape[1]:], skip_special_tokens=True))

Usage

from transformers import AutoModelForCausalLM, AutoTokenizer

repo = "GautierP/MiniLLM-70M"
tok = AutoTokenizer.from_pretrained(repo, trust_remote_code=True)
model = AutoModelForCausalLM.from_pretrained(repo, trust_remote_code=True)

messages = [{"role": "user", "content": "What is the capital of France?"}]
inputs = tok.apply_chat_template(messages, add_generation_prompt=True, return_tensors="pt")
out = model.generate(inputs, max_new_tokens=128)
print(tok.decode(out[0][inputs.shape[1]:], skip_special_tokens=True))

trust_remote_code=True is required โ€” the architecture ships with the repository (modeling_mini_llm.py, configuration_mini_llm.py). Sampling defaults (temperature 0.5, top_k 40, repetition penalty 1.15) live in generation_config.json.

The training format is single-turn and fixed; chat_template.jinja implements it exactly:

User: <question>
Assistant: <answer>

Multi-turn history is never sent to the model: it anchors on its own previous answers and degrades when it sees them, so each question is answered independently.

Limitations

Very small model trained on a modest budget: answers are often fluent and in the right format, but factual errors and hallucinations are common. Do not use it for factual lookup or any production task. English only.

Links

Downloads last month
45
Safetensors
Model size
70M params
Tensor type
F32
ยท
Inference Providers NEW
This model isn't deployed by any Inference Provider. ๐Ÿ™‹ Ask for provider support

Collection including GautierP/MiniLLM-70M