XTuner微调个人小助手认知 #书生浦语大模型实战营#

1.任务:

本次的任务是使用 XTuner 微调 InternLM2-Chat-1.8B 实现自己的小助手认知,从而让模型能够个性化的回复,让模型知道他是我们的小助手,在实战营帮我们完成XTuner微调个人小助手认知的任务。并截图打卡。

任务打卡:

微调前,模型的回复比较通用。

微调后,模型可以有个性化的回复啦。

2.流程:

详细的流程可以参考链接:Tutorial/docs/L1/XTuner/readme.md at camp3 · InternLM/Tutorial · GitHub

2.1环境准备

我们需要创建一个开发机,并安装好相关的Python依赖包。

然后安装好Xtuner。这里我们需要先从从 Github 上下载源码。

# 创建一个目录,用来存放源代码
mkdir -p /root/InternLM/codecd /root/InternLM/codegit clone -b v0.1.21  https://github.com/InternLM/XTuner /root/InternLM/code/XTuner

 其次,进入源码目录,执行安装。

# 进入到源码目录
cd /root/InternLM/code/XTuner
conda activate xtuner0121# 执行安装
pip install -e '.[deepspeed]'

2.2.模型准备

对于学习而言,我们可以使用 InternLM 推出的1.8B的小模型来完成此次微调演示。我们可以通过以下代码一键通过符号链接的方式链接到模型文件,这样既节省了空间,也便于管理。

# 创建一个目录,用来存放微调的所有资料,后续的所有操作都在该路径中进行
mkdir -p /root/InternLM/XTunercd /root/InternLM/XTunermkdir -p Shanghai_AI_Laboratoryln -s /root/share/new_models/Shanghai_AI_Laboratory/internlm2-chat-1_8b Shanghai_AI_Laboratory/internlm2-chat-1_8b

 2.3.微调前的模型对话

我们可以通过网页端的 Demo 来看看微调前 internlm2-chat-1_8b 的对话效果。基本效果如下:

 2.4.指令跟随微调

1)准备数据文件

为了简化数据文件准备,我们也可以通过脚本生成的方式来准备数据。

2)准备配置文件

在准备好了模型和数据集后,我们就要根据我们选择的微调方法结合微调方案来找到与我们最匹配的配置文件了,从而减少我们对配置文件的修改量。

列出支持的配置文件:XTuner 提供多个开箱即用的配置文件,可以通过以下命令查看。

conda activate xtuner0121xtuner list-cfg -p internlm2

复制一个预设的配置文件:由于我们是对internlm2-chat-1_8b模型进行指令微调,所以与我们的需求最匹配的配置文件是 internlm2_chat_1_8b_qlora_alpaca_e3,这里就复制该配置文件。

cd /root/InternLM/XTuner
conda activate xtuner0121xtuner copy-cfg internlm2_chat_1_8b_qlora_alpaca_e3 .

对配置文件进行修改:在选择了一个最匹配的配置文件并准备好其他内容后,下面我们要做的事情就是根据我们自己的内容对该配置文件进行调整,使其能够满足我们实际训练的要求。

#######################################################################
#                          PART 1  Settings                           #
#######################################################################
- pretrained_model_name_or_path = 'internlm/internlm2-chat-1_8b'
+ pretrained_model_name_or_path = '/root/InternLM/XTuner/Shanghai_AI_Laboratory/internlm2-chat-1_8b'- alpaca_en_path = 'tatsu-lab/alpaca'
+ alpaca_en_path = 'datas/assistant.json'evaluation_inputs = [
-    '请给我介绍五个上海的景点', 'Please tell me five scenic spots in Shanghai'
+    '请介绍一下你自己', 'Please introduce yourself'
]#######################################################################
#                      PART 3  Dataset & Dataloader                   #
#######################################################################
alpaca_en = dict(type=process_hf_dataset,
-   dataset=dict(type=load_dataset, path=alpaca_en_path),
+   dataset=dict(type=load_dataset, path='json', data_files=dict(train=alpaca_en_path)),tokenizer=tokenizer,max_length=max_length,
-   dataset_map_fn=alpaca_map_fn,
+   dataset_map_fn=None,template_map_fn=dict(type=template_map_fn_factory, template=prompt_template),remove_unused_columns=True,shuffle_before_pack=True,pack_to_max_length=pack_to_max_length,use_varlen_attn=use_varlen_attn)

 2.5.启动微调

