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/code

cd /root/InternLM/code

git 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/XTuner

cd /root/InternLM/XTuner

mkdir -p Shanghai_AI_Laboratory

ln -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 xtuner0121

xtuner list-cfg -p internlm2

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

cd /root/InternLM/XTuner
conda activate xtuner0121

xtuner 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 xtuner0121

xtuner 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 xtuner0121

export 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 选项可以创建符号链接。

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

  • 23
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值