拓十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

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

大模型训练到部署全流程:SFT、PPO、剪枝量化与OpenCompass评测实践

大模型训练到部署全流程:SFT、PPO、剪枝量化与OpenCompass评测实践

很多做模型训练和部署的朋友应该都有同感:大模型这个链条太长太碎了。前面要微调,微调完要对齐,对齐之后要压缩,压缩完还要评估,每个环节用的工具都不一样,环境配置就能折腾一整天。我最早做一个小模型的SFT,光是把数据格式转来转去、把训练脚本从A框架迁到B框架,就花了两天。后来接触了CubeStudio的大模型任务模板,发现它把LLaMA-Factory的SFT/PPO/reward训练、蒸馏、剪枝、量化、安全评估、OpenCompass评测这些环节都串在了一个平台上,这才算把整个流程理顺了。

这篇文章我就从实际使用的角度,把这条链路怎么在平台上跑通、每个环节有哪些关键参数和避坑点,从头到尾拆一遍。适合正在做大模型微调、对齐、压缩或者部署优化的工程师参考,也适合想从零搭一套完整模型迭代流程的团队。内容不绕弯子,都是直接能用的东西。

1. 为什么要做“一站式”:大模型迭代链路的真实痛点

在聊模板怎么用之前,先把背景说清楚。大模型从训练到上线,本质上是“训练-对齐-压缩-评估”四个阶段的循环。这里面最麻烦的不是单个阶段有多难,而是阶段和阶段之间的衔接。

1.1 链路断裂带来的隐性成本

先看一个最典型的场景:你用LLaMA-Factory跑完SFT微调,得到了一个lora权重。下一步做PPO对齐,你得把它合并回主模型,再单独写一个PPO的训练脚本,reward模型还得另起炉灶。好不容易对齐完了,模型体积太大,部署不上,你又得找剪枝和量化的工具,而这些工具往往跟前面的训练框架根本不兼容。光是把权重格式转来转去、把超参数重新对齐一遍,就够头疼的。

更麻烦的是评估环节。模型做完了安全评估,结果发现某个指标不达标,你得回溯到训练阶段重新调参。如果训练和评估是两套割裂的系统,你根本不知道问题出在数据、模型还是对齐策略上。这个时间成本,做过的人都懂。

1.2 CubeStudio把“工序”变成“流水线”

CubeStudio的做法是,把大模型迭代的每个环节都封装成标准化的任务模板。你不需要自己搭训练环境、不需要手动配置分布式框架、不需要担心权重格式转换,只需要在界面上选模板、填参数、提交任务。底层的调度和资源分配是平台自动处理的。

这种模式的好处在于:任务之间的输入输出是标准化的。SFT产出的模型快照可以直接作为PPO的初始模型,PPO对齐后的结果可以直接进剪枝和量化环节,评估报告也能自动回溯到对应版本。整个流程从“每个环节独立折腾”变成了“一条流水线往下走”。对个人开发者来说省了环境配置的工夫,对团队来说更重要的是流程可复现、版本可追踪。

2. 训练阶段实操:SFT、PPO与reward模型的完整链路

训练是整条链路的基础。CubeStudio的大模型任务模板覆盖了LLaMA-Factory里最核心的三个训练能力:SFT、PPO、reward模型训练。下面逐个拆解我在实际使用中总结的要点。

2.1 SFT微调:先搞清楚你的数据格式

SFT(监督微调)是大模型适配特定领域最基础的手段。在LLaMA-Factory里,SFT支持多种数据格式,但最推荐的是对话格式:

[ { "conversations": [ { "from": "human", "value": "请帮我总结这段合同里的风险点" }, { "from": "gpt", "value": "这段合同的主要风险点包括:1. 违约金比例过高..." } ] } ]

在CubeStudio的SFT任务模板里,你需要指定数据集路径、基座模型名称、lora的秩(r值)、学习率、批次大小等核心参数。这里有几个我实测后觉得关键的点:

第一,lora的r值不是越大越好。我试过用r=64微调一个7B模型,效果并没有比r=16好多少,但显存占用和训练时间翻了将近一倍。对于大多数领域适配任务,r值设置在16到32之间就够了,除非你的任务和基座模型的原始分布差异特别大。

第二,学习率和batch size要联动调整。LLaMA-Factory默认的学习率是2e-4,但这个值在batch size较大的时候会不稳。我在实际跑的时候习惯用学习率1e-4配合batch size 4,如果你的显存支持更大的batch,学习率要相应降一些。

