游乐游手机版
首页/AI热点日报/热点详情

大模型PEFT参数高效微调技术解析与加速实践

类型:热点整理2026-07-03
自ChatGPT走红以来,大模型战场瞬间热闹了起来。但动辄上亿甚至百亿的参数规模,直接让从头训练变成了一件“奢侈品”。于是,微调(fine-tuning)技术成了业界更务实的选择——基于一个已经在海量数据上训练好的开源基座模型,再用特定业务领域的数据做针对性训练,性价比极高。 传统方式是全参数微调,

自ChatGPT走红以来,大模型战场瞬间热闹了起来。但动辄上亿甚至百亿的参数规模,直接让从头训练变成了一件“奢侈品”。于是,微调(fine-tuning)技术成了业界更务实的选择——基于一个已经在海量数据上训练好的开源基座模型,再用特定业务领域的数据做针对性训练,性价比极高。

传统方式是全参数微调,也就是在训练过程中把预训练模型里每一个权重都拉出来更新一遍(如图中那满满的d*d个参数)。可问题是,面对像LLaMA 3-70B、Qwen 1.5-110B这样的巨无霸,全参数微调的计算成本和时间代价,已经远远超出了多数团队能承受的范围。

但思路一转,问题就有了突破口。既然模型在预训练阶段积累了足够多的“见识”,那是不是可以给模型装一个“外设”小模块,让它专门去学习下游任务所需的知识,而模型主体保持不动?这正是参数高效微调(PEFT, Parameter-Efficient Fine-Tuning)的核心思想——通过冻结大部分预训练参数,只更新极少量的额外参数,从而大幅降低训练成本,同时保持甚至提升模型在下游任务上的表现。

下面,我们就系统性地梳理几种主流的PEFT方法,从它们的原理、特点到实际应用效果,逐一拆解。此外,还会分享一些基于Unsloth的加速实践经验,看看在工程落地上能省下多少真金白银的算力。

参数高效微调(PEFT)

在深入具体方法之前,有必要明确一个背景:为什么我们需要PEFT?简单来说,全参数微调是“推倒重来”,而PEFT是“精准调整”。前者就像为每个新任务重新培养一个专家,后者则是给一个通才发几本专业手册。显然,在资源有限、任务多样的现实环境中,PEFT要实用得多。

Adapter Tuning与Prefix Tuning

在LoRA这类当前最热门的方法问世之前,业界已经有过一些探索。

Adapter Tuning

2019年提出的Adapter Tuning,是早期PEFT的代表作之一。它的做法是在Transformer层中插入一个轻量的“适配器”模块(如图中右边部分所示),微调时只更新这个模块的参数,其余部分全部冻结。这样做的好处是训练参数量大幅下降,但一个明显的缺陷也随之而来——模型结构变得更深了,推理时需要额外计算Adapter部分,导致推理时长增加。

Prefix Tuning

Prefix Tuning的思路则更巧妙一些。它不改变模型结构,而是在输入数据前加上一段连续、可训练的“前缀”向量。这个前缀就像给模型的一个“小抄”,引导它更关注输入中的关键信息。同样,模型主体参数被冻结,只优化前缀。不过问题也很直接:前缀长度不好选,太长增加计算量,太短可能引导不足;而且前缀的加入本身就会增加输入的计算成本。

LoRA(Low-Rank Adaptation)

前面提到的两种方法,要么改变模型结构,要么增加输入长度。那有没有一种方法,既能像全参数微调那样不改变模型架构、不增加计算负担,又能把可训练参数量降到极低?LoRA给出了一个漂亮的答案。

原理

LoRA(低秩适配器)的核心逻辑非常直观:它认为模型参数在微调过程中的更新量ΔW是一个低秩矩阵。基于这个假设,它不直接去更新庞大的原始权重矩阵W,而是在W旁边加一个“旁路”——由两个低秩矩阵A和B组成。通过优化A和B来近似模拟ΔW,就能实现对下游任务的适配。

