LLama Factory从入门到放弃

目录

简介

安装

LLama Factory界面介绍

数据格式要求

微调训练


        

        今天在这里介绍一种常用的大模型微调框架——LLama Factory。

简介

        LLama Factory 是一个高效的界面化大语言模型微调工具库,支持多种参数高效微调技术,提供简洁接口和丰富示例,助力用户快速定制和优化模型性能。

安装

        a.获取并安装 git 上的 LLama Factory 

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

        b.创建一个 LLama Factory 的虚拟环境

conda create -n llamafactory python==3.10 -y

        c.换至 llamafactory 环境

source activate llamafactory

        d.找到从 git 上获取的 LLama-Factory.zip,并解压、安装

unzip LLama-Factory.zip
cd LLama-Factory
pip install -e .

        至此,LLama Factory 安装完毕。

LLama Factory界面介绍

        将环境切换至 llamafactory,并切换到 LLama Factory 的目录后,启动 LLama Factory。

source activate llamafactory
cd /root/autodl-tmp/LLaMA-Factory
llamafactory-cli webui

        如果你使用的是 vscode 中的 remote 插件链接的服务器,由于 vscode 中自带端口转发,因此,你可以在你的电脑本地直接使用浏览器访问 LLama Factory 的 web 界面。

        打开之后的界面大致是这样的:

        接下来,将对界面中的每一个参数进行介绍

        a.模型名称:你所需要微调的模型的名称(本参数是为了对应后面的对话模板)

        b.模型路径:你所需要微调的模型的绝对路径

        c.微调方法

                full:全量微调——对整个预训练模型的所有参数进行微调,适用于计算资源较为充足的情况

                freeze:冻结部分参数微调——冻结预训练模型的大部分参数,仅微调部分顶层参数或新增的任务相关层

                LoRA:量化微调——将原模型分解为两个低秩矩阵,通过微调低秩矩阵来间接微调原模型的参数。可以进一步选择下方的量化等级,进行QLoRA微调。关于LoRA微调涉及的具体原理,后续单开一篇文章来进行介绍。

        d.检查点路径:如果你想继承之前的训练进度的话,可以选择之前保存的某一轮参数,从该参数继续进行训练

        e.对话模板:用于控制模型的输出规范。对话模板本身并不影响模型的性能,但是,如果模型在微调和推理时的对话模板不一致的话,可能会影响到模型最终的输出效果。

        f.RoPE 插值方法:通过一种平滑的位置编码方式,将模型的上下文窗口扩展到更远的区域。LLama Factory 中可选的方式有:线性缩放位置索引(Linear)、动态调整缩放因子(Dynamic)、非均匀频率调整(YaRN)和专门用于LLaMA3的优化插值(Llama3)。如果没有特殊要求的话,通常选择none就行。这里不再做过多赘述,如果有机会的话,以后单开一章进行详细说明。

        g.加速方式:通过优化计算内核或引入高效算法,减少模型训练和推理的时间开销,同时节省显存占用。

        auto:框架自动选择当前环境支持的最优加速方案。

        flashattn2:一种高效计算 Transformer 模型中注意力机制的算法库,通过优化 GPU 内存访问模式和计算步骤,显著加速注意力计算并减少显存占用。

        unsloth:一个针对大模型微调(尤其是 LoRA)的轻量级优化库,通过简化计算图和混合精度策略加速训练。

        liger_kernel:LLaMA Factory 自研的轻量级加速内核,针对常见操作(如矩阵乘法、LayerNorm)进行底层优化。

        h.训练阶段:针对大语言模型(LLM)不同训练目标和任务设计的特定流程。

        Supervised Fine-Tuning:在标注数据上微调预训练模型,使其适配特定任务。

        Reward Modeling:训练一个奖励模型,用于评估生成内容的质量。

        PPO(Proximal Policy Optimization,近端策略优化):一种强化学习算法,通过最大化奖励模型的反馈优化生成策略。

        DPO(Direct Preference Optimization,直接偏好优化):通过直接优化偏好数据调整模型策略。

        KTO (Kahneman-Tversky Optimization):基于行为经济学中的“前景理论”,设计损失函数以模拟人类决策偏差。

        Pre-Training:在大规模无标注文本数据上训练模型,学习通用语言表示,构建模型的基础语言理解能力。

        

        i.计算类型:指定了模型训练和推理过程中数值计算的精度格式,直接影响显存占用、计算速度和数值稳定性。

        bf16:Brain Float 16,由 Google Brain 团队设计,指数位与 FP32 对齐,牺牲小数精度换取更大动态范围,数值范围在约 ±1.18e-38 到 ±3.4e38 之间。

        fp16:16 位(半精度)浮点数,数值范围在约 ±6.1e-5 到 ±65504。

        fp32:32 位(单精度)浮点数,数值范围在约 ±1.18e-38 到 ±3.4e38 之间,范围与 bf16 相同。

        pure_bf16:纯 BF16 训练,全程使用 BF16 精度(包括权重、梯度、优化器状态),不保留 FP32 主权重副本。

