用通俗易懂的方式讲解大模型:一个强大的 LLM 微调工具 LLaMA Factory

news2025/1/23 13:17:25

LLM(大语言模型)微调一直都是老大难问题,不仅因为微调需要大量的计算资源,而且微调的方法也很多,要去尝试每种方法的效果,需要安装大量的第三方库和依赖,甚至要接入一些框架,可能在还没开始微调就已经因为环境配置而放弃了。

今天我们来介绍一个可以帮助大家快速进行 LLM 微调的工具——LLaMA Factory,它可以帮助大家快速进行 LLM 微调,而且还可以在微调过程中进行可视化,非常方便。

什么是 LLM 微调

LLM 微调,也叫做 Fine-tuning,是深度学习领域中常见的一种技术,用于将预先训练好的模型适配到特定的任务或数据集上。这个过程包括几个主要步骤:

  • 基础模型选择:选择一个通用文本数据的基础语言模型,使其能够理解基本的语言结构和语义。

  • 准备训练数据集:选择一个与目标任务相关的较小数据集。

  • 微调:在此数据集上训练模型,但通常使用较低的学习率,以保留基础模型学到的知识,同时学习目标任务的特定知识。

  • 评估:在目标任务的验证集上评估模型的性能,需要准备评估数据集。

  • 应用:如果性能满意,则可以将模型应用于实际任务。

这种方法的优势在于,通过微调可以快速并且以较低的计算成本将模型适配到特定任务,而不需要从头开始训练模型。同时,由于预训练模型已经学到了很多通用的语言知识,微调通常能够获得不错的性能。

前沿的微调策略

  • LoRA:LoRA 是一种用于微调大型语言模型的技术,通过低秩近似方法降低适应数十亿参数模型(如 GPT-3)到特定任务或领域的计算和财务成本。

  • QLoRA:QLoRA 是一种高效的大型语言模型微调方法,它显著降低了内存使用量,同时保持了全 16 位微调的性能。它通过在一个固定的、4 位量化的预训练语言模型中反向传播梯度到低秩适配器来实现这一目标。

  • PEFT:PEFT 是一种 NLP 技术,通过仅微调一小部分参数,高效地将预训练的语言模型适应到各种应用,降低计算和存储成本。它通过调整特定任务的关键参数来对抗灾难性遗忘,并在多种模式(如图像分类和稳定扩散梦展台)中提供与全微调相当的性能。这是一种在最少的可训练参数情况下实现高性能的有价值方法。

目前 LLM 微调的最佳实践是采用 LoRA 或 QLoRA 策略进行 LLM 微调。

通俗易懂讲解大模型系列

  • 用通俗易懂的方式讲解大模型:使用 LangChain 和大模型生成海报文案

  • 用通俗易懂的方式讲解大模型:ChatGLM3-6B 部署指南

  • 用通俗易懂的方式讲解大模型:LangChain Agent 原理解析

  • 用通俗易懂的方式讲解大模型:HugggingFace 推理 API、推理端点和推理空间使用详解

  • 用通俗易懂的方式讲解大模型:使用 LangChain 封装自定义的 LLM,太棒了

  • 用通俗易懂的方式讲解大模型:使用 FastChat 部署 LLM 的体验太爽了

  • 用通俗易懂的方式讲解大模型:基于 Langchain 和 ChatChat 部署本地知识库问答系统

  • 用通俗易懂的方式讲解大模型:使用 Docker 部署大模型的训练环境

  • 用通俗易懂的方式讲解大模型:在 Ubuntu 22 上安装 CUDA、Nvidia 显卡驱动、PyTorch等大模型基础环境

  • 用通俗易懂的方式讲解大模型:Llama2 部署讲解及试用方式

  • 用通俗易懂的方式讲解大模型:LangChain 知识库检索常见问题及解决方案

  • 用通俗易懂的方式讲解大模型:基于 LangChain 和 ChatGLM2 打造自有知识库问答系统

  • 用通俗易懂的方式讲解大模型:代码大模型盘点及优劣分析

  • 用通俗易懂的方式讲解大模型:Prompt 提示词在开发中的使用

技术交流

建了大模型技术交流群! 想要学习、技术交流、获取如下原版资料的同学,可以直接加微信号:mlc2060。加的时候备注一下:研究方向 +学校/公司+CSDN,即可。然后就可以拉你进群了。

方式①、微信搜索公众号:机器学习社区,后台回复:加群
方式②、添加微信号:mlc2060,备注:来自CSDN + 技术交流

