NanoEuler:纯C/CUDA从零实现的GPT-2级语言模型
NanoEuler是一个完全用C/CUDA从零构建的GPT-2级语言模型,不使用PyTorch或自动求导。项目包含手写的BPE分词器、前向/反向传播、在书籍和网络语料上的预训练以及监督微调(SFT)。支持CPU和GPU训练,GPU版本使用cuBLAS和FlashAttention。该模型是教育和研究性质的,展示了完整的训练流程。
NanoEuler 是一个 GPT-2 级别的语言模型,完全使用 C 和 CUDA 从零构建,不依赖 PyTorch、自动求导或任何机器学习库。项目的核心在于工程和教育价值,展示了完整的深度学习训练流程,包括手写的字节对编码(BPE)分词器、前向和反向传播、在书籍和网络语料上的预训练,以及监督微调(SFT)成对话模型。
该模型得名于欧拉(Euler),因为其残差块结构与欧拉前向积分方法形式相同:每个残差连接类似于一个微分方程的离散化步骤。项目包含两种配置:一个在 CPU 上运行的小型展示模型(约 1.05M 参数),以及一个在单个 RTX 4070 上训练的 GPU 模型(约 116M 参数)。GPU 模型使用手写的 CUDA 引擎,包括 cuBLAS 矩阵乘法和 FlashAttention,并通过全模型梯度检查(双精度有限差分)验证了反向传播的正确性。
NanoEuler 的架构是典型的解码器仅变换器,采用 RMSNorm(无偏置)、旋转位置编码(RoPE)、SwiGLU 前馈网络、分组查询注意力(GQA)和多令牌预测(MTP)。分词器是字节级 BPE,使用 GPT-2 风格的预分词,词汇表大小为 4096。
项目目前处于研究和教育阶段。训练出的模型虽然能生成流畅的英文,但缺乏真实世界知识,并非有用的助手。预训练数据来自古登堡计划的经典文学(如奥斯汀、狄更斯、托尔斯泰等)和 FineWeb-Edu 的高质量教育网络文本,SFT 使用 Alpaca 指令数据。项目的路线图包括下一步实现直接偏好优化(DPO)以及将模型规模扩展到约 270M 参数。
NanoEuler 采用 MIT 许可,所有代码和数据生成脚本均开源。该项目的意义在于提供了一个完全从头开始、可理解且可验证的语言模型训练实现,有助于深度学习教学和实验。