ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

从零训练微型语言模型:minimind单卡跑通全流程实践

从零训练微型语言模型:minimind单卡跑通全流程实践

老读者都清楚,我一直主张一个观点——想真正弄懂大语言模型,与其天天看论文刷视频,不如亲手训一个能吐字的模型来得实在。minimind 这个项目,就是照着这个思路做的一个微型语言模型,主打“从零起步、一人一卡、一天跑通”。项目的起点是从租用服务器开始,把算力这件事先解决掉,再一步步把数据、模型、训练、推理串起来。这篇文章就把整条路上的细节摊开讲,适合三类人看:一是想入门 LLM 但手里没 GPU 的学生和开发者,二是要做小规模验证、证明某个想法可行的工程师,三是对自建模型有好奇、想亲手跑一遍完整流程的爱好者。

minimind 不是什么大工程,它的定位就是"小但完整"。用一个可以在单张消费级显卡上跑起来的参数量,去完成一个语言模型的全部生命周期:数据清洗、分词、预训练、生成推理。整个过程不需要多个节点做分布式训练,不需要调优集群,也不需要深厚的系统功底,只要你能跟着敲命令、看日志,就能把它跑通。下面我从项目设计开始讲,把为什么要这么做、每一步怎么选型、怎么落地,都尽量交代清楚。

1. 项目整体设计与思路拆解

1.1 minimind 到底要做什么

简单说,minimind 是一个以 GPT 架构为基础的微型语言模型项目。它具备语言模型的基本能力——给定一段文字,预测下一个 token,从而逐渐学会“续写”和“生成”。参数规模控制在千万级上下,也就是 20M 到 50M 不等,具体视显卡显存和训练数据量来定。

这个体量听起来不大,但要注意,千万级参数已经足够让模型学到很多语言规律。以中文为例,用一个几十 MB 的纯文本语料训练一个 20M 参数模型,它就能学会基本的用词习惯、句子衔接甚至部分常识。如果数据质量高,模型还能模仿特定文本风格,比如写诗、写摘要、模拟对话。minimind 的目标不是做一个能打的产品,而是做一个能让你亲眼看到“从随机噪声到有意义文字”的完整过程。

我把这个项目拆成四个核心阶段:基础设施准备、数据处理、模型训练、推理验证。每一个阶段都有对应的产出物和验证方式。比如基础设施阶段验证“GPU 是否可用”,数据处理阶段验证“token 序列是否合理”,训练阶段验证“loss 是否下降”,推理阶段验证“生成文本是否有可读性”。这样每个环节都有明确的可检查点,不会卡在某个黑盒里不知道怎么排查。

1.2 为什么从服务器租用开始

很多人在本地机器上做深度学习,第一道坎就是硬件。Windows 笔记本、MacBook Air、集成显卡这类设备,跑 CV 小模型可能勉强凑合,但跑语言模型几乎是寸步难行。语言模型的训练依赖矩阵乘法和大量显存,集成显卡根本承载不了,哪怕模型只有 20M 参数,训练时涉及中间激活值、梯度、优化器状态,内存需求会迅速膨胀。

合理的选择就是租一台远端 GPU 服务器。租用服务器的好处其实很直接:按需付费、配置可调、用完即释放。你不需要一次性投入几千上万去买显卡,也不需要折腾驱动和散热机箱。从时间成本上看,从下单到拿到一台带 GPU 的机器,通常只需要几分钟。相比本地慢慢攒机器,这个效率高得多。

有人会担心租服务器很贵,其实对于这种微型模型项目,成本完全可控。如果用一台单卡 24G 显存的机器,跑一个 20M 参数的模型,训练时长基本在几小时以内,租金开销通常比吃一顿饭还低。关键是你要清楚自己的项目需要什么级别的算力,而不是一味买最贵的配置。minimind 的定位就决定了它对硬件要求不高,这也正是项目设计的巧妙之处——用最低的成本完成一次完整的模型训练体验。

1.3 完整技术路线图

  • 第 1 步:确定硬件需求,租一台带 GPU 的服务器,完成基本网络连通性检查。
  • 第 2 步:配置 Python 环境和深度学习框架,安装 CUDA 相关组件,验证 GPU 对框架可见。
  • 第 3 步:准备训练数据,做清洗、过滤、分词,构造输入输出对。
  • 第 4 步:定义模型结构和训练参数,包括层数、隐藏维度、注意力头数、学习率等。
  • 第 5 步:开始训练,监控 loss 变化,保存 checkpoint,并在训练过程中做抽样生成测试。
  • 第 6 步:加载最优模型,做完整的推理验证,整理项目产出。

