TinyTalk — human-like small talk on a microcontroller
2
1 commits
2 linked in READMEs
updated Jun 13, 2026
TinyTalk is a ~8.3M-parameter (≈1.6M non-embedding) GPT-Neo chatbot built to do one thing: hold short, friendly, human-sounding small-talk conversations on low-end hardware that can't run a normal LLM — think an ESP32-S3.
It is the model embedded in the Cardputer AI
firmware, where it runs fully offline on the device in ~2 MB of flash after
Q4_0 quantization. This repository hosts the full-precision PyTorch /
safetensors weights so the model can be used, fine-tuned, or re-quantized on
its own.
Most chat models assume a datacenter GPU. TinyTalk asks the opposite question: how small can a model be and still feel like talking to someone? It trades away knowledge, reasoning, and long context to fit on a microcontroller, keeping only the ability to make warm, coherent small talk:
User: hey, how are you?
Bot: I am good! I played outside today. It was so much fun!
User: nice! what did you play?
Bot: I played with my ball. Do you want to play too?
Good fits: an offline conversational toy or companion on an ESP32 / handheld; a teaching example of an end-to-end on-device LLM; a tiny base to fine-tune for embedded chat. Not a fit: anything needing facts, instructions, reasoning, or safety guarantees.
GPTNeoForCausalLM) — 8 layers, hidden size 128,
16 heads, alternating global/local attention (window 256), learned position
embeddings, tied input/output embeddings, GPT-2 byte-level BPE tokenizer
(vocab 50257).roneneldan/TinyStories-Instruct-3M.allenai/SODA, reformatted as
User:/Bot: turns, mixed with a slice of
TinyStoriesInstruct.
Loss is masked to the bot replies / story bodies, so the model never trains on
producing the user's turns.Trained on this exact format, with <|endoftext|> (token 50256) between
exchanges:
User: <message>
Bot: <reply><|endoftext|>
User: <message>
Bot:
Feed User: <message>\nBot: and generate until <|endoftext|>.
from transformers import AutoModelForCausalLM, AutoTokenizer
tok = AutoTokenizer.from_pretrained("TheREZOR/TinyTalk")
model = AutoModelForCausalLM.from_pretrained("TheREZOR/TinyTalk")
prompt = "User: hi, what's your name?\nBot:"
ids = tok(prompt, return_tensors="pt").input_ids
out = model.generate(
ids, max_new_tokens=40, do_sample=True, temperature=0.7, top_k=40,
eos_token_id=tok.eos_token_id,
)
print(tok.decode(out[0, ids.shape[1]:], skip_special_tokens=True))
Released under CC BY 4.0, the binding term inherited from the SODA training data. You must retain the following attributions:
See NOTICE.md for the full provenance.
1 commits
TinyTalk — human-like small talk on a microcontroller
2
1 commits
2 linked in READMEs
updated Jun 13, 2026
TinyTalk is a ~8.3M-parameter (≈1.6M non-embedding) GPT-Neo chatbot built to do one thing: hold short, friendly, human-sounding small-talk conversations on low-end hardware that can't run a normal LLM — think an ESP32-S3.
It is the model embedded in the Cardputer AI
firmware, where it runs fully offline on the device in ~2 MB of flash after
Q4_0 quantization. This repository hosts the full-precision PyTorch /
safetensors weights so the model can be used, fine-tuned, or re-quantized on
its own.
Most chat models assume a datacenter GPU. TinyTalk asks the opposite question: how small can a model be and still feel like talking to someone? It trades away knowledge, reasoning, and long context to fit on a microcontroller, keeping only the ability to make warm, coherent small talk:
User: hey, how are you?
Bot: I am good! I played outside today. It was so much fun!
User: nice! what did you play?
Bot: I played with my ball. Do you want to play too?
Good fits: an offline conversational toy or companion on an ESP32 / handheld; a teaching example of an end-to-end on-device LLM; a tiny base to fine-tune for embedded chat. Not a fit: anything needing facts, instructions, reasoning, or safety guarantees.
GPTNeoForCausalLM) — 8 layers, hidden size 128,
16 heads, alternating global/local attention (window 256), learned position
embeddings, tied input/output embeddings, GPT-2 byte-level BPE tokenizer
(vocab 50257).roneneldan/TinyStories-Instruct-3M.allenai/SODA, reformatted as
User:/Bot: turns, mixed with a slice of
TinyStoriesInstruct.
Loss is masked to the bot replies / story bodies, so the model never trains on
producing the user's turns.Trained on this exact format, with <|endoftext|> (token 50256) between
exchanges:
User: <message>
Bot: <reply><|endoftext|>
User: <message>
Bot:
Feed User: <message>\nBot: and generate until <|endoftext|>.
from transformers import AutoModelForCausalLM, AutoTokenizer
tok = AutoTokenizer.from_pretrained("TheREZOR/TinyTalk")
model = AutoModelForCausalLM.from_pretrained("TheREZOR/TinyTalk")
prompt = "User: hi, what's your name?\nBot:"
ids = tok(prompt, return_tensors="pt").input_ids
out = model.generate(
ids, max_new_tokens=40, do_sample=True, temperature=0.7, top_k=40,
eos_token_id=tok.eos_token_id,
)
print(tok.decode(out[0, ids.shape[1]:], skip_special_tokens=True))
Released under CC BY 4.0, the binding term inherited from the SODA training data. You must retain the following attributions:
See NOTICE.md for the full provenance.
1 commits