在这里插入图片描述

LLaMA Factory 介绍

LLaMA Factory[1]是一个 LLM 微调工具,支持预训练(Pre-Training)、指令监督微调(Supervised Fine-Tuning)、奖励模型训练(Reward Modeling)等训练方式,每种方式都支持 LoRA 和 QLoRA 微调策略。它的前身是ChatGLM-Efficient-Turning[2],是基于 ChatGLM 模型做的一个微调工具,后面慢慢支持了更多的 LLM 模型,包括 BaiChuan,QWen,LLaMA 等,于是便诞生了 LLaMA Factory。

它的特点是支持的模型范围较广(主要包含大部分中文开源 LLM),集成业界前沿的微调方法,提供了微调过程中需要用到的常用数据集,最重要的一点是它提供了一个 WebUI 页面,让非开发人员也可以很方便地进行微调工作。

部署安装

LLaMA Factory 的部署安装非常简单,只需要按照官方仓库中的步骤执行即可,执行命令如下:

# 克隆仓库
git clone https://github.com/hiyouga/LLaMA-Factory.git
# 创建虚拟环境
conda create -n llama_factory python=3.10
# 激活虚拟环境
conda activate llama_factory
# 安装依赖
cd LLaMA-Factory
pip install -r requirements.txt

接下来是下载 LLM,可以选择自己常用的 LLM,包括 ChatGLM,BaiChuan,QWen,LLaMA 等,这里我们下载 BaiChuan 模型进行演示:

# 方法一:开启 git lfs 后直接 git clone 仓库
git lfs install
git clone https://huggingface.co/baichuan-inc/Baichuan2-13B-Chat

# 方法二:先下载仓库基本信息,不下载大文件,然后再通过 huggingface 上的文件链接下载大文件
GIT_LFS_SKIP_SMUDGE=1 git clone https://huggingface.co/baichuan-inc/Baichuan2-13B-Chat
cd Baichuan2-13B-Chat
wget "https://huggingface.co/baichuan-inc/Baichuan2-13B-Chat/resolve/main/pytorch_model-00001-of-00003.bin"
...

方法一的方式会将仓库中的 git 记录一并下载,导致下载下来的文件比较大,建议是采用方法二的方式,速度更快整体文件更小。

注意点:

  • 如果你是使用 AutoDL[3] 进行部署的话,在conda activate llama_factory之前需要先执行一下conda init bash命令来初始化一下 conda 环境,然后重新打开一个终端窗口,再执行conda activate llama_factory命令。

  • 如果使用的是 BaiChuan 的模型,需要修改transformers的版本为4.33.2,否则会报AttributeError: 'BaichuanTokenizer' object has no attribute 'sp_model'的错误。

开始微调

启动 LLaMA Factory 的 WebUI 页面,执行命令如下:

CUDA_VISIBLE_DEVICES=0 python src/train_web.py

启动后的界面如下:

图片

界面分上下两部分,上半部分是模型训练的基本配置,有如下参数:

  • 模型名称:可以使用常用的模型,包括 ChatGLM,BaiChuan,QWen,LLaMA 等,我们根据下载的模型选择Baichuan2-13B-Chat。

  • 模型路径:输入框填写我们之前下载的 Baichuan 模型的地址。

  • 微调方法有三种:

  • full:将整个模型都进行微调。

  • freeze:将模型的大部分参数冻结,只对部分参数进行微调。

  • lora:将模型的部分参数冻结,只对部分参数进行微调,但只在特定的层上进行微调。

  • 模型断点:在未开始微调前为空,微调一次后可以点击刷新断点按钮,会得到之前微调过的断点。

  • 高级设置和模型设置可以不用管,使用默认值即可。

