一、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]"
- git clone --filter=blob:none --quiet https://github.com/hiyouga/LLaMA-Factory.git
复制代码 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、启动
如果是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/simple
-
- cd 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)通常是为了让模型更好地学习数据中的模式,从而进步模型的性能。
- 如果模型在训练过程中表现出过拟合或欠拟合,增长训练轮次大概有助于改善这些题目。
- 噪声与平滑处置惩罚的关系:
- 如果平滑处置惩罚后噪声反而增长,大概是由于平滑处置惩罚的方法或参数选择不妥。
- 在某些情况下,过度的平滑处置惩罚大概会导致重要信息的丢失,反而使数据看起来更加嘈杂。
- 实际应用中的发起:
- 在进行平滑处置惩罚时,应选择符合的平滑方法和参数,以确保既能有用淘汰噪声,又能保存数据中的重要信息。
- 如果增长训练轮次是为了低落噪声,大概需要同时调整其他超参数,如学习率、正则化参数等,以到达最佳效果。
总之,平滑处置惩罚通常是为了淘汰噪声,而不是增长噪声。如果在实际应用中碰到噪声增长的题目,发起检查平滑处置惩罚的方法和参数,大概思量其他大概的因素。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |