首页优化地图方法索引基础概念
返回技术汇总表 ↗

M034 · 独立详解

LoRA与QLoRA:少训练参数,为什么仍要经过基座

用一个低秩Linear算例理解前后向,再把训练状态、冻结权重与激活的容量分开计算。

模型与算法内存与数据搬运详解已编写
视频讲解待制作

这篇文章的小视频尚未制作;可以先阅读下方文字详解。

本页目录

01 · 全参数微调为什么要保存大量状态

全参数微调不仅保存模型权重,还需要梯度、优化器状态和反向所需激活。LoRA冻结基座,训练少量新增参数;QLoRA进一步以低位保存冻结基座。它们主要改变适配训练方案及状态容量,不是任意预训练循环的无损替代。

对象LoRA发生什么QLoRA进一步做什么
基座权重不更新,但参与计算用低位码与尺度等表示,计算时还原或用适配内核。
基座梯度/优化器状态冻结参数通常不需要这些更新状态仍不更新冻结基座。
适配器A/B训练,保留梯度与所需优化器状态一般仍以训练配方支持的浮点格式计算/保存。
激活与反向仍有依赖,不会随可训练参数同比消失继续受序列、batch与重算策略影响。

依据:LoRA · 低秩适配原始论文 ↗ · QLoRA · 量化基座微调原始论文 ↗

02 · 一个大矩阵旁边,加两个小矩阵

采用列向量记法:基座W形状[dout,din],输入x为din维。LoRA用A[r,din]和B[dout,r],形成ΔW=sBA,输出y=Wx+sB(Ax)。经典缩放s=alpha/r;变体可采用别的缩放,应按检查点配置。

教学示意 · 不代表硬件实测
基座路径:x[din] → W → y_base[dout]
适配路径:x[din] → A → u[r] → B → delta[dout]
输出:y = y_base + scale * delta
# r是低秩中间宽度,通常远小于din/dout。

自设din=dout=2、r=1,W为单位阵,A=[1,2],B=[3,4]ᵀ,s=0.5,x=[1,2]。Ax=5,增量=[7.5,10],最终y=[8.5,12]。低秩分支仍依赖输入和两组参数,不能只缓存一个固定输出增量。

依据:LoRA · 低秩适配原始论文 ↗

03 · 可训练参数减少多少,先按矩阵算

自设一个4096×4096的Linear:全矩阵有16777216个参数;LoRA参数为r×(din+dout)。r=16时为131072个,即1/128。这个比例只属于该矩阵,模型若只适配部分层还需分别求和。

rank变大,训练状态怎样增长?

仅一个4096×4096矩阵;训练状态按参数2B+梯度2B+Adam两状态8B,不计master副本。低位基座只计原始码载荷;尺度、激活、workspace和实际峰值另计。

教学账本按每个可训练参数:参数2B、梯度2B、FP32 Adam两状态8B,共12B,不含master副本。全矩阵约192 MiB;r=16的LoRA训练状态约1.5 MiB,另加冻结基座32 MiB,合计33.5 MiB。真实dtype和优化器可能不同。

QLoRA将同一基座按4bit码计算原始载荷为8 MiB,尚需量化尺度、码本/其他元数据和工作区;不能把“4bit”当每参数只有0.5B的最终训练峰值。低位权重、梯度、激活和通信格式也不是同一个设置。

依据:QLoRA · 量化基座微调原始论文 ↗ · Hugging Face PEFT · 量化基座微调 ↗

04 · 冻结W,为什么还要算dX

若前面还有可训练层,Loss梯度必须经过当前层传回。冻结W只是不计算或不保存它的更新梯度;输入梯度仍包含Wᵀdy。即使前面的基座也冻结,上游LoRA分支仍可能需要这些梯度。

教学示意 · 不代表硬件实测
u = A x;给定上游dy
dB = scale * dy uᵀ
dA = scale * (Bᵀ dy) xᵀ
dx = Wᵀ dy + scale * Aᵀ Bᵀ dy
# W冻结:不更新W。仍根据输入/上游是否需要梯度决定是否算dx。

因此不能对整段基座随便套no_grad或detach。那会同时截断通向上游适配器的路径。只有不影响任何所需梯度的冻结前缀,才可能省掉相应反向;要按计算图判断。

经典LoRA初始化常让一侧为零,使初始增量为零。此时另一侧第一步梯度也可能为零,这不表示梯度实现坏了;测试时可用非零A/B检查一般情况。

依据:LoRA · 低秩适配原始论文 ↗ · Hugging Face PEFT 0.21.0 · LoRA参数、变体与合并 ↗

05 · QLoRA不是把所有训练都变成4bit