这个路线图看起来平铺直叙,但每一步展开都有不少细节。下面我从服务器选型开始逐步讲解。

2. 服务器租用与硬件选型

2.1 先算清楚你需要多大显存

选服务器之前,第一件事不是比较哪家便宜,而是算清楚你的模型训练到底需要多少显存。很多人租机器时盲目选最大显存,结果价格翻倍,利用率却不高。也有一些人租了低配机器,结果训练到一半 OOM,钱白花还得重新配置。

显存占用主要来自四个方面:模型参数、梯度、优化器状态和中间激活值。对于 Adam 优化器,每个参数至少要保存一份参数副本、一份梯度、一份一阶动量、一份二阶动量,加在一起至少是参数量乘以一个系数。比如 20M 参数的项目,如果全用 FP32 精度,模型参数本身占约 80MB,梯度占约 80MB,优化器状态占约 160MB,光这些就有 320MB。这还没算激活值,激活值跟 batch size、序列长度、层数都正相关,但即便 batch size 和序列长度设置得比较正常,整体显存占用也会在 2GB 到 6GB 之间。

如果选用 FP16 混合精度训练,显存占用会进一步下降,但需要在代码里做梯度缩放,也要注意某些算子在 FP16 下的精度损失。对于 minimind 这种规模的模型,其实 FP32 也能跑,用混合精度更多是为了给后续项目积累经验。显存规划有一个粗略公式:总显存需求大约等于模型参数量的 12 到 20 倍。20M 参数对应 240MB 到 400MB,这看起来很少,但一旦把 batch size 调大、序列长度拉长,显存消耗就会快速上升。所以我的建议是,至少租一张显存不低于 8GB 的卡,这样有充足余量可以调参。

2.2 不同 GPU 规格怎么选

市面上的 GPU 服务器配置五花八门,对 minimind 而言,核心只看两个指标:显存大小和算力水平。以下是我用过的几种常用规格对照,可以参考着做选型:

GPU型号显存算力水平适合minimind的程度备注
入门级卡8GB-12GB中等较高训练20M参数绰绰有余,性价比最高
中高端卡16GB-24GB高非常高可以放心加大batch size和序列长度,适合做实验
高性能卡32GB-40GB很高高对minimind来说有些浪费,适合更大规模项目
多卡配置每卡24G+很高低单机多卡分布式训练,minimind用不上,还很贵

如果你只是做验证,租一张 12GB 显存的单卡就足够了。我实测过,12GB 显存配合合适的数据并行策略,可以轻松训练 50M 参数的模型,还把 batch size 调到 32、序列长度设成 512。反过来说,如果硬租一张 40GB 大显存卡,大部分算力闲置,费用却翻了几倍,不划算。

另外要注意一个细节:显存大不等于训练快。有些老款大显存卡,架构较旧,算力反而不如新款小显存卡。所以在选型时,最好结合具体卡的核心架构和发布时间来判断,不要只盯着显存数字,要看整体性价比。

2.3 租用流程与开通检查清单

租用服务器本身并不复杂。大概步骤是这样的:选择一个提供按需 GPU 实例的服务平台,选好地域(尽量靠近你的位置,延迟会更低),选择镜像系统(一般选 Ubuntu 的长期支持版本),然后下单开通。开通后平台会给你一个公网 IP、SSH 端口和登录密码,或者让你自己配置密钥对。拿到这些信息后,你就能从本地终端 SSH 连接到服务器了。

我在开通后会立刻做一遍检查,确认机器状态符合预期:

  • 确认登录成功,系统版本是想要的版本。
  • 查看 GPU 是否被系统识别,使用nvidia-smi命令检查。
  • 查看磁盘分区和剩余空间,至少保证有 20GB 以上可用空间用于装环境、放数据和存模型。
  • 检查网络:能否正常访问代码仓库和软件源,能否下载依赖包。这一步尤其重要,因为后续装 Python 包全靠网络连通性。
  • 测试 CPU 核数和内存大小,确认跟购买配置一致,避免买到缩水配置。

