LoRA 最早是由 Meta AI 在 2023 年 5 月 23 日在论文 <<LoRA: Low-Rank Adaptation of Large Language Models>> 中提出的,是一种用于微调大型语言模型的方法。LoRA 通过将模型的一部分参数分解为低秩矩阵,从而在微调时减少计算量和存储需求,同时保持模型的性能。

解决了什么问题❔
✅大模型微调时计算量过大
✅大模型微调时存储需求过大

优点👍

优点 描述
避免灾难性遗忘 直接修改大模型的参数会导致灾难性遗忘,LoRA 通过冻结大模型参数,保留原模型的能力
快速切换 任务切换只需要加载不同的 LoRA 参数即可,不需要重新训练模型
存储效率高 一个大模型可搭配多个 LoRA,只需要存储 LoRA 参数,不需要存储大模型参数
兼容性强 原始模型完全不动,多个团队可以共享同一个基础模型,只开发自己负责的 LoRA 模块

# LoRA 原理

LoRA 的核心思想是将模型的一部分参数分解为低秩矩阵,从而在微调时减少计算量和存储需求。具体来说, LoRA 将模型的一部分参数分解为两个低秩矩阵,然后将这两个矩阵相乘得到微调后的参数。这样,在微调时只需要对这两个低秩矩阵进行更新,而不需要对整个模型进行更新,从而大大减少了计算量和存储需求。
示例:
模型原始参数矩阵为 AA,将其分解为两个低秩矩阵 UUVV,即 A=UVA = UV。在微调时,只需要更新 UUVV,而不需要更新整个 AA
变换公式如下:

微调后的参数矩阵=原始参数矩阵+微调参数矩阵A微调参数矩阵A=低秩矩阵U×低秩矩阵V\begin{aligned} \text{微调后的参数矩阵} & = \text{原始参数矩阵} + \text{微调参数矩阵A}\\ \text{微调参数矩阵A} & = \text{低秩矩阵U} \times \text{低秩矩阵V} \end{aligned}

# llama.cpp 下载与编译

llama.cpp 可以帮助我们转化模型 lora 微调模型为 gguf 格式,便于后续 ollama 部署。

  1. llama.cpp 下载
git clone https://github.com/ggerganov/llama.cpp
cd llama.cpp
  1. llama.cpp 编译环境
    创建 anaconda 虚拟环境,并安装相关依赖
conda create -n llama python=3.9
conda activate llama
cd llama.cpp
pip install -e .
  1. llama.cpp 编译

Linux 环境下编译:

#直接进入工程目录 make 即可
make
#CUDA 加速版编译
make GGML_CUDA=1

windows 环境下编译:

#Windows 平台需要安装 cmake 和 gcc,如果有没有安装的请自行百度安装
mkdir build
cd build
cmake ..
cmake --build . --config Release
 
#CUDA 加速版编译
mkdir build
cd build
cmake .. -DLLAMA_CUBLAS=ON
cmake --build . --config Release

# LoRA 微调

# 1. 准备数据集

数据集格式为 jsonl,每行一个 json,包含以下字段:

{
    "prompt": "xxx",
    "response": "xxx"
}

# 2. 准备 LoRA 参数

使用 llama.cpp 中的 tools/finetune.py 脚本,将原始模型参数转换为 LoRA 参数。