TinyTalk 2

A 8M-parameter chatbot that runs fully offline on an ESP32-S3 microcontroller (M5Stack Cardputer, 512 KB SRAM, no PSRAM) at ~5 tokens/s — and, of course, on anything bigger. The successor to TinyTalk.

What it's for

Small talk with multi-turn memory, TinyStories-style story writing, simple kindergarten Q&A (colors, animal sounds, opposites, baby animals), and — new in TinyTalk 2 — graceful ignorance: questions beyond a tiny model get a friendly "I don't know" instead of confabulation.

It was built as the brain of the cardputer-ai firmware, where it runs Q4_0-quantized with an int4 KV cache and a hand-written ESP32-S3 PIE SIMD kernel.

What's new vs TinyTalk 1

TinyTalk 1 (3M) TinyTalk 2 (8M)
Base model TinyStories-Instruct-3M TinyStories-Instruct-8M
Held-out masked val loss 1.838 1.486
Kindergarten facts answered (8-prompt battery) 1/8 7/8
"I don't know" on impossible questions 6/8 7/8
Training dialogues ~70K (SODA prefix filter, 47% yield) ~124K (SODA window filter 85% yield + DailyDialog)
Extra skills templated kindergarten QA + SciQ-question deflection pairs

What it is technically

GPT-Neo architecture: 8 layers, hidden size 256, 16 heads, alternating global/local attention (window 256), GPT-2 byte-level BPE, tied embeddings. Fine-tuned for 2 epochs (~47M chars) with masked loss — loss only on bot replies, story bodies and EOS, so it learns to answer and to stop, never to imitate users.

Prompt format

User: <message>
Bot: <reply><|endoftext|>
User: <message>
Bot:

Story mode: Summary: <what the story is about>\nStory:

A chat_template is embedded, so tokenizer.apply_chat_template() produces this format automatically.

Usage

from transformers import GPTNeoForCausalLM, GPT2TokenizerFast

model = GPTNeoForCausalLM.from_pretrained("TheREZOR/TinyTalk-2")
tok = GPT2TokenizerFast.from_pretrained("TheREZOR/TinyTalk-2")

msgs = [{"role": "user", "content": "what sound does a dog make?"}]
ids = tok(tok.apply_chat_template(msgs, tokenize=False), return_tensors="pt").input_ids
out = model.generate(ids, max_new_tokens=40, do_sample=True,
                     temperature=0.8, top_p=0.9,
                     eos_token_id=tok.eos_token_id,
                     pad_token_id=tok.eos_token_id)
print(tok.decode(out[0][ids.shape[1]:], skip_special_tokens=True))
# " A dog says woof!"

GGUF builds for llama.cpp / Ollama are at TheREZOR/TinyTalk-2-GGUF:

ollama run hf.co/TheREZOR/TinyTalk-2-GGUF

Honest limitations

This is a toy/educational model. Kindergarten English; no world knowledge beyond ~150 hand-written nursery facts; context trained to 256 tokens; anything outside its lane gets a (trained) polite deflection — usually. Do not use it for anything that matters.

License & attribution

CC BY-NC-SA 4.0 (non-commercial). TinyTalk 1 was CC BY 4.0; TinyTalk 2 additionally trains on DailyDialog (CC BY-NC-SA 4.0) and question texts from SciQ (CC BY-NC 3.0), so the most restrictive license is inherited.

Downloads last month
444
Safetensors
Model size
19.7M params
Tensor type
F32
·
Inference Providers NEW
This model isn't deployed by any Inference Provider. 🙋 Ask for provider support

Model tree for TheREZOR/TinyTalk-2

Finetuned
(1)
this model
Quantizations
1 model

Datasets used to train TheREZOR/TinyTalk-2

Papers for TheREZOR/TinyTalk-2