假设原始权重W的维度是d×d。LoRA将A的维度设为r×d,B的维度设为d×r,其中r远小于d。这样,可训练的参数量就从d×d降到了2×d×r。训练时,A和B被更新,而原始W被冻结。推理时,只需将训练好的BA矩阵与原权重合并(即h = (W + BA)·x),模型结构和计算量完全不受影响。

直观理解,就是先通过A做降维,再通过B做升维,在压缩和还原过程中捕捉任务相关的变化。以d=4096、r=8为例,全参更新需要约1600万个参数,而LoRA只需要约6.5万个,效率提升非常显著。

LoRA有个关键特点:不同的业务场景可以基于同一个基座模型训练不同的LoRA权重,使用时加载对应的LoRA即可,非常灵活。而且LoRA权重通常远小于基座模型,存储和切换都很方便。

实验

在58同城的两个NLU业务数据集上,我们基于qwen1.5-7b-base模型做了对比实验。结果相当有说服力:

  • NLU业务数据集1: 全参微调的F1-Score为87.68%,LoRA(r=8)达到86.44%,几乎持平,而且远超GPT4的59%。
  • NLU业务数据集2: LoRA(r=16)的性能甚至超过了全参微调,精确率、召回率、F1三项指标全面领先。

说明LoRA在多数场景下足以媲美全参微调,同时成本大幅降低。但实验也显示,秩r的选择直接关系效果:r太小,欠拟合;r过大,可能过拟合或带来不必要的开销。在实践中,找到合适的r是一个需要反复尝试的关键环节。

QLoRA(Quantized LoRA)

LoRA主要降低优化器状态占用的显存,但对模型权重和中间变量的显存消耗改善有限。QLoRA在此基础上,通过模型量化进一步压低了显存占用。

原理

量化的本质,就是用更少的比特来表示参数值,必然会带来信息损失。QLoRA的巧妙之处在于,它用一种更聪明的量化方式——分位数量化+分块量化,来尽可能减少这种损失。

  • 分位数量化: 利用了模型权重符合正态分布的规律。分布中间区域(出现频率高)映射更精细,两端(出现频率低)映射更粗糙,从而整体减少量化误差。
  • 分块量化: 将数据分成小块,每个块独立量化,并记录每个块的量化常数。这样可以有效减轻离群值对整体量化的负面影响。

此外,QLoRA还引入了双重量化:把量化常数本身再做一次8bit量化;以及分页优化:在显存不足时将部分梯度检查点转移到CPU内存,避免OOM。通过这些技术,QLoRA在保持与原始LoRA几乎相同精度的前提下,将显存占用压缩到了极其经济的水平。

实验

在A800上对Qwen1.5-7B进行的测试显示:QLoRA的训练显存占用从LoRA的55.7GB降至39.1GB,降低约30%,但训练时间因量化和反量化操作略有增加(从7192s延长至8760s)。精度方面,QLoRA的F1-Score为86.23%,与LoRA的86.44%几乎无差。对于显存资源紧张、对训练速度不敏感的团队来说,这是一个非常值得采用

AdaLoRA(Adaptive Low Rank Adaptor)

LoRA所有模块都用同一个秩r,这显然不够“聪明”——其实模型中不同模块的重要性差别很大,用统一尺度去处理,效率自然不是最优。AdaLoRA正是来解决这个问题的。

原理

AdaLoRA将LoRA的“双项式”结构改造成了SVD(奇异值分解)的“三项式”结构:ΔW = P·Λ·Q,其中P和Q是正交矩阵,Λ是对角矩阵。这样每项的变化可以独立考察,而Λ中的奇异值及其对应的奇异向量,就构成了一个可以衡量重要性的“三元组”。

具体来说,AdaLoRA通过一个重要性函数(结合敏感性和不确定性)来评估每个三元组对最终任务的贡献。训练过程中,它会不断剪枝掉那些重要性低的三元组(通过将其在Λ中对应值置0),而保留重要的三元组。最终,不同模块的秩会根据自身重要性自适应地调整,有些保留更高的秩,有些则剪得更低。

