ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

从零到跑通:大语言模型与推理模型构建避坑指南

从零到跑通:大语言模型与推理模型构建避坑指南 搞过AI工程的人都知道这行表面上光鲜实际上坑多到能埋人。框架遍地、模型权重满天飞拿过来就能用但真要让你从零动手复现一个能跑通的东西不少人直接就傻了。市面上那些《Build a Large Language Model from Scratch》《Build a Reasoning Model from Scratch》的教程和仓库近段时间突然火起来本质就是这个痛点被戳中了封装太方便反而让人没法学到真东西。我刚把这条路完整走了一遍从数据处理到Tokenizer从Transformer架构到RL训练踩过的坑、绕过的弯都记在这篇里了。这篇东西适合所有想真正理解AI工程的人不着急速成更不指望调接口混日子而是想把每个环节的底层逻辑拿捏住再往上盖楼的那种学习者。1. 为什么说从零开始才是学AI工程最赚的方式现在选一个预训练模型然后finetune太容易了。几行代码就能把几万块成本的模型跑到“差不多好用”但你要问自己一个问题如果模型输出的效果不好你能定位到是哪一层出了问题吗是数据处理漏了还是分词器边界不匹配或者是学习率策略在某个阶段把你坑了这些问题的答案只从框架的封装接口里是找不到的。只有你自己亲手写出数据处理管线、自己训练过一个tokenizer、自己跑过一遍loss下降的曲线才能对这些环节产生真正的直觉。从另一个角度说AI工程落地最大的成本早就不是算力了而是排错的时间。你训练出来的模型效果不达标直接调参是盲人摸象。但如果你对每个环节的细节有掌控感你可以按顺序去排查数据、preprocess、embedding、attention、FFN、优化器、采样策略逐层拆开看问题出现在哪里几乎一目了然。这种能力和天赋关系不大纯粹取决于你花了多少时间在“底层”上。从零开始构建一个微型模型就是性价比最高的修炼方法。至于“从零修一个推理模型”这更是能把视野拉高的活。推理模型不仅仅是“更聪明的LLM”它的训练链路里涉及SFT、偏好对齐、强化学习还涉及奖励设计、策略优化、训练稳定性调试。这套组合拳打下来你基本能把当前大模型技术的整个横向脉络都串起来。所以不管你是技术负责人、算法工程师还是刚入门的学生我都建议你至少要完整走一次这条路径。2. 从零构建LLM第一步数据准备与Tokenizer2.1 数据先于模型质量直接决定天花板很多人上手先从模型架构开始这也是我踩过的第一个坑。你花两周把Transformer写完了数据随便拼凑了一下就开训最后结果是loss降到3.2就卡住不动生成的内容全是重复的空话。问题不在模型是数据太脏。版权和数据安全问题这里不展开就讲实际操作里怎么搞。我建议从三个来源入手维基百科导出、公版书籍比如古登堡计划里的公开文本、以及你自己手里的业务语料。粗糙估一下规模预备情况可以这样模型规模建议数据体量训练时长单卡A100-80G预期效果亿级参数demo级别10-50GB纯文本3-5天能进行短句续写语法错误少但逻辑弱十亿级参数入门实用200GB以上2-4周能完成基本问答短文本生成长段落百亿级参数进阶探索1TB以上数月具备一定常识与推理能力训练成本飙升初次实践不用贪大先把十亿以下参数的路径打通把“数据处理管线”建好。这个管线主要包括编码统一、HTML标签与特殊符号清洗、敏感内容过滤、文档级别的去重MinHash或SimHash都行、过长文本切分。文本切分这里注意一个点别傻乎乎按固定长度靠字符硬切要优先按句子和段落边界切否则句子被拦腰斩断模型很难学到稳定的语言结构。2.2 自己动手训练一个BPE TokenizerTokenizer是LLM最容易忽视又最值钱的环节。你想——模型根本不着文本它只认识token idtoken切得不好中文一字一字拆得多英文单词被硬劈成碎片模型的语义理解能力直接打折。BPEByte Pair Encoding至今还是最主流的算法思路它从字节级出发不断合并语料里出现频次最高的相邻子词对最终得到一层词汇表。具体实现路径不复杂但细节多。第一步把语料全部映射到字节流这能保证任意语言和特殊符号都不会出现未知词。第二步统计所有相邻字节对的频率每次合并最高频的那一对把合并结果写进词表循环重复2万至10万次。Tiktoken、sentencepiece这些库帮你把脏活干了但我建议你自己用Python实现一遍合并逻辑这个过程能让你真正理解词表上限、合并次数、语料语言对分词效率的直接影响。词汇表大小直接关系到训练效果和推理开销。拿中文场景举例词表4万左右中文能覆盖得不错如果再混入代码和英文需要升到8万到10万。词表太大embedding矩阵和输出层参数量占比会失控模型结构还没深先被词表扛住了。词表太小1万以内中文一个概念容易被拆得七零八落语义表示效率又差。实操上我一般先用一个小样本语料快速训练几个不同词表大小的candidate再用UNK率和平均token长度来评估选那种“同样文本切出来的token数量最少”的配置。2.3 数据管线设计的几个硬性指标数据管线这东西80%的代码都是为了处理“意外”。文本编码混乱、emoji夹杂、HTML标签没清干净、超长代码块、全角半角符号混在一起每一种都能让你的分词结果变得离谱。我的排查优先级是这样的先做编码统一UTF-8非法字节直接剔除再做规则清洗再做基于困惑度的低质量句子过滤可以把一个初版模型当评分器用最后做去重和切分。这套跑完数据基本能拿来训练了但注意清洗严格一点没关系漏掉一条脏数据对于十几亿token的训练集来说不算什么真正致命的是整个数据采集渠道混进了大量同质低质内容那直接会把模型“喂傻”。我建议把数据管线做成可复用的Python模块三个关键输出必须有统计报告总字节数、token数量、平均序列长度、抽样反馈随时能取出几条数据看看切成什么样、断点续跑功能。断点续跑极其重要只要碰到服务器重启或者某个脚本异常退出你从头再跑一遍10TB的数据那种崩溃感你不想体验第二次。3. 从零构建LLM第二步架构与训练工程3.1 Transformer解码器架构的必知细节GPT系列是Decoder-only架构整条主干就是Token Embedding 位置编码 N层Transformer Decoder Block 最后的分类Head。每个Decoder Block里又有三个核心子模块Masked Multi-Head Self-Attention、Feed-Forward NetworkFFN、LayerNorm。用生活化的方式理解Self-Attention每个词就像一个学生在教室里整句话的所有词都同时看了一遍计算谁和自己“关系近”。这个“关系近不近”使用的是Q、K、V三组向量的内积来打分再通过softmax归一化成权重最后把V加权求和得到当前词的新表示。Masked部分就是规定“这个学生不能看后面的同学”因为训练时如果能看到未来词等于开卷考试预测就失去意义了。FFN则是每个词独立做非线性变换。如果把Attention比作收集信息的网络FFN就是处理信息的“思考区”。这部分在GPT里占的参数量最大每层通常占三分之二以上我习惯把它叫“模型记忆的主战场”。激活函数现在主流的SwiGLU效果比早期GELU和ReLU更好但实现时要注意维度匹配和数值稳定性。位置编码是我自己想特别强调的点。绝对位置编码就是给第n个token加一个固定的位置向量在长序列上会暴露训练与推理之间的长度差异问题推广到很长的上下文时会掉精度。实际做的时候我更推荐RoPE旋转位置编码它配合现有的注意力机制转一圈能天然外推更长的上下文业内大量模型也在用。如果你真的是为了搞懂原理用绝对编码先跑通也行但正式项目直接上RoPE别在错误的方向上强化自己。3.2 训练目标、优化器与超参数工程训练目标很简单就是下一个token预测给定前面所有的token让模型把下一个token正确预测出来。Loss是交叉熵每个位置都对下一个位置做一次预测最后对所有位置取平均。这背后的逻辑是让模型学会“模式推测”这种模式推测能力强到一定程度就在表征空间里实现了“理解”。优化器基本只有AdamW一个答案。AdamW在Adam的基础上把权重衰减从动量中分离出来实际训练中既稳又不至于把大权重压太死。核心的超参数经验和公开参考值如下超参数参考值说明优化器AdamWbetas(0.9,0.95)是较常用组合Weight Decay0.1权重大点没问题别太小峰值学习率3e-4约等于参数量的平方根倒数大模型要降小模型可以高Warmup步数占训练总步数的1%-5%避免初始阶段震荡学习率调度Cosine衰减到峰值的10%末尾微调更细腻梯度裁剪1.0防梯度爆炸对训练稳定性极其有用还有一个极少在文档里看到但特别重要的点全局batch size对梯度噪声的影响。梯度越大的batch每次更新的方向越接近真实梯度训练更稳但总batch太大模型的泛化性反而会略降。我测试过的经验曲线是对于十亿级以下模型全局batch size在0.5M到2M tokens之间的区间是比较合适的。你可以在这个区间里通过调整梯度累积步数来匹配显存限制显存不够就用梯度累积但累积步数太多也会拖慢迭代节奏最好控制到不超过16步。3.3 混合精度、梯度累积与显存优化单卡训练十亿参数是有点吃力的但并非不可能。基础方案是混合精度用bf16计算前向和反向用fp32累积主权重。bf16的指数范围和fp32一样宽就不太容易导致大数值溢出的NaN问题这也是为什么现在很多AI训练脚本直接默认bf16。如果显卡不支持bf16退而求其次用fp16但需要额外小心loss scale不然小数值梯度会被抹成零。显存不够还有几个实际招数激活重计算Activation Checkpointing通过牺牲计算量换回激活值的存储ZeRO-Offload把优化器状态放到CPU内存8-bit优化器进一步把梯度和状态压缩。你需要按顺序尝试先混合精度再打开Activation Checkpointing再考虑梯度累积最后才上Offload。Offload带来了大量CPU-GPU间的数据传输通信开销会很严重训练速度可能掉到原来的30%-50%。我实测下来8B以上模型最好还是直接用多卡并行否则单卡虽能塞下权重但训练效率太低。单机多卡用DeepSpeed的ZeRO-3来配置原理并不复杂每张卡只保存一部分模型参数在计算前把需要的参数从别卡拉过来计算后再释放。这一套配置有很多坑但跑通了以后你会对分布式训练有非常直观的理解。4. 从零构建推理模型从LLM到会思考的模型4.1 推理模型和普通LLM的差异普通LLM的训练目标决定了它擅长的是“接话”而不是“解题”。你让它做数学题它可能给你一句流畅的废话你让它逻辑推理它能把前提到结论编得像模像样但结论是错的。推理模型的目标则不同它需要能拆解问题、形成步骤、自我检查、纠正错误最后才给答案。这三层的多了一个关键环节——在作答之前增加一个显式的“思考过程”。这条路线的代表之一就是思维链Chain-of-ThoughtCoT思路。训练数据需要把以往简单的“问题-答案”对升级为“问题-思考过程-答案”。这里的思考过程不是随随便便写几行“我想了想”就行而是要把中间推导步骤逐步列出来并且具备可纠正性。数据生产的方式很多你可以用更强的模型生成思维链然后人工抽查修正也可以用规则模板自己构造一部分比如数学解题、逻辑分类、长文本问答这类目标明确的任务。4.2 三阶段训练SFT 到 RL 的升级路径基础能力阶段完成后推理模型一般要经过三个训练阶段。第一个阶段是继续预训练Continue Pretraining。如果你要模型掌握某一垂直领域的知识直接用这个领域的语料再训练一小段。注意学习率要放得很低普通预训练的十分之一左右因为模型已经基本稳定撑不住大扰动训练步数不用多几个epoch足够。第二个阶段是监督微调SFT。这一步是在高质量指令和思维链数据上教模型“按我们期望的形式说”。SFT的损失计算很常规交叉熵即可但你得仔细控制数据配比。数学题、逻辑推理、代码生成、一般问答各占多少比例直接影响最终模型的能力分布。我自己的经验值是推理类数据不低于30%代码类10%-20%其余是通用指令和对话数据。第三个阶段是偏好优化与强化学习RL对齐。这一步是推理模型“会思考”的关键。常用算法有RLHF使用一个额外的RM奖励模型、PPO、近两年很火的GRPO等。GRPO相比PPO的核心优点是不需要单独训练一个价值网络Critic来估算基线而是从当前策略的一组采样结果里直接估计相对优劣省了大量显存和训练开销被DeepSeek-R1这样的大规模项目验证过稳定性和效果都不错。如果你是第一次做我强烈建议从GRPO起步实现成本比PPO低很多调参压力也小。4.3 奖励模型与训练稳定性的关键经验训练推理模型最麻烦的不是模型本身而是“怎么告诉模型什么算做得好”。奖励设计是成败关键。规则型奖励最简单比如数学题就直接对比最终答案对不对代码题就直接跑测试用例看通过率。这种奖励干净、透明还能完全自动化构造特别适合起步阶段。模型到后面越来越复杂纯规则覆盖不了的任务再加一个学出来的RM模型评分用生成结果的整体质量作为奖励。训练过程的稳定性简直是劝退最多的环节。我见过的失败case有奖励值在几千步里纹丝不动、策略崩溃模型直接退化成无脑输出、奖励模型作为“裁判”本身过拟合到把低质量回答打高分。我的解决思路是奖励信号尽量同时用规则和RM设置一个比例比如规则奖励权重0.7RM权重0.3每训练一个阶段就抽样一批生成结果人工看一眼不要只看reward曲线因为reward曲线涨不代表回答质量好它可能是在钻奖励模型的空子。参考DeepSeek-R1公开的技术细节注意它的过滤策略和价值设定。好的RL阶段需要动态调节采样数量、温度、奖励尺度每次只改一个变量跑几十步对比效果再决定下一步。切忌同时调多个超参出了问题根本不知道该怪谁。5. 实操路线从环境配置到跑通推理模型5.1 环境与依赖搭建真正踩过一遍我建议你从下述清单着手Python 3.10不建议太老AI库的新特性对版本有要求PyTorch 2.x 配套 CUDA 环境Transformers、Datasets、Tokenizers跑辅助功能核心逻辑自己写DeepSpeed多卡并行轮换使用时才装上WandB或者TensorBoard训练监控必须有不然训练裸奔Accelerate脚本管理和Hugging Face Hub模型存储不用一上来就用很重的框架。你从零复现一遍训练循环加载数据、构造batch、计算loss、backward、optimizer.step()、scheduler.step()、保存checkpoint、加载checkpoint。这个过程做完后再切换到Accelerate做分布式扩展。顺序别反过来否则你可能在框架的抽象层里永远出不来了。5.2 里程碑式推进先跑小模型再放大我强烈建议你按照下面四个里程碑走每一步的模型都能跑、能测、能迭代不会出现“倒数第二步才知道模型跑不动”的惨剧。Step 1最小可行模型。参数量控制在3000万到1亿之间词表1万训练数据几条纯文本拼接即可真的不要多1MB也能跑。这一步的目标是“通了”loss能从6左右降到2以下能生成通顺的句子。这里你会遇到最多的工程问题全是好事。Step 2中型模型。3亿参数词表8万左右训练数据5-10GB。目标是生成质量和语义连贯性明显改善。这一步开始要认真做评估集我建议自己手写50条常识性问题定期跑一遍并记录回答质量的定性变化。Step 3SFT微调。Coach数据用2-5万条高质量指令数据来微调训练2-3个epoch学习率为峰值学习率的十分之一。微调后模型问答表现跃升一个档次。Step 4RL对齐。在微调好的模型上做GRPO采样8-16个候选回答用规则奖励打分。训练稳定后你会发现模型在数学和逻辑类任务上的表现明显超出了SFT的基线。5.3 训练脚本里能动的手脚训练脚本里有些服务器端一定要提前写好检查点定期保存与自动恢复。每500或者1000步保存一次保存下来时同时保存optimizer状态和scheduler状态。否则一次断点恢复loss就从高原区开始乱跳日志体系至少要有loss、学习率、token吞吐tokens/s、显存占用。监控这些能帮你提前发现瓶颈数据比例的动态调整能力。多份不同来源的数据集要能通过配置调整配比这样在发现“模型偏科”时可以快速做实验生成验证每个固定训练阶段自动用prompt集合生成几个回答丢到日志里。光看loss曲线你根本不知道模型变聪明了没有6. 常见问题与排查技巧实录我复盘了从零到跑通的整个过程中遇到的坑哪些最值得写出来供大家避雷我整理成了一张速查表感慨一句每一行都是真金白银换来的。问题可能原因排查方向与解法Loss不降或缓慢学习率太低或太高先检查warmup长度和峰值日志里看token的样本多样性如果是重复文本会造成局部最小平坦区Loss直接就NaN数据里有NaN或Inf值fp16溢出转为bf16数据管线里显式过滤异常值降低学习率生成全都是重复词采样温度太低或模型已进Loop调高temperature到0.8-1.0引入top-p采样0.9左右检查训练时的dropout是否开了显存OOM单样本过长或激活存储爆炸减小序列长度开启Activation Checkpointing使用梯度累积降低有效batchTokenizer把中文切得稀碎词表太小或语料中中文占比不足增大词表到4万训练词表时中英文语料都要有推理时模型经常“胡说”基础预训练能力不够直接跳SFT回到预训练阶段延长训练步数提升底模质量RL阶段reward涨但answer质量差奖励模式被利用加人工抽样检查奖励规则提高权重尝试降低温度分布式训练时速度越来越慢通信瓶颈检查DataLoader的num_workers增加批次减少通信频率确认DeepSpeed的ZeRO级别合理让我再说备份一个容易忽略的多卡并行时每张卡的随机种子必须不同否则所有卡上的数据顺序完全相同这会导致梯度更新方向重复得厉害然后模型泛化性差到离谱很多人百思不得其解到底哪出了问题。解决办法很简单每张卡按global rank设置随机种子偏移。最后再分享一个保留项目如果你SFT完模型聊着聊着就开始乱答大概率是SFT阶段数据里保存了大量“问题与答案不匹配”的低质量pair。别着急忙慌地去调模型先把SFT数据里的模糊答案清掉sample对了模型自然就不飘了。这一步比任何超参数调优都管用。从零构建AI工程这条路看起来绕远但多绕的每一公里都长在你自己身上。由浅入深地把Tokenizer、Transformer、优化器、奖励模型逐个亲手跑过之后再回去看那些现成的模型和框架你会发现它们再也不像黑盒了每一层都是你自己的认知图景中的一部分。这套功夫对你以后排查任何AI问题、做任何技术决策都会有持续的复利。如果这篇踩坑记录能让你少走几个弯路那我这一路就没白走。
返回列表