数据格式要求

        在使用 LLama Factory 进行微调之前,我们需要先明确一下 LLama Factory 在微调时所要求的数据格式。

        LLama Factory 中默认的数据格式是json,以 data 文件夹下的 identity 数据为例,大概长这样:

[{"instruction": "hi","input": "","output": "Hello! I am {{name}}, an AI assistant developed by {{author}}. How can I assist you today?"},{"instruction": "hello","input": "","output": "Hello! I am {{name}}, an AI assistant developed by {{author}}. How can I assist you today?"},{"instruction": "Who are you?","input": "","output": "I am {{name}}, an AI assistant developed by {{author}}. How can I assist you today?"}
]

        其中,"instruction"是用户的输入,"output"是模型的输出,"input"能够为指令提供额外的上下文或具体输入内容,例如:当 instruction 为“翻译以下内容”,可以在"input"中输入想要翻译的语句(但是感觉一般不会这么干)。

微调训练

        接下来以模型的自我认知训练作为例子,来实战演示一下使用 LLama Factory 进行模型微调。

        操作步骤如下:

                1.找到并打开 LLama Factory 根目录下的 data/identity.json,将其中所有的 {{name}} 和 {{author}} 替换为自己想要的内容。例如:

[{"instruction": "hi","input": "","output": "Hello! I am 丛雨, an AI assistant developed by yuriko. How can I assist you today?"},{"instruction": "hello","input": "","output": "Hello! I am 丛雨, an AI assistant developed by yuriko. How can I assist you today?"},{"instruction": "Who are you?","input": "","output": "I am 丛雨, an AI assistant developed by yuriko. How can I assist you today?"}
]

                2.数据准备好之后,在控制台中使用 llamafactory-cli webui 启动 LLama Factory。(需要切换至 LLama Factory 的环境,并进入 LLamaFactory 的根目录)

                3.如果你使用的是 vscode 中的插件链接的服务器,那么在成功启动后,应当会自动打开 LLama Factory 的主界面。

                4.在模型名称和模型路径中选择自己的本地模型

                5.在微调之前,可以先使用 chat 功能加载模型进行一下测试,以便之后对比

                 6.现在我们切回"Train"进行参数设置,需要调整的参数已经如下图所示,使用红色方框标出。其中,需要特别说明一下的是,“训练轮数”可以填写一个较大的数值,后面根据模型的收敛情况手动停止。对于“截断长度”,由于我们这里做的是自我认知训练,模型的回复结果通常不需要太长。“批处理大小”根据自己的显存情况进行选择,显存比较小的情况,对应的批处理大小也可以设置得小一些。

                全部设置完毕后,可以点击下方的“开始”进行训练。

                7.在训练的过程中,我们可以在下方看到模型的损失下降过程。其中,浅色的线代表模型的真实损失,深色的线代表平滑后的损失情况。当看到损失接近平稳时,就可以点击“中断”,停止训练。

                8.模型的参数会被保存到 LLama Factory 的 saves 文件夹下,默认是每100个 epoch 保存一次参数,可以在“其他参数设置”中的“保存间隔”进行设置。

                9.训练完成后,再次切回 Chat 标签页,卸载原有模型,添加检查点路径后,加载模型进行测试。

                10.当模型的输出符合自己预期时,可以切换至 Export 标签页,设置导出参数。

                稍微对参数进行一下解释,

                最大分块大小:如果模型大小较大,那么模型会被分割成多个文件,每个文件不超过所设置得大小。

                导出目录:字面意思。如果目录不存在,则会自动创建一个新目录。

                11.导出模型后,可以切换至 Chat 标签,对导出的模型再次进行测试。将模型路径切换为导出后的模型路径,并且清空检查点路径中的内容,加载模型,进行测试。

        至此,LLama Factory 的简单微调训练流程到此结束。后续可能会单开一章专门讲一下量化微调,以及在 LLama Factory 中如何进行量化微调。

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

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

