【书生·浦语大模型实战营】学习笔记4

1. Finetune简介

微调
两种微调模式:增量预训练和指令跟随
增量预训练:目标垂直领域的常识,让基座模型学到新知识,使用文章、书籍、代码等进行训练
指令跟随:根据人类指令进行对话,让模型学会对话模板,使用高质量对话、问答数据进行训练
image.png

展示基座模型(预训练模型)和指令微调后的对话模型的区别
image.png
关于使用LLM对话
三种角色:System、User、Assistant
将finetune需要使用到的对话数据分发给这样三个角色,即是完成了对话模板的构建
指令跟随finetune需要的即是对话模板数据

对话模板
不同的基座模型有不同的对话模板
示例如下:
image.png
image.png

指令跟随微调
微调过程与推理过程一致,给对话数据加上模板,在微调过程中会有input和output,对output部分计算Loss修改模型参数
image.png

增量预训练微调
数据全为需要llm掌握的陈述句事实,使用的对话模板只有output
image.png
和指令微调一样计算损失

LoRA&QLoRA微调
LoRA:Low-Rank Adaptation of Large Language Models
image.png
LoRA在预训练模型原本的Linear参数旁,新增一个支路,包含两个连续的小Linear,称为Adapter,Adapter的引入显著降低微调成本
LoRA文件即旁路的Adapter参数

对比全参数微调&LoRA微调&QLoRA微调
QLoRA在加载base模型上使用4-bit量化方式,加载并不是那么精确
优化器状态在CPU和GPU之间切换
image.png

2. XTuner简介

打包好的llm finetune工具箱
image.png
技术概览:
image.png

数据引擎
原始问答对-> 格式化问答对 数据集映射函数
格式化问答对->可训练语料 对话模板映射函数
多数据样本拼接:增加模型微淘的并行性,充分利用GPU资源

XTuner的微调优化技巧

  1. Flash Attention:并行化计算Attention
  2. DeepSpeed ZeRO:切片保存训练参数、梯度和优化器状态,使用FP16权重

3. 动手实战

安装XTuner

# 创建版本文件夹并进入
mkdir xtuner019 && cd xtuner019
# 拉取 0.1.9 的版本源码
git clone -b v0.1.9  https://github.com/InternLM/xtuner
# 进入源码目录
cd xtuner
# 从源码安装 XTuner
pip install -e '.[all]'

微调

配置文件
查看XTuner提供的配置文件

xtuner list-cfg

image.png
XTuner中配置文件示例如上图
配置文件名解释:
baichuan2_13b_base_qlora_oasst1_e3:baichuan2_13b_base即模型类型为baichuan13b基座模型,进行的是qlora微调,在oasst1数据集上进行微调,e3指微调进行3个epoch
拷贝配置文件供微调使用

cd ~/ft-oasst1
xtuner copy-cfg internlm_chat_7b_qlora_oasst1_e3 .

数据集准备
使用openassistant-guanaco数据集

配置文件修改
修改其中的模型路径和数据集路径

开始微调

# 开启deepspeed加速训练
# 单卡
xtuner train ./internlm_chat_7b_qlora_oasst1_e3_copy.py --deepspeed deepspeed_zero2
# 多卡
NPROC_PER_NODE=${GPU_NUM} xtuner train ./internlm_chat_7b_qlora_oasst1_e3_copy.py --deepspeed deepspeed_zero2

将微调得到的.pth模型转换为HuggingFace模型

mkdir hf
export MKL_SERVICE_FORCE_INTEL=1
export MKL_THREADING_LAYER=GNU
xtuner convert pth_to_hf ./internlm_chat_7b_qlora_oasst1_e3_copy.py ./work_dirs/internlm_chat_7b_qlora_oasst1_e3_copy/epoch_1.pth ./hf

得到的hf文件夹即LoRA模型文件

部署与测试

将HuggingFace adapter合并到llm上

xtuner convert merge ./internlm-chat-7b ./hf ./merged --max-shard-size 2GB

得到一个合并后的模型,即Qlora微调结果
使用合并后的模型

# 加载 Adapter 模型对话(Float 16)
xtuner chat ./merged --prompt-template internlm_chat

# 4 bit 量化加载
# xtuner chat ./merged --bits 4 --prompt-template internlm_chat

# 加载未微调的llm进行对话
xtuner chat ./internlm-chat-7b --bits 4 --prompt-template internlm_chat

微调前后效果对比
两个文件夹来启动不同的模型,merged为微调后llm,inernlm-chat-7b为原生llm
xtuner chat参数说明
--no-streamer:是否启动流式传输,来确定chat_llm的回答是否是一个词一个词蹦出来的
--temperature:温度值(0~1),如果temperature高,则模型偏好生成更有创造力的答案
--bits:LLM位数
--prompt-template:对话模板指定
--lagent:是否使用lagent
微调前的结果:
image.png

微调后的结果:
image.png

自定义微调

使用Medication QA数据集进行微调
基于 InternLM-chat-7B 模型,用 MedQA 数据集进行微调,将其往医学问答领域对齐

数据准备
利用gpt生成python脚本代码,将Medication QA原始的.xlsx格式转换为.jsonl格式,并划分训练集和验证集
修改配置文件
微调启动
pth模型转hf模型
image.png
部署测试

微调前的结果
image.png

微调后的结果
image.png

使用MS-Agent数据集微调

MS-Agent数据集中包含与插件调用相关的数据,通过在system的prompt中输入有关插件调用的数据,将llm微调为能够调用插件回答用户相关问题的agent
image.png

使用对应的配置文件和数据集进行微调
image.png

添加serper环境变量

export SERPER_API_KEY=abcdefg
5eba38c689dbec0f3dc96a20cff694746fdca1a0

启动有agent能力的llm
--lagent参数即是使得llm能够调用lagent的代理功能

xtuner chat ./internlm-chat-7b --adapter internlm-7b-qlora-msagent-react --lagent

something gets wrong
我的163邮箱迟迟收不到serper.dev的验证邮件
换了gmail邮箱,秒收到!

按照教程注释掉了'trust_remote_code=True'得到这么个啥也不知道的llm,我不懂!
image.png

参考资料

  1. 书生·浦语大模型全链路开源体系教程xtuner部分
  • 23
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值