提示:服务器供应商的实例名称往往带有类似“高性能计算型”“GPU加速型”的字样,但实际硬件配置可能因可用区不同而有差异。开通后务必用命令核对真实硬件,不要只看订单页面。

这一步花不了几分钟,但能避免后面所有问题都在环境层面来回折腾。我在第一次实践时就吃过亏,开通时选了 24GB 显存,结果登录进去nvidia-smi显示 16GB,最后发现是平台分配到了不同硬件批次,联系客服才处理好。所以下单前看说明,下单后看实测,这句话一定要记住。

3. 环境搭建与依赖配置

3.1 初始化系统和基础依赖

拿到一台全新的 Ubuntu 服务器,第一步是更新系统软件源,并安装一些基础工具。执行apt update && apt upgrade把系统包更新到最新状态,然后安装curl、wget、git、vim这些日常命令工具。如果系统里没有 Python,需要先确认自带 Python 版本,尽量选择 3.10 或更高版本,太老的 Python 版本对 PyTorch 的兼容性不好。

装好基础工具后,建议创建一个专门的虚拟环境,用python3 -m venv或者conda都行。我个人倾向于用conda,因为它不仅能管理 Python 版本,还能顺便解决一些底层依赖库的冲突问题。不过虚拟环境不是必须的,关键在于把项目依赖隔离起来,避免系统里不同项目之间的包互相干扰。

我在实际操作中会顺便把.bashrc里加几条常用别名,比如alias py=python3,再配置好pip使用一个国内可访问的镜像源,这样后续下载包会快很多。这些操作看起来琐碎,但后面每次敲命令都会受益。

3.2 安装 GPU 驱动与 CUDA 工具链

深度学习框架依赖 GPU 驱动和 CUDA 运行时库。GPU 驱动通常已经预装在新开的服务器上,不一定需要手动装,但你要确认版本是否满足 PyTorch 的要求。运行nvidia-smi会显示驱动版本和最高支持的 CUDA 版本号,把这个数字记录下来。

接下来安装 CUDA 工具链。这里有一个常见的误区:很多人以为要安装跟nvidia-smi显示的最高 CUDA 版本完全一致的 CUDA 工具包,其实不必。PyTorch 通常自带 CUDA 运行时库,你只需要安装足够新的驱动,并在安装 PyTorch 时选择对应的 CUDA 版本即可。换句话说,驱动版本决定下限,PyTorch 里捆绑的 CUDA 库决定实际使用的版本,两者并不需要严格相等。

如果你确实需要单独安装 CUDA 工具包,我建议按照对应发行版的安装命令来,重点是把/usr/local/cuda/bin和/usr/local/cuda/lib64加入环境变量。安装完成后用nvcc --version验证。不要为了追求最新版本去下刚发布的测试版,稳定版本反而问题更少。

3.3 安装 PyTorch 并验证 GPU 可用性

PyTorch 的安装方式很成熟,直接用pip安装即可。重点是根据自己的 CUDA 版本选择正确的安装命令。以 CUDA 12.x 为例,安装命令是pip install torch torchvision torchaudio --index-url加上对应的源地址。如果服务器访问不了默认源,可以换成国内镜像,但要注意一些镜像可能不同步最新的 CUDA 版本。

装完后,用一段简短的 Python 代码验证环境和 GPU 状态:

import torch print("PyTorch version:", torch.__version__) print("CUDA available:", torch.cuda.is_available()) if torch.cuda.is_available(): print("GPU name:", torch.cuda.get_device_name(0)) print("GPU memory:", torch.cuda.get_device_properties(0).total_memory / 1024**3, "GB")

如果torch.cuda.is_available()返回True,说明 PyTorch 能正常调用 GPU。这一步是整个项目最关键的环境检查点,因为后面所有训练代码都会基于这个底层能力。

再跑一个小矩阵乘法测试,看看 GPU 是否真的参与计算,而不是只检测到设备:

import torch a = torch.randn(1024, 1024, device="cuda") b = torch.randn(1024, 1024, device="cuda") c = torch.mm(a, b) print(c.sum().item())

这里建议顺手测一下 CPU 和 GPU 的矩阵计算耗时差异,你会明显感觉到 GPU 的优势,同时也确认驱动没有潜在问题。

到这里,环境就绪,可以进入数据和模型部分了。

4. 数据准备与模型结构设计