第三,历史回放比例(history_ratio)是个容易被忽视的参数。在LLaMA-Factory的SFT中,historical data的比例控制着模型对历史对话的保留程度。如果你做的是多轮对话微调,建议保留0.2到0.3的历史数据比例,否则模型会逐渐忘记上下文。这里我踩过坑,一开始把history_ratio设成0,结果微调后的模型在第二轮对话中开始“失忆”,完全忽略了之前说过的内容。

2.2 reward模型训练:给PPO打地基

PPO对齐的前提是有一个靠谱的reward模型。reward模型的作用是给模型的输出打分,告诉策略模型“什么样的回复更符合人类偏好”。在LLaMA-Factory里,reward模型的训练数据是偏好对格式:

[ { "system": "你是一个有帮助的助手", "history": [], "input": "如何提高工作效率?", "chosen": "可以从以下几个方面提高工作效率:1. 设定明确的目标...", "rejected": "随便干就行,不用想太多。" } ]

训练reward模型的时候,我一开始犯过一个错误:数据量太小就急着上。reward模型对数据的质量要求极高,就算只有几百条高质量偏好对都比几千条噪声数据强。但反过来说,如果你只有几百条,模型很容易过拟合,在训练集上得分很高,一上验证集就崩。

CubStudio的reward训练模板里有一个细节处理得不错:它把chosen和rejected的response单独做编码,然后拼接score的差值作为loss,这样比直接做二分类稳定很多。实操中要注意的是,reward模型的得分差异不应该太大,几百分的差距往往是数据标注不一致导致的,这种时候优先去清洗数据,而不是继续堆训练轮数。

另外一个容易忽略的是reward模型和策略模型的tokenizer要匹配。如果用不同的tokenizer做PPO,会在内外层循环的tokenize环节出问题,报错还不是特别明显,表现为训练loss正常下降但reward曲线纹丝不动。所以我在搭PPO任务之前,一定会确认reward模型用的是和策略模型同一个tokenizer。

2.3 PPO对齐训练:人类反馈的强化学习落地

PPO(Proximal Policy Optimization)是整个链路里训练最重、最容易出问题的环节。它的逻辑简单说是:让模型生成回复,reward模型打分,然后通过PPO目标函数让模型往高reward方向迭代,同时约束不要偏离原始模型太远。

在CubStudio的PPO模板里,参数分为几组:策略模型参数、reward模型参数、PPO算法参数。我用下来觉得要重点关注的PPO相关参数有:

  • KL系数(kl_ctrl):控制新策略和旧策略的KL散度惩罚强度。默认的0.02在我看来偏高了,尤其在训练前期,KL约束太强会让模型学习速度明显变慢。经验值可以先从0.01开始,观察reward曲线如果掉得太快再加回去。
  • 优势估计的gamma和lambda:这两个参数控制奖励的折扣因子和GAE(广义优势估计)的平滑程度。对大模型对话任务,gamma=1.0比较合理,因为对话任务没有明确的终止条件,每个step的reward同等重要。lambda建议在0.95左右。
  • mini-batch size:PPO里一个关键认知是,policy的更新步数不要太多,否则模型会快速偏离原来的行为分布。我一般把ppo_epochs控制在1到2之间,mini-batch size设成比训练batch小一半,这样稳定性最好。

实际操作中有个很典型的坑:PPO阶段只有策略模型是可训练参数,reward模型和ref模型(参考模型)都要冻结。但很多分布式配置里,如果你不做特殊处理,框架会把reward模型也当成可训练模型去更新,导致训练出来的模型行为完全混乱。CubStudio的模板默认配置会冻结这部分参数,这算是省了不少心。

2.4 三个训练环节的衔接关系

这三个任务不是孤立的,正确的使用顺序是:先跑SFT让模型具备领域能力,再用这些数据训练reward模型,最后用SFT后的模型做初始策略、reward模型做奖励信号,跑PPO对齐。中间任何一个环节的产出质量会直接影响下一环。

特别是在PPO里,策略模型的初始化越好,对齐效果越稳。另一个实用技巧是,SFT阶段不要过度训练,否则会压缩模型的多样性,让后续PPO阶段很难探索出更好的策略区间。我在一个中文问答场景里对比过,SFT跑3个epoch之后接PPO,和SFT跑6个epoch再接PPO,前者的最终reward得分反而更高。

3. 压缩阶段实操:知识蒸馏、剪枝与量化的落地差异