冻结基座以量化码长期保存,计算时按训练配方还原到支持的计算dtype或走相应低位路径;反向仍通过基座运算把梯度传给适配参数,不需要对离散基座码做全参数更新。

原QLoRA配方提出NF4、量化常数再量化,以及分页优化器控制内存峰值。NF4不是普通均匀整数4bit,分页优化器也不等于分页KV。它们解决不同对象的容量问题,应分别核对实现与硬件支持。

量化会改变基座数值,反量化和小矩阵分支也有代价;QLoRA节省容量可能让训练放得下,但不保证相同batch的每步更快或所有任务等质量。

依据:QLoRA · 量化基座微调原始论文 ↗ · Hugging Face PEFT · 量化基座微调 ↗

06 · 一次微调step怎样流过基座与分支

教学示意 · 不代表硬件实测
加载兼容基座,必要时建立低位表示
冻结指定参数,插入A/B并检查可训练参数清单
前向:每个目标层同时算基座与适配分支
按任务定义计算Loss
反向:保留所需dx,计算A/B及其他指定参数梯度
优化器仅更新目标参数;再进入下一批
保存适配器 + 基座身份 + tokenizer/配置等恢复信息

目标模块、rank、scale、dropout、bias、额外可训练层和词表修改都会影响参数量与导出。不要只检查名字含lora的参数:modules_to_save或任务头也可能需要更新和保存。

可以结合混合精度、激活重算、长度组织和分片。冻结参数减少的状态同步,与TP/PP执行过程中仍需的通信不是同一件事,不能因此删掉所有多卡通信。

依据:Hugging Face PEFT 0.21.0 · LoRA参数、变体与合并 ↗ · Hugging Face PEFT · 量化基座微调 ↗

07 · 小脚本验证梯度,更新时只改A/B

下载脚本验证一般形状LoRA与合并矩阵输出,核对x、A、B的解析梯度和有限差分;再经过一个冻结Linear,让梯度继续传给上游适配器,展示detach会错误丢失它。一次SGD演示只更新A/B,基座保持原值。脚本不实现NF4或真实QLoRA训练。

教学示意 · 不代表硬件实测
确认目标层与scale、dtype、dropout
列出requires_grad参数和优化器实际接收参数
用小输入核对前后向与更新前后权重
记录基座码/元数据、适配状态、激活和workspace峰值
以目标任务质量比较总训练时间
# 参数减少比例与每step加速比例分开报告。

依据:Hugging Face PEFT 0.21.0 · LoRA参数、变体与合并 ↗

08 · 训练完以后:保留分支还是合并

固定适配器、普通线性LoRA且推理无dropout时,可令Wmerged=W+sBA,省掉在线适配分支。有限精度仍需验证误差;低位基座还涉及反量化、合并和可能的重新量化。把训练时的QLoRA权重直接当可随意原地相加的普通矩阵,会出错。

多适配器服务则通常共享基座,保留各自A/B,不能用一份合并权重同时表达所有请求。M031会继续展开共享批处理、按适配器分组以及加载生命周期。

依据:Hugging Face PEFT 0.21.0 · LoRA参数、变体与合并 ↗

09 · 验收是容量、速度和质量三份账

  • 正确性:target模块、rank/scale、冻结清单、上游梯度、导出及恢复。
  • 容量:基座及元数据、可训练参数状态、保存激活、重算和临时workspace。
  • 速度:前反向、反量化、小分支启动、优化器和完整step。
  • 质量:同任务数据与评测,rank/目标层/量化配方的效果和达到目标所需步数。

GPU/NPU都需要与量化格式、适配器布局及训练框架匹配的实现。CUDA低位加载配置不是昇腾通用训练指令;先核对版本支持,再验证完整训练路径。

依据:vLLM Ascend · 支持功能矩阵(main) ↗

  • 可训练参数只有1/128,为什么不能期待完整step快128倍?
  • 冻结Linear位于两个可训练分支之间,为什么不能detach它?
  • QLoRA的分页优化器与分页KV分别管理什么对象?

流程位置与关联方法

这个方法可能出现在多个位置;计算线包含模型计算与算子实现,执行线包含运行时、内存和通信。

资料与核查范围

原理依据以原始论文和官方文档为主;算例与时间线是教学推导。文档核查日期:2026-10-10。引用 main / latest 文档时,实际接口以安装版本为准。

代码为接入片段或教学伪代码;本页没有声称完成 NVIDIA / 昇腾硬件实测。

← 返回总表中的 M034继续阅读:混合精度训练 →
AI Infra 知识库 · 总览 → 独立讲解网站更新 2026-10-08
搜索知识库

搜索方法与基础概念 · Esc 关闭