一、LoRA微调的基本原理
1、基本概念
- LoRA(Low-Rank Adaptation)是一种用于大模型微调的技术,通过引入低秩矩阵来减少微调时的参数量。在预训练的模型中,LoRA通过添加两个小矩阵B和A来近似原始的大矩阵ΔW,从而减少需要更新的参数数量。具体来说,LoRA通过将全参微调的增量参数矩阵ΔW表示为两个参数量更小的矩阵B和A的低秩近似来实现:
- [ W_0 + \Delta W = W_0 + BA ]
- 其中,B和A的秩远小于原始矩阵的秩,从而大大减少了需要更新的参数数量。
2、思想
- 预训练模型中存在一个极小的内在维度,这个内在维度是发挥核心作用的地方。在继续训练的过程中,权重的更新依然也有如此特点,即也存在一个内在维度(内在秩)
- 权重更新:W=W+^W
• 因此,可以通过矩阵分解的方式,将原本要更新的大的矩阵变为两个小的矩阵 - 权重更新:W=W+^W=W+BA
- 具体做法,即在矩阵计算中增加一个旁系分支,旁系分支由两个低秩矩阵A和B组成
3、原理
- 训练时,输入分别与原始权重和两个低秩矩阵进行计算,共同得到最终结果,优化则仅优化A和B
- 训练完成后,可以将两个低秩矩阵与原始模型中的权重进行合并,合并后的模型与原始模型无异
4、为什么GPU支持AI训练,且是最优选
CPU串行运算能力强(计算频率高,核心数少)
GPU并行运算能力强(计算频率低,核心数多(CUDA数量))
5、模型之间区别
1、模型预训练:从头开始训练一个全新的模型。(全新的模型是指模型的参数完全随机,不能处理任何问题。)
2、微调训练(迁移学习):基于之前训练好的模型,来继续学习新的任务。微调的目的往往是让模型具备新的或者特定的能力。
3、Lora微调属于局部微调。
二、LLaMA-Factory介绍
github官网地址:https://github.com/hiyouga/LLaMA-Factory/blob/main/README_zh.md
1、基本介绍
LLaMA Factory 是一个简单易用且高效的大型语言模型(Large Language Model)训练与微调平台。通过 LLaMA Factory,可以在无需编写任何代码的前提下,在本地完成上百种预训练模型的微调,框架特性包括:
-
模型种类:LLaMA、LLaVA、Mistral、Mixtral-MoE、Qwen、Yi、Gemma、Baichuan、ChatGLM、Phi 等等。
-
训练算法:(增量)预训练、(多模态)指令监督微调、奖励模型训练、PPO 训练、DPO 训练、KTO 训练、ORPO 训练等等。
-
运算精度:16 比特全参数微调、冻结微调、LoRA 微调和基于 AQLM/AWQ/GPTQ/LLM.int8/HQQ/EETQ 的 2/3/4/5/6/8 比特 QLoRA 微调。
-
优化算法:GaLore、BAdam、DoRA、LongLoRA、LLaMA Pro、Mixture-of-Depths、LoRA+、LoftQ 和 PiSSA。
-
加速算子:FlashAttention-2 和 Unsloth。
-
推理引擎:Transformers 和 vLLM。
-
实验监控:LlamaBoard、TensorBoard(最好推荐)、Wandb、MLflow、SwanLab 等等。
2、安装 LLaMA Factory(基于windows)
git clone --depth 1 https://github.com/hiyouga/LLaMA-Factory.git
cd LLaMA-Factory
pip install -e ".[torch,metrics]"
1、创建一个conda环境
conda create -n llamaFactory python=3.12 -y
pip install -e .[torch,metrics]
或者pip install -e
上面的似乎没有安装cuda,所以训练时会提示
Warning
CUDA environment was not detected.
因此安一下:
pip3 install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu121
2、启动
llamafactory-cli webui
如果是linux,建议使用vscode做ssh连接,这样就方便外部访问web端。
3.使用 LLaMA-Factory 微调 Qwen
选择自己本地的大模型,记住路径改为自己的本地路径,否则会跑去huggingface去下载。
自己的本地路径
Checkpoint path检查点路径就是如果你中途断网了,比如你训练了500次了,那么就可以从五百次继续训练。如果没有训练过,那么此处就不要填。
继续
Dataset(数据集)
数据集必须放在LLaMA-Factory项目下的data文件夹里,记住是必须。
训练轮次 最少300
Cutoff length(截断长度)越大 越耗资源,根据自己的数据量给出相应的长度
Batch size(批次大小,根据自己的GPU决定)
用的啥选啥,我用的lora,所以选LoRA configurations
LoRA alpha设置为LoRA rank的2倍
priview command(预览命令)
可以复制到自己本地去跑,但是感觉有点多余。
设备数量(device count),当你有几台设备就填几
之前没有在conda安装cuda,运行提示Warning
CUDA environment was not detected.
安装以后不提示。
正常训练
可以看到一些正常输出了
如果你中断训练,后台会报错
raiseValueError("OutputdirectoryalreadyexistsandIsnotempty.Pleasesetovenarite_output_dir.")
ValueError: Output directory already exists and is not empty.
Please set overwrite_output_dir
如果要重新训练,把LLaMA-Factory文件下的saves目录下的之前的数据删除就可以了
这里设置日志打印,和保存批次
填入自己的训练数据point,就可以聊天了。
**那什么时候可以训练停止呢**?
loss损失,趋于平衡时。
三、LLaMA-Factory微调数据集制作方法
1、modelscope下载数据集,然后通过代码转换成自己想要的格式的数据
比如我用弱智吧数据训练:https://modelscope.cn/datasets/w10442005/ruozhiba_qa
数据下载下来以后
用如下代码转成如下格式的数据:
{"instruction": "计算这些物品的总费用。 ","input": "输入:汽车 - $3000,衣服 - $100,书 - $20。","output": "汽车、衣服和书的总费用为 $3000 + $100 + $20 = $3120。"
}
代码
import json# 读取原始JSON文件
input_file = r"data\ruozhiba_qaswift.json" # 你的JSON文件名
output_file = r"\data\ruozhiba_qaswift_train.json" # 输出的JSON文件名with open(input_file, "r", encoding="utf-8") as f:data = json.load(f)# 转换后的数据
converted_data = []for item in data:converted_item = {"instruction": item["query"],"input": "","output": item["response"]}converted_data.append(converted_item)# 保存为JSON文件(最外层是列表)
with open(output_file, "w", encoding="utf-8") as f:json.dump(converted_data, f, ensure_ascii=False, indent=4)print(f"转换完成,数据已保存为 {output_file}")
然后将转换的数据放入LLaMA-Factory项目下的data下,同时更改dataset_info.json.
然后就可以训练了。
四、训练评估
箭头所指的地方为自己需要填的训练checkpoint最终的批次路径,和数据集
需要安装以下包,才可评估。
pip install jieba
pip install nltk
pip install rouge_chinese
五、量化导出
量化导出,默认为none,不用安装包。如果量化到4,或者8,需要安装一些包.不建议量化2和3,因为量化2和3,模型可能不好用或者不太能用。同时模型越小,越不建议量化,比如0.5B 不建议导出,因为0.5已经是最小的模型了,继续量化反而效果不理想,能不量化 尽量不量化
0.5B 不建议导出,因为0.5已经是最小的模型了,继续量化反而效果不理想,如图
模型路径为合并后的路径,保存路径自己定义
量化安装包
pip install optimum
pip install outo_gptq
pip install rouge_chinese
安装out_gptq会报错,它会与cuda环境不兼容,因此需要新建一个环境安装
根据您的CUDA 12.1环境,安装AutoGPTQ
(可能您指的outo_gptq
是该工具的旧称或笔误)需要特殊处理。以下是详细步骤:
方法:创建一个conda,建议3.10虚拟环境
1. 源码安装(兼容CUDA 12.1)
直接通过pip
安装可能无法获取兼容版本,需从源码安装:
conda create -n llama python==3.10 -y
然后安装
# 克隆仓库
git clone https://github.com/PanQiWei/AutoGPTQ.git
cd AutoGPTQ
pip install outo_gptq
pip install auto-gptq -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install optimum -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install scipy -i https://pypi.tuna.tsinghua.edu.cn/simplecd LLaMA-Factory
pip install -e .
或者
pip install -e
llamafactory-cli webui
2. 验证安装
安装后运行以下Python代码测试:
from autogptq import AutoGPTQ# 初始化量化器(无需实际量化,仅验证加载)
quantizer = AutoGPTQ(model_path="your_model_path", device="cuda")
print("AutoGPTQ初始化成功!")
3. 常见问题处理
- 依赖冲突:在虚拟环境中重新安装
numpy
和transformers
:pip uninstall numpy transformers -y pip install numpy==1.24.3 transformers==4.32.0
- CUDA驱动问题:确保NVIDIA驱动版本 ≥ 530.30(CUDA 12.1最低要求)。
4. 备选方案
如果仍报错,尝试指定旧版AutoGPTQ
:
pip install git+https://github.com/PanQiWei/AutoGPTQ.git@v1.0.0
请按步骤操作后观察是否解决兼容性问题。若遇到其他错误,请提供完整报错日志以便进一步排查。
训练图分析
y轴 loss为损失率
step为步数
original”(原始)和“smoothed”(平滑)
“original”(原始)和“smoothed”(平滑)。这种选项通常用于图像处理或数据可视化中,允许用户在原始数据或经过平滑处理的数据之间进行选择。
- Original(原始):选择这个选项将显示未经过任何处理的原始数据或图像。
- Smoothed(平滑):选择这个选项将显示经过平滑处理的数据或图像,平滑处理通常用于减少噪声或使数据更易于分析。
两者趋于重合且在一条线时,训练可停止。Smoothed越高噪声越大,通常需要增加训练轮次来减少噪声。
通常情况下,平滑处理是为了减少噪声,而不是增加噪声。以下是一些可能的解释:
-
平滑处理的目的:
- 平滑处理通常用于减少数据中的噪声,使数据更加平滑和易于分析。
- 在图像处理和信号处理中,平滑处理可以帮助去除高频噪声,保留重要的低频信息。
-
增加训练轮次:
- 增加训练轮次(epochs)通常是为了让模型更好地学习数据中的模式,从而提高模型的性能。
- 如果模型在训练过程中表现出过拟合或欠拟合,增加训练轮次可能有助于改善这些问题。
-
噪声与平滑处理的关系:
- 如果平滑处理后噪声反而增加,可能是因为平滑处理的方法或参数选择不当。
- 在某些情况下,过度的平滑处理可能会导致重要信息的丢失,反而使数据看起来更加嘈杂。
-
实际应用中的建议:
- 在进行平滑处理时,应选择合适的平滑方法和参数,以确保既能有效减少噪声,又能保留数据中的重要信息。
- 如果增加训练轮次是为了降低噪声,可能需要同时调整其他超参数,如学习率、正则化参数等,以达到最佳效果。
总之,平滑处理通常是为了减少噪声,而不是增加噪声。如果在实际应用中遇到噪声增加的问题,建议检查平滑处理的方法和参数,或者考虑其他可能的因素。