当我们准备好了所有内容,我们只需要将使用 xtuner train 命令令即可开始训练。

cd /root/InternLM/XTuner
conda activate xtuner0121xtuner train ./internlm2_chat_1_8b_qlora_alpaca_e3_copy.py

 2.6.模型格式转换

模型转换的本质其实就是将原本使用 Pytorch 训练出来的模型权重文件转换为目前通用的 HuggingFace 格式文件,那么我们可以通过以下命令来实现一键转换。

cd /root/InternLM/XTuner
conda activate xtuner0121# 先获取最后保存的一个pth文件
pth_file=`ls -t ./work_dirs/internlm2_chat_1_8b_qlora_alpaca_e3_copy/*.pth | head -n 1`
export MKL_SERVICE_FORCE_INTEL=1
export MKL_THREADING_LAYER=GNU
xtuner convert pth_to_hf ./internlm2_chat_1_8b_qlora_alpaca_e3_copy.py ${pth_file} ./hf

 2.7.模型合并

对于 LoRA 或者 QLoRA 微调出来的模型其实并不是一个完整的模型,而是一个额外的层(Adapter),训练完的这个层最终还是要与原模型进行合并才能被正常的使用。

cd /root/InternLM/XTuner
conda activate xtuner0121export MKL_SERVICE_FORCE_INTEL=1
export MKL_THREADING_LAYER=GNU
xtuner convert merge /root/InternLM/XTuner/Shanghai_AI_Laboratory/internlm2-chat-1_8b ./hf ./merged --max-shard-size 2GB

2.8.微调后的模型对话

微调完成后,我们可以再次运行xtuner_streamlit_demo.py脚本来观察微调后的对话效果,不过在运行之前,我们需要将脚本中的模型路径修改为微调后的模型的路径。

3.问题:

本次任务整体来说还是比较顺利的,但也有一些问题,总的来说就是微调后模型的效果不理想。

一开始模型微调后,模型的输出和微调前相比并没有表现出个性化的内容。

主要表现为两者的输出结果相差不大。

后来可能又出现了过拟合的问题。模型可以输出个性化的结果了,但对其他问题的回答不理想。

由于时间关系,没有在此做过多的纠结了。选择了一个差不多的效果,就截图打卡了。

这块如果时间充足的话,是值得好好研究细化的。

4.知识点:

列举一些本次任务的相关知识点和一些小的tricks。

4.1.微调

微调(fine-tuning)是一种基于预训练模型,通过少量的调整(fine-tune)来适应新的任务或数据的方法。

微调的优势包括:1)减少数据需求;2)提高效率;3)更好的性能

在大模型的下游应用中,经常会用到两种微调模式:增量预训练 和 指令跟随 。

4.2.增量预训练

增量预训练是一种在预训练模型已经完成了初始预训练阶段后,利用额外的数据集进行进一步训练的过程。这些额外的数据集通常包含特定领域的知识,或者是为了纠正模型在某些方面的偏差而设计的。

优点:1)灵活性:可以根据需要轻松添加新的数据集来扩展模型的知识;2)高效性:相比于重新开始预训练,增量预训练通常需要较少的计算资源;3)针对性:能够有针对性地提升模型在特定任务或领域内的性能。

挑战:1)过拟合风险;2)数据质量;3)参数调整;4)灾难性遗忘

4.3.指令跟随

指令跟随是指模型能够理解和执行人类语言中的指令,这是实现人机交互和提高智能系统智能化水平的重要方面。指令跟随的核心在于通过构造特定的输入提示(prompt)来指导模型生成期望的输出。

4.4.Lora

LoRA(Low-Rank Adaptation)是一种使用低精度权重对大型预训练语言模型进行微调的技术,它的核心思想是在不改变原有模型权重的情况下,通过添加少量新参数来进行微调。这种方法降低了模型的存储需求,也降低了计算成本,实现了对大模型的快速适应,同时保持了模型性能。

QLoRA(Quantized LoRA)微调技术是对LoRA的一种改进,它通过引入高精度权重和可学习的低秩适配器来提高模型的准确性。并且在LoRA的基础上,引入了量化技术。通过将预训练模型量化为int4格式,可以进一步减少微调过程中的计算量,同时也可以减少模型的存储空间,这对于在资源有限的设备上运行模型非常有用。最终,可以使我们在消费级的显卡上进行模型的微调训练。

