第七集:LoRA 和 QLoRA 微调技术及区别含代码实现

  • 时间:2025-10-22 15:46 作者: 来源: 阅读:7
  • 扫一扫,手机访问
摘要:一、LoRA 对比 QLoRALoRA(低秩自适应)与 QLoRA(量化低秩自适应),均为训练AI模型的技术。具体而言,它们属于参数高效微调(PEFT)方法,这类微调技术因比训练大语言模型(LLMs)的其他方法更具资源效率而广受关注。LoRA和QLoRA都能更高效地微调大语言模型,但二者在操作模型的方式及利用存储实现预期效果的技术路线上存在差异。二、oRA与

一、LoRA 对比 QLoRA

LoRA(低秩自适应)与 QLoRA(量化低秩自适应),均为训练AI模型的技术。具体而言,它们属于参数高效微调(PEFT)方法,这类微调技术因比训练大语言模型(LLMs)的其他方法更具资源效率而广受关注。

LoRA和QLoRA都能更高效地微调大语言模型,但二者在操作模型的方式及利用存储实现预期效果的技术路线上存在差异。

二、oRA与QLoRA相较传统微调有何不同?

大语言模型是由海量参数构成的复杂模型——部分模型参数可达数十亿量级。这些参数使模型能够基于特定规模的信息进行训练。参数越多意味着数据存储需求越高,整体而言模型能力也越强。

传统微调需要重新拟合(更新或调整)每个独立参数以更新大语言模型。这可能涉及数十亿参数的微调,需消耗大量算力成本与时间成本。

逐参数更新可能导致“过拟合”,该术语指AI模型除学习常规训练数据外,还习得了“噪声”或无价值数据。

三、何为基础模型?

设想教师与课堂场景:学生全年学习数学知识,临考前教师重点强调长除法。考试时许多学生过分专注长除法,反而遗忘了其他同等重大题目的关键数学公式。这正是传统微调中过拟合对大语言模型的影响。

除过拟合问题外,传统微调还存在显著的资源消耗成本。

QLoRA与LoRA作为微调技术,通过技术捷径提升全参数微调效率。二者将模型分解为矩阵结构,仅训练学习新信息所需的必要参数,而非更新所有参数。

延续这个比喻:这些微调技术能高效引入新知识点,且不会分散模型对考试中其他知识点的注意力。

四、LoRA如何运作?

LoRA技术通过引入新参数在新增数据上训练AI模型。

该方法不训练整个模型及所有预训练权重,而是将其搁置或"固定",转而训练较小规模的参数样本。这些样本被称为低秩自适应矩阵,LoRA即得名于此。

其"低秩"特性源于矩阵所含参数与权重数量较少。训练完成后,这些矩阵会与原始参数合并,形成单一整体矩阵运作。该机制显著提升微调效率。

可将LoRA矩阵理解为向原矩阵添加的单行或单列。

第七集:LoRA 和 QLoRA 微调技术及区别含代码实现


训练参数所有权重需耗费大量时间、资金及内存资源。完成训练后,可能仍需补充训练,且过程中已徒耗大量资源。

此列代表低秩权重:

第七集:LoRA 和 QLoRA 微调技术及区别含代码实现


当新增的低秩参数完成训练后,该独立"行"或"列"将被添加进原始矩阵。该机制使模型能将新增训练成果应用于整体参数。

第七集:LoRA 和 QLoRA 微调技术及区别含代码实现


此时AI模型可与新增微调权重协同运作。

训练低秩权重所需时间、内存及成本显著降低。一旦该样本完成训练,即可在大型矩阵内部应用所学知识,且无需占用额外内存。

五、LoRA技术优势

LoRA是一种能以更少时间、更低资源及更小代价实现模型微调的技术。其优势包括:

  • 需训练参数量更少

  • 过拟合风险更低

  • 训练速度更快

  • 内存占用更少

  • 支持灵活调整(可选择性应用于模型特定部分)

六、QLoRA如何运作?

QLoRA是LoRA的扩展技术。这种类似技术具备额外优势:内存占用更低。

"QLoRA"中的"Q"代表"量化"。在此语境下,模型量化指将高度复杂、高精度的参数(含大量小数位并占用高内存)压缩为更精简的参数(小数位更少且内存占用更低)。

其目标是通过单个图形处理器(GPU)的存储与内存实现模型局部微调。该技术采用4位标准浮点数(NF4)——一种新型数据类型,能以比LoRA更低的内存需求实现矩阵量化。通过将参数压缩为更小、更易处理的数据形式,可将内存占用量最高压缩至原始大小的四分之一。

模型经量化后,因体积大幅减小而更易微调。

第七集:LoRA 和 QLoRA 微调技术及区别含代码实现


在12个参数中,3个为绿色,6个为蓝色,2个为黄色,1个为粉色。当模型经量化处理后,将被压缩为先前模型的表征形式。

第七集:LoRA 和 QLoRA 微调技术及区别含代码实现


量化处理后,样本量缩减为1个绿色、2个蓝色及1个黄色参数。

量化过程中存在数据丢失风险:部分参数因数值过小,可能在压缩时丢失。例如粉色参数缺失,因其在原参数中占比过小,所代表数据量不足以在压缩版本中保留。

此示例将参数从12个压缩至4个。实际应用中,数十亿参数被压缩为有限数量,以便在单个GPU上实现可操作的微调。

理想情况下,当新增训练矩阵合并回原始矩阵时,任何丢失数据均可从原参数中恢复,且全程精度无损。但此结果并非绝对保证。

该技术融合高性能计算与低维护成本存储,使模型在有限资源下仍能保持极高精度。

七、QLoRA技术优势