相关文章

如何借助全球动态IP实现多平台账号的批量注册?

无论是社交网络、在线购物平台还是专业应用软件,账号的创建和使用都是必不可少的。然而,在面对不同平台各自的注册限制和策略时,如何高效、安全且合法地进行账号批量注册成为了亟待解决的问题。本文将探讨全球动态IP在这一过程中的作用及其如…

django admin 添加自定义页面

在Django中,你可以通过多种方式向Django Admin添加自定义页面。以下是一些常见的方法: 方法1:使用ModelAdmin的get_urls()方法 如果你只是想添加一个简单的页面来展示信息,你可以在你的ModelAdmin类中重写get_urls()方法。 from…

Docker容器持久化

引言 Docker 容器作为一种轻量级、可移植的虚拟化技术,广泛应用于开发、测试和生产环境中。然而,容器天生是短暂的,意味着它们在生命周期结束后会被销毁,而其中的数据也会随之丢失。为了确保容器中的数据能够持久化,我…

ShaderToy学习笔记 02.圆

1. 画圆 1.1. 圆的方程 圆的方程是:(x^2 y^2 r^2),其中(r)是圆的半径。 我们可以使用 desmos 来验证一下。 输入 x^2 y^2 -10,即可得到圆。 类似下图 1.2. 画圆的方式 画圆:使用圆的方程,判断每个像素点是否在圆…

一文详解卷积神经网络中的卷积层和池化层原理 !!

文章目录 前言 一、卷积核大小(Kernel Size) 1. 卷积核大小的作用 2. 常见的卷积核大小 3. 选择卷积核大小的原则 二、步长(Stride) 1. Stride的作用 三、填充(Padding) 1. 填充的作用 四、通道数&#xff…

云+AI双轮驱动,亚马逊云科技加速中国企业出海新浪潮

导读:全球化就是本地化 作者 | 小葳 图片来源 | 摄图 近年来,中国企业出海步伐不断加快,“不出海,就出局”成为很多企业的共识。 据沙利文统计,2024年上半年,超过2000家中国上市企业布局海外市场&#xff…

C语言HashTable基本理解

文章目录 一、哈希表概念1. 哈希表的基本概念2. 哈希表的核心组件2.1 哈希函数2.2 冲突处理(哈希碰撞) 3.哈希表的三种结构(1) 数组作为哈希表示例: 2. Set(集合)示例:查找数组中的重复元素1. Set 基础概念…

【缓存与数据库结合最终方案】伪从技术

实现伪从技术:基于Binlog的Following表变更监听与缓存更新 技术方案概述 要实现一个专门消费者服务作为Following表的伪从,订阅binlog并在数据变更时更新缓存,可以采用以下技术方案: 主要组件 MySQL Binlog监听:使…

《100天精通Python——基础篇 2025 第3天:变量与数据类型全面解析,掌握Python核心语法》

目录 一、Python变量的定义和使用二、Python整数类型(int)详解三、Python小数/浮点数(float)类型详解四、Python复数类型(complex)详解---了解五、Python字符串详解(包含长字符串和原始字符串)5.1 处理字符串中的引号5.2 字符串的…

