9、LLaMA-Factory项目微调介绍

news/2024/9/19 0:37:57/ 标签: llama, LLaMA Factory, 微调, 大模型, LoRA

1、LLaMA Factory 介绍

  LLaMA Factory是一个在GitHub上开源的项目,该项目给自身的定位是:提供一个易于使用的大语言模型(LLM)微调框架,支持LLaMA、Baichuan、Qwen、ChatGLM等架构的大模型。更细致的看,该项目提供了从预训练、指令微调到RLHF阶段的开源微调解决方案。截止目前(2024年3月1日)支持约120+种不同的模型和内置了60+的数据集,同时封装出了非常高效和易用的开发者使用方法。而其中最让人喜欢的是其开发的LLaMA Board,这是一个零代码、可视化的一站式网页微调界面,它允许我们通过Web UI轻松设置各种微调过程中的超参数,且整个训练过程的实时进度都会在Web UI中进行同步更新。

  简单理解,通过该项目我们只需下载相应的模型,并根据项目要求准备符合标准的微调数据集,即可快速开始微调过程,而这样的操作可以有效地将特定领域的知识注入到通用模型中,增强模型对特定知识领域的理解和认知能力,以达到“通用模型到垂直模型的快速转变”。

  LLaMA Factory的GitHub地址如下:https://github.com/hiyouga/LLaMA-Factory/tree/main

  LLaMA-Factory目前支持微调的模型及对应的参数量:

模型名模型大小Template
Baichuan 27B/13Bbaichuan2
BLOOM/BLOOMZ560M/1.1B/1.7B/3B/7.1B/176B-
ChatGLM36Bchatglm3
Command R35B/104Bcohere
DeepSeek (Code/MoE)7B/16B/67B/236Bdeepseek
Falcon7B/11B/40B/180Bfalcon
Gemma/Gemma 2/CodeGemma2B/7B/9B/27Bgemma
GLM-49Bglm4
InternLM2/InternLM2.57B/20Bintern2
Llama7B/13B/33B/65B-
Llama 27B/13B/70Bllama2
Llama 3/Llama 3.18B/70Bllama3
LLaVA-1.57B/13Bvicuna
MiniCPM1B/2Bcpm
Mistral/Mixtral7B/8x7B/8x22Bmistral
OLMo1B/7B-
PaliGemma3Bgemma
Phi-1.5/Phi-21.3B/2.7B-
Phi-34B/7B/14Bphi
Qwen/Qwen1.5/Qwen2 (Code/Math/MoE)0.5B/1.5B/4B/7B/14B/32B/72B/110Bqwen
StarCoder 23B/7B/15B-
XVERSE7B/13B/65Bxverse
Yi/Yi-1.56B/9B/34Byi
Yi-VL6B/34Byi_vl
Yuan 22B/51B/102Byuan

  可以看到,当前主流的开源大模型,包括ChatGLM3、Qwen的第一代以及最新的2版本,还有Biachuan2等,已经完全支持不同规模的参数量。针对LLaMA架构的系列模型,该项目已经基本实现了全面的适配。而其支持的训练方法,也主要围绕(增量)预训练、指令监督微调、奖励模型训练、PPO 训练和 DPO 训练展开,具体情况如下:

方法全参数训练部分参数训练LoRAQLoRA
预训练(Pre-Training)
指令监督微调(Supervised Fine-Tuning)
奖励模型训练(Reward Modeling)
PPO 训练(PPO Training)
DPO 训练(DPO Training)

  最后且最关键的一点需特别指出:虽然LLaMA-Factory项目允许我们在120余种大模型中灵活选择并快速开启微调工作,但运行特定参数量的模型是否可行,仍然取决于本地硬件资源是否充足。因此,在选择模型进行实践前,大家必须仔细参照下表,结合自己的服务器配置来决定,以避免因硬件资源不足导致的内存溢出等问题。不同模型参数在不同训练方法下的显存占用情况如下:

训练方法精度7B13B30B65B
全参数16160GB320GB600GB1200GB
部分参数1620GB40GB120GB240GB
LoRA1616GB32GB80GB160GB
QLoRA810GB16GB40GB80GB
QLoRA46GB12GB24GB48GB

关于微调理论我们会在后面专门写文章解释