4.5.DeepSpeed

DeepSpeed 是一个由微软开发的开源深度学习优化库,它旨在提高大规模深度学习模型训练的效率和可扩展性。DeepSpeed 解决了训练大规模模型时常见的性能瓶颈问题,并且通过一系列创新的技术和工具,使得训练和推理更加高效。

DeepSpeed 的特点:1)高效训练;2)大规模模型支持;3)内存优化;4)并行计算;5)易用性;6)社区支持。

4.6.符号链接

符号链接(Symbolic Link),通常简称为“软链接”,是一种在文件系统中创建指向另一个文件引用的方法。在 Unix 和类 Unix 操作系统(如 Linux 和 macOS)中,符号链接是非常有用的工具,它们允许用户在文件系统中创建指向其他文件或目录的链接,而不必复制实际的数据内容。

符号链接的特点:1)指向文件而非复制;2)跨文件系统;3)节省空间;4)易于管理。

在命令行中,可以使用 ln 命令来创建符号链接。具体来说,使用 -s 选项可以创建符号链接。

本次就写到这里啦,喜欢的小伙伴收藏点赞关注吧。也欢迎评论区留言讨论。

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

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

相关文章

书生.浦江大模型实战训练营——(十一)LMDeploy 量化部署进阶实践

最近在学习书生.浦江大模型实战训练营,所有课程都免费,以关卡的形式学习,也比较有意思,提供免费的算力实战,真的很不错(无广)!欢迎大家一起学习,打开LLM探索大门&#xf…

复杂的编辑表格

需求描述 表格可以整体编辑;也可以单行弹框编辑;且整体编辑的时候,依然可以单行编辑 编辑只能给某一列(这里是参数运行值)修改,且根据数据内容的参数范围来判断展示不同的形式:input/数字输入/单…

计算机网络——TCP协议与UDP协议详解(下)

一、TCP协议 1.1 TCP协议的报文 TCP全称为 "传输控制协议(Transmission Control Protocol")。人如其名,要对数据的传输进行一个详细的控制。我们先看其报文格式,如下图: TCP报文由以下几个字段组成: 源端口号和目标端口…

MySQL索引详解:原理、数据结构与分析和优化

在数据库管理系统中,索引是提高查询性能、优化数据存储结构的重要工具。MySQL作为广泛使用的开源关系型数据库管理系统,其索引机制对于提升数据库操作效率具有至关重要的作用。本文将围绕“MySQL索引详解:原理、数据结构与分析和优化”这一主…

CRUD的最佳实践,联动前后端,包含微信小程序,API,HTML等(二)

CRUD老生常谈,但是我搜索了一圈,发觉几乎是着重在后端,也就是API部分! 无外乎2个思路 1.归总的接口,比如一个接口,实现不同表的CRUD 2.基于各自的表,使用代码生成器实现CRUD 个人来说是推荐2&am…

Harmony鸿蒙应用开发:解决Web组件加载本地资源跨域

鸿蒙开发文档中有一节 加载本地页面 提到了可以通过 $rawfile 方法加载本地 HTML 网页: Index.ets 1Web({ src: $rawfile("local.html"), controller: this.webviewController })但是如果在 local.html 中需要引用一些静态资源,例如图片、JS、…

MMS论文中关于语种识别的内容摘要

MMS论文中关于语种识别的内容摘要 前言语种识别相关内容实验结论 前言 摘要翻译一些内容。 论文地址请看这里 语种识别相关内容 Whisper支持LID,可以区分99种不同的语言;有人使用wav2vec 2.0实现LID,数据集中包含10种亚洲语言;…

JavaScript - Ajax

Asynchronous JavaScript And XML,异步的JavaScript和XML 作用: 数据交换:通过Ajax可以给服务器发送请求,并获取服务器响应的数据。异步交互:可以在不重新加载整个页面的情况下,与服务器交换数据并更新部分网页的技术…

[新手入门]1台电脑+1个电视+2个软件(sunshine+moonlight) 解决黑神话悟空没有hdmi线的痛...

sunshinemoonlight 解决黑神话悟空 本地串流投屏 背景:偶然间在B站发现了sunshinemoonlight方案,替代hdmi线,做本地串流...于是心灵手巧的我开始尝试踩坑之路:1.准备安装包2.开始安装2.1 笔记本windows安装sunshine2.2 遇到了第一个坑.Fatal: ViGEmBus is not installed or run…

