一、LORA篇

1、介绍一下Lora的原理

LoRA 是一种参数高效微调方法,其核心思想是将原始权重矩阵的更新限制在一个低秩空间内,从而显著减少训练参数量。
不同于传统微调,LoRA 将权重的更新项 Δ W \Delta W ΔW 表示为两个低秩矩阵 A ∈ R r × d A \in \mathbb{R}^{r \times d} ARr×d B ∈ R d × r B \in \mathbb{R}^{d \times r} BRd×r 的乘积:
W ′ = W + Δ W = W + B A W' = W + \Delta W = W + BA W=W+ΔW=W+BA
训练阶段只更新两个低秩矩阵 A A A B B B ,原始模型权重 W W W 保持不变;

2、LoRA 是为了解决什么问题提出的?哪些模型适合用 LoRA 微调?什么是低秩分解?

  • LoRA 的核心目标:降低大模型微调成本 参数量从 O ( d 2 ) O(d^2) O(d2) O ( r d ) O(rd) O(rd)
  • 适合含大量线性层的 Transformer 架构模型 比如注意力模块的 Q/K/V 投影矩阵、FFN前馈神经网络
低秩分解:用小矩阵逼近大矩阵

定义:低秩分解是将高维矩阵近似为两个低维矩阵的乘积,以降低表示复杂度。
数学形式:对于 d × d d \times d d×d 的高维矩阵 W W W,找到两个低维矩阵 A ∈ R r × d A \in \mathbb{R}^{r \times d} ARr×d B ∈ R d × r B \in \mathbb{R}^{d \times r} BRd×r 的乘积,使得:

W ≈ B A W \approx BA WBA

  • (A) 是 降维矩阵:将原始 d d d 维空间映射到 r r r 维子空间(提取关键特征)。
  • (B) 是 升维矩阵:将 $r$ 维特征恢复到 d d d 维空间(重构原始空间的更新)。
  • 优势:通过仅优化 (A) 和 (B) 的 2 r d 2rd 2rd 个参数(远小于 d 2 d^2 d2),即可近似表达 (W) 的主要变化,大幅减少计算量。

3、LoRA初始化

LoRA 的初始化通常遵循以下原则:

  • 原始模型权重 W 不变

  • LoRA 的矩阵:

    • A A A 通常使用正态分布初始化:nn.Linear(..., bias=False) 默认初始化
    • B B B 通常初始化为 全零矩阵,这样一开始 Δ W = B A = 0 \Delta W = B A = 0 ΔW=BA=0,模型输出不会被扰动,保证收敛稳定性

如果A也初始化成0,这样都没法更新了。对于

对于 y = B A x y = B A x y=BAx

  • 对 B 的梯度: ∂ L ∂ B = ∂ L ∂ y ⋅ ( A x ) T \displaystyle \frac{\partial L}{\partial B} = \frac{\partial L}{\partial y} \cdot (A x)^T BL=yL(Ax)T
  • 对 A 的梯度: ∂ L ∂ A = B T ⋅ ( ∂ L ∂ y ) ⋅ x T \displaystyle \frac{\partial L}{\partial A} = B^T \cdot \left( \frac{\partial L}{\partial y} \right) \cdot x^T AL=BT(yL)xT
    向量对矩阵求导规则:
    如果:
  • y = B z y = B z y=Bz
  • B ∈ R d × r B \in \mathbb{R}^{d \times r} BRd×r
  • z ∈ R r z \in \mathbb{R}^{r} zRr
    则有:
    ∂ L ∂ B = ∂ L ∂ y ⋅ z T \frac{\partial L}{\partial B} = \frac{\partial L}{\partial y} \cdot z^T BL=yLzT
    📌 这是矩阵微积分中经典的链式法则:
  • ∂ L ∂ y \frac{\partial L}{\partial y} yL d d d 维行向量(外层loss对每个输出的导数)
  • z T z^T zT 1 × r 1 \times r 1×r 行向量
  • 所以它们的乘积是一个 d × r d \times r d×r 的矩阵(和 B 同型)

4、LoRA初始化秩 r 是怎么选的?为什么不选其他值?

