ARTICLE DETAIL

资讯详情

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

大模型训练全流程实战:从数据清洗到评估的完整指南

大模型训练全流程实战:从数据清洗到评估的完整指南 大模型训练这件事网上说的人多真正从数据到评估完整跑通的人少。大多数人看到的是各家机构发布的模型卡和论文真正实践时面对的却是数据清洗、loss异常、显存爆炸、对齐效果不稳定这些具体问题。这篇内容我按真实训练流程来写从数据准备、预训练、SFT、DPO/RLHF到评估每个环节都给出可落地的方案和参数参考也包括踩坑记录。无论你是想从零训练一个百亿级模型还是只想系统理解大模型训练全链路都可以按这条路径走一遍。1. 先搞清楚一件事你到底要不要从零训1.1 从零训练不是炫技而是需求驱动的决策在这个开源模型遍地都是的时代从零训练一个大模型并不是默认选项它只适用于几类特定场景。我在决定启动这个项目前花了整整两周做前期论证核心就一个问题现有的开源模型能不能满足需求先说结论如果你的任务是中文长文本理解、垂直领域知识密集型问答、特定格式生成微调一个开源基座就足够了从零训练反而会拖垮预算和迭代周期。但如果你的场景同时满足以下条件从零训练才值得考虑第一领域数据在通用语料中占比极低比如特定古籍整理、特殊行业文档结构化、某种专业符号体系的翻译这些内容在开源模型的预训练语料里几乎不存在单纯靠微调是“无中生有”模型很难学会。第二你对模型架构和训练流程有改造需求比如要改注意力机制、要接入特殊编码器、要控制词表大小以适应某些边缘设备从已有模型改架构的难度往往大于从头训一个。第三你有长期迭代的计划模型底座要持续升级从零训练能让你完整掌握数据配比、训练节奏、对齐策略这些环节后面每次迭代都是可控的。我这次训练的模型定位是“中文百科全书式问答助手”语料以中文高质量文本为主参数量定在3B级别。选这个规模的原因很实际单机8卡A10080G就能完成预训练总成本可控迭代速度快且在推理侧部署成本低。很多人一上来就奔着几十B甚至上百B去结果卡在显存和电力预算上项目就烂尾了。如果你的资源有限建议从1B到3B起步把全链路跑通再考虑放大。1.2 路线图与真实成本估算整个训练链路我拆成了五个阶段每个阶段的耗时和成本完全不一样。预训练占大头大概占整体预算的70%以上SFT和对齐阶段虽然数据量小得多但需要反复调参实验迭代次数反而很多评估看似简单但真正的有效评估需要大量人力投入标注这块往往被低估。用3B模型、中文语料1万亿token来算一笔账在8卡A100上每卡每秒约处理3000-5000 token取决于上下文长度和优化器配置理论吞吐量大约是每秒3万-4万 token。每小时能处理1.1亿-1.4亿 token1万亿token需要约710-900小时即30-40天连续训练。按A100租用市场行情算这个阶段的成本约15万-25万元人民币。如果数据量减到5000亿token成本和周期都能减半。SFT阶段的数据量通常在100万-500万条指令对训练3-5个epoch8卡并行下一天内就能完成。DPO或RLHF阶段的数据量在10万-50万条偏好对训练也不超过一天。但这两个阶段由于要反复实验不同参数实际消耗的时间可能是训练本身的好几倍。我强烈建议在项目启动前就明确“每个阶段的可接受最低效果指标”。比如预训练阶段验证集loss下降到某个值才进入SFTSFT后人工抽测回答质量达标率多少对齐后安全评测通过率多少。没有这些量化指标你会陷入无休止的调参循环。2. 数据工程决定模型上限的第一道工序2.1 数据从哪来混合多源语料的配比思路大模型的能力上限很大程度上在数据阶段就锁定了。模型架构和训练技巧只是把数据里蕴含的知识和模式提取出来数据里没有的东西模型不可能凭空学会。所以数据工程这部分值得你投入最大的精力。我从五个来源收集语料每个来源的配比经过了多轮实验调整通用网页文本来自Common Crawl的中文子集、中文维基百科、百度百科等占比约60%。这部分提供基础语言能力和世界知识但噪声很大必须严格清洗。高质量书籍与论文各类公开的中文书籍、arXiv论文、期刊资源占比约15%。这部分语言质量高、逻辑性强对模型的长文理解和推理能力帮助很大但数量有限需要反复清洗和去重。结构化知识库包括百科类结构化数据、领域知识图谱、医学/法律/工程等专项数据库占比约10%。这部分决定了后续微调阶段的上限如果这里的领域数据质量不行后面花再多精力对齐也补不回来。对话与社区语料知乎、豆瓣、百度贴吧等平台的公开数据占比约10%。这部分语料口语化强对模型后续“像人一样说话”很有帮助但涉及隐私和安全的内容必须过滤掉。代码数据GitHub公开代码库的中文注释、技术文档占比约5%。代码语料能显著增强模型对逻辑和结构化信息的理解能力即使你的任务不涉及写代码也建议保留少量代码数据。这个配比不是一次到位的。我第一版训练用了纯网页文本结果模型生成的内容虽然通顺但事实性极差一句话里三个事实错两个。后来逐步加入书籍和结构化和知识库事实性才明显提升。建议你每次改配比之后都做一次小规模比如10亿token的试训练对比效果再决定下一步不要一次投入全部数据。2.2 清洗、去重、质量过滤一个都不能少数据清洗的流程我按“规则清洗→质量过滤→语义去重→安全检查”四步来做每一步都不省。规则清洗解决的是明显垃圾HTML标签、控制字符、只包含数字或符号的无效行、乱码文本、广告和营销内容。我用了一套基于规则的正则表达式加上布隆过滤器做URL去重。公开爬取语料里总有大量低质内容清洗后往往能减掉20%-30%的原始文本。质量过滤这一步很关键。我用了两个维度文本长度和困惑度。单条样本少于200个字符的直接丢弃因为短文本很难提供完整的语义信息困惑度过高的文本通常是乱码或极端口语化内容也直接过滤。困惑度的阈值我在实验中选择的分数是“PPL500则丢弃”结合语言模型打分这一步能把剩余噪声再压掉一半。实际操作时你不需要自己训一个打分模型用现成的小型bert或xlm-roberta即可速度也够快。语义去重不能只靠字符串匹配。我用MinHash加LSH方案先对文本做jaccard相似度计算并分组再做簇内过滤。相似度超过0.85的文本只保留一条优先保留来自更高质量源的那条。这个步骤的重要性被很多人低估——重复数据会直接导致模型过拟合在评估集上表现为泛化能力差生成内容严重的复读倾向。安全检查这步不容含糊。大模型训练语料里如果混入大量违法违规内容模型会在生成阶段直接复现。我用关键词黑名单加分类模型双重过滤黑名单覆盖色情、暴力、赌博等类别。这一步必须做不只是合规问题也是模型质量的基本保障。2.3 tokenization与数据配比的主要参数tokenization是大模型训练里容易被忽略但实际影响很大的环节。中文的tokenize方式和英文不同如果直接用BPE切中文会产生大量碎片化的token降低训练效率。我用的方案是基于sentencepiece训练一个词表为5万的中文spm模型采用byte-level BPE方法把中文字符、常用词、英文单词、代码符号都纳入词表中。词表大小需要把握一个平衡太小会导致单字被拆多次训练效率低太大会让embedding矩阵过大增加训练参数量。5万对3B模型是个稳妥的选择embedding和输出层的参数量大约占模型总参数的30%这个占比是可控的。如果你准备训练更大规模的模型词表可以适当放大到8万到10万但要提前算好显存。tokenization之后要做数据配比与混洗。我采用的是“先按配比混合再全局随机打乱”的方式。注意这里的细节如果不同来源的数据本身是分文件存储的一定要在按比例融合后再做全量随机shuffle否则模型会在训练早期集中学习某一种分布的数据出现阶段性的loss异常波动。另外提醒一点数据管道的数据加载和预处理必须以离线完成的中间格式进行。把原始文本直接在训练循环里做tokenize速度会慢到难以接受。我通常先把全部数据离线tokenize为二进制格式如arrow或mmap训练时直接读token序列既省CPU也方便做断点续训。3. 预训练最关键也最枯燥的一环3.1 基础配置与关键参数预训练阶段的核心配置我直接给出一份经过验证的参数组合3B模型、中文语料场景下可以直接参考# 模型结构3B级别 hidden_size: 2560 num_hidden_layers: 32 num_attention_heads: 32 intermediate_size: 10240 max_position_embeddings: 8192 vocab_size: 50000 # 训练配置 batch_size: 512 (按序列长度8192计算) learning_rate: 1.5e-4 warmup_steps: 2000 lr_scheduler: cosine weight_decay: 0.1 optimizer: adamw3B级别建议用bf16混合精度训练。A100对bf16的支持很好训练速度约是fp32的2-3倍显存还省一半。梯度累积步数设为8每批次有效样本数为1024。序列长度从4096开始预训练到一半再切换为8192这种动态长度策略能降低前期训练成本同时让模型更平滑地适应长文本。学习率是最敏感的超参数。我在实验中对比了1e-4到3e-4几个档位1.5e-4表现最稳。如果你发现训练中期loss出现明显震荡可以适当降低学习率但如果前期就不收敛问题往往不在学习率而在数据或embedding初始化。warmup步数大概占整个训练步数的1%-2%即可太少会导致大学习率冲击底层embedding太多则浪费训练时间。优化器选择AdamW基本是业界的通用做法没有需要特殊折腾的地方。但有两个细节值得注意权重衰减不要加在LayerNorm层和bias上否则会影响训练稳定性梯度裁剪设置为1.0防止个别样本产生超大梯度导致loss尖峰。3.2 Loss曲线怎么看什么情况该停了预训练阶段每天做得最多的事情就是看loss曲线。很多人只看整体loss下降觉得在降就行其实几种异常模式需要特别警惕。第一种loss降到一定程度后长期平台怎么调学习率都在原地波动。这种情况通常是数据问题常见的是清洗后保留的文本过于同质化或者有效token占比过低。我用神州数码的一次经历举个例子某次训练loss卡在2.3附近一周没动我把验证集loss按数据来源拆分来看发现其中代码语料占比最高的子集loss一直在涨说明是代码数据分布和训练数据不一致导致的。换掉了一批格式异常的代码文件后loss才继续下降。第二种loss周期性尖峰。每个几千步就冒出一个高峰再回落这通常是某个batch里有污染数据比如清洗漏掉的乱码文本。我的做法是定位到引起尖峰的batch把样本拿出来人工检查确认是异常数据就把它从训练集中剔除。不处理的话尖峰会导致模型学习到噪声模式。第三种验证集loss和训练集loss差距越来越大也就是过拟合信号。预训练阶段通常不会明显过拟合但如果你数据量很小又训练过多个epoch就会出现这种情况。这时候不要单纯加数据先检查是不是训练集和验证集之间混入了重复数据。“什么时候停”这个问题我建议不要只看loss绝对值还要看具体能力指标。比如我在训练中每5000步保存一个checkpoint同时跑一次小规模评测包括通用问答、知识问答、代码生成三个维度观察这些任务的表现和loss下降之间的对应关系。通常loss下降的前期任务效果提升明显到了后期loss还在降但任务效果增长趋于平缓这时候就可以评估是否值得继续烧钱。3.3 检查点管理、恢复训练与显存优化预训练动辄几十天检查点管理决定你的容错能力。我每1000步保存一个检查点保留最近5个每5000步保存一个里程碑检查点永久保留。这样即使中途崩溃最多丢失1000步的训练进度折合时间约1-2小时。保存时用异步方式把写入磁盘和训练并行处理避免保存过程阻塞训练。断点恢复训练是最必须掌握的操作。很多框架如Megatron-LM、DeepSpeed都支持从指定checkpoint恢复关键是要保证随机种子、数据加载位置、学习率调度器的状态都和保存时一致。我踩过最大的坑是忘记恢复数据加载位置导致断点后重复读了一段已训练过的数据相当于重启了一个小型的过拟合实验。恢复后我会空跑100步对比loss曲线是否与原训练曲线平滑衔接有问题就立即停止排查。显存优化方面如果8卡A100不够用可以逐一添加以下手段开启activation checkpointing用计算换显存梯度累积用小batch多次累积到目标batchZeRO-3将优化器状态在数据并行组间分片这部分能显著降低显存。我在1024batch_size、8192序列长度下单卡峰值显存稳定在76G左右预留了约5%的余量跑得很稳。训练吞吐方面有一个恒等式有效吞吐等于“global_batch_size乘以每秒迭代数”。如果你发现吞吐率远低于理论值优先排查数据加载瓶颈。我的数据管道用了异步预取和预缓存把tokenize后的数据直接缓存在内存中训练过程完全不出现GPU等待的情况。4. 从会接话到会干活SFT阶段4.1 指令数据的构建与格式预训练完成后的模型能续写文本但不具备“听懂指令”的能力。你要让模型从“填空式生成”变成“任务执行式生成”这一步靠的正是SFT。SFT数据决定了模型的“性格”和基本行为模式质量压倒数量。我搭建SFT数据集时定义了超过30种任务类型从最基础的问答、摘要、翻译到更复杂的代码生成、推理分析、结构化抽取。每个任务类型都设计了对应的指令模板同一个任务至少写10种不同的表达方式避免模型对措辞过拟合。指令格式方面我用的chat式模板三部分结构system角色设定可选、user用户指令或问题、assistant期望输出。模板必须全程统一这直接关系到后续RLHF阶段和推理阶段的数据格式SFT阶段格式不一致后面所有工作都会乱套。一条高质量的SFT数据长这样{ instruction: 请分析下列文本的主旨并用不超过三句话概括。, input: 近日某研究团队发布了一项关于深海热液区微生物群落的研究成果研究显示这些极端环境中的微生物具有独特的代谢途径..., output: 该研究聚焦深海热液区的微生物群落揭示了极端环境下微生物的特殊代谢机制对了解生命适应极限具有重要意义。 }每条数据必须经过人工质量抽检。我按1%的比例抽检抽检不合格率超过3%就返工重写。因为一个坏数据对模型的影响不是一两个样本的问题而是会在模型内部形成错误映射后面很难纠正。4.2 SFT训练技巧与loss解析SFT阶段的训练配置和预训练差异很大我认为这是全链路里最需要“控制住手”的阶段。学习率主要策略是要降低到预训练的十分之一到五十分之一通常在1e-5到5e-5之间。过大的学习率会破坏预训练已经学到的知识。我观察到一个具体现象学习率用到2e-4时SFT训练出来模型的通用知识问答能力明显下降而用2e-5时则几乎无影响。这就是“灾难性遗忘”在SFT阶段的典型表现。训练轮次epoch不宜过大。我的SFT数据约200万条训练3个epoch基本收敛再多就有过拟合风险。判断依据验证集loss在第二个epoch后持续上升而训练集loss继续下降说明模型开始死记硬背指令数据而不是学会泛化。如果你用的数据量较小比如只有10万条1-2个epoch就足够了。SFT阶段loss的绝对数值参考价值有限我更看重loss下降后的分布情况。具体做法是训练结束后用一组从未见过的指令让模型生成对比输出的多样性、信息度和格式正确性。如果模型输出千篇一律那么即使loss再低这个SFT也是失败的。一个额外技巧在SFT数据集里混入10%-20%的纯预训练数据原始语料不含指令格式能显著抑制灾难性遗忘。这个做法称为数据混合实测下来能让模型在保持指令遵循能力的同时尽量维持预训练阶段获取的通用知识。4.3 合成数据与人工标注的取舍指令数据的来源不能只靠人工写。维护一支标注团队的成本极大我采用的是“人工标注 合成数据”混合方式。合成数据是用已有的大模型GPT系列、Claude或者开源模型生成的指令对。但直接生成的脏数据不能用必须经过过滤和重写。我的流程是先让一个较强的模型生成候选指令对再用规则加人工抽检做过滤最后将过滤后的数据交给标注人员重写增强。合成数据大约占SFT总数据的60%人工数据占40%。这里其实有一个容易被忽略的“天花板问题”学生模型的水平超不过老师模型时合成数据越多模型上限越受限于教师模型。所以合成数据绝不是越多越好。我在试验中发现当合成数据占比超过70%模型输出的风格和内容开始明显趋近于教师模型的风格原创性和多样性反而下降。此外你还要警惕数据污染——如果合成数据里有教师模型的错误知识学生模型会把错误“巩固”下来。人工标准数据的价值是给模型提供高质量“示范点”弥补合成数据分布不均匀的问题。建议人工标注优先覆盖复杂推理题、专业领域知识点、多伦对话、安全边界场景。这些场景合成数据往往质量不稳定但人工可控性最强。5. 对齐阶段DPO与RLHF怎么选5.1 偏好数据从哪来SFT让模型学会了“怎么回答”而对齐让模型学会“什么回答更好”。无论选DPO还是RLHF第一步都是要构造偏好数据。偏好数据的来源主要有三种人工标注、模型自动对比、线上反馈。人工标注最贵但质量最高适合做核心偏好集模型自动对比可以用一个强模型比如GPT-4来比较不同回答的质量速度快但会有Bias线上反馈适合产品已上线的场景用真实用户的点赞/踩来构造偏好对。我采用的比例是人工标注60%、模型对比40%总计50万条偏好对。每条数据包含一个prompt、两个候选回答chosen和rejected、以及选择的依据说明。chosen和rejected的结构必须保持选择的依据要写清楚目的不是为了让人看懂而是为了后续数据审核时可以追溯方便找出标注错误和矛盾标注。偏好数据的一致性检查相当重要相同prompt下两条数据不能出现互相矛盾的偏好标注。这是一项繁琐的体力活但如果不做后续DPO或RLHF训练时模型学到的是混乱的奖励信号效果很可能不升反降。5.2 RLHF完整链路与实现细节如果你听信一些博主说的“RLHF就是PPO套上去就行”那你大概率会走进一个漫长的烧钱期。任何一个做过RLHF的人都会告诉你这条链路最大的复杂度在于四个组件Actor模型、Reward模型、Critic模型、Reference模型。训练流程分三步走。第一步训练Reward模型用偏好数据训练一个给回答打分的模型这个模型通常和Actor模型同规模或略小。第二步冻结Reference模型就是SFT后的模型它作为KL散度的约束基准防止Actor在训练中跑偏太远。第三步用PPO算法循环迭代Actor生成回答Reward模型打分Critic模型估计优势函数然后根据优势函数更新策略。PPO阶段的关键参数我给出一个稳定的组合kl_coef: 0.05 clip_epsilon: 0.2 entropy_beta: 0.01 # 熵正则强度 reward_model_batch_size: 128 ppo_epochs_per_batch: 4视野rollout里最需要盯的指标是kl散度。如果kl散度在训练开始后快速增大说明模型在偏离参考策略生成内容可能开始飘这时需要提高kl_coef值或者降低学习率。另一个需要监视的是模型的输出长度PPO训练中模型会在奖励驱动下产生回答越来越长的趋势因为长回答往往能得到更高分数这种长度退化需要靠约束输出长度来抑制。RLHF的成本是SFT的5-10倍这是是正常的节奏。每次PPO迭代中要反复让Actor生成和评分消耗大量算力。训练相对稳定的情况下大约2-3天可以完成一个收敛周期。5.3 DPO的实现与稳定性问题DPO全称是Direct Preference Optimization它的核心思路是不用训练一个独立的Reward模型而是直接把偏好目标转成策略模型的训练信号。相比RLHFDPO实现简单得多训练稳定性也好得多我用DPO做主线对齐然后用RLHF做精细微调。DPO的损失函数核心是让chosen的回答相对于rejected的回答有更高的概率。具体实现时需要同时计算Actor模型在chosen和rejected上的log概率还要计算Reference模型在同样数据上的log概率。关键的系数beta遗传正则强度控制模型偏离参考策略的幅度。我给的参考参数beta: 0.1 # 这个值越小越激进越大越保守 learning_rate: 5e-6 # DPO阶段学习率必须很小 batch_size: 32 max_length: 2048DPO的坑我觉得有两个。第一个是额外要拿到chosen和rejected的完整输出不能只存文本还要存logprob。第二个是DPO训练过程中容易发生“奖励黑客”也就是模型找到了某种提升chosen概率的捷径比如改变输出格式而不是内容质量。判断的方法是写一个格式占比统计器观察chosen和rejected在长度、标点、特殊标记等维度的分布如果训练后这些差距显著拉大就说明模型在用格式作弊。DPO之后的模型一般比RLHF更“锐利”但也会更容易出现安全边界被突破的情况原因就在于DPO没有奖励模型的软约束。所以DPO之后通常建议用一轮轻度RLHF做安全对齐或者至少在偏好数据里加大安全边界场景的比例。6. 评估别只看Loss要看真实能力6.1 基准测试的选择与局限训练完的模型效果如何不能凭感觉判断。但基准测试本身就是一门博弈你需要知道每个基准到底在测什么。我评估3B模型时用了这样一个组合基准名称考察维度我对它的信任度C-Eval中文综合知识中会有数据污染风险MMLU英文综合知识低因为模型以中文为主CMB中文医学知识中高领域专项测试HumanEval代码生成中GSM8K数学推理中高自定义业务测试集真实业务任务最高必须自己搭公开基准有个致命问题数据污染。如果基准题出现在预训练或SFT数据里无论是原始语料还是合成数据模型就相当于“考前看过答案”。判断污染的办法是用一个训练前的模型跑同样基准对比分数差异如果从随机水平直接跳到高水平大概率就是数据污染了。我建议每个项目都必须搭建自己的业务测试集至少覆盖你的核心使用场景比如1000条真实用户问题由人工标注标准答案。这个测试集在整个训练过程中保持冻结每个关键节点都跑一遍以此作为“真值”。6.2 人工评估的流程设计自动化基准能测出模型的基础能力但真实交互体验还得靠人工评估。我设计了一套双项人工评估流程能力维度评估和偏好评估。能力维度评估把输出质量拆成四个维度打分信息准确性关键事实有没有错、逻辑连贯性前后是否自洽、指令遵循度有没有按格式和长度要求来、有帮助性整体上有没有解决问题。每个样本两到三个人标注取平均分。偏好评估是更简单直接的标签“A还是B”就是让标注者同时看两个模型的回答选出更优的那个。这个流程虽然粗糙但最能反映真实用户感受而且还能作为后续DPO偏好数据的补充来源。我建议在人工评估中定期加入“盲测对照”不告诉标注者哪个是哪个模型避免因先入为主的品牌印象而产生系统性偏差。6.3 安全性与幻觉检测对齐之后模型变得“听话”了但安全性和幻觉问题仍然需要专项检测。安全性检测方面我构建了约500条对抗性样本覆盖诱导泄露、违法信息请求、恶意代码生成、侮辱性内容生成等类别。检测结果中最理想的全通过率应为95%以上如果低于这个标准唯一的补救办法是回到对齐阶段补充对应的偏好数据重新训练一轮。幻觉检测是我觉得整个评估环节里最值得投入的部分。用无攻击性但事实性要求高的问题比如“某某机构成立于哪一年”“某个专业术语的定义是什么”然后人工逐条核对模型输出的每句话是否和权威来源一致。模型的幻觉来源通常有两个一个是训练数据本身有错误知识另一个是生成阶段为了“凑内容”编造事实。前者难以根治只能靠数据清洗时提升来源可信度后者可以通过调整采样参数、降低温度值来缓解。7. 踩坑记录与实操心得7.1 我遇到过的七个典型问题及解决方案第一个坑预训练Keyword里没有设置固定随机种子结果断点恢复时种子不一致导致重复数据训练。解决方案是把所有可能导致随机性的部分数据shuffle、dropout的seed都固定下来并在checkpoint里保存。第二个坑SFT数据里混入了几条因为模板拼接错误产生的“空指令对”——就是system为空但user也为空的数据。模型学到后碰到空输入会产出大量无意义内容。解决方式是数据上线前跑一次完整的数据校验统计每段数据的长度分布发现异常样本立即剔除。第三个坑DPO训练时Reference模型没有完全冻结。因为在代码里不小心把Reference模型也设为了可训练状态导致reference的分布跟着变化训练了一个小时后才察觉。这提醒我在Reference模型前必须显式设置requires_grad为False。第四个坑PPO训练时经验回收机制timesteps累积设置过低导致reward信号被旧策略污染。简单说就是数据的时效性被拉低了模型学到的奖励信号失真。用标准的per-episode回放并在每次更新前清空旧的rollout数据就好。第五个坑动用了不合适的设备跑长文本序列。模型max_position_embeddings设置到8192但某次升级代码时误把训练序列改成了16384。显存立即溢出训练崩溃。建议每次改配置前都检查序列长度、batch_size、显存这三个变量。第六个坑tokenizer的vocab在预训练和SFT之间发生了更新导致SFT阶段无法精确映射token。这个问题相当隐蔽表现形式是模型输出质量下降但无法定位。我的解决办法是在项目开始就把tokenizer固化为一个不可变版本任何修改都要重跑一遍全流程。第七个坑合成SFT数据中出现了“标签泄漏”——生成答案直接包含了输入数据中隐藏的正确答案。比如让模型根据文章写摘要时摘要直接复制了文章最后一句。这会让模型学会“复制”而不是“概括”。需要针对“复制率过高”做专项检测超过阈值就重写那批数据。7.2 一些省钱省时的建议大模型训练的项目管理比技术本身更考验人的耐心和判断力。用“小规模试错”模式来替代“一步到位”的大规模训练所有改动都要先跑一轮小的验证实验比如用10亿token验证数据配比用1万条指令验证SFT策略。等小规模实验通过再放大到全量数据。这个模式看似多花了时间实际上帮你省掉的是灾难性失败的成本。数据版本管理是大模型训练里最容易被忽略的基础设施。我把每次数据清洗后的数据、每个阶段的训练数据都打了snapshot用类似dvc的方案管理。没有这套管理机制你会在一次次实验迭代中迷失方向搞不清某个效果好的模型用的究竟是哪一版数据。最后想说一个项目运行的小技巧每轮训练结束之后跑一套“回归测试”再继续下一阶段。具体操作是把已经通过的历史评测集拿出来重新跑一遍确保新阶段的改动没有让老能力退化。表面上看是保守实际上是在为长期迭代建一个安全网每一次模型更新都心里有数。我自己实际做完一遍全流程之后最大的体会是大模型的训练没有玄学很多看似“灵光一现”的效果提升大多来自数据质量和评估体系的可控改善。如果你在某个环节卡住了很久通常不是训练技巧的问题而是数据或评估的标准没有定好。把这两件事管住了全流程的可操作性会超出你最初的预期。
返回列表