下半部分是一个页签窗口,分为TrainEvaluateChatExport四个页签,微调先看Train界面,有如下参数:

  • 训练阶段:选择训练阶段,分为预训练(Pre-Training)、指令监督微调(Supervised Fine-Tuning)、奖励模型训练(Reward Modeling)、PPO 、DPO 五种,这里我们选择指令监督微调(Supervised Fine-Tuning)。

  • Pre-Training:在该阶段,模型会在一个大型数据集上进行预训练,学习基本的语义和概念。

  • Supervised Fine-Tuning:在该阶段,模型会在一个带标签的数据集上进行微调,以提高对特定任务的准确性。

  • Reward Modeling:在该阶段,模型会学习如何从环境中获得奖励,以便在未来做出更好的决策。

  • PPO Training:在该阶段,模型会使用策略梯度方法进行训练,以提高在环境中的表现。

  • DPO Training:在该阶段,模型会使用深度强化学习方法进行训练,以提高在环境中的表现。

  • 数据路径:指训练数据集文件所在的路径,这里的路径指的是 LLaMA Factory 目录下的文件夹路径,默认是data目录。

  • 数据集:这里可以选择数据路径中的数据集文件,这里我们选择self_cognition数据集,这个数据集是用来调教 LLM 回答诸如你是谁你由谁制造这类问题的,里面的数据比较少只有 80 条左右。在微调前我们需要先修改这个文件中的内容,将里面的<NAME><AUTHOR>替换成我们的 AI 机器人名称和公司名称。选择了数据集后,可以点击右边的预览数据集按钮来查看数据集的前面几行的内容。

图片

  • 学习率:学习率越大,模型的学习速度越快,但是学习率太大的话,可能会导致模型在寻找最优解时跳过最优解,学习率太小的话,模型学习速度会很慢,所以这个参数需要根据实际情况进行调整,这里我们使用默认值5e-5

  • 训练轮数:训练轮数越多,模型的学习效果越好,但是训练轮数太多的话,模型的训练时间会很长,因为我们的训练数据比较少,所以要适当增加训练轮数,这里将值设置为30

  • 最大样本数:每个数据集最多使用的样本数,因为我们的数据量很少只有 80 条,所以用默认值就可以了。

  • 计算类型:这里的fp16bf16 是指数字的数据表示格式,主要用于深度学习训练和推理过程中,以节省内存和加速计算,这里我们选择bf16

  • 学习率调节器:有以下选项可以选择,这里我们选择默认值cosine

  • linear(线性): 随着训练的进行,学习率将以线性方式减少。

  • cosine(余弦): 这是根据余弦函数来减少学习率的。在训练开始时,学习率较高,然后逐渐降低并在训练结束时达到最低值。

  • cosine_with_restarts(带重启的余弦): 和余弦策略类似,但是在一段时间后会重新启动学习率,并多次这样做。

  • polynomial(多项式): 学习率会根据一个多项式函数来减少,可以设定多项式的次数。

  • constant(常数): 学习率始终保持不变。

  • constant_with_warmup(带预热的常数): 开始时,学习率会慢慢上升到一个固定值,然后保持这个值。

  • inverse_sqrt(反平方根): 学习率会随着训练的进行按照反平方根的方式减少。

  • reduce_lr_on_plateau(在平台上减少学习率): 当模型的进展停滞时(例如,验证误差不再下降),学习率会自动减少。

  • 梯度累积和最大梯度范数:这两个参数通常可以一起使用,以保证在微调大型语言模型时,能够有效地处理大规模数据,同时保证模型训练的稳定性。梯度累积允许在有限的硬件资源上处理更大的数据集,而最大梯度范数则可以防止梯度爆炸,保证模型训练的稳定性,这里我们使用默认值即可。

  • 断点名称:默认是用时间戳作为断点名称,可以自己修改。

  • 其他参数使用默认值即可。

参数设置完后点击预览命令按钮可以查看本次微调的命令,确认无误后点击开始按钮就开始微调了,因为数据量比较少,大概几分钟微调就完成了(具体时间还要视机器配置而定,笔者使用的是 A40 48G GPU),在界面的右下方还可以看到微调过程中损失函数曲线,损失函数的值越低,模型的预测效果通常越好。

图片

模型试用

微调完成后,进入Chat页签对微调模型进行试用。首先点击页面上的刷新断点按钮,然后选择我们最近微调的断点名称,再点击加载模型按钮,等待加载完成后就可以进行对话了,输入微调数据集中的问题,然后来看看微调后的 LLM 的回答吧。

图片

模型导出

如果觉得微调的模型没有问题,就可以将模型导出并正式使用了,点击Export页签,在导出目录中输入导出的文件夹地址。一般模型文件会比较大,右边的最大分块大小参数用来将模型文件按照大小进行切分,默认是10GB,比如模型文件有 15G,那么切分后就变成 2 个文件,1 个 10G,1 个 5G。设置完成后点击开始导出按钮即可,等导出完成后,就可以在对应目录下看到导出的模型文件了。

图片

微调后的模型使用方法和原来的模型一样,可以参考我之前的文章来进行部署和使用——《使用 FastChat 部署 LLM》。

总结