QLoRA是一种强调低内存维护需求的技术。与LoRA类似,其优先思考效率以实现更快速、更便捷的微调训练过程。优势包括:

  • 内存需求低于LoRA

  • 有助于避免数据过拟合

  • 精度维持高位

  • 实现快速轻量级模型调优

八、LoRA与QLoRA有何差异?

LoRA本身即可作为高效微调技术独立使用。QLoRA则是在LoRA基础上集成多层技术以提升效率的扩展方案,其存储空间占用显著低于LoRA。

若难以确定适用技术方案,提议优先评估可用存储与资源规模。若存储资源受限,QLoRA将更易执行。

九、代码实现

1. 用pip安装 loralib

pip install loralib# Alternatively# pip install git+https://github.com/microsoft/LoRA

2.可选择通过loralib实现的对应模块替换特定层进行适配。当前仅支持nn.Linear、nn.Embedding及nn.Conv2d层。针对单一nn.Linear层表征多层结构的场景(如注意力机制qkv投影的某些实现方案),亦支持MergedLinear模块(详见附加说明)。

# ===== Before =====# layer = nn.Linear(in_features, out_features)# ===== After ======import loralib as lora# Add a pair of low-rank adaptation matrices with rank r=16layer = lora.Linear(in_features, out_features, r=16)

3.训练循环启动前,仅需将LoRA参数标记为可训练状态。

import loralib as loramodel = BigModel()# This sets requires_grad to False for all parameters without the string "lora_" in their nameslora.mark_only_lora_as_trainable(model)# Training loopfor batch in dataloader:   ...

4.保存检查点时,需生成仅包含LoRA参数的状态字典。

# ===== Before =====# torch.save(model.state_dict(), checkpoint_path)# ===== After =====torch.save(lora.lora_state_dict(model), checkpoint_path)

5.加载检查点时使用load_state_dict方法,需设置strict=False。

# Load the pretrained checkpoint firstmodel.load_state_dict(torch.load('ckpt_pretrained.pt'), strict=False)# Then load the LoRA checkpointmodel.load_state_dict(torch.load('ckpt_lora.pt'), strict=False)

5. 注意事项

1. 尽管示例中我们采用简单高效的配置(仅调整Transformer的q与v投影层),但LoRA可应用于预训练权重的任意子集。提议尝试不同配置方案,例如:通过将nn.Embedding替换为lora.Embedding调整嵌入层,或适配MLP层。不同模型架构与任务的最优配置存在差异。

2. 部分Transformer实现使用单一nn.Linear层处理查询/键/值投影矩阵。若需约束各矩阵更新的秩,须拆分为三个独立矩阵或采用lora.MergedLinear。选择拆解层结构时,务必相应修改检查点。

# ===== Before =====# qkv_proj = nn.Linear(d_model, 3*d_model)# ===== After =====# Break it up (remember to modify the pretrained checkpoint accordingly)q_proj = lora.Linear(d_model, d_model, r=8)k_proj = nn.Linear(d_model, d_model)v_proj = lora.Linear(d_model, d_model, r=8)# Alternatively, use lora.MergedLinear (recommended)qkv_proj = lora.MergedLinear(d_model, 3*d_model, r=8, enable_lora=[True, False, True])

3. 在训练偏差向量时结合LoRA技术,可能是提升任务性能的性价比较优方案(需谨慎调整学习率)。虽然论文中未深入探究其影响,但通过lora库可便捷尝试。调用
mark_only_lora_as_trainable方法时,通过设置bias="all"或"lora_only"可将部分偏差向量标记为可训练。保存检查点时,须向lora_state_dict传递对应的bias=参数。

# ===== Before =====# lora.mark_only_lora_as_trainable(model) # Not training any bias vectors# ===== After =====# Training all bias vectors associated with modules we apply LoRA to lora.mark_only_lora_as_trainable(model, bias='lora_only')# Alternatively, we can train *all* bias vectors in the model, including LayerNorm biaseslora.mark_only_lora_as_trainable(model, bias='all')# When saving a checkpoint, use the same bias= ('all' or 'lora_only')torch.save(lora.lora_state_dict(model, bias='all'), checkpoint_path)

4.调用model.eval()将触发LoRA参数与对应预训练参数的合并操作,此举可消除后续前向传播的额外延迟。再次调用model.train()将解除该合并状态。通过向LoRA层传递merge_weights=False参数可禁用此功能。

  • 全部评论(0)
最新发布的资讯信息
【系统环境|】Spring Boot3 中实现按模板导出 Word 文档合同的技术指南(2025-10-30 16:04)
【系统环境|】openPangu-Ultra-MoE-718B-V1.1今日正式开源,部署指南来啦!(2025-10-30 16:03)
【系统环境|】Ubuntu + vLLM + DeepSeek 本地部署完全指南(2025-10-30 16:03)
【系统环境|】如何用公众号AI编辑器实现一键排版?一份完整的5步指南(2025-10-30 16:02)
【系统环境|】Spring Boot 与 Nacos 完美整合指南(2025-10-30 16:01)
【系统环境|】Rust MCP开发指南:让AI与应用对话的桥梁(2025-10-30 16:00)
【系统环境|】MCP Server 开发实战指南(2025-10-30 15:59)
【系统环境|】入门指南:使用 Playwright MCP Server 为你的 AI Agent 赋予能力(2025-10-30 15:58)
【系统环境|】一个IT女搬砖工的情人节爱心礼物指南及衍伸 v16.02.14(2025-10-30 15:57)
【系统环境|】百元矿渣显卡淘金全指南(2025-10-30 15:57)
手机二维码手机访问领取大礼包
返回顶部