无需多部备用机,云手机方便又便宜!

云手机,是云计算技术的又一创新应用,它通过在云服务器上虚拟出带有原生安卓操作系统的手机实例,为用户提供了一种全新的手机使用体验。无需携带多部手机,只需通过云手机,便可轻松实现多账号管理、应用运行及数据存储等…

【物理学】什么是运动学和动力学?

Kinematics 和 Kinetics 是力学中的两个重要分支,它们虽然都涉及物体的运动,但关注的方面不同。 Kinematics(运动学) Kinematics 主要研究物体的运动,而不涉及导致运动的力。它关注的是运动的几何特性,比…

基于SSM的学生管理系统的设计与实现(包含源码、sql脚本、导入视频教程)

👉文末查看项目功能视频演示获取源码sql脚本视频导入教程视频 1 、功能描述 基于SSM的学生管理系统2拥有三种角色 管理员:学生管理、教师管理、课程管理、个人信息管理等教师:添加课程、录入成绩、查看选课名单和结课、个人信息等学生&…

i.MX6裸机开发(11)——DDR测试

本章参考资料:《IMX6ULRM》(参考手册)。 学习本章时,配合《IMX6ULRM》Chapter 33: Multi Mode DDR Controller (MMDC) 一起阅读,效果会更佳,特别是涉及到寄存器说明的部分。 特别说明,本书内容是以i.MX6U系列控制器资…

SSRF漏洞实现

目录 ssrf简介SSRF(Server-Side Request Forgery:服务器端请求伪造) SSRF题1 前期介绍 方法1:ssrfredis写入webshell 扫ip:端口 使用工具写木马 SSRF题2 ssrffastcgi未授权访问写入webshell 环境搭建: 攻击: ssrf简介 SS…

UE5学习笔记18-使用FABRIK确定骨骼的左手位置

一、在武器的骨骼资产中创建一个新的插槽 二、在动画类中添加代码 xxx.h UPROPERTY(BlueprintReadOnly, Category Character, meta (AllowPrivateAccess "true"))/** 蓝图只读 类型是Character 允许私有访问 */ FTransform LeftHandTransform;//拿武器时知道左手…

【数模资料包】最新数模国赛word+latex模版|数模常用的算法python+matlab代码

【2024最全国赛研赛数模资料包】C君珍贵国一数模资料|最新数模国赛wordlatex模版|数模常用的算法pythonmatlab代码 国赛指:高教社杯全国大学生数学建模竞赛,研赛指:华为杯研究生数学建模竞赛。资料内容具体看文末卡片…

Java:BigDecimal 解决小数运算失真问题

文章目录 BigDecimal代码 BigDecimal 解决小数运算失真问题 解决方法:转换为BigDecimal对象 代码 package com.zhang.math;import java.math.BigDecimal;/*** Author: ggdpzhk* CreateTime: 2024-08-25*/ public class BigDecimalTest {public static void main(…

C++初学者指南-5.标准库(第二部分)–特殊容器

C初学者指南-5.标准库(第二部分)–特殊容器 pair<A , B> 包含两个相同或不同类型的值 tuple<A , B> C11 包含许多相同或不同类型的值 optional C17 包含一个类型为 T 的值或没有值 variant<A,B,C,…> C17 包含一个类型为A、B或C的值…… any C17 包含任…

redis--主从复制,哨兵模式,Redis Cluster模式

源码安装 [rootredis-node1 ~]# tar zxf redis-7.4.0.tar.gz [rootredis-node1 ~]# ls redis-7.4.0 redis-7.4.0.tar.gz#安装编译工具 [rootredis-node1 redis-7.4.0]# dnf install make gcc initscripts-10.11.6- 1.el9.x86_64 -y#执行编译命令 [rootredis-node1 redis-7.4.0…

【计算机网络】名词解释--网络专有名词详解

在网络通信中&#xff0c;有许多专业术语和概念&#xff0c;它们共同构成了网络通信的基础。以下是一些常见的网络术语及其定义和相互之间的关系&#xff1a; 一、网络基础 1.1 电路交换&#xff1a;电路交换是一种在数据传输前建立专用通信路径的通信方式。在通信开始前&…