1. Finetune简介
微调
两种微调模式:增量预训练和指令跟随
增量预训练:目标垂直领域的常识,让基座模型学到新知识,使用文章、书籍、代码等进行训练
指令跟随:根据人类指令进行对话,让模型学会对话模板,使用高质量对话、问答数据进行训练
展示基座模型(预训练模型)和指令微调后的对话模型的区别
关于使用LLM对话
三种角色:System、User、Assistant
将finetune需要使用到的对话数据分发给这样三个角色,即是完成了对话模板的构建
指令跟随finetune需要的即是对话模板数据
对话模板
不同的基座模型有不同的对话模板
示例如下:
指令跟随微调
微调过程与推理过程一致,给对话数据加上模板,在微调过程中会有input和output,对output部分计算Loss修改模型参数
增量预训练微调
数据全为需要llm掌握的陈述句事实,使用的对话模板只有output
和指令微调一样计算损失
LoRA&QLoRA微调
LoRA:Low-Rank Adaptation of Large Language Models
LoRA在预训练模型原本的Linear参数旁,新增一个支路,包含两个连续的小Linear,称为Adapter,Adapter的引入显著降低微调成本
LoRA文件即旁路的Adapter参数
对比全参数微调&LoRA微调&QLoRA微调
QLoRA在加载base模型上使用4-bit量化方式,加载并不是那么精确
优化器状态在CPU和GPU之间切换
2. XTuner简介
打包好的llm finetune工具箱
技术概览:
数据引擎
原始问答对-> 格式化问答对 数据集映射函数
格式化问答对->可训练语料 对话模板映射函数
多数据样本拼接:增加模型微淘的并行性,充分利用GPU资源
XTuner的微调优化技巧
- Flash Attention:并行化计算Attention
- 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
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
微调前的结果:
微调后的结果:
自定义微调
使用Medication QA数据集进行微调
基于 InternLM-chat-7B 模型,用 MedQA 数据集进行微调,将其往医学问答
领域对齐
数据准备
利用gpt生成python脚本代码,将Medication QA原始的.xlsx
格式转换为.jsonl
格式,并划分训练集和验证集
修改配置文件
微调启动
pth模型转hf模型
部署测试
微调前的结果
微调后的结果
使用MS-Agent数据集微调
MS-Agent数据集中包含与插件调用相关的数据,通过在system的prompt中输入有关插件调用的数据,将llm微调为能够调用插件回答用户相关问题的agent
使用对应的配置文件和数据集进行微调
添加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,我不懂!