使用LlamaFactory进行模型微调

使用LlamaFactory进行模型微调

简介

论文地址:https://arxiv.org/pdf/2403.13372

仓库地址:https://github.com/hiyouga/LLaMA-Factory/tree/main

名词解释

1. 预训练 (Pre-training, PT)

预训练是指模型在大规模无监督数据集上进行初步训练的过程。数据通常由互联网上的文本构成,没有明确的标签。模型通过预测下一个词来学习语言的语法、语义和常识知识。

  • 目标:通过大量的文本数据学习词与词之间的关系,获得广泛的语言理解能力。
  • 训练方式:无监督学习。模型根据已知上下文预测下一个词,并通过这个预测结果不断调整自身的参数。
  • 结果:预训练后的模型具备了基本的语言生成和理解能力,但缺乏完成特定任务的精细调整。

2. 指令微调 (Supervised Fine-tuning, SFT)

指令微调是在预训练的基础上,使用有监督数据对模型进行精细调整的过程。这里的数据是特定任务的数据集,通常包含了人类标注的输入-输出对,指导模型如何在特定指令下工作。

  • 目标:提升模型在特定任务上的表现,让模型更好地理解和执行特定指令。
  • 训练方式:有监督学习。模型根据给定的输入和预期的输出调整参数,以便能够在类似场景下更准确地执行任务。
  • 结果:模型在特定任务(如回答问题、翻译、摘要等)上具有更好的性能和准确性。

3. 基于人工反馈的对齐 (Reinforcement Learning with Human Feedback, RLHF)

RLHF 是通过引入人工反馈,进一步调整模型行为,使其生成的内容更加符合人类期望的一个阶段。具体来说,人类会对模型的输出进行评估,模型根据这些反馈进行强化学习调整。

  • 目标:让模型的输出更符合人类偏好或社会价值观,并减少不当或有害的输出。
  • 训练方式:强化学习。模型会生成多个候选答案,并由人类评估这些答案的质量。基于这些评价,模型会通过强化学习算法(如Proximal Policy Optimization, PPO)调整生成策略。
  • 结果:模型不仅能够理解指令,还能产生与人类偏好对齐的答案。RLHF 在模型的安全性和伦理方面也有很大的作用。

背景

开源大模型如LLaMA,Qwen,Baichuan等主要都是使用通用数据进行训练而来,其对于不同下游的使用场景和垂直领域的效果有待进一步提升,衍生出了微调训练相关的需求,包含预训练(pt),指令微调(sft),基于人工反馈的对齐(rlhf)等全链路。但大模型训练对于显存和算力的要求较高,同时也需要下游开发者对大模型本身的技术有一定了解,具有一定的门槛。

LLaMA-Factory整合主流的各种高效训练微调技术,适配市场主流开源模型,形成一个功能丰富,适配性好的训练框架。项目提供了多个高层次抽象的调用接口,包含多阶段训练,推理测试,benchmark评测,API Server等,使开发者开箱即用。同时提供了基于gradio的网页版工作台,方便初学者可以迅速上手操作,开发出自己的第一个模型。

环境准备

colab

使用google的colab可以快速且免费地使用LlamaFactory进行模型微调。

https://colab.research.google.com/drive/1d5KQtbemerlSDSxZIfAaWXhKr30QypiK?usp=sharing
在这里插入图片描述

本地机器

  1. 本地运行需要必要的cuda和pytorch,如果你在容器里运行,可以直接使用nvidia的pytorch镜像:nvcr.io/nvidia/pytorch:24.05-py3
  2. 安装LlamaFactory
export PIP_INDEX_URL=https://pypi.tuna.tsinghua.edu.cn/simple
export USE_MODELSCOPE_HUB=1
export MODELSCOPE_CACHE=/data/modelscope
git clone --depth 1 https://github.com/hiyouga/LLaMA-Factory.gitcd LLaMA-Factory
pip install -e ".[torch,metrics,modelscope]"llamafactory-cli webui

数据集