这种“改结构 + 评估重要性 + 动态剪枝”的设计,理论上有很大的优势。但有一个代价:为了确保P和Q满足正交性质,AdaLoRA在损失函数中加入了严格的正交约束(正则项)。这在一定程度上可能限制了模型的表达能力。

实验

在NLU业务数据集1上的测试显示,AdaLoRA(r=2)的F1-Score为82.37%,明显低于LoRA(r=8)的86.44%。这表明,尽管AdaLoRA的思路非常有价值——自适应分配秩确实是一项重要的贡献,但正定假设的严厉性在实践中可能对模型性能产生了制约。不过,它启发了很多后续工作,是一个里程碑式的思路。

SoRA(Sparse low rank adaptation)

如果说AdaLoRA是通过在损失函数中加约束来实现自适应,那么SoRA则选择了一条更轻量、更灵活的路径。

原理

SoRA在LoRA的低秩分解结构中间,增加了一个可学习的“门单元”(gate)。训练时,通过近端梯度下降优化器,对门单元施加稀疏性约束(L1正则化),让门单元的部分值被置为0。置0就意味着对应的秩被“切断”,相当于自动降维了。

更妙的是,在推理时,可以将这些被置0的秩对应的参数(与门单元相关的权重)完全删除,SoRA模块就退化为一个更紧凑但同样有效的LoRA模块。整个过程完全自适应,不需要像AdaLoRA那样手动设置target r和剪枝阈值。

实验

在NLU业务数据集1和数据集2上的对比中,SoRA的表现非常亮眼。在数据集1上,SoRA的F1-Score达到86.52%,略高于LoRA的86.44%;在数据集2上,SoRA在所有指标上都全面超越了LoRA和AdaLoRA。这说明,SoRA在保持或提升精度的同时,实现了真正的自适应秩调整。

微调加速实践

除了优化微调方法本身,加速训练过程也是提升效率的关键。我们尝试了Unsloth这个工具,它在不损失精度的前提下,能显著加快训练速度、降低显存占用。

Unsloth

Unsloth的核心思路是,用Triton语言手写大模型中关键结构(如RoPE、MLP、LayerNorms)的前向和反向传播代码,替代PyTorch的默认实现。手动实现可以更精细地优化链式求导过程,大量使用in-place操作,从而节省显存和提升计算速度。

目前Unsloth支持llama、gemma、deepseek、qwen等主流模型,但仅支持基于peft库的LoRA微调方式(包括QLoRA),不支持预训练,也不支持MoE结构。并且开源版本仅支持单卡。

微调加速

接入方式非常简单:只需用FastLanguageModel.get_peft_model取代原始的get_peft_model即可。

测试结果

我们在A800上对qwen和llama系列模型进行了测试,效果令人印象深刻:

  • 训练时间: 缩短20%~35%。例如,qwen1.5-7b在batchsize=16下的训练时间从12.1小时降至7.76小时,提速55%。
  • 显存占用: 降低30%~46%。例如,qwen1.5-7b的显存占用从72GB降至39.2GB,降幅达45.56%。

结合Unsloth和flash-attention后,加速效果更稳定。不过值得注意的是,Unsloth本身可能已经包含了flash-attention的部分优化,所以两者简单叠加时,效果可能不是线性叠加。

总结

从Adapter Tuning到SoRA,参数高效微调技术走过了一条从“插件化”到“自适应”的进化之路。当前实践证明:结合成熟的低参微调方案(如LoRA、SoRA)与高效的微调加速工具(如Unsloth),完全可以用极低的资源代价,获得与全参数微调几乎无异的性能。

对于绝大多数AI应用团队来说,这无疑是最务实的路径——用最小的成本,最大化基础模型的价值。

来源:https://www.53ai.com/news/finetuning/2025031393418.html

相关热点

继续查看同栏目近期热点。

延伸阅读

补充最近整理过的热点入口。