资讯详情

资讯详情

大模型训练全流程解析:从数据清洗到对齐评估

很多人对“大模型训练”这四个字的理解是把它当成一个“跑脚本”的活儿数据备好、显卡插上、框架启动、等个把月模型出炉。我在这个领域摸爬滚打几年之后想说的是事情远不是这么回事。大模型训练本质上是一场横跨数据工程、算法调优、分布式系统和产品验收的持久战任何一个环节掉链子前面的算力投入都可能白费。这篇文章我想把“一个模型是怎么炼成的”这条链路完整讲清楚——从数据清洗、预训练、监督微调到对齐与评估重点讲每一步在真实项目里是怎么做决策的而不是教科书里那种理想化流程。无论你是想试着训练模型的学生还是团队里负责技术选型的工程师或者只是单纯好奇一个会聊天的程序背后到底发生了什么这篇内容应该都能帮你看清全局。1. 模型不是“写”出来的是“喂”出来的——动手前的全局规划1.1 先回答三个问题再谈训练很多团队一上来就找训练框架、调显卡驱动但我觉得动手之前最该想清楚的是三个问题你要的模型是什么形态你手里有多少数据你准备为这次训练投入多少资源模型形态决定了后续所有技术路线。你是要一个纯粹补全文本的底座模型还是要一个能听懂人话、按指令办事的对话模型这两者的训练目标和验收标准完全不同。底座模型只需要在大量文本上做预测训练能顺畅续写、编码、概括就算合格对话模型则必须在预训练之后再做一轮甚至多轮的“管教”让它在面对“帮我写一封邮件”这种指令时知道该怎么组织语言、用什么语气。数据和资源的约束往往比算法更硬。我见过不止一个团队模型结构选了很大的规模结果数据量只有几百GB训练卡也只有几十张最后做出来的模型既比不上开源底座又花掉了大半年时间。这里的核心规律是模型参数量、训练数据量、算力预算三者必须匹配。数据太少而模型太大模型会把训练集背下来而不是学会规律跑出来的效果就是“复读机”而不是“理解者”。1.2 三条路线从零预训练、继续预训练、全参数微调接下来要选路线。市面上的主流做法基本分成三类成本从高到低、自主性也随之下滑。第一类是从零预训练。这条路意味着你要自己准备几万亿级别的token数据搭建大规模分布式训练集群从头学出全部参数。它的门槛极高一般只有头部实验室或大厂才有底气碰。第二类是继续预训练也叫增量预训练。你在一个开源底座模型的基础上用特定领域的数据继续做预测任务把模型“往某个方向再拽一程”。比如想做一个法律领域的模型就往底座里继续灌法律文书、法条解析让模型对这个领域更“熟”。第三类就是全参数微调直接用带指令的数据训练模型学会对话这是大多数应用团队的日常成本也相对可控。我个人的建议很明确除非你有极其特殊的理由否则不要从零预训练。继续预训练和微调的组合已经能覆盖绝大多数真实业务需求而且能踩在前人的肩膀上。选底座的时候也别只看榜单分数要看它的数据协议、社区活跃度、中间版本稳定性这些在落地时比那零点几个百分点重要得多。2. 数据工程80%的工时都花在这里却最容易被低估2.1 清洗与去重垃圾进垃圾出好多第一次做训练的人会把大量精力放在“选什么模型结构”上结果被数据狠狠教育了一轮。大模型训练里有一句老话垃圾进垃圾出。数据质量的上限直接决定了模型能力的上限而结构只是把这份养料转化成能力的手段。清洗这件事听起来不过是“去掉乱码、删掉广告”做起来却是一项系统工程。首先是格式清洗抓来的网页里混杂着导航栏、版权声明、重复的模板段落这些都要去掉。然后是质量过滤用规则也好、用小模型打分类标签也好把纯乱码、机器生成的垃圾内容、低质量的碎片段落筛掉。还有一类容易被忽略的东西是个人隐私信息比如电话号码、身份证号、邮箱地址这类内容必须在训练前做脱敏处理否则模型在推理时可能会“背出”真实用户的隐私这是合规事故级别的风险。去重同样关键。训练集里如果存在大量重复文本模型会对这些片段产生过拟合表现就是生成时不断复读同一段话。常见做法是先做精确去重再用MinHash这类算法做近似去重把“改了两个字但其实还是同一篇文章”的副本也揪出来。另一个容易踩的坑是污染检测公开的开源底座在预训练时很可能已经见过各种评测集的内容如果我们在微调数据里再混入同源的题目评估分数会虚高部署之后一测真实任务就现原形。所以我们每次准备数据都要专门跑一遍和评测集的相似度比对。2.2 词表与序列长度Tokenizer里的隐性决策Tokenizer决定了模型“看世界”的最小单位但很多人会把这一步完全交给现成工具。词表大小、合并规则、特殊token的设计都会影响训练效果和推理成本。常见的做法是训练一个字节对编码BPE词表规模在五万到十几万之间。词表太小一个词被拆成太多碎片序列变长计算量变大词表太大嵌入层的参数暴涨小数据量下反而学不好。实际项目中我会先拿一部分语料训练一个词表统计它的压缩率和覆盖情况再决定是否调整。对中文场景还要特别留意数字和英文的大小写形态、中英文混合的切分方式这些细节不处理干净模型在代码任务或中英混杂场景下会表现得格外迟钝。序列长度是另一个容易被忽略的决策。预训练时序列越长模型能看到的上下文越完整但注意力计算成本也越高。很多项目会选择先以较短的序列比如2048或4096完成大部分训练最后再用更长序列做少量“拉长训练”让模型适应长文本场景。这个策略既省钱又能兼顾效果是我们实操中比较稳妥的做法。2.3 数据配比给模型搭配“营养餐”数据配比其实就是决定“模型吃下去的每100个token里代码占多少、通用文本占多少、领域数据占多少”。别小看这个比例它直接塑造模型的“性格”。代码太多模型在各种任务里都会不自觉地输出Markdown格式连写个请假条都给你来个三连列表通用文本太多代码能力又会明显偏弱。配比没有万能公式但我见过比较合理的起点是通用文本占大头六成以上代码和结构化数据各占一到两成领域数据按需补充。然后通过一系列小规模的对照实验调比例——先用几亿token跑几组“小灶”看领域任务的评估曲线再决定全量阶段怎么配。还有一个细节训练过程中数据配比最好是有“节奏”的比如前中期多喂通用数据后期提高高质量指令和领域数据的比重这种渐进式配比往往比全程固定配比更稳。另外同一份数据在训练中被重复“投喂”的次数量级也很关键。一般来说数据量越少模型看到它的轮次就越多过拟合风险越大。我们的经验是把数据按质量分层高质量数据可以多过几遍低质量数据最多过一遍甚至直接扔掉这样才能把模型的能力上限顶上去。3. 预训练loss下降只是表象稳定不炸才是真功夫3.1 训练循环里每天都在重复的事预训练的日常说白了就是不断重复“前向计算—反向传播—更新参数”这个循环。模型吃进去一批文本预测下一个token是什么拿预测结果和真实文本算交叉熵损失然后通过反向传播算出梯度用优化器把参数往损失更低的方向挪一步。听起来很简单但把这个循环放到几千张卡上、跑上几个月复杂度和意外都会指数级上升。这里有个反直觉的点loss下降本身不代表训练健康。很多人都盯着训练日志里的loss曲线看它一路下行就觉得万事大吉可真正的工程风险往往藏在细节里。比如某一步的梯度出现了离群值参数一下被冲垮又比如数据某个分片里有大段重复内容模型在那一小段时间里loss降得特别快看似是“进步”实际是把那部分内容背了下来之后在其他数据上泛化一塌糊涂。所以我后来训练时不仅看整体loss还会盯分阶段、分数据域的loss曲线还要监控梯度范数、激活值分布这些更细的信号。3.2 学习率、批次大小与优化器看似经验实则规律的选择预训练里最常被问到的就是“学习率设多少”。这个数字不是拍脑袋拍出来的背后有一条朴素的权衡学习率太大参数更新幅度过猛训练容易震荡甚至发散学习率太小训练进展太慢几个月算力白烧也见不到效果。实际项目中我们常用AdamW这一类优化器配合warmup加余弦衰减的学习率调度。warmup的含义是训练刚开始时让学习率从很小逐步升到峰值帮模型在“初生状态”下站稳脚跟之后学习率按余弦曲线平滑衰减到接近零让模型在后期进入精细打磨状态。峰值学习率通常在“训练卡的数量、批次大小、模型结构”这几者共同作用的一个窄区间里选择很多团队的做法是先跑小规模的“学习率扫描”找出曲线最稳的区间再放大到全量训练上。批次大小同样有规律可循。直觉上批次越大每一步的梯度估计越准训练越稳但批次过大每一步能做的更新次数就变少最终效果未必更好。业界有一条被称为“缩放定律”的经验模型规模变大时批次大小和数据量也要跟着同步放大三者大致呈线性或幂律关系。我们实际做下来一般会在固定算力预算下用“虚拟批次大小”的策略——单次设备上的批次小一些但累积若干步之后再统一更新参数这样既省显存又能模拟出大批次训练的稳定效果。3.3 分布式训练的工程暗礁显存、吞吐与断点续训到了真正的全量训练阶段算法问题反而退居其次工程问题成了主角。单张训练卡的显存是有限的一个动辄几百亿甚至上千亿参数的模型参数本身、梯度、优化器状态加起来远超单卡显存不做分布式策略根本装不下。常见的解法是从数据并行、张量并行、流水线并行到各种混合策略。数据并行就是每张卡都放一份完整模型各吃各的数据最后同步梯度张量并行是把一层里的矩阵切到多张卡上流水线并行则是把网络按层切成几段卡与卡之间像流水线一样接力。这些策略各有代价通信开销、等待时间、显存冗余工程上就是在这些代价之间找平衡。我们实践中常用的还有混合精度训练用bf16之类的低精度格式存中间计算显著降低显存占用和带宽压力关键位置保留fp32精度以防数值问题。更让我印象深刻的是断点续训。几个月的大规模训练集群里某个节点随时可能出故障如果每隔一段时间不保存检查点一次宕机就可能让几天的算力全部作废。保存检查点本身也不能太频繁否则保存动作抢占带宽反而拖慢训练。我们在项目里通常按训练的固定步数周期保存保存前先“静默”同步所有卡的参数状态再压缩落盘。恢复时也要格外小心如果只恢复模型参数而没有把数据加载进度、随机数状态一起恢复训练的可复现性就会受影响后续曲线会对不上。还有一类工程暗礁是loss突然变成NaN或者出现“尖刺”。这背后可能是某条数据里有异常值也可能是学习率过大、梯度溢出。我们的排查顺序一般是这样先缩小范围定位是哪一堆数据触发的再检查梯度范数是否异常最后看是不是混合精度下某个数值下溢。排查一次这种问题的成本可能高达几天所以更稳妥的做法是提前设好梯度裁剪阈值在日志系统里加好告警让工程团队第一时间介入。4. 让模型从“会接话”到“会办事”监督微调与偏好对齐4.1 监督微调本质是教格式顺便教能力底座模型训练完之后它的行为是“续写”你给它一句“给我写一份总结”它大概率会顺着这句话继续写下去而不是停下来回答你。要让模型变成能对话的助手关键一步是监督微调。这一步做的事情是用大量“指令期望回答”的配对数据让模型学会对话的格式和意图。很多初学者觉得微调是“教模型新知识”这个理解不太准确。微调阶段的数据量通常只有预训练的极小一部分它更重要的作用是调整模型的“行为模式”——让它知道用户抛出指令时自己应该先理解指令、再组织答案而不是继续没完没了地生成下文。微调数据质量直接决定模型“听话”的程度。我们做微调数据时最重要的不是数量而是多样性和一致性。一个常见的误区是重复用同一批优质问答数据来回训练结果模型把这几条回答背得滚瓜烂熟遇到稍微变一下说法的指令就乱套。更合理的做法是把指令形式做得尽量多样短指令、长指令、带约束的指令、多轮对话的指令混合在一起。每条回答的语气、结构也要尽量统一否则模型会学到“东一榔头西一棒子”的表达风格。微调时的超参数也同样敏感学习率一般比预训练低一个数量级以上训练轮数通常只有一到三轮。过度微调是非常容易踩的坑模型在微调数据上表现近乎完美但通用能力明显退化说话变得“模板化”。判断是不是过拟合了不能只看微调集上的指标要拿一批模型没见过的指令做“抽查”听它回答新问题的自然度。4.2 偏好对齐让模型学会“人类觉得什么更好”监督微调之后模型已经能“好好说话”了但它并不一定知道什么回答是“更好”的。比如同一个问题可能有三种答案一种简洁准确一种啰嗦但信息全一种看似礼貌实则回避问题。要教模型分辨优劣就需要偏好对齐。业界最经典的做法是基于人类反馈的强化学习也就是大家常说的RLHF。第一步先收集大量“同一个问题、多个回答、按人类偏好排序”的数据集用它训练一个奖励模型让奖励模型学会给回答打分。第二步再让主模型自己去生成回答用奖励模型打分通过强化学习算法把“预期得分高”的行为方式强化进主模型里。这套流程的效果很显著但也有两个非常现实的难点奖励模型打分的偏差会直接污染主模型强化学习训练过程中模型可能“钻空子”学会了能拿高分但事实上并没有更好回答的投机行为。后来社区里出现了更轻量的替代方案比如直接偏好优化DPO思路是不再单独训练奖励模型而是直接用偏好数据调整主模型的策略。这类方法在中小规模项目里更容易落地节省了大量训练开销。但我们用它的时候也发现它对偏好数据本身的质量极其敏感数据里如果存在“标注员自己都拿不准孰优孰劣”的样本训练出来的模型反而会变得含糊其辞。4.3 对齐税越乖巧越“笨”的尴尬做对齐训练时间长了你会碰上一个挺无奈的现象模型越是被调教得“懂事”它在某些能力指标上的得分反而越低。这个现象在社区里被叫作“对齐税”。解释起来也不复杂——模型在迎合人类偏好和保持自身能力的平衡中会牺牲一部分原有的泛化能力。尤其当偏好数据里大量充斥着“安全、礼貌、避免争议”类的样本时模型会变得越来越谨慎甚至对正常问题也拒绝回答这就是过度对齐。怎么缓解我的经验是多做“控制变量”对齐训练之后一定要回到预训练阶段的评测集上重新跑一遍对比通用能力是否明显下滑。如果下滑明显就要检查是不是偏好数据太单一或者训练强度过大。另一个常用技巧是混合少量高质量、更“天真”的底座数据一起训练相当于在乖巧和能力之间拉一条缓冲带。对齐从来不是一锤子买卖它是一个需要反复权衡、渐进调整的过程。5. 评估与迭代没有评测的训练等于闭着眼开车5.1 公开榜单只能当参考线不能当终点线我见过不少项目训练结束之后大家最开心的时刻是看到模型在几个公开评测集上分数上涨然后就直接对外宣发。但说实话公开榜单一来存在严重的“题库泄漏”风险模型训练数据里可能早已包含了类似题目二来评分方式过于机械选择题、填空题能反映一部分知识掌握程度却完全测不出对话的自然度、逻辑的连贯性。所以我们内部做评估时会自建一套评测集。这套评测集围绕真实业务场景设计客服场景里用户怎么问、开发场景里模型该给什么样的代码、写作场景里用户期望什么风格。评测集里的题目会被严格隔离在训练数据之外每次微调或对齐之后都跑一遍相同的评测集对比得分变化。只有在这个自建评测集上稳定提升我才会认为这次训练是有效的。5.2 找坏例、修数据、再训练的循环才是真正的迭代真正让模型质量螺旋上升的不是调参技巧而是一套“找坏例—分析根因—修数据—再训练”的迭代循环。每次训练完我们会拿模型去跑大量真实用户问法把回答质量差的样本捞出来。然后逐个看是模型不知道这个知识是理解了但表达不对是指令压根没读懂还是被数据污染带偏了针对不同的根因修法完全不同。知识缺失就要补高质量语料做继续预训练表达不对就要在微调阶段多加强这类句式的对齐样本指令理解差则要考虑是不是指令数据的多样性不够。这个过程很枯燥但它是模型效果提升的真正驱动。坦率地讲大部分外部看起来“惊艳”的模型背后靠的都不是什么神秘算法而是成百上千次这样的坏例分析循环堆出来的。评估环节还有一个容易被忽略的维度回归测试。你为了修A类问题可能顺手把B类能力弄坏了这是模型训练里极其常见的“按下葫芦浮起瓢”。所以每次更新的模型不仅要看目标能力有没有提升还要把历史积累的评测集全部回归一遍。一旦发现某类能力明显退化就要回头审视最近一次训练的数据配比和超参设置决定是回滚还是继续微调补偿。6. 练完三四个模型后我最想叮嘱的几件事6.1 实验记录是最大的资产训练一个模型动辄消耗大量算力但如果过程没有记录好那这笔投入就只换来一个“模型文件”下回还想复现或者定位问题几乎无从下手。我从第一次训练开始就强制自己记录数据版本、清洗规则、词表配置、配比方案、学习率、批次大小、检查点路径、训练卡数量、每个阶段的评测得分。别嫌琐碎等模型出了问题需要回溯时这些记录比任何代码注释都值钱。现在有不少实验管理工具可以做自动记录但更关键的是团队是否养成了这个习惯。6.2 小规模验证跑通再上全量这是我最想强调的一条经验。很多人直接拿全量数据和完整模型开跑结果要么是数据管道有bug跑到一半才发现数据加载出来全是空的要么是并行策略写错一个月后才发现通信瓶颈严重。我们现在的流程是先用极小规模的数据子集、缩小版的模型把整条训练链路完整跑通一遍确认loss能正常下降、检查点能正常保存、恢复训练能正常衔接。全链路验证通过之后再逐步放大到全量。这个“试跑”环节看似浪费了几天时间实际上替我们省掉了无数次返工。6.3 别把全部筹码押在“炼丹”上最后想说一点边界之外的事模型训练只是整个产品的一部分。模型练出来了还要做推理加速、服务部署、数据回流、大模型应用的容错设计。很多团队把全部精力押在训练调参上结果模型还没上线就发现推理延迟过高、成本无法承受。我的体会是训练团队最好在早期就和推理、产品团队对齐“可服务的规格”——响应时间、并发量、单次调用成本这些约束反过来会倒推训练时的模型规模、量化策略、序列长度选择。一个能跑起来的模型永远比一个只活在实验报告里的高分模型更有价值。
觉得有用,分享给同行:

为您的企业打造数字门面

稳重轻奢商务风格,端正雅致视觉,长效耐看不易过时。

立即咨询 →