LLamaFactory内置了一些常用的数据集,可以直接在现有的数据集上修改,也可以自己扩充新的数据集,详细参考:https://github.com/hiyouga/LLaMA-Factory/blob/main/data/README_zh.md

这里直接用身份验证数据集,修改模型的身份去验证微调效果:

import jsoncd /content/LLaMA-Factory/NAME = "测试AI"
AUTHOR = "测试科技"with open("data/identity.json", "r", encoding="utf-8") as f:dataset = json.load(f)for sample in dataset:sample["output"] = sample["output"].replace("{{"+ "name" + "}}", NAME).replace("{{"+ "author" + "}}", AUTHOR)with open("data/identity.json", "w", encoding="utf-8") as f:json.dump(dataset, f, indent=2, ensure_ascii=False)

目前LLamaFactory支持两种数据集:Alpaca 格式、Sharegpt 格式。相较于 alpaca 格式的数据集,sharegpt 格式支持更多的角色种类,例如 human、gpt、observation、function 等等。

Alpaca格式

指令微调 (Supervised Fine-tuning, SFT) 格式

在指令监督微调时,instruction 列对应的内容会与 input 列对应的内容拼接后作为人类指令,即人类指令为 instruction\ninput。而 output 列对应的内容为模型回答。

如果指定,system 列对应的内容将被作为系统提示词。

history 列是由多个字符串二元组构成的列表,分别代表历史消息中每轮对话的指令和回答。注意在指令监督微调时,历史消息中的回答内容也会被用于模型学习

[{"instruction": "人类指令(必填)","input": "人类输入(选填)","output": "模型回答(必填)","system": "系统提示词(选填)","history": [["第一轮指令(选填)", "第一轮回答(选填)"],["第二轮指令(选填)", "第二轮回答(选填)"]]}
]

预训练 (Pre-training, PT) 格式

在预训练时,只有 text 列中的内容会用于模型学习。

[{"text": "document"},{"text": "document"}
]

偏好数据集

偏好数据集用于奖励模型训练、DPO 训练、ORPO 训练和 SimPO 训练。

它需要在 chosen 列中提供更优的回答,并在 rejected 列中提供更差的回答。

[{"instruction": "人类指令(必填)","input": "人类输入(选填)","chosen": "优质回答(必填)","rejected": "劣质回答(必填)"}
]

Sharegpt格式

指令微调 (Supervised Fine-tuning, SFT) 格式

相比 alpaca 格式的数据集,sharegpt 格式支持更多的角色种类,例如 human、gpt、observation、function 等等。它们构成一个对象列表呈现在 conversations 列中。

注意其中 human 和 observation 必须出现在奇数位置,gpt 和 function 必须出现在偶数位置。

[{"conversations": [{"from": "human","value": "人类指令"},{"from": "function_call","value": "工具参数"},{"from": "observation","value": "工具结果"},{"from": "gpt","value": "模型回答"}],"system": "系统提示词(选填)","tools": "工具描述(选填)"}
]

偏好数据集

[{"conversations": [{"from": "human","value": "人类指令"},{"from": "gpt","value": "模型回答"},{"from": "human","value": "人类指令"}],"chosen": {"from": "gpt","value": "优质回答"},"rejected": {"from": "gpt","value": "劣质回答"}}
]

微调

开始微调

可以通过gradio页面直接微调

# 启动gradio,使用7860端口访问
llamafactory-cli webui

选择微调模型和数据集

在这里插入图片描述

开始微调
在这里插入图片描述

微调完成后的文件存在项目目录的saves文件夹下。

判断微调效果

可以通过看损失曲线是否收敛来判断本次训练的效果,如果收敛不好,则需要考虑调小学习率、减少梯度累积、增加训练轮数等方式。以下是一些损失较大的图例(需要修改参数重新微调)。

在这里插入图片描述
在这里插入图片描述

验证微调效果

在这里插入图片描述

微调参数解释

梯度累积 (gradient_accumulation_steps)

