
nanochat 是 Andrej Karpathy 用纯 C 语言训练与推理 GPT-2 的“玩具级”教学项目,可在笔记本电脑上一分钟内完成文本生成,帮助开发者彻底理解大模型原理。
二、主要功能
-
训练:从 0 开始训练 124M 参数的 GPT-2,支持自定义语料与超参数。
-
推理:加载训练好的权重,逐 token 采样生成文本。
-
交互:提供简易 REPL,实时对话或续写。
-
可视化:打印每一步 logits、loss、梯度范数,方便调试。
-
零依赖:仅依赖标准 C 库,单文件即可编译运行。
三、技术原理
-
模型结构:完全复现 GPT-2 Small,12 层 Transformer,768 维隐藏状态,12 头自注意力。
-
训练算法:AdamW + 余弦退火,支持混合精度(fp16/fp32)与梯度裁剪。
-
数据流:使用 mmap 将语料一次性映射到内存,多线程分块并行编码。
-
推理优化:KV-Cache + 温度采样 + Top-k 截断,CPU 即可达 100 tok/s。
-
代码设计:单文件 nanochat.c 约 2k 行,所有矩阵运算手写循环,无第三方库,便于阅读与修改。
四、应用场景
-
教学演示:课堂或直播现场 10 分钟训练出会写诗的模型。
-
算法验证:快速验证新采样策略或位置编码改进。
-
嵌入式实验:在树莓派或 MCU 上跑通“最小 GPT”。
-
面试刷题:手写 C 版本 transformer 作为加分项。
-
黑客松:24 小时内训练专属角色语料,生成剧本或对话。
五、使用方法
-
获取代码:git clone https://github.com/karpathy/nanochat
-
准备语料:python preproc.py --input raw.txt --output train.bin
-
编译:gcc -O3 -o nanochat nanochat.c -lm -pthread
-
训练:./nanochat train --data train.bin --steps 1000 --lr 6e-4
-
推理:./nanochat chat --model model.bin --prompt “Once upon a time”
-
调参:直接改头文件中的 MAX_SEQ_LEN、N_LAYER 等宏,重新编译即可。
六、适用人群
-
想了解 transformer 底层细节的算法工程师。
-
教授深度学习课程的高校教师。
-
嵌入式 C 开发者寻求端侧 LLM 方案。
-
参加 Kaggle LLM 比赛需自建 baseline 的选手。
-
对“手写 CUDA 前向”感到畏惧、想先从 C 入门的初学者。
七、优缺点介绍
-
优点
-
代码极短,单文件即可通读,无黑盒。
-
训练+推理全流程公开,CPU 可跑,无需 GPU。
-
支持任意修改,方便植入新课注意力或旋转位置编码。
-
-
缺点
-
仅实现 GPT-2 124M,规模小,生成质量有限。
-
无分布式支持,大数据训练耗时。
-
缺少现代特征:RoPE、RMSNorm、GQA、FlashAttention 等。
-
C 语言手工矩阵乘,未调 SIMD/GPU,算力利用率低。
-
八、分类标签 教育工具、轻量级模型、C语言实现、Transformer教学、开源项目
清华大学自然语言处理实验室(THUNLP)和ModelBest联合开发的开源设备端GUI代理工具,能够操作中文和英文安卓应用,并通过强化微调提升推理能力,高效执行任务。