4.1 语料选择与预处理

训练语言模型,数据是重中之重。minimind 不需要像大模型那样动辄几个 TB 的语料,但数据质量比数量更重要。我常用的做法是找一个干净的中文文本集,比如维基百科的中文条目、开源小说集,或者你自己整理的领域文本,几万到几十万行都可以。

拿到原始文本后,第一件事是清洗。清洗流程包括:去重、去空白、过滤过短句子、去除包含乱码或特殊符号的段落。还要统一标点格式,比如把中文全角符号保留、将英文半角符号转为全角或按需处理。这一步看起来很基础,但直接影响后续 token 切分的质量。如果数据里有大量 HTML 标签、URL 或无意义符号,模型学出来的文本会很怪。

清洗完成后,要把语料切分成适当长度的文本块。语言模型训练的基本单位是序列,也就是一段固定长度的 token 序列。minimind 的序列长度我一般设置在 128 到 512 之间。太短了模型学不到长距离依赖,太长了显存压力大而且训练速度明显变慢。将语料组织成语料库文件后,再用 tokenizer 把文本转成 token id 序列。

4.2 分词器选择与构建

分词是中文语言模型里一个绕不开的话题。中文不像英文那样天然按空格分词,所以你需要选一种分词方案。常见选择有:基于 BPE 的 tokenizer、基于 WordPiece 的 tokenizer,或者简单地按字切分。

对于 minimind 这样的小模型,我个人更推荐直接按字符级切分,也就是把每个汉字、每个字母、每个数字都当成一个 token。字符级分词的好处是词表很小,通常几千个 token 就够,模型更容易在小数据量下收敛,实现也最简单。缺点是对词义的理解粒度不够细,模型需要自己从字形和上下文去学词义,但在小模型和小语料的场景下,这个缺点反而不明显。

另一种方案是使用 BPE,用开源 tokenizer 库训练一个新的 BPE 词表。BPE 能压缩序列长度,同一个词用一个 token 表示,减少模型需要处理的信息量。但这会增加训练时间,并且需要额外维护分词器文件。我的建议是,在 minimind 项目里先用字符级切分跑通整个流程,之后再考虑切换到 BPE 做对比实验。

无论选哪种方案,最终都要把数据转换成.bin或.npy格式的 token id 数组,方便训练时快速加载。这一步可以直接在用 Python 脚本里做,把整份语料遍历一遍,切成固定长度的序列,存成内存映射文件或二进制文件。

4.3 模型架构与配置

模型架构我直接采用标准 GPT 风格 decoder-only transformer。核心组件包括:token 嵌入层、位置编码、多层 transformer block,每层 block 里有自注意力子层和前馈神经网络子层,最后接一个输出映射层。这个架构虽然简单,但它是绝大多数现代语言模型的基础,搞明白它,后面的很多概念都能串联起来。

minimind 的配置应该设置在什么量级?我给一个参考配置:

配置项参考值
层数4 到 6 层
隐藏维度128 到 256
注意力头数4 到 8
序列长度128 到 512
词表大小约 3000(字符级)
参数量约 20M 到 50M

这个配置下,用 12GB 显存跑训练非常轻松。层数太少模型容量不足,学不出复杂规律;层数太多则训练速度下降且容易过拟合。隐藏维度 256 配 4 到 6 层,对小型文本生成任务来说是比较均衡的选择。如果你手头显存更大,可以适当增加到隐藏维度 512、层数 8,但提升幅度不一定明显,反而训练时间会成倍增加。

定义模型时还要考虑初始化方式。Transformer 对初始化比较敏感,通常使用标准差较小的正态分布初始化,或者直接用默认初始化方式。如果初始化设置不当,可能在训练早期就出现梯度爆炸或 loss 不下降的情况。很多新手把模型搭出来就丢进训练脚本,结果 loss 降不下去,排查半天才发现是初始化的问题。

5. 训练过程与核心实现

5.1 训练脚本的关键设计

训练脚本是整个项目的心脏。我不打算贴一份上百行的完整代码,而是把关键设计讲清楚,因为这些设计的取舍会直接决定训练是否顺利。

