开源项目用可运行的极小 LLM 实现从零演示 transformer、token、forward pass 等 LLM 核心概念,是学习大模型原理的最佳教学资源。
一个约 9M 参数的 LLM,说话像条小鱼。
这个项目的目的是证明训练自己的语言模型并不是魔法。不需要博士学位。不需要巨大的 GPU 集群。一个 Colab 笔记本,5 分钟,你就拥有一个从零开始构建的工作 LLM——数据生成、分词器、模型架构、训练循环和推理。如果你能运行一个笔记本,你就能训练一个语言模型。
它不会产生一个能写论文的十亿参数模型。但它会向你展示每一部分是如何工作的——从原始文本到训练权重到生成输出——这样那些大模型就不再显得像黑盒子了。
You> hi guppy
Guppy> hi there. i just found a nice spot near the rock. the temperature feels nice.
You> are you hungry
Guppy> yes. always yes. i will swim to the top right now. i promise to eat all of it.
You> do you like bubbles
Guppy> i love bubbles. they make the water feel slightly different.
You> what is the meaning of life
Guppy> food. the answer is always food.
You> tell me a joke
Guppy> what did the fish say when it hit the wall. dam.
You> do you love me
Guppy> you're my favorite big shape. my mouth are happy when you're here.
You> goodnight guppy
Guppy> ok sleep time. i was following a bubble but now i'll stop. goodnight tank. goodnight water.
GuppyLM 是一个微小的语言模型,假装是一条名叫 Guppy 的鱼。它用简短、小写的句子说话,内容是关于水、食物、光和水族箱生活。它不理解人类的抽象概念,比如钱、电话或政治——也没想过。
它从零开始在 60 个主题的 60K 合成对话上进行训练,在单个 GPU 上运行约 5 分钟,并产生一个足够小的模型,可以在浏览器中运行。
普通的 Transformer。没有 GQA、没有 RoPE、没有 SwiGLU、没有提前退出。尽可能简单。
60 个主题:问候、感受、温度、食物、光、水、水族箱、噪音、夜晚、孤独、气泡、玻璃、反射、呼吸、游泳、颜色、味道、植物、过滤器、藻类、蜗牛、害怕、兴奋、无聊、好奇、快乐、疲倦、户外、猫、雨、季节、音乐、访客、小孩、人生的意义、时间、记忆、梦想、大小、未来、过去、名字、天气、睡眠、朋友、笑话、恐惧、爱、年龄、智力、健康、唱歌、电视等。
完全在浏览器中通过 WebAssembly 运行。下载一个量化的 ONNX 模型(约 10 MB)并在本地运行推理——没有服务器,没有 API 密钥。
从 HuggingFace 下载预训练模型,让你聊天。只需运行所有单元格。
将运行时设置为 T4 GPU
运行所有单元格——下载数据集、训练分词器、训练模型、测试它
上传到 HuggingFace 或本地下载
pip install torch tokenizers
python -m guppylm chat
You> the cat is looking at you
Guppy> i hide behind the plant when the furry one comes.
You> it is raining outside
Guppy> i think rain is the best thing about outside.
在交互式聊天模式中,对话会增长,很快就会遇到 128 个令牌的限制,降低质量。你也可以用单个提示调用聊天,并在响应后退出:
python -m guppylm chat --prompt "tell me a joke"
HuggingFace 上的 arman-bd/guppylm-60k-generic。
from datasets import load_dataset
ds = load_dataset("arman-bd/guppylm-60k-generic")
print(ds["train"][0])
# {'input': 'hi guppy', 'output': 'hello. the water is nice today.', 'category': 'greeting'}
guppylm/
├── config.py Hyperparameters (model + training)
├── model.py Vanilla transformer
├── dataset.py Data loading + batching
├── train.py Training loop (cosine LR, AMP)
├── generate_data.py Conversation data generator (60 topics)
├── eval_cases.py Held-out test cases
├── prepare_data.py Data prep + tokenizer training
└── inference.py Chat interface
tools/
├── make_colab.py Generates Colab notebooks
├── export_onnx.py Export model to ONNX (quantized uint8)
├── export_dataset.py Push dataset to HuggingFace
└── dataset_card.md HuggingFace dataset README
docs/
├── index.html Browser demo (ONNX + WASM)
├── download.sh Download model.onnx + tokenizer from HF
├── model.onnx Quantized uint8 (~10 MB)
├── tokenizer.json BPE tokenizer
└── guppy.png Logo (transparent)
每个训练样本都有相同的 system prompt。一个 9M 参数的模型无法条件性地遵循指令——个性被烤进权重里。移除它可以节省约 60 个令牌的推理。
多轮会在第 3-4 轮时因 128 个令牌的上下文窗口而降质。一条会遗忘的鱼符合设定,但乱码输出不符合。单轮是可靠的。
GQA、SwiGLU、RoPE 和提前退出增加了在 9M 参数规模下不会有帮助的复杂性。标准注意力 + ReLU FFN + LayerNorm 以更简洁的代码产生相同的质量。
一条具有一致个性的鱼角色需要一致的训练数据。模板组合配合随机化的组件(30 个水族箱对象、17 种食物类型、25 个活动)从约 60 个模板生成约 16K 个唯一输出。