训练完的模型体积大、推理慢,直接部署不现实。所以压缩是必经之路,但压缩也有三条路线:蒸馏、剪枝、量化,它们的原理和适用场景差别很大。

3.1 知识蒸馏:用小模型学大模型的“行为”

蒸馏不是直接改结构,而是让一个小模型去模仿大模型的输出分布。在LLaMA-Factory/CubStudio的蒸馏模板里,你需要配置teacher模型(大模型)和student模型(小模型),然后用teacher的logits或者输出概率分布作为soft label来训练student。

做蒸馏最重要的认知是:不要只让student学teacher的最终答案,要学teacher预测的概率分布。比如遇到一个有争议的问题,teacher可能给正确答案打了0.7的概率,给次优答案打了0.2,这0.2就包含了“次优答案也不是完全错”的知识。传统硬标签训练学不到这一层信息,蒸馏就是要把这部分信息迁移过去。

实操里有一个关键参数叫温度(temperature)。温度越高,概率分布越平滑,soft label携带的信息越丰富。但温度过高也会引入太多噪声,让student模型学不到重点。在LLaMA-Factory的蒸馏实现里,默认蒸馏温度是2.0,我通常会先不动,等看效果再尝试2.5或者1.5,一般来说文本生成类任务温度2到3是个安全区间。

还有一个容易踩的坑:student模型和teacher的tokenizer必须一致。如果一个是Qwen的分词器,一个是LLaMA的分词器,输出的token序列完全对不上,蒸馏loss会变成一种没有意义的数字。我在CubStudio里配蒸馏任务时,都会先去模型详情页确认两个模型的tokenizer兼容性。

3.2 剪枝:微观上挑“重要参数”,宏观上做结构精简

剪枝本质上是删掉模型里对输出影响最小的参数,把稠密网络变成稀疏网络。但在大模型时代,直接做非结构化剪枝意义不大,因为稀疏矩阵在GPU上很难发挥算力优势,所以实际有用的是结构化剪枝——把整行、整列或者整个attention头砍掉。

在CubStudio的剪枝模板里,可以选择剪枝目标层(比如只剪attention层或FFN层)、剪枝比例、以及是否需要微调恢复。我做剪枝时总结的经验是:

  • 先做敏感度分析再动手。不要一上来就剪30%,先用小批量数据测每一层的敏感度,优先剪那些对输出影响小的层。模板里如果有profiling功能,务比先用它跑一遍。
  • 剪枝和量化不要同时做。有两个维度同时压缩,模型的精度掉得特别快,而且出了问题你根本没法定位是剪枝的问题还是量化的问题。
  • 剪枝后一定要做恢复训练。剪枝不是“删了就行”,删完部分参数后模型分布会破坏,需要用少量数据做低学习率的恢复微调。恢复训练的数据量不需要大,几百上千条高质量数据就够了。

有一次我做ResNet34的剪枝量化流程实验时发现,剪掉20%且不做恢复训练,精度直接掉了十五个点;做了少量恢复训练后,精度能回到原来的97%以上。这个规律在LLM场景下同样适用,哪怕层数更深、参数量更大,恢复训练的作用依旧显著。

3.3 量化:用精度换效率之前的“算账”

量化的原理很简单:把模型权重从FP16压缩到INT8甚至INT4,用更少的bit存同样规模的模型。但这里的“算账”逻辑很多人没搞清——你要先知道瓶颈在哪,再决定怎么量化。

推理瓶颈可以分为计算密集型和显存带宽密集型。对7B、13B这种规模的模型,推理主要瓶颈在显存带宽,所以用INT8量化收益最高,基本能把显存占用砍一半。如果继续压到INT4,虽然显存占用进一步下降,但精度损失大幅上升,仅适合对精度要求较低、吞吐量要求极高的场景。

在CubStudio的量化模板里,常见的两种模式:

  • PTQ(训练后量化):直接用校准集计算量化参数,不动训练流程,速度快,但精度损失需要靠校准集的代表性来保证。
  • QAT(量化感知训练):在训练或微调过程中模拟量化误差,让模型逐步适应,精度损失更小,但耗时更长。

实操里我建议的顺序是:先跑PTQ看精度损失是否能接受,如果掉了超过3个百分点再上QAT。量化过程中还有几个细节很关键,比如group size的选择。group size越小,量化粒度越细,精度损失越小,但推理时反量化的开销越大。7B模型这里我实测group size 128是一个比较平衡的选择。

