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

2024-08-27 04:12

本文主要是介绍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 选项可以创建符号链接。

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

这篇关于XTuner微调个人小助手认知 #书生浦语大模型实战营#的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1110603

相关文章

从原理到实战深入理解Java 断言assert

《从原理到实战深入理解Java断言assert》本文深入解析Java断言机制,涵盖语法、工作原理、启用方式及与异常的区别,推荐用于开发阶段的条件检查与状态验证,并强调生产环境应使用参数验证工具类替代... 目录深入理解 Java 断言(assert):从原理到实战引言:为什么需要断言?一、断言基础1.1 语

Java MQTT实战应用

《JavaMQTT实战应用》本文详解MQTT协议,涵盖其发布/订阅机制、低功耗高效特性、三种服务质量等级(QoS0/1/2),以及客户端、代理、主题的核心概念,最后提供Linux部署教程、Sprin... 目录一、MQTT协议二、MQTT优点三、三种服务质量等级四、客户端、代理、主题1. 客户端(Clien

在Spring Boot中集成RabbitMQ的实战记录

《在SpringBoot中集成RabbitMQ的实战记录》本文介绍SpringBoot集成RabbitMQ的步骤,涵盖配置连接、消息发送与接收,并对比两种定义Exchange与队列的方式:手动声明(... 目录前言准备工作1. 安装 RabbitMQ2. 消息发送者(Producer)配置1. 创建 Spr

深度解析Spring Boot拦截器Interceptor与过滤器Filter的区别与实战指南

《深度解析SpringBoot拦截器Interceptor与过滤器Filter的区别与实战指南》本文深度解析SpringBoot中拦截器与过滤器的区别,涵盖执行顺序、依赖关系、异常处理等核心差异,并... 目录Spring Boot拦截器(Interceptor)与过滤器(Filter)深度解析:区别、实现

深度解析Spring AOP @Aspect 原理、实战与最佳实践教程

《深度解析SpringAOP@Aspect原理、实战与最佳实践教程》文章系统讲解了SpringAOP核心概念、实现方式及原理,涵盖横切关注点分离、代理机制(JDK/CGLIB)、切入点类型、性能... 目录1. @ASPect 核心概念1.1 AOP 编程范式1.2 @Aspect 关键特性2. 完整代码实

MySQL中的索引结构和分类实战案例详解

《MySQL中的索引结构和分类实战案例详解》本文详解MySQL索引结构与分类,涵盖B树、B+树、哈希及全文索引,分析其原理与优劣势,并结合实战案例探讨创建、管理及优化技巧,助力提升查询性能,感兴趣的朋... 目录一、索引概述1.1 索引的定义与作用1.2 索引的基本原理二、索引结构详解2.1 B树索引2.2

从入门到精通MySQL 数据库索引(实战案例)

《从入门到精通MySQL数据库索引(实战案例)》索引是数据库的目录,提升查询速度,主要类型包括BTree、Hash、全文、空间索引,需根据场景选择,建议用于高频查询、关联字段、排序等,避免重复率高或... 目录一、索引是什么?能干嘛?核心作用:二、索引的 4 种主要类型(附通俗例子)1. BTree 索引(

Java Web实现类似Excel表格锁定功能实战教程

《JavaWeb实现类似Excel表格锁定功能实战教程》本文将详细介绍通过创建特定div元素并利用CSS布局和JavaScript事件监听来实现类似Excel的锁定行和列效果的方法,感兴趣的朋友跟随... 目录1. 模拟Excel表格锁定功能2. 创建3个div元素实现表格锁定2.1 div元素布局设计2.

Redis 配置文件使用建议redis.conf 从入门到实战

《Redis配置文件使用建议redis.conf从入门到实战》Redis配置方式包括配置文件、命令行参数、运行时CONFIG命令,支持动态修改参数及持久化,常用项涉及端口、绑定、内存策略等,版本8... 目录一、Redis.conf 是什么?二、命令行方式传参(适用于测试)三、运行时动态修改配置(不重启服务

Python并行处理实战之如何使用ProcessPoolExecutor加速计算

《Python并行处理实战之如何使用ProcessPoolExecutor加速计算》Python提供了多种并行处理的方式,其中concurrent.futures模块的ProcessPoolExecu... 目录简介完整代码示例代码解释1. 导入必要的模块2. 定义处理函数3. 主函数4. 生成数字列表5.