LoRA 中的秩 $r$ 是一个超参数,控制低秩矩阵的维度,通常选取值为 4、8、16、32、64,具体视模型规模和任务而定。

  • 太小(如 r = 1 r=1 r=1:表达能力太弱,模型性能下降
  • 太大(如 r = 512 r=512 r=512:虽然逼近能力强,但和原始 full fine-tune 差别不大,丧失了 LoRA 节省资源的意义

📌 一般经验:

模型规模推荐 LoRA 秩 r
<100M 参数4-8
100M-1B16
>1B 模型32 或 64

5、LoRA家族

参考:LoRA及衍生

5.1 LoRA+

将矩阵 B 的学习率设置得比矩阵 A 的学习率高得多
在这里插入图片描述

4.2 VeRA

VeRA(Very Efficient Rank Adaptation)是一种改进版 LoRA 微调方法,它固定低秩矩阵 A 和 B(随机初始化后冻结,在所有层之间共享;),仅训练缩放向量 d 和 b,实现参数更少、适配性更强的微调。
在这里插入图片描述
等等

4.3 QLoRA

对LoRA进行量化

模型参数精度格式

类型位数作用优缺点
FP32(float32)32 bits默认精度,训练常用精度高,速度慢,占内存大
FP16(float16)16 bits常用于推理、混合精度训练精度适中,速度快,容易溢出
bfloat1616 bitsGoogle 开发的 float16 变体精度比 FP16 更稳,适合训练
INT88 bits整数,常用于推理时量化占用小但训练难,精度可能下降
NF4(4-bit量化)4 bits近似表示浮点,QLoRA 中用占用极小,速度快,精度较低

QLoRA 是一种面向大语言模型的参数高效微调方法,它结合了 4-bit 权重量化和 LoRA adapter 插入,其关键技术点包括三方面:

第一,4-bit量化 NF4 量化(Normalized Float 4)。 相比传统的对称 int4 量化,QLoRA 使用非对称、数据分布感知的 NF4 量化格式,它通过查表(lookup table)方式实现非均匀分桶,可以更好地保留模型参数的数值分布特性。同时配合 double quantization 技术,连 lookup 表都量化,显著降低显存开销。

第二,LoRA

第三,内存调度优化。 QLoRA 使用 bitsandbytes 库的 4bit Linear 替代标准 nn.Linear,并结合 Hugging Face 的 paged optimizer,在训练时自动进行参数分页加载和 offloading,从而有效避免 CUDA OOM,支持在单张 A100 上训练 65B 模型。

二、VLLM

vLLM 是一种用于大语言模型推理加速的高性能推理引擎,核心创新点在于引入了 PagedAttention 机制,有效解决了 KV Cache 管理的显存碎片化问题。
传统的自回归推理中,每个请求的 KV Cache 都是按最大长度预分配,这会造成显存利用率极低
vLLM 使用类似操作系统分页的方式,将 KV Cache 划分为固定大小的 memory blocks,实现了按需分配与复用(paged memory management),大幅提升了显存利用率,支持高吞吐量并发。
此外,vLLM 支持高效的 continuous batching(动态批处理),无需等待所有请求完成再重新构造 batch,可以在同一批次内混合不同阶段的请求,提高 GPU 利用率。


三、Latex OCR 微调Qwen2-vl-2B-Instruct

在项目中我采用了基于 Hugging Face PEFT 框架的 LoRA 微调流程,目标模型是多模态大语言模型 Qwen2-VL-2B-Instruct,用于 LaTeX OCR 任务。
首先,我通过 AutoTokenizerAutoProcessor 加载了原始模型的 tokenizer 和图文处理器,并开启 enable_input_require_grads() 以支持梯度检查点和中间状态回传。(这是指使用 Gradient Checkpointing 技术,将部分中间激活值(activation)在前向传播时不保存,而在反向传播时再动态重算,从而节省显存。)

在模型微调上,我应用了 Parameter-Efficient Fine-Tuning(PEFT)策略,具体采用了 LoRA(Low-Rank Adaptation)机制,对 q_projk_projv_projo_proj 以及 FFN 中的 gate、up、down 投影层插入可训练的低秩模块,冻结其余参数以减少训练资源占用。

LoRA 参数配置中,我设置了秩为 64,lora_alpha 为 16,dropout 为 0.05,bias 为 none

数据方面,我基于原始 JSON 格式构建了 Dataset 对象,并通过 map() 函数绑定自定义的 process_func 实现图文对数据的 prompt 拼接、图像编码及 token 对齐。

在训练阶段,我使用 Hugging Face Transformers 的Trainer 框架,设置了 gradient_checkpointing 与梯度累积以降低显存占用,并通过 DataCollatorForSeq2Seq 实现 batch 自动 padding 以及标签 mask。

此外,我集成了 SwanLabCallback 进行训练过程指标可视化,并使用 bfloat16 精度与 device_map="auto" 方式自动调度至多张 GPU。


Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