2、LLaMA-Factory私有化部署

  作为GitHub上的开源项目,LLaMA-Factory的本地私有化部署过程与我们之前介绍的大模型部署大体相同,主要包括创建Python虚拟环境、下载项目文件及安装所需的依赖包。这一过程相对直观。但在开始部署之前,我们需要先了解LLaMA-Factory私有化部署对本地软硬件环境的具体要求:

  • Python >= 3.8版本,建议Python3.10版本以上
  • PyTorch >= 1.13.1版本,建议 Pytorch 版本为 2.2.1
  • transformers >= 4.37.2,建议 transformers 版本为 4.38.1
  • CUDA >= 11.6,建议CUDA版本为12.2

2.1 创建虚拟环境

创建LLaMA-Factory的Python虚拟环境

 conda create  --name llama_factory python==3.11

在这里插入图片描述
  如上所示,新创建了一个名为LLaMA-Factory的Python虚拟环境,其Python版本为3.11。创建完成后,通过如下命令进入该虚拟环境,执行后续的操作:

conda activate llama_factory

在这里插入图片描述

2.2 安装Pytorch

  建议先自己根据CUDA版本要求安装Pytorch,如果按照llama_factory官网安装默认是支持CPU的版本,地址:https://pytorch.org/get-started/previous-versions/**

  这里根据自己电脑显卡驱动的CUDA版本要求,在Pytorch官网中找到适合自己的Pytorch安装命令。

    conda install pytorch==2.2.0 torchvision==0.17.0 torchaudio==2.2.0 pytorch-cuda=12.1 -c pytorch -c nvidia

  待安装完成后,如果想要检查是否成功安装了GPU版本的PyTorch,可以通过几个简单的步骤在Python环境中进行验证:

    import torchprint(torch.cuda.is_available())

在这里插入图片描述
  如果输出是 True,则表示GPU版本的PyTorch已经安装成功并且可以使用CUDA,如果输出是False,则表明没有安装GPU版本的PyTorch,或者CUDA环境没有正确配置,此时根据教程,重新检查自己的执行过程。

2.3 下载LLaMA-Factory项目文件

  进入LLaMA-Factory的官方Github,地址:https://github.com/hiyouga/LLaMA-Factory , 在 GitHub 上将项目文件下载到有两种方式:克隆 (Clone) 和 下载 ZIP 压缩包。推荐使用克隆 (Clone)的方式。我们首先在GitHub上找到其仓库的URL。

  执行克隆命令,将LLaMA-Factory Github上的项目文件下载至本地的当前路径下,如下:

    git clone https://github.com/hiyouga/LLaMA-Factory.git

如果网络不通或者其他原因无法下载,就下载zip文件解压到本地目录,或者上传到服务器。

  建议在执行项目的依赖安装之前升级 pip 的版本,如果使用的是旧版本的 pip,可能无法安装一些最新的包,或者可能无法正确解析依赖关系。升级 pip 很简单,只需要运行命令如下命令:

python -m pip install --upgrade pip

2.4 安装LLaMA-Factory项目代码运行的项目依赖

  在LLaMA-Factory中提供的 requirements.txt文件包含了项目运行所必需的所有 Python 包及其精确版本号。使用pip一次性安装所有必需的依赖,执行命令如下:

cd LLaMA-Factory
pip install -e ".[torch,metrics]"

在这里插入图片描述
  如果不具备科学上网环境,还想通过在线的方式下载大模型,可以将模型下载源指向国内的ModelScope社区。这需要先中断当前的LLaMA-Board的后台服务,具体操作如下:

    # Linux操作系统, 如果是 Windows 使用 `set USE_MODELSCOPE_HUB=1`export USE_MODELSCOPE_HUB=1 CUDA_VISIBLE_DEVICES=0 llamafactory-cli webui

  通过上述步骤就已经完成了LLaMA-Factory模型的完整私有化部署过程。接下来,我们将详细介绍如何借助LLaMA-Factory项目执行ChaGLM3、Qwen和Baichuan2系列模型的微调和使用。

2.5 chat

先选择一个简单的模型进行测试,我们选择Qwen2-0.5B-Chat
在这里插入图片描述
可以在界面进行简单的对话
在这里插入图片描述

2.6 微调

选择数据集,注意我们启动命令时一定要在LLaMA-Factory目录下,不然数据会加载失败。选择预置的数据,支持预览查看,需要特定的数据格式,如果是自定义数据也需要按照这种格式来进行配置。
在这里插入图片描述

界面展示
在这里插入图片描述
训练过程
在这里插入图片描述

