llama-factory学习个人记录

框架、模型、数据集准备

1.llama-factory部署

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

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

git lfs install
git clone https://huggingface.co/baichuan-inc/Baichuan2-13B-Chat

在LLaMA-Factory项目中,单显卡可以用命令或web页面训练,多显卡只能用用命令的方式

web页面方式

启动 LLaMA Factory 的 WebUI 页面

CUDA_VISIBLE_DEVICES=0 python src/webui.py

如果报错:Traceback (most recent call last):
  File "/home/bingxing2/ailab/group/ai4agr/wzf/LLM/frame/LLaMA-Factory/src/webui.py", line 13, in <module>
    main()
  File "/home/bingxing2/ailab/group/ai4agr/wzf/LLM/frame/LLaMA-Factory/src/webui.py", line 9, in main
    create_ui().queue().launch(share=gradio_share, server_name=server_name, inbrowser=True)
  File "/home/bingxing2/ailab/scxlab0069/.conda/envs/llama_factory/lib/python3.10/site-packages/gradio/blocks.py", line 2375, in launch
    raise ValueError(
ValueError: When localhost is not accessible, a shareable link must be created. Please set share=True or check your proxy settings to allow access to localhost. 

解决办法:

unset http_proxy

unset https_proxy

启动后的界面如下所示: 

 

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

  • 模型名称:可以使用常用的模型,包括 ChatGLM,BaiChuan,QWen,LLaMA 等,我们根据下载的模型选择Baichuan2-13B-Chat。
  • 模型路径:输入框填写我们之前下载的 Baichuan 模型的地址。

微调方法有三种:

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

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

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

下半部分是一个页签窗口,分为Train、Evaluate、Chat、Export四个页签,微调先看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目录。

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

如果采用自行准备的数据集,要在 LLaMA Factory目录下data目录下的dataset_info.json添加新新数据集信息。

 替换后

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

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

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

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

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

  • linear(线性): 随着训练的进行,学习率将以线性方式减少。
  • cosine(余弦): 这是根据余弦函数来减少学习率的。在训练开始时,学习率较高,然后逐渐降低并在训练结束时达到最低值。
  • cosine_with_restarts(带重启的余弦): 和余弦策略类似,但是在一段时间后会重新启动学习率,并多次这样做。
  • polynomial(多项式): 学习率会根据一个多项式函数来减少,可以设定多项式的次数。
  • constant(常数): 学习率始终保持不变。
  • constant_with_warmup(带预热的常数): 开始时,学习率会慢慢上升到一个固定值,然后保持这个值。
  • inverse_sqrt(反平方根): 学习率会随着训练的进行按照反平方根的方式减少。
  • reduce_lr_on_plateau(在平台上减少学习率): 当模型的进展停滞时(例如,验证误差不再下降),学习率会自动减少。

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

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

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

参数设置完后点击预览命令按钮可以查看本次微调的命令,确认无误后点击开始按钮就开始微调了,因为数据量比较少,大概几分钟微调就完成了。在界面的右下方还可以看到微调过程中损失函数曲线,损失函数的值越低,模型的预测效果通常越好

后端界面

前端界面 

 

4.模型试用

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

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

指令方式

命令运行的脚本地址:LLaMA-Factory/examples/README_zh.md

训练指令 

 1.预训练指令

CUDA_VISIBLE_DEVICES=0 python src/train.py \--stage pt \                               # Pre——Training预训练模式--model_name_or_path path_to_llama_model \ # 模型地址--do_train \                               # 表示进行训练--dataset wiki_demo \                      # 使用的数据集--finetuning_type lora \                   # 微调的方法--lora_target W_pack \                     # LoRA作用模块:Baichuan为W_pack--output_dir path_to_pt_checkpoint \       # 断点保存:保存模型断点的位置--overwrite_cache \                        # 表示是否覆盖缓存文件--per_device_train_batch_size 4 \          # 批处理大小:每块 GPU 上处理的样本数量--gradient_accumulation_steps 4 \          # 梯度累积:梯度累积的步数(节省显存的方法)--lr_scheduler_type cosine \               # 学习率调节器:采用的学习率调节器名称--logging_steps 10 \                       # 日志间隔:每两次日志输出间的更新步数--save_steps 1000 \                        # 保存间隔:每两次断点保存间的更新步数--learning_rate 5e-5 \                     # 学习率:AdamW优化器的初始学习率--num_train_epochs 3.0 \                   # 训练轮数:需要执行的训练总轮数--plot_loss \                              # 绘制损失函数图--fp16                                     # 计算类型:是否启用fp16或bf16混合精度训练

如果报错:

File "/home/bingxing2/ailab/scxlab0069/.conda/envs/llama_factory/lib/python3.10/site-packages/torch/nn/modules/module.py", line 1532, in _wrapped_call_implreturn self._call_impl(*args, **kwargs)File "/home/bingxing2/ailab/scxlab0069/.conda/envs/llama_factory/lib/python3.10/site-packages/torch/nn/modules/module.py", line 1541, in _call_implreturn forward_call(*args, **kwargs)File "/home/bingxing2/ailab/scxlab0069/.conda/envs/llama_factory/lib/python3.10/site-packages/torch/nn/modules/loss.py", line 1185, in forwardreturn F.cross_entropy(input, target, weight=self.weight,File "/home/bingxing2/ailab/scxlab0069/.conda/envs/llama_factory/lib/python3.10/site-packages/torch/nn/functional.py", line 3086, in cross_entropyreturn torch._C._nn.cross_entropy_loss(input, target, weight, _Reduction.get_enum(reduction), ignore_index, label_smoothing)
RuntimeError: "nll_loss_out_frame" not implemented for 'Half'

解决办法:把fp16改成bf16 

2.指令监督微调(已跑通)

CUDA_VISIBLE_DEVICES=0 python src/train.py \--stage sft \--model_name_or_path path_to_llama_model \--do_train \--dataset alpaca_gpt4_zh \                  --template default \              # 提示模板:构建提示词时使用的模板 --finetuning_type lora \--lora_target W_pack \--output_dir path_to_sft_checkpoint \--overwrite_cache \--per_device_train_batch_size 4 \--gradient_accumulation_steps 4 \--lr_scheduler_type cosine \--logging_steps 10 \--save_steps 1000 \--learning_rate 5e-5 \--num_train_epochs 3.0 \--plot_loss \--fp16

 3训练奖励模型+PPO

CUDA_VISIBLE_DEVICES=0 python src/train.py \--stage rm \--model_name_or_path path_to_llama_model \--do_train \--dataset comparison_gpt4_zh \              # 奖励模型训练数据集--template default \--finetuning_type lora \--lora_target W_pack \--resume_lora_training False \              # 接着上次的LoRA权重训练或创建一个新的LoRA权重--checkpoint_dir path_to_sft_checkpoint \   # 指令微调模型的断点--output_dir path_to_rm_checkpoint \        # 奖励模型的输出位置--per_device_train_batch_size 2 \--gradient_accumulation_steps 4 \--lr_scheduler_type cosine \--logging_steps 10 \--save_steps 1000 \--learning_rate 1e-6 \--num_train_epochs 1.0 \--plot_loss \--fp16

PPO训练(PPO训练需要先进行上一步RM的训练,然后导入微调后模型和RM进行训练输出)

CUDA_VISIBLE_DEVICES=0 python src/train.py \--stage ppo \--model_name_or_path path_to_llama_model \--do_train \--dataset alpaca_gpt4_zh \--template default \--finetuning_type lora \--lora_target W_pack \--resume_lora_training False \--checkpoint_dir path_to_sft_checkpoint \   # 加载指令微调的断点模型--reward_model path_to_rm_checkpoint \      # 奖励模型的断点路径--output_dir path_to_ppo_checkpoint \       # ppo训练的断点输出位置--per_device_train_batch_size 2 \--gradient_accumulation_steps 4 \--lr_scheduler_type cosine \--logging_steps 10 \--save_steps 1000 \--learning_rate 1e-5 \--num_train_epochs 1.0 \--plot_loss

 4.DPO训练

(不需要先训练RM,直接导入微调模型进行DPO训练)

CUDA_VISIBLE_DEVICES=0 python src/train.py \--stage dpo \--model_name_or_path path_to_llama_model \--do_train \--dataset comparison_gpt4_zh \--template default \--finetuning_type lora \--lora_target W_pack \--resume_lora_training False \--checkpoint_dir path_to_sft_checkpoint \--output_dir path_to_dpo_checkpoint \--per_device_train_batch_size 2 \--gradient_accumulation_steps 4 \--lr_scheduler_type cosine \--logging_steps 10 \--save_steps 1000 \--learning_rate 1e-5 \--num_train_epochs 1.0 \--plot_loss \--fp16
  • 大规模无监督语言模型(LMs)虽然可以学习广泛的世界知识和一些推理技能,但由于其训练的完全无监督性,因此实现对其行为的精确控制是困难的。现有的获得这种可控性的方法是收集人工对模型生成相对质量的标签,并且通过人类反馈强化学习(RLHF)对无监督的 LM 进行微调,以使其与人类偏好相一致。然而,RLHF 是一个复杂且经常不太稳定的过程,它首先拟合一个反应人类偏好的奖励模型,然后通过强化学习对大型无监督 LM 进行微调以最大化评估奖励,并避免与原始模型相差太远。
  • 在本文中,我们使用奖励函数和最优策略间的映射,展示了约束奖励最大化问题完全可以通过单阶段策略训练进行优化 ,从本质上解决了人类偏好数据上的分类问题。我们提出的这个算法称为直接偏好优化(Direct Preference Optimization,DPO)。它具有稳定性、高性能和计算轻量级的特点,不需要拟合奖励模型,不需要在微调时从 LM 中采样,也不需要大量的超参调节。我们的实验表明了 DPO 可以微调 LMs 以对齐人类偏好,甚至比现有方法更好。值得注意的是,用 DPO 进行微调在控制生成结果的情感以及改善摘要和单轮对话的响应质量方面表现出更好的能力,同时在实现和训练时的难度大大降低。

模型评估

CUDA_VISIBLE_DEVICES=0 python src/evaluate.py \--model_name_or_path path_to_llama_model \     # base模型--finetuning_type lora \ --checkpoint_dir path_to_checkpoint \          # 训练好的检查点--template vanilla \                           # 模板类型--task ceval \                                 # 任务类型--split validation \                           # 指定数据集的划分--lang zh \--n_shot 5 \                                   # few-shot 学习的示例数--batch_size 4                                 # 评估时的批量大小

模型预测

CUDA_VISIBLE_DEVICES=0 python src/train.py \--model_name_or_path path_to_llama_model \    # base模型--do_predict \                                # 执行预测任务--dataset alpaca_gpt4_zh \--template default \--finetuning_type lora \--checkpoint_dir path_to_checkpoint \         # 训练好的检查点--output_dir path_to_predict_result \--per_device_eval_batch_size 8 \--max_samples 100 \                           # 最大样本数:每个数据集最多使用的样本数--predict_with_generate                       # 使用生成模式进行预测

微调训练后生成的文件夹path_to_sft_checkpoint中包括:

  • checkpoint-xxx 间隔固定step生成的模型断点
  • runs 文件夹用于tensorboard可视化训练过程
  • lora adapter模型、配置
  • 分词器脚本、配置、模型
  • 训练日志
  • loss曲线

参考:用通俗易懂的方式讲解大模型:一个强大的 LLM 微调工具 LLaMA Factory_llama-factory-CSDN博客

从零开始的LLaMA-Factory的指令增量微调_llamafactory微调-CSDN博客 

LLaMA-Factory参数的解答(命令,单卡,预训练)_llama-factory单机多卡-CSDN博客 

Llama-Factory的baichuan2微调-CSDN博客 

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

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

相关文章

线性回归模型

目录 1.概述 2.线性回归模型的定义 3.线性回归模型的优缺点 4.线性回归模型的应用场景 5.线性回归模型的未来展望 6.小结 1.概述 线性回归是一种广泛应用于统计学和机器学习的技术&#xff0c;用于研究两个或多个变量之间的线性关系。在本文中&#xff0c;我们将深入探讨…

会声会影调速怎么用 会声会影如何调整音频速度

会声会影是一款功能强大的视频编辑软件&#xff0c;可以帮助我们轻松的实现剪辑。 会声会影的操作简单易懂&#xff0c;界面简洁明快。适合家庭使用&#xff0c; 我们使用会声会影可以在家就能将视频剪辑成好莱坞大片。但是在使用的过程中&#xff0c;仍然会遇到一些操作上的问…

微信小程序预览图片和H5使用canvas实现图片+蒙层+文字

1、效果 2.H5实现 <!--* Author: limingfang* Date: 2024-05-20 10:26:51* LastEditors: limingfang* LastEditTime: 2024-05-21 16:31:11* Description: --> <!DOCTYPE html> <html lang"en"> <head> <meta charset"UTF-8&q…

【小程序 按钮 表单 】

按钮 代码演示 xxx.wxml <view class"boss" hover-class"box"hover-start-time"2000"hover-stay-time"5000">测试文本<view hover-stop-propagation"true">子集</view><view>子集2</view>…

Capture One Studio for Mac:打造完美影像的利器

对于摄影师而言&#xff0c;每一次按下快门都是一次对完美影像的追求。而Capture One Studio for Mac正是这样一款能够帮助你实现这一追求的利器。 Capture One Studio for Mac v16.4.2.1中文直装版下载 首先&#xff0c;Capture One Studio for Mac拥有出色的图像处理能力。它…

Java—二分查找

介绍 二分查找&#xff08;Binary Search&#xff09;是一种在有序数组中查找特定元素的搜索算法。其基本思想是将目标值与数组中间的元素进行比较&#xff1a; 如果目标值等于中间元素&#xff0c;则查找成功。如果目标值小于中间元素&#xff0c;则在数组左半部分继续进行二…

2024年汉字小达人活动4个多月开赛:18道历年选择题和答案、解析

根据近年的安排&#xff0c;2024年第11届汉字小达人比赛还有4个多月就启动&#xff0c;那么孩子们如何利用这段时间有条不紊地备考呢&#xff1f;我的建议是两手准备&#xff1a;①把小学1-5年级的语文课本上的知识点熟悉&#xff0c;重点是字、词、成语、古诗。②把历年真题刷…

VTK 数据处理:特征边提取

VTK 数据处理&#xff1a;特征边提取 VTK 数据处理&#xff1a;特征边提取原理实例 1&#xff1a;边界边提取实例 2&#xff1a;模型特征边提取实例 3&#xff1a;利用 vtkFeatureEdges 提取的边界补洞实例 4&#xff1a;利用 vtkFillHolesFilter 补洞 VTK 数据处理&#xff1a…

全局平均池化笔记

全局平均池化&#xff08;Global Average Pooling, GAP&#xff09;是一种用于卷积神经网络&#xff08;CNN&#xff09;中的池化操作&#xff0c;其主要作用和优点包括&#xff1a; 减少参数数量&#xff1a;全局平均池化层将每个特征图通过取其所有元素的平均值&#xff0c;压…

初识Spring Boot

初识Spring Boot SpringBoot是建立在Spring框架之上的一个项目,它的目标是简化Spring应用程序的初始搭建以及开发过程。 对比Spring Spring Boot作为Spring框架的一个模块&#xff0c;旨在简化Spring应用程序的初始搭建和开发过程&#xff0c;以下是Spring Boot相对于传统Spri…

[datawhale202405]从零手搓大模型实战:TinyAgent

结论速递 TinyAgent项目实现了一个简单的Agent智能体&#xff0c;主要是实现了ReAct策略&#xff08;推理调用工具的能力&#xff09;&#xff0c;及封装了一个Tool。 项目实现有一定的疏漏。为了正确运行代码&#xff0c;本次对代码Agent部分进行了简单修改&#xff08;完善…

【Linux】Linux的安装

文章目录 一、Linux环境的安装虚拟机 镜像文件云服务器&#xff08;可能需要花钱&#xff09; 未完待续 一、Linux环境的安装 我们往后的学习用的Linux版本为——CentOs 7 &#xff0c;使用 Ubuntu 也可以 。这里提供几个安装方法&#xff1a; 电脑安装双系统&#xff08;不…

关于burp的intruder返回包空白问题

记录一下被自己蠢笑的问题 burp返回包为空怎么办&#xff0c;在查询无果后经过多次试验&#xff0c;确实没有效果 看那三个点还以为加载呢&#xff0c;攻击完了怎么一个显示没有 于是…… 鼠标到三个点&#xff0c;往下一拉 哈哈哈哈哈哈哈&#xff0c;真是被自己给蠢到了

基于地理坐标的高阶几何编辑工具算法(2)——相交面裁剪

文章目录 工具步骤应用场景算法输入算法输出算法示意图算法原理后处理 工具步骤 选中一个需要裁剪的面&#xff0c;点击“相交面裁剪”工具&#xff0c;多选裁剪模板面&#xff0c;空格执行。 应用场景 常用于基于遥感影像的建筑物几何面编辑。 算法输入 一个待裁剪的面&a…

Mysql 备份恢复 mysqldump与xtrabackup备份

1.1 备份的原因 备份是数据安全的最后一道防线&#xff0c;对于任何数据丢失的场景&#xff0c;备份虽然不一定能恢复百分之百的数据 (取决于备份周期)&#xff0c;但至少能将损失降到最低。衡量备份恢复有两个重要的指标&#xff1a;恢复点目标(RPO) 和恢复时间目标(RTO)&…

vue+elemntui 加减表单框功能样式

<el-form ref"form" :model"form" :rules"rules" label-width"80px"><el-form-item label"配置时间" prop"currentAllocationDate"><div v-for"(item,key) in timeList"><el-date…

实验一:通过路由器实现内外网互联

通过路由器实现内外网互联 一、实验拓扑 相关配置详见下图&#xff0c;内网区域为AR2以内设备&#xff0c;外网区域以AR1和PC1代替进行实验测试。 二、实验要求 通过路由器实现内外网互联&#xff1a; 1.各内网PC可自动获取ip地址&#xff1b; 2.各内网PC可ping通外网PC&…

认知架构 cognitive architecture

Assistants API&#xff1a;以开发人员为中心。 有状态的API&#xff1a;允许存储以前的消息、上传文件、访问内置工具&#xff08;代码解释器&#xff09;、通过函数调用控制其他工具。 认知架构应用的两个组件&#xff1a;&#xff08;1&#xff09;如何提供上下文给应用 &…

【DevOps】深入了解RabbitMQ:AMQP协议基础、消息队列工作原理和应用场景

目录 一、核心功能 二、优势 三、核心概念 四、工作原理 五、交换机类型 六、消息确认 七、持久性和可靠性 八、插件和扩展 九、集群和镜像队列 十、客户端库 十一、管理界面 十二、应用场景 RabbitMQ是一个基于AMQP协议的消息队列中间件&#xff0c;提供高可用、可…

C++ | Leetcode C++题解之第112题路径总和

题目&#xff1a; 题解&#xff1a; class Solution { public:bool hasPathSum(TreeNode *root, int sum) {if (root nullptr) {return false;}if (root->left nullptr && root->right nullptr) {return sum root->val;}return hasPathSum(root->left…