模型会在每次处理一个小批次后,不立即更新权重,而是先将每次的小批次梯度累积起来,直到累积到设定的次数为止(例如,4或8),然后再一次性执行权重更新。这样做的主要原因是为了减少显存占用。如果你的显存较为充裕,想要快速更新权重,可以选择较小的值,比如 4,否则可以选择较大的值,比如 8

学习率 (learning_rate)

更大的学习率意味着模型每次更新的幅度更大,收敛速度会较快。然而,过大的学习率可能会导致模型在损失函数的表面上跳动过大,甚至错过全局最优解,导致模型发散或收敛到局部最优解。

5e-5:适合在模型刚开始训练时使用,或者用于一些简单任务和数据集较小的场景。较大的学习率可以帮助模型快速进入一个较好的区域,减少训练时间。

5e-6:适合在微调阶段使用,特别是当你在较大的预训练模型上进行微调时,小的学习率更为合适。因为大模型通常已经学习到了大量的知识,微调阶段只需要进行小幅度的调整,过大的学习率反而可能破坏模型原有的良好性能。

训练轮次 (training_epochs)

在深度学习中,单次迭代(即单个epoch)通常不足以让模型学到足够的信息。模型通过多轮次的训练,不断调整权重,逐渐优化自身,降低误差并提高在验证集上的性能。每次新的epoch开始,模型会使用更新的权重重新开始遍历数据,从而逐步学习数据中的模式和特征。

如果训练轮次设置得太少,模型可能无法充分学习数据中的模式,表现为欠拟合(underfitting),即训练不足,模型在训练集和验证集上的表现都较差。

果训练轮次设置得太多,模型可能过度拟合(overfitting)训练集,即模型对训练数据的表现非常好,但在验证集或测试集上的表现可能会变差,因为模型“记住”了训练数据中的噪声,而不是学习到泛化的模式。

合并LoRA 权重

使用页面的Export功能进行LoRA的权重合并
在这里插入图片描述

合并完成后,可以用以下代码进行测试

import transformers
import torchmodel_id='/data/finetuned/llama3-8b-instruct-merged'
pipeline = transformers.pipeline("text-generation",model=model_id,model_kwargs={"torch_dtype": torch.bfloat16},device="cuda",
)messages = [{"role": "system", "content": "You are a helpful assistant"},{"role": "user", "content": "你是谁?"},
]prompt = pipeline.tokenizer.apply_chat_template(messages,tokenize=False,add_generation_prompt=True
)terminators = [pipeline.tokenizer.eos_token_id,pipeline.tokenizer.convert_tokens_to_ids("<|eot_id|>")
]print("欢迎使用聊天模型!输入 'exit' 退出对话。\n")
while True:input_text = input("你: ")if input_text.lower() == "exit":print("对话结束。")breakoutputs = pipeline(prompt,max_new_tokens=256,eos_token_id=terminators,do_sample=True,temperature=0.6,top_p=0.9,)print(outputs[0]["generated_text"][len(prompt):])

在这里插入图片描述

问题解决

KeyError: ‘WEBP’

使用图形化界面微调模型时,页面会展示训练损失图,可能会报这个错误,这个错误表明在使用 matplotlib 保存图片为 WEBP 格式时,出现了 KeyError: 'WEBP',即 PIL 不支持 WEBP 格式。这通常是由于 Pillow 库没有正确安装 WEBP 格式的支持引起的。

apt-get update && apt-get install libwebp-dev
pip uninstall pillow
pip install --no-cache-dir pillow

使用python验证是否解决,期待返回True

from PIL import features
print(features.check('webp'))

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

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

相关文章

最强 OpenAI o1 逻辑推理正确率仅 50%!清华、智谱推出「大模型逻辑推理新基准」

9.11 和 9.9 哪个大&#xff1f; 这一连人类幼儿园儿童都能回答的问题&#xff0c;曾经&#xff08;至今&#xff09;难倒了众多大语言模型&#xff08;LLM&#xff09;。 然而&#xff0c;要想达到通用人工智能&#xff08;AGI&#xff09;的水平&#xff0c;LLM 不仅要完成“…

居民小区的有序充电策略及解决方案