第一是数据加载器。数据加载器要从预处理好的 token 数组中按顺序切出 batch。每个 batch 包含一组样本,每个样本是一条长度为seq_len的 token 序列。语言模型的训练目标是“预测下一个 token”,所以输入是序列的前seq_len - 1个 token,标签是后seq_len - 1个 token,二者错开一位。这个细节很多新手容易搞错,导致模型学的不是语言规律,而是死记硬背。

第二是损失函数。采用交叉熵损失,计算时忽略 padding 位置。如果整个序列都是有效内容,那直接对所有位置求平均即可。但如果 batch 里有 padding,就要用ignore_index把 padding token 排除在损失计算之外,否则模型会被无意义的 padding 干扰。

第三是优化器与学习率。Adam 优化器是语言模型训练的主流选择,需要设置合适的学习率。我习惯用余弦退火学习率调度,配合前面的线性预热阶段。预热的作用是让模型在初始阶段用较小步长稳定训练,避免一开始就走偏。学习率峰值一般设置在 1e-3 到 3e-4 之间,具体要看模型大小和 batch size。20M 参数的模型,学习率太高容易发散,太低则收敛很慢。

第四是梯度裁剪。Transformer 模型在训练中偶尔会出现梯度异常大的情况,不处理的话会直接让 loss 爆掉。设一个max_grad_norm,通常是 1.0,用全局梯度范数裁剪来限制更新幅度。这是训练稳定性的保险丝,建议开。

5.2 训练前的超参数规划

训练之前,花几分钟算一下训练步数是有价值的。假设语料有 500 万 token,序列长度 256,那么语料被切成约 2 万条样本。如果 batch size 是 32,那么一个 epoch 大约是 625 步。训练 3 个 epoch,总共约 1875 步。如果每步耗时 0.5 秒,总训练时长大约 15 分钟。这个估算帮我提前判断训练计划是否合理。

另一个要提前决定的是日志打印频率和 checkpoint 保存频率。我习惯每个固定步数打印一次 loss 和当前学习率,同时做一次小规模采样生成,用几句话看模型当前水平。checkpoint 则保存每轮结束后的模型权重,防止训练中断时全部白跑。

很多人一开始就把 batch size 调到很大,结果显存溢出不自知。batch size 并非越大越好,尤其在loss已经收敛到合理范围后,继续加大 batch 只会延长训练时间。minimind 场景下,batch size 从 16 或 32 开始都比较合理。

5.3 训练中的监控与 checkpoint 管理

训练过程中,我最关心的指标有三个:loss 的下降趋势、学习率的变化曲线、生成文本的可读性。loss 是最客观的训练指标,如果 loss 在下滑,说明模型在逐步收敛;如果 loss 反复震荡或者长期不变,说明超参或数据有问题。生成文本的可读性则直观反映模型学得怎么样,比单纯看 loss 数字更有体感。

checkpoint 管理上,我建议保存两种:一种是按步数定期保存的完整 checkpoint,包括模型权重、优化器状态、当前 epoch 和步数,这样可以精确断点续练;另一种是每个 epoch 结束单独保存一份最优权重,方便后续加载推理。注意,minimind这种小型项目,权重文件只有几百 MB,保存成本很低,多存几份完全没问题。

训练停止的时机可以这样判断:如果在验证集上 loss 已经不再下降,或者生成文本已经很流畅,就可以停止训练。过早停止会欠拟合,过晚停止会过拟合。小模型有过拟合的风险,尤其是数据量不大时,训练中期开始会出现生成的文本重复率升高、模板化严重的问题,这也是该停的标志。

5.4 推理生成验证

训练完成后,要做一个独立的推理脚本来验证模型效果。推理过程相对简单:输入一段初始文本,tokenizer 转成 token id,模型逐 token 预测下一个 token,再把新 token 拼回输入,重复这个过程直到达到目标长度。

推理时的解码策略很关键。如果每次都贪心选择概率最大的 token,生成的文本往往很机械、容易卡在重复循环。如果每次从全量分布中随机采样,又可能生成过于混乱的内容。比较合理的做法是使用top-k采样加上temperature缩放,temperature让概率分布更集中或更平滑,top-k则只从概率最高的 k 个 token 中采样,避免极端低概率 token 被选中。

在推理阶段,同样的模型、同样的参数,只用不同解码策略,生成效果就能差很多。这不是模型训练没到位,而是解码设计本身就有讲究。把这一步做好,项目才算真正闭环。

6. 常见问题与排查技巧实录

6.1 高频问题速查表