【前后端分离项目】Vue+Springboot+MySQL

文章目录 1.安装 Node.js2.配置 Node.js 环境3.安装 Node.js 国内镜像4.创建 Vue 项目5.运行 Vue 项目6.访问 Vue 项目7.创建 Spring Boot 项目8.运行 Spring Boot 项目9.访问 Spring Boot 项目10.实现 Vue 与 Spring Boot 联动11.安装 axios12.编写请求13.调用函数请求接口14.…

线性代数(一些别的应该关注的点)

一、矩阵 矩阵运算:线性变换 缩放、平移、旋转 无所不能的矩阵 - 三维图形变换_哔哩哔哩_bilibili

01Redis快速入门(nosql、安装redis、客户端、命令及类型、java客户端、序列化)

Redis的常见命令和客户端使用 1.初识Redis Redis是一种键值型的NoSql数据库,这里有两个关键字: 键值型 NoSql 其中键值型,是指Redis中存储的数据都是以key、value对的形式存储,而value的形式多种多样,可以是字符串…

AI编程:[体验]从 0 到 1 开发一个项目的初体验

一、开发信息 开发时间:1.5-2天工具使用: 不熟练,开发本项目前1天,才简单使用了Cursor的功能 功能复杂度: 开发的功能相对简单。页面:2个,登录页面,个人中心页面功能:5个…

LeetCode-392 判断子序列

给定字符串 s 和 t ,判断 s 是否为 t 的子序列。 字符串的一个子序列是原始字符串删除一些(也可以不删除)字符而不改变剩余字符相对位置形成的新字符串。(例如,"ace"是"abcde"的一个子序列&#…

Linux 系统监控大师:Glances 工具详解助力自动化

看图猜诗,你有任何想法都可以在评论区留言哦~ 摘要 Glances 是一款基于 Python 开发的跨平台系统监控工具,集成了 CPU、内存、磁盘、网络、进程等核心指标的实时监控能力,并支持命令行、Web界面、客户端-服务器模式等多种使用场景。其轻量级…

Spring Boot 3.4.5 运行环境需求

📝 Spring Boot 3.4.5 运行环境要求 🌿 1️⃣ 基本需求 ☑️ JDK版本:最低 Java 17 🔗 https://www.java.com/ 最高兼容至 Java 24 ☑️ 依赖框架:需搭配 Spring Framework 6.2.6 🔗 https://docs.sprin…

在KEIL里C51和MDK兼容以及添加ARM compiler5 version编译器

前言 我们想在一个keil里面可以打开32和51的文件,这样就不需要两个keil了 还有就是现在的keil,比如我用的是5.41的,就没有5版本的处理器,所以要安装 本篇文章我们来详细讲解如何实现上面说的两个内容 准备的东西 1.ARM5编译器 …

Flutter 弹窗队列管理:支持优先级的线程安全通用弹窗队列系统

在复杂的 Flutter 应用开发中,弹窗管理是一个常见难题。手动管理弹窗的显示顺序和条件判断不仅繁琐,还容易出错。为此,我们实现了一个支持优先级的线程安全通用弹窗队列管理系统。它能够自动管理弹窗的显示顺序,支持条件判断&…

鸿蒙NEXT开发剪贴板工具类(ArkTs)

import { pasteboard } from kit.BasicServicesKit; import { StrUtil } from ./StrUtil;/*** 剪贴板工具类* 需要权限:* ohos.permission.READ_PASTEBOARD // 允许应用读取剪贴板。* author CSDN-鸿蒙布道师* since 2025/04/25*/ export class PasteboardUtil {…

FastAPI 零基础入门指南:10 分钟搭建高性能 API

一、为什么选择 FastAPI? 想象一下,用 Python 写 API 可以像搭积木一样简单,同时还能拥有媲美 Go 语言的性能,这个框架凭借三大核心优势迅速风靡全球: 开发效率提升 3 倍:类型注解 自动文档,…