显存占用
在这里插入图片描述
显存全部占满

  经过LoRA微调生成的Adapter权重和其相对应的配置文件,其存放在服务器下

/root/LLaMA-Factory-main/saves/Qwen2-0.5B-Chat/lora/train_2024-08-28-15-12-01

在这里插入图片描述

2.7 使用微调模型

  对于LoRA微调,训练结束后如果想使用其微调后的模型,在LLaMA Board上也可以非常方便的加载,具体使用的过程如下:
在这里插入图片描述
在这里插入图片描述
  通过上述步骤,我们可以完整地实现微调流程,且整个过程均可通过页面端完成,整体用户体验非常良好。大家也可以根据上述的流程,尝试对ChatGLM3-6B和Biachuan2系列模型进行LoRA或QLoRA微调,或者其他支持的系列模型。

2.8 合并导出

当然,除了分步加载微调后得到的Adapter 和 原始模型,在LLaMA Board上还可以一键进行模型权重的合并,具体操作如下:

在这里插入图片描述
导出后可以在主目录中查看
在这里插入图片描述


http://www.ppmy.cn/news/1519799.html

相关文章

flutter 手写时钟

前言: 之前看过别人写的 js实现的 时钟表盘 挺有意思的,看着挺好 这边打算自己手动实现以下。顺便记录下实现过程:大致效果如下: 主要技术点: 表盘内样 倒角: 表盘下半部分是有一点倒角的感觉,…

尚品汇-MQ模块搭建测试、消息不丢失(重)(四十三)

目录: (1)消息不丢失 (2)消息确认 (3)消息确认业务封装 (4)封装发送端消息确认 (5)封装消息发送 (6)发送确认消息测试…

鸿蒙(API 12 Beta3版)【媒体资源使用指导】Media Library Kit媒体文件管理服务

应用可以通过photoAccessHelper的接口,对媒体资源(图片、视频)进行相关操作。 说明 在进行功能开发前,请开发者查阅[开发准备],了解如何获取相册管理模块实例和如何申请相册管理模块功能开发相关权限。文档中使用到p…

基于深度学习的游客满意度分析与评论分析【情感分析、主题分析】

需要本项目的可以私信博主 目录 1 绪论 1.1 选题背景及研究意义 1.1.1 选题背景 1.1.2 研究意义 1.2 研究内容与方法 1.2.1 研究内容 1.2.2 研究方法 1.3 创新与不足 1.3.1创新点 1.3.2研究局限性 2 文献综述 2.1 相关概念界定 2.1.1 大数据分析 2.1.2 游客满意度 2.2 国内外研…

大数据系列之:查看Centos服务器用户可以创建的最大线程数、查看系统内核支持的最大线程数、查看系统支持的最大进程数、设置最大线程数限制、查看进程使用的线程数

大数据系列之:查看Centos服务器用户可以创建的最大线程数、查看系统内核支持的最大线程数、查看系统支持的最大进程数、设置最大线程数限制、查看进程使用的线程数 显示当前用户的资源限制查看用户可以创建的最大线程指定进程的资源限制查看系统内核支持的最大线程数查看系统支…

React 入门第八天:性能优化与开发者工具的使用

随着对React的逐步深入,我开始关注如何优化React应用的性能,特别是在复杂的组件树和频繁的状态更新中保持应用的高效性。这一天,我集中学习了React中的性能优化策略,并探索了如何使用React开发者工具来调试和优化应用。 1. 组件的…

续:当有数据时添加slave2

【示例】 另启一台虚拟机,作为mysql3. 新的虚拟机没有mysql软件包,如何才能快速部署?通过mysql1. mysql1: [rootmysql1 ~]# rsync -al /usr/local/mysql/ root172.25.254.166:/usr/local/mysql The authenticity of host 172.25…

Java算法之快速排序(Quick Sort)

快速排序:分而治之的高效排序算法 简介 快速排序是一种分而治之的排序算法,由C. A. R. Hoare在1960年提出。它通过选取一个元素作为"基准"(pivot),然后重新排列数组,使得所有比基准值小的元素都…

【软考】【多媒体应用设计师】媒体与技术

1. 多媒体技术改变了传统循序式模式,用户可以借助超文本链接等方式,更自由灵活地访问所需的信息,体现了其( )的特点。 A.控制性 B.非线性 C.集成性 D.实时性 答案解析:本题考查信息多媒体非线性特点。多媒体…

