尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

持续预训练:从通用大模型到行业大模型的完整实践指南

持续预训练:从通用大模型到行业大模型的完整实践指南 通用大模型在通用场景里能聊天、能写代码、能对答如流可一旦落到具体的行业场景比如医疗、法律、金融、能源、制造业很多时候就露怯了。不是说模型变笨了而是它压根没有见过足够多的行业语料。比如你问一个通用基座模型“变压器油中溶解气体分析的三比值法是什么”它可能给你一段看似合理但完全经不起推敲的答案。这时候企业面前其实就两条路一条是拿行业数据做微调SFT另一条就是做持续预训练Continued Pre-Training简称CPT。前者见效快但只是让模型“学会说话的方式”后者才是让模型“真正懂行”的关键步骤。这篇文章我就围绕Continued Pre-Training这件事把企业如何把通用大模型训练成行业模型的完整思路、数据工程、训练策略、资源评估、评估迭代和踩坑实录一次讲清楚适合算法工程师、AI团队负责人、技术决策者参考。我默认看这篇文章的人已经对Transformer、大模型的基本训练流程有一定了解至少知道loss、batch size、学习率这些概念。如果完全零基础建议先补一下大模型训练的基础知识再来看CPT不然很多参数为什么要这样设会理解不到位。1. 通用大模型的“行业缺陷”为什么训练完成的模型还要再训练1.1 行业语料在大模型预训练阶段的天然缺位通用大模型在预训练阶段语料来源基本是Common Crawl、维基百科、书籍、论文、开源代码这些公开资源。这些数据的特点是量大、覆盖面广但是行业深度严重不足。举个例子一个模型可能在预训练阶段见过几万篇医疗科普文章但它见到的真实电子病历、影像报告、病理诊断描述可能少得可怜。为什么因为这类数据根本不可能大规模出现在公开互联网上它们存在于各家医院的系统里、律所的档案柜里、银行的交易日志里。这就导致一个结果通用大模型对行业术语的“表面语义”有感知但对行业内部的“深层语义”基本无知。它能理解“高血压”这个词的字面意思但它不知道在真实病历中“血压控制不佳”后面通常跟着哪些并发症描述、用药调整方案、随访要求。这种行业语境的缺失不是靠微调能补回来的因为微调的样本量通常只有几万到几十万条它在改变模型行为模式方面很有效但在注入新知识方面效果有限。1.2 Continued Pre-Training到底在做什么Continued Pre-Training的本质是在通用大模型已经训练好的基础上用行业语料继续做自监督学习训练目标和预训练阶段一样还是预测下一个token。只不过这次用的语料全部来自目标行业让模型在原有知识的基础上把行业语料的统计规律、术语搭配、上下文关系“吸收”进模型参数里。用个比较接地气的类比一个刚毕业的医学生通用大模型理论基础扎实能应对各种标准化考试但他还不会看病。在医院实习轮转CPT的过程中他接触了大量真实病例逐渐知道“急性腹痛”后面该排查什么、“胸痛伴出汗”意味着什么风险。这些经验不是背公式背出来的是在大量真实案例中潜移默化形成的。CPT对行业大模型的意义就是这样它让模型从“知道这个行业存在”变成“熟悉这个行业的思维方式和表达习惯”。1.3 CPT和SFT的分工先让模型懂行再教模型做事很多团队容易把CPT和SFT混为一谈或者干脆跳过CPT直接用业务数据做SFT这是我在实际项目中见过最多的问题。两者的分工其实非常明确CPT解决的是“知识”问题让模型知道行业里有哪些概念、术语怎么用、不同实体之间是什么关系、行业文档的行文逻辑是什么。它的数据不需要标注只需要“干净”的行业文本训练目标是自监督的token预测。SFT解决的是“行为”问题让模型学会按照指令回答问题、遵循格式要求、执行特定任务。它的数据需要人工标注或从真实业务流中采集格式是“指令-回答”对。一个行业模型真正落地通常是先做CPT再做SFT。先通过CPT把行业知识注入模型把模型从“通用模式”切换到“行业模式”然后再用少量高质量的SFT数据教会它如何回答问题、如何遵循业务规范。如果跳过CPT直接SFT模型会表现得像“一个懂得行业话术但缺乏行业常识的外行”表面上对答如流深挖细节就露馅。2. 动手之前先想清楚CPT的数据工程与语料配比2.1 行业语料从哪里来来源渠道与优先级排序数据是CPT项目的重中之重数据质量直接决定训练效果。我见过太多团队一上来就问训练参数怎么设、要用多少张卡结果数据质量一塌糊涂训练出来效果稀烂还以为是超参的问题。实际上CPT项目百分之七十的工作量都花在数据上这个比例一点也不夸张。行业语料的来源渠道按质量从高到低排序大致是企业自有的高质量知识资产操作手册、SOP文档、历史案例库、专家总结、内部培训材料、科研报告、专利文档。这类数据质量极高行业密度高是最核心的训练语料。行业公开的权威内容行业标准文件、白皮书、监管公告、公开的学术论文、行业期刊、龙头企业的公开报告。这类数据经过严格编审表达规范适合作为语料主体。业务过程中沉淀的真实文本客服对话记录、工单描述、设备运维日志、法律文书、临床试验报告脱敏后。这类数据最接近真实业务场景但噪声大、隐私风险高需要重点清洗。网络公开的行业讨论行业论坛、技术博客、垂直社区的深度文章。这类数据信息密度参差不齐但常常包含一线从业者的实战经验是前几类的有效补充。一个比较务实的配比建议是自有关键知识资产占三成左右权威公开内容占四到五成真实业务脱敏数据占两到三成行业社区讨论控制在半成以内。这个配比的核心逻辑是保证语料的“权威性”和“真实性”达到平衡只有权威没有真实模型会显得过于书面化只有真实没有权威噪声会拖垮训练效果。2.2 数据清洗的关键动作去重、去噪、敏感信息过滤行业语料不是拿来就能用的必须经过严格的清洗流水线否则训练出来的模型会出现各种奇奇怪怪的问题。我个人习惯的清洗流程包含以下几个关键步骤第一步是格式统一。PDF、Word、扫描件、HTML转出的文本往往存在大量乱码、多余换行、表格断裂、页眉页脚混入等问题。需要用脚本统一处理合并断行、去除页眉页脚、清理不可见字符、将全半角符号统一。这个阶段的目标是让语料变成“干净的纯文本”不要求多精美但必须保证可读。第二步是去重。行业语料中的重复问题比想象中严重得多。同一份行业报告可能被多个网站转载同一份政策解读可能出现几十个版本。重复数据如果不去掉模型会在重复语料上过拟合表现为生成内容时反复绕圈、复读某些固定句式。去重我一般用两层策略先做精确的MD5去重再做基于MinHash的近似去重相似度阈值通常设置在0.8到0.85之间。第三步是质量过滤。用规则加模型的方式把低质量内容筛掉。规则层面可以过滤过短的文档、广告味浓厚的文本、乱码比例过高的文本模型层面可以训练一个轻量的质量分类器给每个文档打质量分设定阈值过滤尾部数据。第四步是敏感信息处理。这一条特别重要尤其是医疗、金融、法律这些强监管行业。训练语料中可能包含个人隐私、商业机密、内部敏感信息。务必要做去标识化处理人名、身份证号、手机号、银行卡号、地址、病历号等都要做脱敏或直接删除相关段落。别心存侥幸一旦模型在生成内容时“记住”了这些信息后果是灾难性的。2.3 数据配比与抽样策略别让模型“背题”数据配比是个容易被忽视但影响很大的环节。行业语料通常存在严重的分布不均衡比如某些热点话题占了语料量的六成冷门但重要的基础内容只有零星几篇。如果不做干预模型会在热点内容上表现很好冷门内容依旧一窍不通。我在实践中常用的做法是先把语料按行业主题分类计算每个类别的token占比然后做重采样。对于占比过高的类别降采样对于占比过低的类别适当过采样但不要过度会导致重复。一个经验性的参考区间是单一类别占比不要超过总量的百分之四十。还有一个细节值得专门提出来Epoch数的控制。CPT不需要像预训练那样把数据跑很多遍一般控制在0.5到2个epoch之间就足够了。为什么因为CPT的语料量相比预训练语料小很多如果跑太多轮模型很容易在行业语料上过拟合导致通用能力大幅退化。业界有好几个开源模型的技术报告都提到过这一点在持续预训练阶段一遍到两遍的数据遍历已经足够让模型充分吸收行业知识再多反而有害。训练完不妨看看验证集上的困惑度如果持续下降而通用能力评测分数明显下降那就是过拟合的信号。3. 训练策略与超参数配置把小规模实验跑通3.1 选基座还是选对话模型起步决策开始CPT之前首先要决定从哪个模型继续训练。选择只有两个基座模型Base Model或者对话模型Chat Model。我的建议非常明确选基座模型。原因有三个。第一基座模型没有被SFT和RLHF“驯化”参数的原始状态保留了最完整的语言建模能力在继续预训练时知识注入的效率更高。第二对话模型在训练过程中已经被强行塑造了“讨好用户”的行为模式预训练阶段注入的知识分布已经被部分覆盖在此基础上继续做CPT效果会打折扣。第三基座模型做CPT的兼容性更好训练完成后可以根据业务需要自由选择是接SFT、还是做偏好对齐主动权掌握在自己手里。如果项目紧急、来不及重新走CPT流程只能从对话模型继续训练也不是完全不行但要意识到这是权宜之计。你得用更小的学习率、更少的数据量同时准备好接受知识注入效果不如基座模型这个现实。3.2 学习率与Warmup设置CPT翻车的第一大原因说句实话CPT翻车的第一大原因就是学习率设置错了。很多人习惯性地把SFT的学习率直接拿到CPT上用比如2e-5、3e-5结果训练没几步loss就飞了模型开始输出乱码。为什么因为SFT是在已经预训练好的模型上做“行为微调”训练步数少、数据量小学习率大一点问题不大。但CPT是在模型上继续做“知识注入”要动的参数幅度比SFT更深。学习率过大的后果不是单纯的不收敛而是灾难性遗忘——模型尚未学到新知识先把自己的通用能力给抹掉了。根据我的实践经验CPT的峰值学习率Peak Learning Rate应该设置为模型原始预训练学习率的十分之一到二十分之一。以7B到14B规模的开源模型为例比较安全的学习率范围是1e-5到3e-5但如果做大规模、长时长的CPT建议往下降控制在8e-6到1e-5区间。关键在于让训练过程足够“温和”给模型足够多的步数去逐步吸收行业知识。Warmup比例一般设置在训练总步数的1%到3%之间。举例来说如果总共训练一万步warmup就是100到300步。Warmup的作用是让模型从原始的参数状态平滑过渡到新的优化轨迹避免一开始就迈大步导致loss震荡。学习率调度器建议用cosine decay配合低峰学习率通常为峰值学习率的十分之一可以让训练末期更稳定。3.3 Batch Size与序列长度吞吐量与Loss稳定性的平衡Batch Size的选择直接关系到训练稳定性。CPT阶段的batch size应该比SFT大一些原因是为了让梯度估计更稳定减少行业语料中的噪声对参数更新的干扰。以7B模型的训练为例我常用的global batch size是64到256个样本对应的token量是128K到512K token以2048序列长度计算。如果算力紧张用32到64的batch size也可以跑只是训练稳定性会稍差需要用更大的学习率warmup去补偿。序列长度方面行业文档往往有长距离依赖的特点比如法律合同的条款引用、病历的现病史与既往史关联、技术手册的跨章节引用。因此我建议序列长度至少从2048起步如果资源允许直接上4096。更长的序列意味着模型能一次性看到更多的上下文对行业文档的理解会更深。但要注意序列长度翻倍显存消耗和计算量也几乎翻倍需权衡。训练过程中的梯度累积步数需要结合global batch size和单卡可承载的micro batch size来算。举个例子如果你的global batch size目标是128单卡每次只能放2个样本micro batch size2用了32张卡那么每一步可以处理64个样本只需要梯度累积2步就能凑够128。梯度累积步数global batch size / (micro batch size × GPU数量)这个公式要随时能算。3.4 退火与基座收尾CPT的标准流程CPT训练过程中有个关键环节叫退火Cooldown。完整的CPT流程通常分成两个阶段稳定训练阶段和退火阶段。稳定训练阶段用上面说的固定学习率策略跑完大部分数据退火阶段在高品质数据上以极低学习率做额外训练让知识真正“落”进参数里。Qwen系列模型在前段时间的技术报告中就提到过这种做法退火阶段使用高质量数据把学习率逐步衰减到接近零。这个设计的逻辑是训练前中期模型在学习“大体的语言规律和知识框架”到了后期需要用低学习率在精选数据上做“精细打磨”相当于让训练好的模型在退火过程中把零散知识重新内化一遍。我自己在实际项目中通常把总数据的90%到95%用于稳定阶段剩下的5%到10%作为退火数据。退火阶段的学习率从峰值逐步衰减到峰值的十分之一甚至更低。退火数据建议人工精选优先选择标注准确、表达规范、覆盖所有核心主题的内容。一个经验数据是同样这批模型做了退火和不做退火在行业评测集上的得分可以相差3到5个百分点差距非常可观。4. 大规模训练的基础设施与并行方案4.1 资源估算多少张卡能训多大的模型聊完训练策略必须面对一个现实问题得有多少算力才能跑起来简单给一个估算逻辑。以7B模型、序列长度2048为例在典型的A100 80G显卡上使用全参数训练单卡大约能承载2到4个batch的样本这取决于是否使用LoRA、是否开启序列并行等因素。如果做全参CPT一张A100的吞吐量大约是每秒处理3000到5000个token。假设你的行业语料总token量是5亿跑一个epoch总计算量就是5亿token的前向加反向传播。用64张A100每张每秒处理4000个token实际训练吞吐按利用率70%折算大概每秒28万token5亿token大约需要30个小时才能跑完一个epoch。语料更大、模型更大、卡更少时间就相应拉长。动手前把这个账算清楚能给项目决策提供最直接的参考。关于显存估算有一个粗粒度经验公式供参考训练阶段的显存需求大约等于模型参数量的16到20倍全参训练场景。7B模型大概需要112GB到140GB显存单张80G的卡不够需要至少2张卡做张量并行或者开启ZeRO优化器的显存卸载功能。14B模型需要224GB到280GB显存4张80G卡起步。这些数字会因具体并行配置不同有浮动但作为初期资源评估已经够用。4.2 并行方式的选择从数据并行到混合并行CPT训练属于典型的“大计算量、长耗时”任务并行策略直接决定训练效率和稳定性。我建议按以下逻辑来选并行方式数据并行Data Parallelism是最基础的方式每张GPU持有一份完整模型副本喂不同的数据通过梯度同步更新参数。在卡数不多8到32卡、模型不算太大7B以下时用DeepSpeed的ZeRO-2或ZeRO-3做数据并行是最省事的选择。ZeRO-2优化器状态分片ZeRO-3把模型参数、梯度、优化器状态全部分片显存占用更低但通信开销更大。如果模型超过7B或者单卡显存不足以放下完整模型就需要引入张量并行Tensor Parallelism。张量并行把模型的一层切分到多张卡上每张卡只负责计算一部分比如把注意力头数按卡数均分。好处是显存压力骤降坏处是通信密集卡间通信带宽不足时会导致训练效率大幅下降。流水线并行Pipeline Parallelism则是按层切分GPU1负责前几层、GPU2负责后面的层数据和梯度在层与层之间传递。这种方案在超大模型70B以上场景更有优势在小规模CPT任务中优先级不高。我在实际项目中常用的组合是7B到14B模型、32张卡以内直接上DeepSpeed ZeRO-3数据并行如果卡数超过32张再加张量并行。70B及以上的超大模型才需要考虑3D并行数据并行加张量并行加流水线并行的组合方案。卡少的时候不要盲目上高级并行方案通信开销可能反而拖垮效率。4.3 用vLLM部署验证训练结果CPT训练完成后不要急着接复杂的评估流程。我的习惯是先快速部署一个服务用最朴素的方式感性地感受一下模型有没有真的“懂行”。部署首选vLLM吞吐量高部署简单。拉起一个标准的OpenAI兼容接口服务然后拿几个行业里最典型的问题去提问看看模型的输出是否明显比CPT之前更专业、更有行业味。这个环节能发现很多脚本化评估发现不了的问题。比如模型行业术语使用是否自然、回答是否体现出对行业逻辑的理解、是否不再出现明显的外行表述。我通常还会故意问一些语料中覆盖率不高的“边角”问题观察模型的应对方式如果模型能结合上下文推断出一个合理回答说明知识注入效果不错如果开始胡编乱造、强行拼凑术语说明数据覆盖还有明显缺口。这个阶段产出的观察记录会直接影响下一轮数据补采的方向。5. 评估体系搭建既懂行业又不掉通用分5.1 行业评测集怎么搭从业务问题反推评测数据行业模型评估是CPT训练闭环里最关键、也最容易被带偏的一环。很多人图省事直接拿一些公开的行业问答集做评测结果训练前后分数都差不多根本看不出来模型有没有进步。根本原因是公开评测集和实际业务场景不匹配模型的行业能力没有通过这些题目充分暴露出来。正确的做法是从业务问题反推评测数据。列出模型上线后最常处理的10到20类业务问题每类准备20到50个真实问题。这些问题不应该是网上能找到的标准答案而应该来自企业内部的知识库、专家访谈、历史工单确保评测数据具备足够的行业深度。评测集总规模控制在200到500个问题之间就够了关键是质量不是数量。评分方式我强烈建议双轨制一部分题目用自动指标ROUGE、BLEU、BERTScore做快速筛查另一部分必须人工评审。人工评审的标准至少包含三个维度行业术语使用是否正确、回答逻辑是否符合行业惯例、关键专业知识点是否准确。只有这两个维度都表现良好才能说明模型是真正的“懂行”而不是“装懂”。5.2 通用能力回归CPT最容易踩的暗坑CPT最大的副作用风险是通用能力的灾难性遗忘。行业语料无论怎么配比相对于模型预训练阶段见过的海量通用语料都只是极小一部分但训练过程会持续用行业语料更新模型参数对通用语料的表征能力可能造成覆盖和遗忘。因此在CPT训练的各个阶段都要用通用基准跑回归。常用基准包括MMLU多任务语言理解、C-Eval中文综合能力、GSM8K数学推理、BBHBig-Bench Hard等。我在实践中定了一条硬规矩CPT训练完成后通用基准的得分下降幅度不能超过3个百分点超过这个阈值就说明学习率过高或者训练轮次过多需要回退参数调整策略。这个阈值不是拍脑袋拍出来的而是基于多个项目的经验总结低于3个点的回落不影响实际可用性超过5个点通用能力退化就会在真实业务中明显感知到。这里分享一个容易被忽略的操作细节在训练过程中要定期同步记录通用基准得分而不是只在训练完成后测一次。建议每训练一个epoch或者每训练几千步就拿出一个小型通用评测集快速测一遍。这样能画出“通用能力衰减曲线”一旦发现衰减趋势明显可以提前终止训练或者调整超参避免等到训练全部完成才发现模型已经被“训废”了。5.3 训练曲线怎么看loss下降不等于模型变好训练过程中大部分人盯着loss看loss降了就以为模型在变好这个直觉在CPT场景里是有误导性的。因为CPT的语料是行业文本loss下降只能说明模型在越来越“擅长预测行业文本的下一个token”但这只是间接信号真正要关心的是模型是否学会了行业知识并保持通用能力。实践中我会同时盯三组曲线训练集loss、验证集loss、行业评测集得分。行业评测集得分不必每一次都测成本太高但至少要在训练的前中后期各测一次训练5%步数时测一次看行业能力是否开始抬头训练50%步数时测一次看方向对不对训练结束后测一次确定最终效果。验证集loss如果出现“先降后升”的拐点而行业评测得分还在上升说明模型开始对训练语料死记硬背此时应当考虑提前停止训练或者进入低学习率的退火阶段。这些曲线共同构成CPT训练的可观测性体系光看任何单一指标都会导致误判。6. 实操中遇到的典型问题与排查实录6.1 快速排查速查表CPT训练过程中会出现各种异常下面这个速查表是我的排障工具箱遇到问题先对照查一遍能省下大量排查时间。现象可能原因快速处置训练开始不久loss飙升学习率过高或数据中存在大量乱码降低学习率到当前值的1/3到1/5检查数据清洗质量loss持续不降但也不涨数据量不足或数据分布太单一扩充行业语料来源调整数据配比loss降得很快但行业评测没提升数据中重复内容过多模型在死记硬背加大去重力度降低epoch数通用能力评测骤降学习率过大、训练步数过长、配比失衡立即停止训练回退到上一个checkpoint调低学习率验证集困惑度先降后升过拟合信号进入退火阶段或提前停止训练生成内容重复、绕圈语料噪声大或局部数据过饱和重点检查去重质量降低单类内容占比显存不足序列过长、batch过大、并行配置不当减小micro batch、缩短序列长度、开启更激进ZeRO6.2 三个真实踩坑记录从翻车到复盘第一个坑是数据去重不够彻底导致的复读问题。一个工业知识库项目CPT训练完以后模型回答任何关于设备故障的问题结尾总喜欢带一句“请定期检查设备运行状态并及时记录异常情况”。排查了很久最后发现是训练语料里设备的巡检记录模板大量重复模型在重复段落的强化下形成了固定输出模式。重新做MinHash近似去重并降低该类数据占比后问题消失。第二个坑是学习率设置过高导致的通用能力崩塌。一个医疗项目团队用SFT常用的3e-5学习率跑CPT训练两万多步后发现MMLU分数掉了8个百分点。回退到1e-5重新训练MMLU分数控制在了正常范围内。这个案例提醒我CPT和SFT学习率的差距不是理论上的差别而是实操中反复验证出来的硬经验动手前务必检查学习率设置。第三个比较隐蔽的坑是退火阶段的语料选择和主训练阶段重叠度太高。本来退火的目的是用高质量数据帮助知识内化但如果退火数据和主训练数据高度重合等于模型又在反复背同样的内容效果反而会变差。之后的实践里我会单独留出一批“退火专属”的高质量语料与主训练语料明确区分这个细节让最终模型在行业评测上的表现又上了一个台阶。6.3 安全与合规训练数据风险的边界意识最后想额外提醒一件事CPT训练的数据安全与合规问题必须前置。行业语料尤其是医疗和金融这类强监管领域的数据在使用前务必经过严格的合规评审。这包括但不限于确认数据的使用权限、完成必要的脱敏和去标识化处理、明确模型上线后的问责边界。不要为了追求训练效果而放松对数据合规的要求一旦出问题整个项目的商业价值都会归零甚至带来更大的风险。我见过不止一个团队因为数据合规的疏漏导致项目中途被叫停前期投入全部白费。正确做法是项目启动时就让法务和合规人员深度参与建立数据来源清单、脱敏操作记录和审核留痕这样才是可持续的做法而不是等出事了再补救。在实际项目中反复验证下来我对CPT最大的体会是它不是一个“跑个训练脚本”就能搞定的技术动作而是一个高度依赖数据工程和细致调参的系统工程。数据质量决定模型知识注入的上限超参策略决定这个上限能被兑现多少评估体系则负责指出能否继续优化的方向。如果团队正准备启动行业大模型的训练我的建议是先花大力气把数据做扎实用小模型或少量数据跑通完整流程再上规模一步一个脚印走得才更稳。最后再分享一个小技巧训练期间每隔固定步数导出一次模型checkpoint用一个小行业评测集做增量评估能让你找到效果最好的那个历史版本而不是默认最后一步就是最好的。
返回列表