20分钟内能否从零基础训练出‘有手就行’的大模型?

摘要:一、说在前面 训练基座大模型那都是大公司们的事情,普通人、普通公司肯定是玩不起的,但是作为一个技术人,你可以不去做真正的大模型训练,但是你还是有必要知道和了解一下一个大模型是如何训练出来的。 而GPT_teacher-3.37M-cn 是一
一、说在前面 训练基座大模型那都是大公司们的事情,普通人、普通公司肯定是玩不起的,但是作为一个技术人,你可以不去做真正的大模型训练,但是你还是有必要知道和了解一下一个大模型是如何训练出来的。 而GPT_teacher-3.37M-cn 是一个很好的示例项目,让你可以用一台普通的PC,用CPU来训练一个3.37M的中文GPT模型,整个训练耗时不到20分钟,回答训练集里的问题的效果也还是挺不错的。感兴趣的同学可以用这个项目来练手、实操复现一下“自己动手从0开始训练一个大模型”的完整流程。 二、项目概述 一个轻量级中文GPT模型项目,专为在CPU上快速训练和演示而设计: 模型参数量:3.37M 架构:4层Transformer解码器 特点:使用RMSNorm、RoPE位置编码、权重共享等优化技术 目标:45分钟内在普通CPU上训练出可用的中文问答模型 参考训练时长: 我的笔记本:CPU: i7-8850H CPU @ 2.60GHz+16G内存,整个训练花了1419.35秒,约需要23.65分钟。 一台Mac Pro(2.6GHz 6核 i7, 16GB内存),整个训练1186.8秒,约需要19.78分钟。 三、完整复现流程 介绍完了,就让我们来实操整个从0到1的训练吧。 先下载代码: git clone https://gitee.com/baidumap/GPT_teacher-3.37M-cn 1. 环境准备 # 进入项目目录 cd g:\oddmeta\oddllm\GPT_teacher-3.37M-cn # 安装依赖 python -m pip install -r requirements.txt 依赖项包括: pip>=21.0 # 确保依赖解析能力,避免安装失败 torch>=2.2,<2.5 # 锁定 2.x 稳定区间,2.5+ 已完善 NumPy 2.x 支持,但暂不冒险 PyYAML>=6.0,<7.0 # 限制在 6.x 稳定系列,避开未来 7.x 大版本变更 numpy>=1.24,<2.0 # 核心修复:满足原版本要求,同时彻底避开 NumPy 2.x 兼容问题 tokenizers>=0.15,<0.25 # 锁定 0.15-0.24 稳定区间(Hugging Face 官方推荐) sentencepiece>=0.1.99,<0.2.0 # 限制在 0.1.x 系列,避免 0.2.x 重构版本风险 2. 构建中文分词器 python -m src.build_tokenizer 这将: 使用BPE(字节对编码)算法训练分词器 设置ByteLevel解码器确保中文输出正常 保存到tokenizer/tokenizer.json 3. 配置文件确认 config.yaml包含了所有必要配置,我在这里给每个参数加了个说明,以便于理解每个参数的意义。 model: n_layer: 4 # 模型的Transformer层数,决定了模型的深度。这个小模型使用4层,平衡了参数量和性能。 n_head: 4 # 注意力头的数量,每个头可以学习不同的语义表示。4个注意力头适合小参数量模型。每个头的维度为64(256/4)。 n_embd: 256 # 嵌入向量的维数,决定输入的维度。这个小模型使用256维的嵌入向量。 seq_len: 128 # 序列最大长度,模型能处理的最大token数量。设为128是为了在CPU上高效训练。 dropout: 0.0 # 丢弃率,用于防止过拟合。决定模型训练时是否进行dropout。这个小模型不使用dropout。 training: batch_size: 16 # 批次大小,决定每次训练的样本数量。这个小模型使用16个样本进行训练。 micro_batch: 4 # 实际每次前向传播的批次大小,用于梯度累积。微批次大小,每个批次进一步分为4个微批次进行训练。这个小模型使用4个微批次。 lr: 0.0003 # 学习率,决定模型训练时参数的更新速度。这个小模型使用0.0003的学习率。 weight_decay: 0.01 # 权重衰减,一种正则化方法,防止模型过拟合。权重衰减决定模型训练时参数的更新大小。这个小模型使用0.01的权重衰减。 max_steps: 2000 # 最大训练步数,决定模型训练的轮数。这个小模型使用2000个训练步数。
阅读全文