参考链接:
以下教程在InternStudio平台完成
Part1:使用XTuner微调个人小助手
ps:因数据集太少,微调后会过拟合,只会回答一个问题,仅供学习使用。
环境准备
最低可以使用10%A100的开发机,我用的是30%;
安装python环境
直接复制现有的环境,比较慢,耐心等待
studio-conda xtuner0.1.17
# 激活环境
conda activate xtuner0.1.17
下载并安装XTuner
# 创建版本文件夹并进入,以跟随本教程
mkdir -p /root/xtuner0117 && cd /root/xtuner0117
# 拉取 0.1.17 的版本源码
git clone -b v0.1.17 https://github.com/InternLM/xtuner
# 无法访问github的用户请从 gitee 拉取:
# git clone -b v0.1.15 https://gitee.com/Internlm/xtuner
# 进入源码目录
cd /root/xtuner0117/xtuner
# 从源码安装 XTuner
pip install -e '.[all]'
准备数据集
首先创建一个学习目录
# 前半部分是创建一个文件夹,后半部分是进入该文件夹。
mkdir -p /root/ft && cd /root/ft
# 在ft这个文件夹里再创建一个存放数据的data文件夹
mkdir -p /root/ft/data && cd /root/ft/data
使用教程中代码,直接生成一个简单的数据集,如图
准备模型
使用软连接,简单方便
ln -s /root/share/new_models/Shanghai_AI_Laboratory/internlm2-chat-1_8b /root/ft/model
修改配置文件
要修改的项比较多,按照教程一点点改就行了
开始训练
ps:如果使用deepspeed_zero2加速,生成的文件转换的时候报错了,还没解决,所以这里使用常规训练
# 指定保存路径
xtuner train /root/ft/config/internlm2_1_8b_qlora_alpaca_e3_copy.py --work-dir /root/ft/train
可以看到已经开始加载数据了
如果你执行完命令后卡主了,说明配置文件出了问题,按照文档排查一遍,再试试。如果删除不掉临时文件,可以把开发机先停止,重启再试。
模型转换
训练完后的模型不能直接使用,需要转换成HF格式
# 创建一个保存转换后 Huggingface 格式的文件夹
mkdir -p /root/ft/huggingface
# 模型转换
# xtuner convert pth_to_hf ${配置文件地址} ${权重文件地址} ${转换后模型保存地址}
xtuner convert pth_to_hf /root/ft/train/internlm2_1_8b_qlora_alpaca_e3_copy.py /root/ft/train/iter_500.pth /root/ft/huggingface
模型整合
# 创建一个名为 final_model 的文件夹存储整合后的模型文件
mkdir -p /root/ft/final_model
# 解决一下线程冲突的 Bug
export MKL_SERVICE_FORCE_INTEL=1
# 进行模型整合
# xtuner convert merge ${NAME_OR_PATH_TO_LLM} ${NAME_OR_PATH_TO_ADAPTER} ${SAVE_PATH}
xtuner convert merge /root/ft/model /root/ft/huggingface /root/ft/final_model
对话测试
# 与模型进行对话
xtuner chat /root/ft/final_model --prompt-template internlm2_chat
虽然可以正常回答我们预设的问题,但是出现了过拟合现象!
Part2:多模态微调
PS:多模态需要最低30% A100,按教程操作也会出现过拟合,仅供学习!
Haotian Liu等使用GPT-4V对图像数据生成描述,以此构建出大量
<question text><image> -- <answer text>
的数据对。利用这些数据对,配合文本单模态LLM,训练出一个Image Projector。所使用的
文本单模型LLM
和训练出来的Image Projector
,统称为LLaVA模型
。
概述
在本节中,我们将 自己构造
<question text><image>--<answer text>
数据对,基于InternLM2_Chat_1.8B这个文本单模态模型,使用LLaVA方案,训练一个给InternLM2_Chat_1.8B使用的Image Projector文件。
LLaVA方案中,给LLM增加视觉能力的过程,既是训练ImageProjector文件的过程。分为Pretrain和Finetune两个阶段
环境准备
与Part1相同,不再赘述
Pretrain阶段
在Pretrain阶段,我们会使用大量的
图片+简单文本(caption, 即图片标题)
数据对,使LLM理解图像中的普遍特征。即,对大量的图片进行粗看。Pretrain阶段训练完成后,此时的模型已经有视觉能力了!但是由于训练数据中都是图片+图片标题,所以此时的模型虽然有视觉能力,但无论用户问它什么,它都只会回答输入图片的标题。即,此时的模型只会给输入图像“写标题”。
ps:条件所限,只能使用现成的了。
Finetune阶段
在Finetune阶段,我们会使用图片+复杂文本
数据对,来对Pretrain得到的Image Projector即iter_2181.pth进行进一步的训练。
训练数据
格式
[
{
"id": "随便什么字符串",
"image": "图片文件的相对位置。相对谁?相对你后面config文件里指定的image_folder参数的路径。",
"conversation": [
{
"from": "human",
"value": "<image>\n第1个问题。"
},
{
"from": "gpt",
"value": "第1个回答"
},
{
"from": "human",
"value": "第2个问题。"
},
{
"from": "gpt",
"value": "第2个回答"
},
# ......
{
"from": "human",
"value": "第n个问题。"
},
{
"from": "gpt",
"value": "第n个回答"
},
]
},
# 下面是第2组训练数据了。
{
"id": "随便什么字符串",
"image": "图片文件的相对位置。相对谁?相对你后面config文件里指定的image_folder参数的路径。",
"conversation": [
{
"from": "human",
"value": "<image>\n第1个问题。"
},
# ......
{
"from": "gpt",
"value": "第n个回答"
}
]
}
]
制作
使用最懒的办法吧!
cd ~ && git clone https://github.com/InternLM/tutorial -b camp2 && conda activate xtuner0.1.17 && cd tutorial
python /root/tutorial/xtuner/llava/llava_data/repeat.py \
-i /root/tutorial/xtuner/llava/llava_data/unique_data.json \
-o /root/tutorial/xtuner/llava/llava_data/repeated_data.json \
-n 200
使用最懒的办法,准备配置文件
cp /root/tutorial/xtuner/llava/llava_data/internlm2_chat_1_8b_llava_tutorial_fool_config.py /root/tutorial/xtuner/llava/llava_internlm2_chat_1_8b_qlora_clip_vit_large_p14_336_lora_e1_gpu8_finetune_copy.py
# 查询xtuner内置配置文件
xtuner list-cfg -p llava_internlm2_chat_1_8b
# 拷贝配置文件到当前目录
xtuner copy-cfg \
llava_internlm2_chat_1_8b_qlora_clip_vit_large_p14_336_lora_e1_gpu8_finetune \
/root/tutorial/xtuner/llava
修改llava_internlm2_chat_1_8b_qlora_clip_vit_large_p14_336_lora_e1_gpu8_finetune_copy.py
文件中的:
# Model
- llm_name_or_path = 'internlm/internlm2-chat-1_8b'
+ llm_name_or_path = '/root/share/new_models/Shanghai_AI_Laboratory/internlm2-chat-1_8b'
- visual_encoder_name_or_path = 'openai/clip-vit-large-patch14-336'
+ visual_encoder_name_or_path = '/root/share/new_models/openai/clip-vit-large-patch14-336'
# Specify the pretrained pth
- pretrained_pth = './work_dirs/llava_internlm2_chat_1_8b_clip_vit_large_p14_336_e1_gpu8_pretrain/iter_2181.pth' # noqa: E501
+ pretrained_pth = '/root/share/new_models/xtuner/iter_2181.pth'
# Data
- data_root = './data/llava_data/'
+ data_root = '/root/tutorial/xtuner/llava/llava_data/'
- data_path = data_root + 'LLaVA-Instruct-150K/llava_v1_5_mix665k.json'
+ data_path = data_root + 'repeated_data.json'
- image_folder = data_root + 'llava_images'
+ image_folder = data_root
# Scheduler & Optimizer
- batch_size = 16 # per_device
+ batch_size = 1 # per_device
# evaluation_inputs
- evaluation_inputs = ['请描述一下这张图片','Please describe this picture']
+ evaluation_inputs = ['Please describe this picture','What is the equipment in the image?']
开始Finetune
cd /root/tutorial/xtuner/llava/
xtuner train /root/tutorial/xtuner/llava/llava_internlm2_chat_1_8b_qlora_clip_vit_large_p14_336_lora_e1_gpu8_finetune_copy.py --deepspeed deepspeed_zero2
报错了,先继续吧!
Part3: 将微调后的模型上传到OpenXLab
上传
其实就是一个git上传!因为文件比较大需要安装 git-lfs
apt-get install git-lfs
首先登陆到OpenXLab,创建一个仓库地址和一个token,参考OpenXLab,因为git的需要必选填写用户名。
创建完成后clone到本地,注意如果选择的是私库,则需要带上token
之后把训练好的模型文件复制到这个目录下,然后就可以上传了
git lfs track "*.bin"
git lfs track "*.model"
git add -A
# 提交
git commit -m '初始化'
# 推送到远程
git push
部署
参考教程,开发一个Gradio应用,上传到github。主要修改git的路径
在OpenXLab中创建一个应用,填写git地址并授权。注意选择python=3.9的版本,3.10有冲突