当前位置: 首页 > news >正文

【学习记录】大模型微调之使用 LLaMA-Factory 微调 Qwen系列大模型,可以用自己的数据训练

一、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. 常见问题处理
  • 依赖冲突:在虚拟环境中重新安装numpytransformers
    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越高噪声越大,通常需要增加训练轮次来减少噪声。
    通常情况下,平滑处理是为了减少噪声,而不是增加噪声。以下是一些可能的解释:
  1. 平滑处理的目的

    • 平滑处理通常用于减少数据中的噪声,使数据更加平滑和易于分析。
    • 在图像处理和信号处理中,平滑处理可以帮助去除高频噪声,保留重要的低频信息。
  2. 增加训练轮次

    • 增加训练轮次(epochs)通常是为了让模型更好地学习数据中的模式,从而提高模型的性能。
    • 如果模型在训练过程中表现出过拟合或欠拟合,增加训练轮次可能有助于改善这些问题。
  3. 噪声与平滑处理的关系

    • 如果平滑处理后噪声反而增加,可能是因为平滑处理的方法或参数选择不当。
    • 在某些情况下,过度的平滑处理可能会导致重要信息的丢失,反而使数据看起来更加嘈杂。
  4. 实际应用中的建议

    • 在进行平滑处理时,应选择合适的平滑方法和参数,以确保既能有效减少噪声,又能保留数据中的重要信息。
    • 如果增加训练轮次是为了降低噪声,可能需要同时调整其他超参数,如学习率、正则化参数等,以达到最佳效果。

总之,平滑处理通常是为了减少噪声,而不是增加噪声。如果在实际应用中遇到噪声增加的问题,建议检查平滑处理的方法和参数,或者考虑其他可能的因素。


http://www.mrgr.cn/news/95782.html

相关文章:

  • How to share files with Linux mint 22 via samba in Windows
  • Sql Server 索引性能优化 分析以及分表
  • _DISPATCHER_HEADER结构中的WaitListHead和_KWAIT_BLOCK的关系
  • Linux的SPI子系统的原理和结构详解【SPI控制器(spi_master)、SPI总线(device-driver-match匹配机制)、SPI设备、SPI万能驱动`spidev.c`】
  • Unity 实现一个简易可拓展性的对话系统
  • 深度解读DeepSeek:开源周(Open Source Week)技术解读
  • 从零开始的LeetCode刷题日记:128. 最长连续序列
  • Spring Boot 整合 Nacos 注册中心终极指南
  • CentOS 7 更换 yum 源(阿里云)+ 扩展 epel 源
  • Jackson实现JSON数据的合并
  • vivo 湖仓架构的性能提升之旅
  • AI本地部署之dify
  • Redis 服务搭建
  • DeepSeek面试——模型架构和主要创新点
  • 《TCP/IP网络编程》学习笔记 | Chapter 21:异步通知 I/O 模型
  • springboot使用netty做TCP客户端
  • python面试高频考点(深度学习大模型方向)
  • 鸿蒙进行视频上传,使用 request.uploadFile方法
  • 大模型应用(Java)2025/3/24
  • LeetCode热题100JS(69/100)第十三天|34|33|153|4|20