为了节省大家排查时间,我把实际操作中最常遇到的几个问题整理成了对照表:

现象可能原因解决方案
torch.cuda.is_available()返回 False驱动未安装或版本过旧检查nvidia-smi,更新驱动;确认 PyTorch 版本匹配 CUDA
训练报 CUDA out of memorybatch size 过大或序列过长调小 batch size 或缩短序列长度;开启梯度累积
loss 一开始就是 NaN学习率过高或初始化异常降低学习率;做梯度裁剪;检查数据是否有 NaN
loss 不下降,反复横跳数据加载顺序有误或学习率不合适检查标签对齐;调低学习率;加大 batch size
训练速度极慢CPU 指令集受限或 GPU 型号太老确认 GPU 载荷;检查 CUDA 核心是否真正在工作
SSH 连接经常断开安全策略或网络不稳定使用密钥登录,配合 nohup/tmux 跑长任务
生成的文本全是重复模型过拟合或解码参数不当减小训练轮次;调高 temperature;调整 top-k
下载依赖时一直超时网络问题没有配置代理或镜像配置国内可用的镜像源;设置合理的超时重试

6.2 我实际踩过的几个坑

第一坑:训练中断导致前功尽弃。我第一次跑模型的时候,直接在前台跑训练脚本,结果 SSH 断了一下,训练进程直接终止,半天时间白费。后来学乖了,统一用tmux或nohup把训练任务放后台跑,客户端断开也不影响进程,还能随时回去查看日志。哪怕是个微型项目,也建议从第一天就用后台任务方式。

第二坑:数据标签错位。我在早期实现数据加载时,直接把输入序列复制一份当了标签,也就是说模型是在预测自己已经看到的 token,这导致 loss 很快降到很低,但生成结果乱七八糟。原因是标签没有做移位,输入和标签没有构成“前文预测后文”的关系。这个问题在当时不容易发现,因为指标看起来很漂亮。所以建议新手写完数据加载器后,先打印一个 batch 的输入和标签,人工核对移位是否正确。

第三坑:贪心解码导致生成重复。训练完后我第一时间用最简单的贪心解码去生成,结果模型写出来的每段话都陷入重复循环。那时候一度以为是模型没训好,后来调了解码策略,换成 top-k 加 temperature,情况立刻好转。这个经验说明,评价一个模型的好坏,要先确保推理阶段的解码策略合理,别急着否定模型本身。

第四坑:误认为显存越大越好。有一阵子我拿到了一张大显存卡,于是把所有超参都往大了调:batch size 直接设成 128,序列长度设成 1024。结果训练速度奇慢,成本飙升,但效果并没有比之前的小配置好。原因很简单,模型容量和数据量决定了收益上限,超出这个上限的一切算力投入都是边际效用递减。后来我养成了先小尺度跑通、再逐步调大的习惯,省了不少钱。

6.3 一组稳妥的训练方案参考

最后给一组经过实操验证、容错率较高的配置组合,适合一个人用 12GB 单卡快速跑通 minimind:

参数建议值
模型配置6 层,隐藏维度 256,8 个注意力头
词表大小约 3000(字符级)
序列长度256
batch size32
学习率峰值1e-3
预热步数200
梯度裁剪1.0
训练 epoch3
数据规模500 万 token 左右
总训练时长约 30 分钟到 1 小时,视 GPU 而定

这套配置跑下来的典型现象是:前 100 步 loss 从 6 左右快速下降到 3 左右,之后下降速度放缓,到 epoch 2 结束时 loss 通常在 1.5 到 2.0 之间。用 top-k 采样出来的文本已经具备不错的可读性。如果想看到更高质量的结果,可以加大语料量到 2000 万 token,并把 epoch 数控制在 2 到 3 轮,效果会更明显。

个人经验来说,minimind 这个项目最大的价值不是得到一个多聪明的模型,而是把“从零到一”跑通一遍。你会亲眼看到随机初始化的权重怎么一步步变成能写出通顺句子的参数,也会理解为什么数据、算力、超参是模型效果的三大支柱。如果以后要深入研究更大规模的模型,这些基础体感会比看很多篇文章都有帮助。后续如果想扩展,可以给 minimind 加上指令微调、RLHF 的简化版本,或者把字符级分词换成 BPE,做一组对照实验,这些都是不错的延伸方向。

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进