XTuner 微调 Llama3 图片理解多模态
本次实验基于 Llama3-8B-Instruct 和 XTuner 团队预训练好的 Image Projector 微调自己的多模态图文理解模型 LLaVA。实验平台为InternStudio,实验所用的显存为24G。
环境、模型、数据准备
配置环境
先来配置相关环境。使用如下指令便可以安装好一个 python=3.10 pytorch=2.1.2+cu121 的基础环境了。
conda create -n llama3 python=3.10
conda activate llama3
conda install pytorch==2.1.2 torchvision==0.16.2 torchaudio==2.1.2 pytorch-cuda=12.1 -c pytorch -c nvidia
接下来安装 XTuner。
cd ~
git clone -b v0.1.18 https://github.com/InternLM/XTuner
cd XTuner
pip install -e .[all]
最后 clone 本Llama3-Tutorial仓库。
cd ~
git clone https://github.com/SmartFlowAI/Llama3-Tutorial
模型准备
准备Llama3权重
在微调开始前,首先来准备 Llama3-8B-Instruct 模型权重。在InternStudio内部的share文件夹里边有模型权重。
mkdir -p ~/model
cd ~/model
ln -s /root/share/new_models/meta-llama/Meta-Llama-3-8B-Instruct .
接下来准备 Llava 所需要的 openai/clip-vit-large-patch14-336,权重,即 Visual Encoder 权重。
mkdir -p ~/model
cd ~/model
ln -s /root/share/new_models/openai/clip-vit-large-patch14-336 .
准备 Image Projector 权重。
mkdir -p ~/model
cd ~/model
ln -s /root/share/new_models/xtuner/llama3-llava-iter_2181.pth .
数据准备
使用过拟合的方式快速实现。可以执行以下代码:
cd ~
git clone https://github.com/InternLM/tutorial -b camp2
python ~/tutorial/xtuner/llava/llava_data/repeat.py \
-i ~/tutorial/xtuner/llava/llava_data/unique_data.json \
-o ~/tutorial/xtuner/llava/llava_data/repeated_data.json \
-n 200
如果自己想构建数据集参考此处。
微调过程
使用如下指令以启动训练:
xtuner train /root/Llama3-Tutorial/configs/llama3-llava/llava_llama3_8b_instruct_qlora_clip_vit_large_p14_336_lora_e1_finetune.py --work-dir /root/model/llama3_llava_pth --deepspeed deepspeed_zero2_offload
训练过程所需显存约为14170左右 MiB,训练所需时间为4小时48分钟。
05/09 11:24:43 - mmengine - INFO - Iter(train) [ 10/1200] lr: 5.1430e-05 eta: 4:48:31 time: 14.5475 data_time: 0.0383 memory: 14172 loss: 1.4195
05/09 11:26:59 - mmengine - INFO - Iter(train) [ 20/1200] lr: 1.0857e-04 eta: 4:36:40 time: 13.5897 data_time: 0.0298 memory: 14170 loss: 0.5519
05/09 11:29:13 - mmengine - INFO - Iter(train) [ 30/1200] lr: 1.6571e-04 eta: 4:30:23 time: 13.4613 data_time: 0.0273 memory: 14170 loss: 0.5242
05/09 11:31:29 - mmengine - INFO - Iter(train) [ 40/1200] lr: 2.0000e-04 eta: 4:26:41 time: 13.5791 data_time: 0.0361 memory: 14170 loss: 0.4559
05/09 11:33:52 - mmengine - INFO - Iter(