LoRA 最早是由 Meta AI 在 2023 年 5 月 23 日在论文 <<LoRA: Low-Rank Adaptation of Large Language Models>> 中提出的,是一种用于微调大型语言模型的方法。LoRA 通过将模型的一部分参数分解为低秩矩阵,从而在微调时减少计算量和存储需求,同时保持模型的性能。
解决了什么问题❔
✅大模型微调时计算量过大
✅大模型微调时存储需求过大
优点👍
优点 | 描述 |
---|---|
避免灾难性遗忘 | 直接修改大模型的参数会导致灾难性遗忘,LoRA 通过冻结大模型参数,保留原模型的能力 |
快速切换 | 任务切换只需要加载不同的 LoRA 参数即可,不需要重新训练模型 |
存储效率高 | 一个大模型可搭配多个 LoRA,只需要存储 LoRA 参数,不需要存储大模型参数 |
兼容性强 | 原始模型完全不动,多个团队可以共享同一个基础模型,只开发自己负责的 LoRA 模块 |
# LoRA 原理
LoRA
的核心思想是将模型的一部分参数分解为低秩矩阵,从而在微调时减少计算量和存储需求。具体来说, LoRA
将模型的一部分参数分解为两个低秩矩阵,然后将这两个矩阵相乘得到微调后的参数。这样,在微调时只需要对这两个低秩矩阵进行更新,而不需要对整个模型进行更新,从而大大减少了计算量和存储需求。
示例:
模型原始参数矩阵为 ,将其分解为两个低秩矩阵 和 ,即 。在微调时,只需要更新 和 ,而不需要更新整个 。
变换公式如下:
# llama.cpp 下载与编译
llama.cpp 可以帮助我们转化模型 lora 微调模型为 gguf 格式,便于后续 ollama 部署。
- llama.cpp 下载
git clone https://github.com/ggerganov/llama.cpp | |
cd llama.cpp |
- llama.cpp 编译环境
创建 anaconda 虚拟环境,并安装相关依赖
conda create -n llama python=3.9 | |
conda activate llama | |
cd llama.cpp | |
pip install -e . |
- 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 参数。