3.4 三条压缩路线的选择矩阵

压缩手段核心原理适合场景精度影响性能收益
知识蒸馏小模型学习大模型的输出分布你有目标小模型,想替代大模型可控,取决于蒸馏质量模型参数成倍缩小
结构化剪枝删除不重要的结构单元延迟敏感,需要减小计算量中,依赖恢复训练推理延迟下降
量化(PTQ)减少权重位宽显存受限,需要提高吞吐低到中显存减半,吞吐提升

一个更务实的用法是组合:先剪枝减小模型结构,再量化压缩权重。但注意顺序必须“先剪枝、后量化”。剪枝改变了模型结构,如果已经量化完了再剪,量化参数全部失效,你需要重新校准。我在实际工作中走过的弯路是用错了顺序,不得不从头跑一遍。

4. 评估阶段与全链路整合:安全评估和OpenCompass

训练和压缩都完成之后,很多人以为就结束了,其实真正的“交付门槛”在评估。模型效果到底行不行、安全维度是否达标、与基座模型的能力是否发生倒退,都需要用评测数据说话。

4.1 安全评估:不是“测一测”那么简单

大模型的安全评估是个既主观又客观的复合问题。客观上可以有规则模型和红队测试集,凡是模型输出的关键词命中了高风险条目,就算安全违规;主观上又依赖评估标准是否覆盖了足够广的刁钻场景。

在CubStudio的安全评估模板里,我比较喜欢它把安全分类打散为多个维度,比如违规内容、价值观倾向、诱导性输出、隐私泄漏等。每个维度有独立的prompt集,模型跑完一轮,每个维度都会生成一份报告。

实操里一个重要的细节是:安全评估对采样参数特别敏感。同样的模型,temperature设成0.1和1.0,安全违规率能差一倍以上。低温下模型更保守,会倾向给出“安全但无用”的回复;高温下模型更自由,更容易在极限边界试探。所以做安全评估时,我会固定temperature为0.6左右,覆盖一个中等风险的范围。另外要同时测系统提示词的影响,加了安全prompt后违规率是否下降,是检验对齐策略是否有效的关键。

安全评估还有一个反直觉的地方:不是模型回答越安全越好。如果模型对所有诱导性问题都回复“我无法回答”,安全评估通过但实用性归零。所以安全和对齐是“在保持有用性的前提下降低风险”,不能一刀切。在做PPO训练时,reward设计里如果过于强调安全、压制有用性,你会观察到一个现象:模型合规率提高了,但Bleu和rouge指标全面下跌。这之间的平衡,需要靠评估报告里的得分分布去动态调整。

4.2 OpenCompass评测:用标准化榜单衡量“好不好”

安全之外,就是综合能力评测。OpenCompass是一套大模型评测框架,覆盖了学科知识、逻辑推理、代码能力、中文理解等多个维度的数据集,输出标准化的榜单分数。在CubStudio的评测模板里,选好你训练产出的模型版本,再勾选需要评测的数据集,平台会自动调度评测任务。

这里有几个实操经验:评测结果要和你未微调的基座模型做对比。很多时候你以为微调让模型变好了,但对比基座之后发现其实在某个专业能力上反而退化了,这是因为微调数据分布偏移导致的。做知识蒸馏、剪枝、量化之后,也要用同一个评测集横向对比,否则你没法量化“我牺牲了多少能力换来了多少性能”。

另外一个容易被忽略的点是评测的prompt模板。OpenCompass的不同数据集对prompt格式有很强的敏感性,有的数据集要用few-shot,有的是zero-shot。你在本地对比不同模型分数的时候,一定确保用的是同一份评测配置,不然模型能力高低你分不清,反而是评测设置的差异。

4.3 训练-压缩-评估的迭代闭环怎么闭环

毕竟我实际操作下来,最深的感受是:一站式平台的本质价值不是省去某个环节的单独配置时间,而是让“反馈-迭代”变得顺畅。你在OpenCompass里发现模型数学能力不行,可以直接回到数据集里补数学样本,重新跑SFT任务。你在安全评估里发现某个维度风险较高,可以直接调整reward模型的偏好对,再跑一次PPO。

这个闭环在做单点工具时很难真正转起来。因为每切换一个环节,你都要面对环境、依赖、格式、接口的适配成本,这些成本多了,你就会不自觉地减少迭代次数,从而影响最终模型质量。