安防监控/软硬一体/视频汇聚网关EasyCVR硬件启动崩溃是什么原因?

安防视频监控EasyCVR安防监控视频系统采用先进的网络传输技术,支持高清视频的接入和传输,能够满足大规模、高并发的远程监控需求。EasyCVR平台支持多种视频流的外部分发,如RTMP、RTSP、HTTP-FLV、WebSocket-FLV、HLS、WebRTC、WS-FMP4、HTTP-…

vue part 5

生命周期 <!DOCTYPE html> <html><head><meta charset"UTF-8" /><title>引出生命周期</title><!-- 引入Vue --><script type"text/javascript" src"https://cdn.jsdelivr.net/npm/vue/dist/vue.js&quo…

进程、线程的区别

进程&#xff08;Process&#xff09;和线程&#xff08;Thread&#xff09;是操作系统中的基本概念&#xff0c;它们在资源管理和任务执行方面有着本质的区别&#xff1a; 定义&#xff1a; 进程&#xff1a;进程是操作系统进行资源分配和调度的一个独立单位。每个进程都有自己…

ArcGIS Pro 3.1下载分享

在使用了很长一段时间ArcGIS Pro 3.0之后&#xff0c;终于迎来了ArcGIS Pro 3.1的更新&#xff0c;这里为你分享一下ArcGIS Pro 3.1的安装步骤。 软件介绍 ArcGIS Pro 3.1 是由Esri发布的地理信息系统 (GIS) 软件的较新版本&#xff0c;作为 ArcGIS 桌面应用程序家族中的核心…

【递归深搜之记忆化搜索算法】

1. 斐波那契数 解法一&#xff1a;递归 class Solution { public:int fib(int n) {return dfs(n);}int dfs(int n){if(n 0 || n 1)return n;return dfs(n - 1) dfs(n - 2);} }; 解法二&#xff1a;记忆化搜索 class Solution {int nums[31]; // 备忘录 public:int fib(int …

使用C++,仿照string类,实现myString

类由结构体演化而来&#xff0c;只需要将struct改成关键字class&#xff0c;就定义了一个类 C中类和结构体的区别&#xff1a;默认的权限不同&#xff0c;结构体中默认权限为public&#xff0c;类中默认权限为private 默认的继承方式不同&#xff0c;结构体的默认继承方式为p…

微型直线导轨高精度运行的工作原理

微型导轨是一种用于高精度定位和运动控制的传动装置&#xff0c;常用于微小化、高精密度化的机械设备中&#xff0c;如IC制造设备、半导体设备、高速移载的设备、精密测量、检测仪器、医疗设备、X-Y table&#xff0c;以及高速皮带驱动的设备等小型化设备。 微型导轨的构成相对…

单窗口IP代理设置指南:轻松搞定

在现代互联网生活中&#xff0c;IP代理已经成为了许多人日常上网的必备工具。单窗口IP代理是一种非常实用的代理方式&#xff0c;它允许你在同一个浏览器中为不同的窗口设置不同的IP地址&#xff0c;从而更好地保护隐私和实现多任务处理。今天&#xff0c;我们就来详细讲解一下…

在 macOS 上升级 Ruby 版本的几种方法

在 macOS 上升级 Ruby 版本通常有几种方法&#xff0c;以下是一些常用的方法&#xff1a; 使用系统自带的 Ruby: macOS 系统自带 Ruby&#xff0c;但通常不是最新版本。可以通过终端使用 softwareupdate 命令来更新系统自带的 Ruby。 使用 Homebrew: Homebrew 是 macOS 的包管…

字符串地指针表示方式

每日诗词&#xff1a; 人生自是有情痴&#xff0c;此恨不关风与月。 ——玉楼春尊前拟把归期说 【宋】欧阳修 目录 数组本身的值和数组储存的值一样吗 char[]和cahr*的区别 1. 类型 2. 内存分配 3. 使用方式 4. 字符串字面量 实例 变式 总结&#xff1a; 下期预告&a…

vue2+countup.js实现大屏数字滚动效果封装

很多大屏、官网或者展示类页面会用到数字跳动更新效果的需求&#xff0c;countup用起来就非常方便 一、官网 CountUp.js 二、效果图 三、安装countup与引入 npm install countup 进行安装依赖 import { CountUp } from countUp.js;//需要用到的页面引入&#xff0c;也可以…