书生浦语大模型单卡低成本微调XTuner(四)

luminescenytx 2024-01-13 15:29:04

XTuner 大模型单卡低成本微调实战

Finetune简介

  • 增量预训练微调
  • 指令跟随微调

img

指令跟随微调

一问一答的对话训练

img

角色指定

img

对话模板(仅在微调阶段):
为了能让LLM区分出, system, User和Assistant 不同的模型会有不同的模板

对话模板构建

img

img

微调时只对答案部分计算损失

img

增量预训练微调

不需要问答 陈述式

角色 system input 留空,仍然计算assistant部分的损失

img

LoRA & QLoRA

LoRA: low-rank adaptation of large language models

在stable diffusion中为了画出心仪的风格/角色, 往往会在一个公开的底模上, 再套一个LoRA模型, 换一个LoRA, 就相当于换一个初始的风格或者初始的人物, 底座模型不用换

LLM的参数量主要集中在模型中的Linear, 训练这些参数需要很大的显存, LoRA模型就不用那么大的显存开销了

LoRA 通过在原本的 Linear 旁, 新增一个支路, 包含两个连续的小 Linear, 新增的这个支路通常叫做 Adapter(Adapter文件就是常说的LoRA模型文件)

Adapter 参数量远小于原本的 Linear, 能大幅降低训练的显存消耗

img

XTuner

介绍

一个大语言模型微调工具箱。由 MMRazor 和 MMDeploy 联合开发

傻瓜化: 以配置文件的形式封装了大部分微调场景
轻量级: 对于 7B 参数量的LLM, 微调所需的最小显存仅为 8GB

支持的开源LLM

  • InternLM ✅
  • Llama,Llama2
  • ChatGLM2,ChatGLM3
  • Qwen
  • Baichuan,Baichuan2
  • ChatGLM
  • Zephyr
  • ......

img

还支持工具类模型的对话

强大的数据处理引擎, 很方便的在更多开源的流行数据集上进行一键启动, 使开发者专注于数据内容
数据集映射函数
对话模板映射函数

多数据样本拼接, 充分利用gpu资源
自定义数据集 建议使用json格式

8GB 显存玩转 LLM

Flash Attention 和 DeepSpeed ZeRO 是 XTuner 最重要的两个优化技巧

  • Flash Attention: 将Attention计算并行化, 避免了计算过程中 Attention Score NxN 的显存占用(训练过程N都比较大)
  • DeepSpeed ZeRO: ZeRO 优化, 通过将训练过程中的参数, 梯度和优化器状态切片保存, 能够在多 GPU 训练时显著节省显存; 除了将训练中间状态切片外, DeepSpeed 训练时使用 FP16 的权重, 相较于 Pytorch 的 AMP 训练, 在单 GPU上也能大幅节省显存(并非默认启动, 需增加参数 QLoRA算法后面跟 deepspeed_zero2)

img

优化前后, 不同的计算卡上的一个显存占用情况

img

动手实战

Ubuntu + Anaconda + CUDA/CUDNN + 8GB nvidia显卡

环境配置

git clone -b v0.1.9 https://github.com/InternLM/xtuner
从源码安装 XTuner
pip install -e '.[all]'

微调

XTuner 提供多个开箱即用的配置文件 xtuner list-cfg

拷贝一个配置文件到当前目录: xtuner copy-cfg ${CONFIG_NAME} ${SAVE_PATH}

img

*无 chat比如 internlm-7b 代表是基座(base)模型

model文件夹
数据文件夹
修改配置文件'

开始微调

训练:xtuner train ${CONFIG_NAME_OR_PATH}
也可以增加 deepspeed 进行训练加速:

# 单卡
## 用刚才改好的config文件训练
xtuner train ./internlm_chat_7b_qlora_oasst1_e3_copy.py

# 多卡
NPROC_PER_NODE=${GPU_NUM} xtuner train ./internlm_chat_7b_qlora_oasst1_e3_copy.py

# 若要开启 deepspeed 加速,增加 --deepspeed deepspeed_zero2 即可

将得到的 PTH 模型转换为 HuggingFace 模型,即:生成 Adapter 文件夹, hf 文件夹即为我们平时所理解的所谓 “LoRA 模型文件”

export MKL_SERVICE_FORCE_INTEL=1

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 ${SAVE_PATH}

流程准备

  • 训练数据
  • 模型文件
  • 配置文件 下载 xtuner copy-cfg
  • 修改配置文件
  • 微调
    xtuner train internlm_chat_7b_qlora_medqa2019_e3.py --deepspeed deepspeed_zero2

部署与测试

将 HuggingFace adapter 合并到大语言模型:
xtuner convert merge ./internlm-chat-7b ./hf ./merged --max-shard-size 2GB

与合并后的模型对话:

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

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

--prompt-template default,zephyr,internlm_chat,moss_s
ft,llama2_chat,code_llama_chat,chatglm2,chatglm3,qwen_ch
at,baichuan_chat,baichuan2_chat,wizardlm

自定义微调

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

数据准备, 将数据转为 XTuner 的数据格式
目标格式:(.jsonL)

[{
    "conversation":[
        {
            "system": "xxx",
            "input": "xxx",
            "output": "xxx"
        }
    ]
},
{
    "conversation":[
        {
            "system": "xxx",
            "input": "xxx",
            "output": "xxx"
        }
    ]
}]

开始自定义微调
xtuner train internlm_chat_7b_qlora_medqa2019_e3.py --deepspeed deepspeed_zero2

用 MS-Agent 数据集赋予 LLM 以 Agent 能力

MS-Agent

教会LLM模型调用 API接口以获取实时信息

MSAgent 数据集每条样本包含一个对话列表(conversations),其里面包含了 system、user、assistant 三种字段。其中:

  • system: 表示给模型前置的人设输入,其中有告诉模型如何调用插件以及生成请求
  • user: 表示用户的输入 prompt,分为两种,通用生成的prompt和调用插件需求的 prompt
  • assistant: 为模型的回复。其中会包括插件调用代码和执行代码,调用代码是要 LLM 生成的,而执行代码是调用服务来生成结果的

插件本质就是python脚本, 调用 API 接口

xtuner 是从国内的 ModelScope 平台下载 MS-Agent 数据集,因此不用提前手动下载数据集文件。

xtuner list-cfg | grep msagent
xtuner copy-cfg internlm_7b_qlora_msagent_react_e3_gpu8 .

xtuner train ./internlm_7b_qlora_msagent_react_e3_gpu8_copy.py --deepspeed deepspeed_zero2

添加 serper 环境变量

serper给LLM提供请求服务, LLM调用 serper提供的API接口以获取搜索得到的结果

去 serper.dev 免费注册一个账号,生成自己的 api key。这个东西是用来给 lagent 去获取 google 搜索的结果的。等于是 serper.dev 帮你去访问 google,而不是从你自己本地去访问 google 了。
export SERPER_API_KEY=abcdefg

xtuner + agent,启动!

未 merge 情况(添加adapter, adapter后面跟上LoRA文件路径)
xtuner chat ./internlm-chat-7b --adapter internlm-7b-qlora-msagent-react --lagent --prompt-template internlm_chat
也可merge模型
--lagent 增加web api启动参数

...全文
163 回复 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

534

社区成员

发帖
与我相关
我的任务
社区描述
构建国际领先的计算机视觉开源算法平台
社区管理员
  • OpenMMLab
  • jason_0615
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