我把这整套流程走顺了之后,迭代效率大致提升在40%以上,主要省的是环境准备和参数对接的重复劳作。CubStudio里面还有一个我比较喜欢的设计,就是每个训练任务的历史配置可以被保存为模板,当你需要换基座模型或者换数据集时,基于已有模板改参数比从零配置快得多。

5. 平台实操中的常见问题与排查技巧

工具再好,跑的过程中总会遇到各种各样的问题。我在CubStudio平台上反复跑LLaMA-Factory训练任务,遇到过高频问题,整理成速查表,方便有类似情况的朋友快速定位。

5.1 训练类问题

现象大概率原因排查方向
SFT训练loss在0.3左右徘徊,无法下降数据格式错误率高,模型在硬学错误检查数据集的conversations格式和字段完整性
PPO任务跑到一半reward曲线突然断崖下跌策略模型更新步数太多,偏离原分布降低ppo_epochs,适当调高KL系数
reward模型训练时loss变成NaN数据中存在太长的response,超出长度限制断单独检查偏好数据中chosen/rejected的token长度
PPO过程中显存OOM模型参数量加上梯度/优化器状态超出GPU显存降低batch size,或使用梯度累积和lora

5.2 压缩类问题

剪枝和量化踩坑的点往往不是算法本身,而是“流程顺序”和“参数设置”。

有人做量化的时候发现模型输出质量大降,几乎都是校准集出了问题。校准集不是随便拿一批测试文本就能用的,它要尽量覆盖真实推理时会遇到的输入分布,数量在几百到几千条。校准集跟训练集是两码事,我自己刚开始也是直接拿了训练集来校准,后来发现量化后模型在真实业务数据上掉点特别严重,换了一批跟线上分布一致的校准集后才恢复。

剪枝的常见问题则是“敏感度分析被跳过”。平台提供了敏感度分析工具,很多同学图省事直接手工指定剪枝层,结果剪完恢复训练后发现模型彻底学不回来。后来规规矩矩先跑敏感度分析,再结合分析结果选择剪枝层,精度保持效果明显更好。

5.3 评估类问题

评估最经常出问题的是“数据集不一致导致的误判”。不同版本的OpenCompass提供的数据集内容一直在更新,你用v1版本跑A模型,用v2版本跑B模型,两个分数放一起对比,结论是不可靠的。所以记录评测结果时,最好把评测集的版本号一并记录下来。

在平台里跑出意外结果时,不要立刻怀疑训练的模型出了问题,先检查任务配置中是否误用了其他版本的数据集模板、是否开了不同的采样参数、是否错误选择了评测base模型。这几个细节点排掉之后,模型本身有大问题的可能性才会上升。

6. 模板选择与后续扩展的个人建议

如果看到这里,你已经想动手试试的话,最明智的第一步不是马上传数据集开跑,而是先在CubStudio上跑一遍每个模板自带的默认样例。样例数据量小、模型规模小,几分钟跑完,你可以清楚看到每个环节的输入输出长什么样。很多人觉得样例是浪费算力,但我反而觉得这是最划算的熟悉方式,跑过一次样例,你对任务模板的理解会完全不一样。

从路线上来说,如果你的目的只是“把一个小模型部署上去”,最低配置路径是:SFT微调一个目标领域模型,用PTQ量化压缩模型,再做一次OpenCompass基础评测验证效果,整个过程几个小时就能跑通。

如果你的目标是“把一个中大型模型做到生产级可控”,那就不能省alias训练:SFT之后训练reward模型再接PPO对齐,然后结构化剪枝配合恢复训练,再过安全评估。这条路径时间会长不少,但每一步的产物都是可追踪、可对比、可回溯的。

从长远角度看,这种“模板化流水线”的思路,我觉得后续能延伸的地方还有不少。比如数据版本管理,微调数据的不同版本会导致模型行为差异,要是能像代码版本管理一样管理数据快照,迭代的可追溯性会更强。再比如多模型对比评估,一次任务同时跑多个候选模型的评测,直接输出雷达图对比,决策效率会更高。甚至可以把整个“训练-压缩-评估”流程编排成定时任务,模型数据更新后自动触发新一轮迭代。这些方向如果平台持续做下去,对大模型工程化的价值会越来越大。

模板本身只是一个入口,真正决定模型质量下限的永远是你的数据和策略。把基础流程跑通、跑顺,把每个环节的意义和参数逻辑搞清楚,你才可能在这个基础上玩出更花活的东西。

返回列表