资讯动态

大模型微调选型指南:LoRA、QLoRA、全量微调原理与实战对比

发布时间:2026/9/10 6:13:50 来源:尧图企业网站定制
上周有个朋友跑来找我说他手里只有一张 RTX 4090想微调一个 7B 模型做客服助手结果在网上搜了一圈全量微调、LoRA、QLoRA、Freeze、Adapter、P-Tuning 这些名词全蹦出来了越看越晕。我说你先别急着选方法你先回答我三个问题你有多少条训练数据你打算动模型哪部分能力你到底有几张卡。微调这件事方法本身没有绝对好坏只有适不适合当前条件。这篇内容适合两类人看一是刚接触微调、第一次准备跑训练的同学想搞清楚这些名字背后的本质区别二是已经跑通过一个流程、但对选型一直处于别人说好我就用状态的实践者。我会用同一个书和笔记的类比把所有方法讲透再补上实际训练时容易踩的坑。1. 六种方法摆在一起看每种微调对应一个现实动作1.1 先建立全局观不然谈选型就是空中楼阁经常有人问我LoRA 是不是比全量微调效果好这个问题本身就是错的。全量微调和 LoRA 不是同一维度的竞争关系而是资源充裕度和参数更新范围两条轴上的不同选择。我把六种主流方法放在一张表里先看清楚它们分别做了什么。方法思路一句话书和笔记的类比显存需求数据需求部署时的额外成本全量微调更新全部模型参数整本书重新再版校对极高高无模型本身不变Freeze 微调只更新部分层参数只改这本书的后半部分中等中无Adapter在 Transformer 内部插入小模块往书里夹专用补充页低低有少量额外计算P-Tuning v2在每层输入前加可学习提示每章开头贴一张导学卡低低有少量额外计算LoRA用低秩侧支路由训练增量在旁边做批注笔记低中合并后无额外成本QLoRA量化原模型后再跑 LoRA拿缩印本做批注省地方极低中合并后无额外成本这张表里的类比不是我临时编着玩的。理解微调最重要的就是搞清楚你改的是模型的正文还是在模型旁边贴了张笔记。正文和笔记在部署时的命运完全不同。1.2 把模型想象成一个知识库六种方法就是六种修改方式为了方便后文反复使用我建立一个统一比喻预训练好的模型相当于一本《通用知识全书》内容已经写好了。你想让它变成懂行话的垂直领域专家本质上就是在这本书里加入新的知识或表达习惯。全量微调把书从头到尾重写一遍每个字都要重新校对成本和动静都最大。Freeze 微调前半本保持原样只重写后半本或者只改某些章节动静比全量小一半。Adapter不动正文但在书里加了一叠补充页内容偏某个专项方向运行时翻到该处要额外看一下补充页。P-Tuning v2不改正文也不夹页而是每章开头贴一张导学卡引导读者用特定方式理解后面的内容。LoRA不动正文在旁边单独记一本批注笔记。笔记里只写哪些地方需要修正、修正成什么。运行模型时把原书和笔记对照着看。QLoRA还是记笔记但是把原书先用压缩复印的方式缩印了一份在缩印本上做批注省空间。实际训练中LoRA 训练出来的笔记可以合并回原书合并后还是一本完整的书。这也是为什么 LoRA 在部署阶段没有任何额外成本——你把批注直接誊写进正文了读者拿到手的还是那本书。1.3 为什么没有绝对最优方法方法选型本质是一个约束优化问题。约束条件包括显存大小、数据量、任务类型、训练时长、部署方式。不同条件下同一个方法的体验可能天差地别。举个例子一张 A100 80G 上7B 模型全量微调可能跑得动但换到 4090 24G 就爆显存你有 5 万条高质量标注数据时LoRA 效果往往够用但如果你想把模型改造成一个完全不懂原来的通用世界、只懂企业内部业务的专用模型LoRA 就不如全量改得彻底。所以与其记谁比谁好不如理解每个方法改动的是模型的哪一层、哪一类参数代价是什么。2. 低参数阵营四兄弟LoRA、QLoRA、Adapter、P-Tuning v2 到底改了什么2.1 LoRA 的低秩笔记不重写正文只记录修正项LoRALow-Rank Adaptation的核心思路非常反直觉冻结原始权重不训练它而是在旁边新增两个小矩阵 A 和 B训练时只更新这两个小矩阵。前向传播变成h W0 * x (B * A) * x其中 W0 是冻结的原权重A 和 B 是两个低秩矩阵。这里的关键是两个矩阵相乘后的秩远小于 W0 的维度但足够表达任务相关的变更方向。实际操作中 A 通常随机初始化B 初始化为零矩阵这样训练开始时增量还是零不会一顿操作把原模型搞坏。低秩这个词是很多人理解 LoRA 的门槛。我打个比方让你修改一本书你不需要把每一个错别字都单独列出来而是总结出几条规律第三章所有日期往前改一天所有产品名后面加‘Pro’语气从书面换成口语。这几条规律就是低秩的——信息量不大但覆盖范围广。LoRA 正是用低秩矩阵去近似模型为了新任务需要发生的整体变化。重要参数是 rank秩和 alpha。rank 决定了笔记的页数页数越多能记录的信息越丰富但也不是越多越好过多会引入噪声且难收敛。alpha 是缩放系数控制笔记对正文的影响强度。常见的经验配方是 alpha 取 rank 的两倍左右我自己常用 rank 16、alpha 32 起步先跑通再调。LoRA 特别典型的场景是对话风格迁移、工具调用格式学习这类任务。因为模型原有的世界知识本来就在你需要改的是说话方式和输出结构这部分变化用低秩矩阵完全能表达。2.2 QLoRA预算不够时的缩印本笔记QLoRA 的全称是 Quantized LoRA关键不是 LoRA 本身而是先对原模型做 4bit 量化再在量化后的模型上跑 LoRA。为什么这么做因为显存主要被原模型权重吃掉了。把原书缩印成一张小卡片做笔记的地方自然就省出来了。量化用的不是普通 4bit而是 NF4NormalFloat4这是为了让 4bit 的数值分布尽量贴合真实权重分布减少精度损失。有人会问模型都量化成 4bit 了训练出来的效果还能用吗QLoRA 论文的结论是在大多数任务上QLoRA 的效果可以和标准的 LoRA 打平差距通常在 1% 以内。原因是 LoRA 微调的是一个适应层只需要原模型保留基本特征提取能力NF4 量化损失的精度在训练过程中会被适配层一定程度补偿回来。QLoRA 还有一个容易被忽视的细节Double Quantization对量化常数再做一次量化以及 Paged Optimizer把优化器状态按页调度到 CPU 显存防止单卡 OOM。这些设定让 7B 模型的 QLoRA 微调可以被塞进 8GB 甚至 6GB 的消费级显卡里。我实测下来的感受是QLoRA 训练速度比 LoRA 慢因为每一步都要经过反量化/再量化但它是单卡资源受限时的救命方案。如果你是学生党或者公司只给你一张 3060那 QLoRA 就是默认选项。2.3 Adapter在模型肚子里加补充页Adapter 的思路很直白在 Transformer 的某些层里插入一个小的前馈网络模块通常包含 down-project把维度压小、激活函数、up-project把维度还原。训练时只更新这些插入的模块原模型参数全冻住。回到书的比喻这相当于在书的固定位置夹了一叠补充页每页只讲一个专项内容。运行时模型看到补充页就会用专项知识处理内容。Adapter 有一个明显特点每个任务对应一组自己的 Adapter 权重可以针对多个任务分别训练多组 Adapter需要哪个任务就用哪组不需要重新训练原模型。这一点在多任务系统里非常实用——你想让同一个基座模型既能做客服又能做法律问答只需要挂两个不同的 Adapter运行时动态切换。但代价也很明确模型体积多出了补充页的开销推理时多了几层额外计算延迟会略涨。以及和 LoRA 相比Adapter 需要手动修改模型结构Debug 成本稍高。现在 PEFT 库把它封装好了倒是省了很多事。2.4 P-Tuning v2不改正文只改导学卡P-Tuning v2 的做法是在模型每一层 Transformer 的输入前面拼接一段可学习的连续向量prefix训练时只更新这些前缀向量。再精确一点P-Tuning v1 只在输入层加一次前缀效果有限v2 改成每层都加参数量和表达力都上来了尤其适合小型模型和少样本场景。这些前缀向量不是人类语言而是模型内部空间的哑标点但它们能引导模型往特定语义方向生成。导学卡的好处是它完全不改变模型的原有参数也不需要像 Adapter 那样插入子模块。训练起来非常轻显存占用甚至比 LoRA 还低。缺点是表达复杂任务变更的能力偏弱适合稳定输出格式固定情感倾向这类简单任务遇到需要大量注入新知识的任务就力不从心。我一般把 P-Tuning v2 用在快速原型验证阶段拿几百条数据跑通任务建模确定输入输出格式没问题再换 LoRA 或全量做正式微调。它是个很好的探路兵。2.5 Freeze 微调不是最土而是中间态Freeze 微调常和 LoRA 混在一起被低估。它做法很简单把模型分成两部分冻结大部分层只训练最后几层或者某些指定模块比如全部 MLP 层或者最后的全连接层。它和 LoRA 的本质区别是LoRA 相当于不改正文只做笔记Freeze 是正文只改一部分不是改笔记。所以 Freeze 的改动痕迹最终会印在模型主体上部署时没有额外成本也不需要合并笔记。什么情况下选 Freeze很多闲聊风格任务、分类任务底层特征提取完全不需要动只改最后的分类头或输出层就够了。你的数据量和任务调整幅度介于LoRA 不够用和全量没必要之间时Freeze 是个很好的折中。3. 全量微调虽然贵但有些场景绕不开3.1 全量微调的三笔账第一笔是显存账。以 7B 模型用 BF16 混合精度为例模型权重本身要 14GB梯度再占一份 14GBAdamW 优化器状态按实现不同需要大约 56GB主权重副本加一阶二阶动量这还没算激活值和临时变量。所以一张 80G 的 A100 跑 7B 全量也非常吃力常规操作是至少 2 到 4 张 80G 卡做张量并行或 ZeRO 分片。把 7B 全量塞进单张 24G 显卡这件事工程上可能但序列长度和数据并行度都会被压到传奇程度不推荐新手尝试。第二笔是数据账。全量微调的收敛通常需要高质量、大数量、覆盖广的数据。它不是我有几千条就敢动全身的方法。数据量太小时全量微调比 LoRA 更容易把模型带偏甚至灾难性遗忘——以前会的能力全丢了。第三笔是调参账。全量微调涉及的学习率策略、正则化、训练轮数都要重新调学习率通常比 LoRA 低一个数量级全量常用 1e-5 到 2e-5LoRA 常用 2e-4 到 5e-4。因为这个操作是动全身的步子迈大了容易扯着蛋。3.2 什么场景下值得上全量我的经验是三个场景一是领域偏移巨大。比如你有一个通用代码模型想改成只处理某种专用 DSL 语言的模型这种底层表示都要重写的任务LoRA 的表达能力可能不够。二是数据量大到普通低秩更新覆盖不了。我做过一个中文法律问答项目标注了十几万条高质量问答数据LoRA 在验证集上分数卡在 89% 上不去换全量后冲到 93%。三是模型规模本身很小1B 以下此时全量微调的显存压力也不大直接全量比 LoRA 简单直接。3.3 全量微调的灾难性遗忘控制做全量微调最需要盯防的是灾难性遗忘。我常用的手段有三件套训练数据里掺入 5%-10% 的通用数据让模型不忘老知识使用较小的学习率和较大的 warmup 比例定期在通用 benchmark 上做回测一旦通用能力明显下滑就回滚。这三件套同样也适合 Freeze 微调。4. 怎么选可以压缩成四个排查问题4.1 问题一你手里到底有多少显存显存是硬约束先把答案框死。可用显存默认推荐能跑的模型规模参考6GB-8GBQLoRA7B 以内12GBQLoRA / 小模型 LoRA7B-13B小心序列长度24GBLoRA / QLoRA7B 很宽松13B 看配置40GB-80G 单卡LoRA 轻松全量小模型7B 全量勉强70B 需 QLoRA多张 80G全量微调成为选项7B-13B 全量注意这里的显存不是只看显存大小还要看你会不会用 gradient checkpointing。开了它激活值占用能砍一大半代价是训练慢 20%-30%。我建议低显存场景一律开启。4.2 问题二你的数据和任务的差距有多大这个问题的本质是你需要模型发生多大的变化。如果只是改变输出语气、输出格式、简单分类那么数据量 1000 条以内用 P-Tuning v2 或 LoRA 都足够。如果想注入大量垂直领域知识比如让模型学一个私有协议栈的全部文档至少需要上万条高质量数据LoRA 是底线有条件的话上全量。一个很实用的判断标准拿一个测试样本看看基座模型直接输出的内容离目标还有多远。如果方向已经对了只是细节不对低参数方法就能拉回来如果方向完全是错的你得考虑更深的改动。4.3 问题三任务类型决定动哪里不同任务需要改动的模型能力区域不一样对话风格转换、角色扮演LoRA 或 QLoRA 效果已经很接近全量。这类任务改动偏表层。工具调用、结构化输出JSON / SQLLoRA 效果好但要注意训练数据格式是否和模型原有的格式约定一致。P-Tuning v2 也行但复杂格式下稳定性差一些。垂直领域知识注入法律、医疗、企业文档建议 LoRA 起步效果不够再考虑全量。注意这类任务的数据质量比数量更重要。代码生成模型转某个私有框架全量的概率更大因为私有框架的语法结构可能与预训练代码差异较大。4.4 问题四部署阶段能否接受额外开销很多人选方法时只看训练时显存忽略部署成本。如果你用 Adapter 或 P-Tuning v2推理时需要加载额外模块延迟会上升。如果用 LoRA/QLoRA训练完可以合并回基座模型推理框架完全不用改动。全量微调更直接模型本身就是新模型没有任何额外负担。这条对线上服务很重要。如果你的服务要求低延迟高吞吐合并 LoRA 几乎是最优解如果模型不大、服务规模小Adapter 的额外开销其实也可以接受。4.5 一个可以直接抄作业的决策口诀把上面的问题串起来我总结成一段流程if 显存 12GB: 直接用 QLoRA elif 任务差异大 and 数据量 5万条 and 有多卡: 考虑全量微调 else: 先用 LoRA 跑一个 baseline 如果验证集分数不理想再考虑 Freeze 或全量这条流程不要看成死规则它是我踩了几年坑沉淀下来的最少后悔路径。最忌讳的是新手一上来就全量结果显存 OOM、数据不够、模型跑飞三步连击直接劝退。5. 实操避坑记录我踩过的五个深坑5.1 LoRA/QLoRA 微调完直接部署效果完全不对这是最常见也最隐蔽的坑。你本地测试效果很好一键部署到推理服务后表现判若两模。多半是没用 adapter 合并且推理框架没有识别出 LoRA 分支。很多推理服务默认只加载 base model 权重你训练出的 adaptor 文件并没有被加载。解决办法是部署前把 LoRA 权重合并回模型导出为一个完整的新模型。PEFT 库有现成的 merge_and_unload 方法合并后在你本地再测一遍。合并后基本不会再有部署前后不一致的问题。5.2 QLoRA 单卡跑了很久结果 loss 一直不降最典型的原因是学习率设置不对。QLoRA 因为用了 4bit 量化梯度的数值范围会和标准 LoRA 不太一样原封不动照搬 LoRA 的高学习率5e-4容易震荡。我的经验是 QLoRA 一开始用 1e-4 到 2e-4 更稳。另外检查一下你的量化参数普通 4bit 和 NF4 的差异对最终效果影响很大尽量用模型库默认支持的 NF4 配置。如果数据没问题、学习率也调了还是不降检查你的 dataset 是不是在每条样本前加上了不匹配的 chat template。很多开源基座对指令格式非常敏感格式错了模型目标 token 都会算错。5.3 用 LoRA 微调完模型忘了通用能力当你用 LoRA 做领域微调时由于训练集全部是领域数据适配层会向领域方向大幅偏移出现一定程度的通用能力遗忘。这很正常但可以控制训练数据里掺入 5% 到 10% 的通用语料或者从通用 benchmark 里抽一小组做验证实时监控遗忘程度。另一个做法是把 LoRA 的 rank 调小一点。rank 越小每次更新的自由度越小对原模型的覆盖程度就越低。这恰好是约束即保护的体现。5.4 rank 和 alpha 并不是越大越好我见过不少新手看到 LoRA 的 rank 参数很大就心安觉得参数多了效果一定好。实际结果经常是训练不稳定、过拟合、推理时出现诡异重复。rank 和 alpha 的经验值可以参考这张表场景建议 rank建议 alpha少样本1000条816常规数据量几千-万级1632更大改动需求万级以上32-6464-128从 rank 16 开始不收敛再往上加始终让 alpha 约等于 rank 的两倍。这个配方不一定最优但是作为一个起点非常稳。5.5 小模型入门演示别硬上大模型如果你只是想给学生或者非技术背景的团队演示什么是微调没必要拖一个 7B、13B 模型出来。我现在做演示用的是 1B 级别的模型配合 QLoRA笔记本就能跑训练几分钟就能看到前后效果变化传播效果反而比大模型好。等演示完再换 7B 上真实任务你就能更清楚地体会到方法一样、规模变大后显存和速度的压力差多少。5.6 数据质量永远比方法选择更重要最后这条是所有这些方法里最不值钱但最容易被忽略的教训方法选得再好数据是垃圾结果就是垃圾。就拿 LoRA 来说它最擅长的是把数据里的规律学进适配层如果训练集里一半标注错了LoRA 会把错误也学得活灵活现。我每次做微调第一件事不是选方法而是花一天清洗数据去掉重复样本、修正格式错误、检查标签一致性、保证标签分布合理。做完这些LoRA 和 QLoRA 的效果差距往往会缩小到一个很小的范围。六种微调方法说到底是六种不同尺度的修改方式。我的建议是先跑通一次 LoRA把流程跑熟再根据任务和数据情况逐步探索其他方法。微调不是选美大赛能稳定落地的方法就是好方法。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价