LLaMA Factory 是一个强大的 LLM 微调工具,今天我们只是简单地介绍了一下它的使用方法,真正的微调过程中还有很多工作要做,包括数据集的准备,微调的多个阶段,微调后的评估等,笔者也是刚接触微调领域,文中有不对的地方希望大家在评论区指出,一起学习讨论。

关注我,一起学习各种人工智能和 AIGC 新技术,欢迎交流,如果你有什么想问想说的,欢迎在评论区留言。

参考:

[1] LLaMA Factory: https://github.com/hiyouga/LLaMA-Factory

[2]ChatGLM-Efficient-Turning: https://github.com/hiyouga/ChatGLM-Efficient-Tuning

[3]AutoDL: https://www.autodl.com/home

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1347274.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【华为OD机试真题2023CD卷 JAVAJS】测试用例执行计划

华为OD2023(C&D卷)机试题库全覆盖,刷题指南点这里 测试用例执行计划 时间限制:1s 空间限制:256MB 限定语言:不限 题目描述: 某个产品当前迭代周期内有N个特性()需要进行覆盖测试,每个特性都被评估了对应的优先级,特性使用其ID作为下标进行标识。 设计了M个测试用…

vue3+ts开发干货笔记

总结一下在vue3中ts的使用。当篇记录部分来自于vue官网&#xff0c;记录一下&#xff0c;算是加深印象吧。 纯干笔记&#xff0c;不断补充&#xff0c;想到什么写什么&#xff0c;水平有限&#xff0c;欢迎评论指正&#xff01; 类型标注 props <script setup lang"…

Armpro脱壳软件搭建教程附源代码

PHP8.0版本&#xff0c;数据库8.0版本 1.配置注册机文件&#xff0c;打开将arm.zip/res目录下&#xff0c;mt管理器搜索将其全部修改为你自己的域名或者是服务器IP 2.然后建立数据库 数据库账号arm 数据库用户名arm 数据库密码EsZfXY4tD3h2NNA4 3.导入数据库 4.配置Redi…

优化模型:matlab多目标规划

一、多目标规划 1.1 多目标规划的定义 多目标规划&#xff08;Multi-Objective Programming&#xff0c;MOP&#xff09; 是数学优化中的一类问题。与单目标规划不同&#xff0c;多目标规划有多个目标函数需要优化&#xff0c;这些目标函数通常是相互矛盾的。多目标规划的目标…

边界判断缺失

作者简介&#xff1a;大家好&#xff0c;我是smart哥&#xff0c;前中兴通讯、美团架构师&#xff0c;现某互联网公司CTO 联系qq&#xff1a;184480602&#xff0c;加我进群&#xff0c;大家一起学习&#xff0c;一起进步&#xff0c;一起对抗互联网寒冬 学习必须往深处挖&…

android开发调用百度地图api实现加载地图和定位

目录 一.踩的一些坑以及解决方法 1.权限声明不要少 2.地图初始化 3.定位问题 &#xff08;1&#xff09;监听器注册 &#xff08;2&#xff09;定位监听器类MyLocationListener的实现 &#xff08;3&#xff09;定位功能的调用 4.android studio连接真机调试问题 二.…

C语言函数篇——strcat()函数

strcat()函数介绍&#xff1a; strcat()函数是C语言中用于连接两个字符串的函数。它将第二个字符串连接到第一个字符串的末尾&#xff0c;并返回第一个字符串的地址。 strcat()函数的语法&#xff1a; char *strcat(char *dest, const char *src); 其中&#xff0c;dest是目标…

pytorch03:transforms常见数据增强操作

目录 一、数据增强二、transforms--Crop裁剪2.1 transforms.CenterCrop2.2 transforms.RandomCrop2.3 RandomResizedCrop2.4 FiveCrop和TenCrop 三、transforms—Flip翻转、旋转3.1RandomHorizontalFlip和RandomVerticalFlip3.2 RandomRotation 四、transforms —图像变换4.1 t…

【JavaScript】浮点数精度问题

✨ 专栏介绍 在现代Web开发中&#xff0c;JavaScript已经成为了不可或缺的一部分。它不仅可以为网页增加交互性和动态性&#xff0c;还可以在后端开发中使用Node.js构建高效的服务器端应用程序。作为一种灵活且易学的脚本语言&#xff0c;JavaScript具有广泛的应用场景&#x…

【MySQL表的增删查改】