0引言 全球经济增长导致化石能源过度消耗&#xff0c;加剧环境污染。电动汽车因其环保优势迅速崛起&#xff0c;预计到2030年中国电动汽车保有量将达到6000万辆。这有助于减少化石能源依赖&#xff0c;推广绿色出行&#xff0c;但也对电网稳定性构成挑战。因此&#xff0c;研究…

2.1 HTML5 - Canvas标签

文章目录 引言Canvas标签概述定义实例&#xff1a;创建画布 理解Canvas坐标系概述实例&#xff1a;获取Canvas坐标 获取Canvas环境上下文概述实例&#xff1a;获取Canvas上下文设置渐变色效果 结语 引言 大家好&#xff0c;今天我们要一起探索HTML5中一个非常有趣且强大的特性…

001 Hadoop安装、Spring整合测试

Hadoop安装、整合测试 文章目录 Hadoop安装、整合测试1.简介1.优点2.组成 2.安装1.安装jdk&#xff08;如已安装可跳过&#xff09;2.安装hadoop1.安装2. 修改配置文件core-site.xml3. 修改配置文件hdfs-site.xml4.启动hadoop5.启动yarn6.执行jps查看7.相关端口及配置位置8.访问…

python中不变的数据类型有哪些

在Python中&#xff0c;不可变&#xff08;immutable&#xff09;数据类型是指一旦创建了这些类型的对象后&#xff0c;就不能改变其值。Python中的不可变数据类型包括以下几种&#xff1a; 数字 (int, float, complex): 这些类型的数值一旦创建就不能更改。例如&#xff0c;如…

Flutter 与 React Native - 详细深入对比分析(2024 年)

超长内容预警&#xff0c;建议收藏后阅。 Flutter 和 React Native 是跨平台应用程序开发的两个领先工具。了解它们的差异以及各自的最佳用例。 什么是Flutter&#xff1f; Flutter 是 Google 于 2018 年发布的用户界面 (UI) 软件开发套件。Flutter 可让您为多种平台和操作系统…

在线深度学习:爱奇艺效果广告分钟级模型优化

01# 背景 在效果广告投放场景中&#xff0c;媒体侧需要准确衡量每次请求的价值&#xff0c;模型预估值在广告竞价中扮演着核心角色。模型预估精度的提升&#xff0c;是改善媒体侧变现效率、提升广告收益的核心技术驱动力。 此前&#xff0c;爱奇艺效果广告预估模型为小时级模型…

构建流媒体管道:利用 Docker 部署 Nginx-RTMP 从 FFmpeg RTMP 推流到 HLS 播放的完整流程

最近要实现一个类似导播台的功能&#xff0c;于是我先用 FFmpeg 实现一个参考对照的 Demo&#xff0c;我将其整理为一篇文章&#xff0c;方便后续大家或者和自己参考&#xff01; 1、软件工具介绍 本次部署相关软件 / 工具如下&#xff1a; FFmpeg&#xff1a;全称是 Fast Fo…

软件确认测试内容和方法分享,CMA、CNAS第三方软件检测机构推荐

在现代软件开发中&#xff0c;软件确认测试扮演着至关重要的角色。它不仅帮助开发团队识别系统中的缺陷&#xff0c;还确保软件产品符合用户需求和期望。 软件确认测试旨在验证软件系统的性能和功能是否符合设计规格和用户需求。它通常在软件开发的后期进行&#xff0c;以确保…

火语言RPA流程组件介绍--浏览器上传文件

&#x1f6a9;【组件功能】&#xff1a;在浏览器内自动点击上传功能按钮&#xff0c;选择本地文件完成文件网页上传 配置预览 配置说明 目标元素 支持T或# 通过捕获网页元素或填写css,xpath获取网页元素作为操作目标 上传文件路径 支持T或# 默认FLOW输入项 需要上传的文件…

从零开始构建:Python自定义脚本自动化你的日常任务

