【书生·浦语大模型实战营】学习笔记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部分

相关推荐

  1. 书生·模型实战学习笔记目录

    2024-03-19 23:14:04       32 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-03-19 23:14:04       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-03-19 23:14:04       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-03-19 23:14:04       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-03-19 23:14:04       20 阅读

热门阅读

  1. android 网络检测简单方法

    2024-03-19 23:14:04       21 阅读
  2. 【C语言】数组基础

    2024-03-19 23:14:04       21 阅读
  3. Linux作业

    2024-03-19 23:14:04       20 阅读
  4. 网页的制作

    2024-03-19 23:14:04       20 阅读
  5. 关于我的经历

    2024-03-19 23:14:04       22 阅读
  6. 【笔记】Linux常用命令

    2024-03-19 23:14:04       18 阅读
  7. PHP使用AES进行加解密

    2024-03-19 23:14:04       20 阅读
  8. 面试宝典:MySQL 索引优化

    2024-03-19 23:14:04       22 阅读
  9. 杂题——1187: 假币问题

    2024-03-19 23:14:04       23 阅读
  10. js iframe获取documen中的对象为空问题

    2024-03-19 23:14:04       18 阅读
  11. 计算机网络技术基础知识

    2024-03-19 23:14:04       20 阅读