文章目录 前言1 Create1.1 单行数据 全列插入1.2 多行数据 指定列插入1.3 插入否则更新1.4 替换 2 Retrieve2.1 SELECT 列2.1.1 全列查询2.1.2 指定列查询2.1.3 查询字段为表达式2.1.4 为查询结果指定别名2.1.5 结果去重 2.2 WHERE 条件2.2.1 英语不及格的同学及英语成绩 ( &…

vue 基础学习 一

1. vue 使用快速入门三步走 (1) 新建 HTML 页面&#xff0c;引入 Vue.js文件 1 2 3 4 5 6 7 <!DOCTYPE html> <html> <head> <meta charset"UTF-8"> <title>Vue.js 入门示例</title> <script src"https://cdn.j…

设计模式:抽象工厂模式(讲故事易懂)

抽象工厂模式 定义&#xff1a;将有关联关系的系列产品放到一个工厂里&#xff0c;通过该工厂生产一系列产品。 设计模式有三大分类&#xff1a;创建型模式、结构型模式、行为型模式 抽象工厂模式属于创建型模式 上篇 工厂方法模式 提到工厂方法模式中每个工厂只生产一种特定…

12.29_黑马数据结构与算法笔记Java

目录 305 旅行商问题 动态规划 实现2 306 旅行商问题 动态规划 实现3 307 分治 概述 308 快速选择算法 分治 309 快速选择算法 数组第k大数 Leetcode215 310 快速选择算法 数组中位数 311 快速幂 分治 312 快速幂 Leetcode50 313 平方根整数部分 Leetcode69-1 314 平方…

从实际工作情况,介绍嵌入式(MCU)软件开发常用(通用)工具

目录 前言 1、代码阅读及编辑工具&#xff08;VSCode、Understand&#xff09; 2、代码对比工具&#xff08;Beyond Compare&#xff09; 3、代码仓库相关工具&#xff08;Git、SVN、Tortoise&#xff09; 4、文本编辑器&#xff08;Notepad&#xff09; 5、电脑文件搜索工…

arkts状态管理使用(@State、@Prop、@Link、@Provide、@Consume、@objectLink和@observed)

一、状态管理 1.在声明式UI中&#xff0c;是以状态驱动视图更新&#xff1a; ①状态&#xff08;State&#xff09;:指驱动视图更新的数据&#xff08;被装饰器标记的变量&#xff09; ②视图&#xff08;View&#xff09;:基于UI描述渲染得到用户界面 注意&#xff1a; ①…

Radar System Pro - Plug Play Solution

Radar System Pro是一款功能多样且可定制的资源,旨在通过功能齐全且易于使用的雷达系统增强您的Unity项目。无论您是在开发第一人称射击游戏、策略游戏还是太空探索模拟器,我们的雷达系统都将为您提供所需的工具,以创建引人入胜且身临其境的体验。 雷达系统是一个模块化资产…

mysql间隙锁demo分析

概述 通常用的mysql都是innodb引擎&#xff1b; 一般在update的时候用id都会认为是给行记录加锁&#xff1b; 在使用非唯一索引更新时&#xff0c;会遇到临键锁&#xff08;范围锁&#xff09;&#xff1b; 临键锁和表中的数据有关&#xff1b; mysq版本:8 隔离级别&#xf…

雨课堂作业整理

第一次作业 1.下列序列是图序列的是&#xff08; &#xff09; A.1&#xff0c;2&#xff0c;2&#xff0c;3&#xff0c;4&#xff0c;4&#xff0c;5 B.1&#xff0c;1&#xff0c;2&#xff0c;2&#xff0c;4&#xff0c;6&#xff0c;6 C.0&#xff0c;0&#xff0c;2&am…

解决基于VectorGrid的矢量瓦片Y轴偏移的问题

目录 前言 一、GeoServer的瓦片 1、GeoWebcache缓存配置 2、矢量瓦片本地缓存 3、瓦片访问 二、VectorGrid加载本地瓦片 1、加载关键代码 2、默认模式的问题 3、问题分析 4、tms参数修改 总结 前言 在前面的博文介绍中&#xff0c;在线连接如下&#xff1a;浅谈前端自定义…

AI与数字化映像:颜值开端,功能至上_光点科技

在人工智能的浪潮中&#xff0c;AI数字人的兴起正成为一个不可忽视的现象。随着ChatGPT等生成式AI算法的进步&#xff0c;AIGC&#xff08;人工智能生成内容&#xff09;的应用呈现出爆发性增长&#xff0c;不仅在技术圈引起广泛关注&#xff0c;也为元宇宙及其相关产业链带来了…