从零开始构建&#xff1a;Python自定义脚本自动化你的日常任务 Python 作为一种简洁且功能强大的编程语言&#xff0c;被广泛应用于各种自动化任务中。通过编写 Python 脚本&#xff0c;你可以轻松地将日常重复性工作自动化&#xff0c;例如文件操作、数据处理、网络爬虫、系统…

vue3--通用 button 组件实现

背景 在日常开发中,我们一般都是利用一些诸如:element-ui、element-plus、ant-design等组件库去做我们的页面或者系统 这些对于一些后台管理系统来说是最好的选择,因为后台管理系统其实都是大同小异的,包括功能、布局结构等 但是对于前台项目,比如官网、门户网站这些 …

【Linux驱动开发】嵌入式Linux驱动开发基本步骤,字符驱动和新字符驱动开发入门,点亮LED

【Linux驱动开发】嵌入式Linux驱动开发基本步骤&#xff0c;字符驱动和新字符驱动开发入门&#xff0c;点亮LED 文章目录 开发环境驱动文件编译驱动安装驱动自动创建设备节点文件 驱动开发驱动设备号地址映射&#xff0c;虚拟内存和硬件内存地址字符驱动旧字符驱动新字符驱动 …

live2d 实时虚拟数字人形象页面显示,对接大模型

live2dSpeek 测试不用gpu可以正常运行 https://github.com/lyz1810/live2dSpeek 运行的话还需要额外下载https://github.com/lyz1810/edge-tts支持语音 ## 运行live2dSpeek >npm install -g http-server >http-server . ## 运行edge-tts python edge-tts.py

使用 Helsinki-NLP 中英文翻译本地部署 - python 实现

通过 Helsinki-NLP 本地部署中英文翻译功能。该开源模型性价比相对高&#xff0c;资源占用少&#xff0c;对于翻译要求不高的应用场景可以使用&#xff0c;比如单词&#xff0c;简单句式的中英文翻译。 该示例使用的模型下载地址&#xff1a;【免费】Helsinki-NLP中英文翻译本…

心觉:激活潜意识财富密码:每天一练,财富自动来

Hi&#xff0c;我是心觉&#xff0c;与你一起玩转潜意识、脑波音乐和吸引力法则&#xff0c;轻松掌控自己的人生&#xff01; 挑战每日一省写作200/1000天 为什么有些人总是轻而易举地吸引到财富 而你却努力多年仍然徘徊在财务的困境中&#xff1f; 你每天都在辛苦工作&…

MambaVision原理和源码调测

Hatamizadeh, Ali and Jan Kautz. “MambaVision: A Hybrid Mamba-Transformer Vision Backbone.” ArXiv abs/2407.08083 (2024): n. pag. 1.模型原理 关键思路&#xff1a; 通过重新设计Mamba的架构和在最终层增加自注意力块&#xff0c;提高了Mamba模型对视觉特征的建模能力…

C语言练习

题目&#xff1a; 1.运用switch选择语句&#xff0c;编写一段C语言&#xff0c;请根据输入的数字&#xff0c;显示相应的星期日&#xff0c;如果数字所对应的星期日并不存在请显示“抱歉&#xff0c;您输入的内容并不存在。” 分析&#xff1a;1.在本题中&#xff0c;要运用到…

C语言之扫雷小游戏(完整代码版)

说起扫雷游戏&#xff0c;这应该是很多人童年的回忆吧&#xff0c;中小学电脑课最常玩的必有扫雷游戏&#xff0c;那么大家知道它是如何开发出来的吗&#xff0c;扫雷游戏背后的原理是什么呢&#xff1f;今天就让我们一探究竟&#xff01; 扫雷游戏介绍 如下图&#xff0c;简…

【网络安全】漏洞案例:提升 Self-XSS 危害

未经许可,不得转载。 文章目录 Self-XSS-1Self-XSS-2Self-XSS-1 目标应用程序为某在线商店,在其注册页面的First Name字段中注入XSS Payload: 注册成功,但当我尝试登录我的帐户时,我得到了403 Forbidden,即无法登录我的帐户。 我很好奇为什么我无法登录我的帐户,所以我…