一个纯C语言编写、零依赖的微型GPT项目,最近在Apple M5 Pro上跑出了惊人的10168430 tok/sec(约1000万token每秒)推理速度。这个名为microGPT的项目,整个实现只有一个C文件,不依赖任何第三方库,仅靠libc标准库就能完成GPT的训练和推理。
项目作者在GitHub上开源了全部代码,支持macOS、Linux和Windows(MSYS2)三大平台,并在ARM64架构上利用NEON指令集、在x86-64上利用AVX2指令集做了底层优化。Makefile会自动检测宿主机架构并选择对应的编译参数,用户只需要执行make run就能跑起来。
训练速度:2万步只需几秒
microGPT是一个字符级别的transformer模型,实现了前向传播、反向传播、Adam优化器和采样功能。在包含约3.2万个名字的数据集上,它只需要几秒钟就能完成训练。从训练日志可以看到,模型在20000步训练中,损失从2.6036逐步下降到2.2201左右,训练过程相当稳定。
更让人意外的是,这个微型模型展现出了真正的泛化能力,而不是死记硬背。模型参数量只有4192个,在32033个名字中取20000个进行训练后,在训练集上的表现是2.2054 nats/字符,而在从未见过的12033个名字上,得分反而更好,达到2.2039 nats/字符。
小参数大能量:比五倍参数模型还强
作为对比,一个经过插值处理的trigram模型,参数量几乎是microGPT的五倍,但在同样的测试条件下,表现却不如这个4192参数的小家伙。这说明microGPT学到的不只是简单的统计规律,而是真正捕捉到了名字数据中的深层结构。
项目在工程实现上也有不少巧思。训练和推理使用了分离的前向传播路径:gpt_forward会存储激活值用于反向传播,而gpt_forward_infer则是专门优化的单token推理路径,两者的logits输出在fp32精度范围内完全一致。项目文档中专门有一份docs/PERFORMANCE.md,详细解释了这条推理路径的工作原理和性能瓶颈所在。
推理性能:从名字生成看实际效果
从实际生成效果来看,模型在训练后能生成kayley、maria、arana、shayan、jayden等听起来相当自然的人名。虽然模型很小,但生成的名字已经具备了英文名字的基本音韵特征,没有出现明显的乱码或拼写错误。
这个项目最大的价值在于,它把GPT的核心机制压缩到了极致——一个文件、零依赖、几秒钟训练、千万级token吞吐。对于想深入理解transformer原理的开发者来说,这几乎是最小可用的学习样本;对于需要在资源受限环境跑推理的场景,这种极简实现也提供了另一种思路。
代码已经开源,支持直接在任何语料上训练,每行一个样本即可。想试试的同学,克隆仓库后直接make run就能复现全部结果。
热门跟贴