【学习记录】大模型微调之使用 LLaMA-Factory 微调 Qwen系列大模型,可以用 ...

打印 上一主题 下一主题

主题 1972|帖子 1972|积分 5916

一、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)

  1. git clone --depth 1 https://github.com/hiyouga/LLaMA-Factory.git
  2. cd LLaMA-Factory
  3. pip install -e ".[torch,metrics]"
  4. git clone --filter=blob:none --quiet https://github.com/hiyouga/LLaMA-Factory.git
复制代码
1、创建一个conda环境
  1. conda create -n llamaFactory python=3.12 -y
复制代码
  1. pip install -e .[torch,metrics]
  2. 或者pip install -e
  3. 上面的似乎没有安装cuda,所以训练时会提示
  4. Warning
  5. CUDA environment was not detected.
复制代码
因此安一下:
  1. pip3 install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu121
复制代码
2、启动
  1. 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.
安装以后不提示。

正常训练

可以看到一些正常输出了


如果你中断训练,配景会报错
  1. raiseValueError("OutputdirectoryalreadyexistsandIsnotempty.Pleasesetovenarite_output_dir.")
  2. ValueError: Output directory already exists and is not empty.
  3. Please set overwrite_output_dir
复制代码
如果要重新训练,把LLaMA-Factory文件下的saves目录下的之前的数据删除就可以了

这里设置日志打印,和保存批次

填入本身的训练数据point,就可以聊天了。

**那什么时候可以训练停止呢**?
loss损失,趋于平衡时。

三、LLaMA-Factory微调数据集制作方法

1、modelscope下载数据集,然后通过代码转换成本身想要的格式的数据
好比我用弱智吧数据训练:https://modelscope.cn/datasets/w10442005/ruozhiba_qa
数据下载下来以后

用如下代码转成如下格式的数据
  1. {
  2.   "instruction": "计算这些物品的总费用。 ",
  3.   "input": "输入:汽车 - $3000,衣服 - $100,书 - $20。",
  4.   "output": "汽车、衣服和书的总费用为 $3000 + $100 + $20 = $3120。"
  5. }
复制代码
代码
  1. import json
  2. # 读取原始JSON文件
  3. input_file = r"data\ruozhiba_qaswift.json"  # 你的JSON文件名
  4. output_file = r"\data\ruozhiba_qaswift_train.json"  # 输出的JSON文件名
  5. with open(input_file, "r", encoding="utf-8") as f:
  6.     data = json.load(f)
  7. # 转换后的数据
  8. converted_data = []
  9. for item in data:
  10.     converted_item = {
  11.         "instruction": item["query"],
  12.         "input": "",
  13.         "output": item["response"]
  14.     }
  15.     converted_data.append(converted_item)
  16. # 保存为JSON文件(最外层是列表)
  17. with open(output_file, "w", encoding="utf-8") as f:
  18.     json.dump(converted_data, f, ensure_ascii=False, indent=4)
  19. print(f"转换完成,数据已保存为 {output_file}")
复制代码
然后将转换的数据放入LLaMA-Factory项目下的data下,同时更改dataset_info.json.
然后就可以训练了。

四、训练评估

箭头所指的地方为本身需要填的训练checkpoint最终的批次路径,和数据集

需要安装以下包,才可评估。
  1. pip install jieba
  2. pip install nltk
  3. pip install rouge_chinese
复制代码
五、量化导出

量化导出,默认为none,不消安装包。如果量化到4,大概8,需要安装一些包.不发起量化2和3,由于量化2和3,模型大概不好用大概不太能用。同时模型越小,越不发起量化,好比0.5B 不发起导出,由于0.5已经是最小的模型了,继续量化反而效果不理想,能不量化 尽量不量化

0.5B 不发起导出,由于0.5已经是最小的模型了,继续量化反而效果不理想,如图

模型路径为合并后的路径,保存路径本身定义

量化安装包
  1. pip install optimum
  2. pip install outo_gptq
  3. pip install rouge_chinese
复制代码
安装out_gptq会报错,它会与cuda环境不兼容,因此需要新建一个环境安装

根据您的CUDA 12.1环境,安装AutoGPTQ(大概您指的outo_gptq是该工具的旧称或笔误)需要特殊处置惩罚。以下是详细步骤:
方法:创建一个conda,发起3.10虚拟环境


1. 源码安装(兼容CUDA 12.1)

直接通过pip安装大概无法获取兼容版本,需从源码安装:
  1. conda create -n llama python==3.10 -y
复制代码
然后安装
  1. # 克隆仓库
  2. git clone https://github.com/PanQiWei/AutoGPTQ.git
  3. cd AutoGPTQ
  4. pip install outo_gptq
  5. pip install auto-gptq -i https://pypi.tuna.tsinghua.edu.cn/simple
  6. pip install optimum -i https://pypi.tuna.tsinghua.edu.cn/simple
  7. pip install scipy -i https://pypi.tuna.tsinghua.edu.cn/simple
  8. cd LLaMA-Factory
  9. pip install -e .
  10. 或者
  11. pip install -e
  12. llamafactory-cli webui
复制代码

2. 验证安装

安装后运行以下Python代码测试:
  1. from autogptq import AutoGPTQ
  2. # 初始化量化器(无需实际量化,仅验证加载)
  3. quantizer = AutoGPTQ(model_path="your_model_path", device="cuda")
  4. print("AutoGPTQ初始化成功!")
复制代码

3. 常见题目处置惩罚



  • 依赖冲突:在虚拟环境中重新安装numpy和transformers:
    1. pip uninstall numpy transformers -y
    2. pip install numpy==1.24.3 transformers==4.32.0
    复制代码
  • CUDA驱动题目:确保NVIDIA驱动版本 ≥ 530.30(CUDA 12.1最低要求)。

4. 备选方案

如果仍报错,尝试指定旧版AutoGPTQ:
  1. 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企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

美食家大橙子

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表