书生大模型实训营第4期进阶岛第四关:InternVL 部署微调实践
- 1. 开发机创建与环境部署
- 1.1 训练环境配置
- 1.2 推理环境配置
- 2. LMDeploy 部署
- 2.1 网页应用部署体验
- 2.2 可能遇到的 Bug
- 3. XTuner 微调实践
- 3.1 配置文件准备
- 3.2 配置文件参数解读
- 3.3 开始微调
- 4. 测试微调后的模型
1. 开发机创建与环境部署
创建一个 50%A100 的开发机,镜像选 Cuda12.2-conda,其余默认。
1.1 训练环境配置
随便给自己的虚拟环境取个名字(这里我的是 Xtuner_InternVL),运行下面的命令创建我们的模型训练环境。
conda create --name Xtuner_InternVL python=3.10 -y
conda activate Xtuner_InternVL
然后安装与 deepspeed 集成的 xtuner 和相关包:
pip install -U 'xtuner[deepspeed]' timm==1.0.9
pip install torch==2.4.1 torchvision==0.19.1 torchaudio==2.4.1 --index-url https://download.pytorch.org/whl/cu121
pip install transformers==4.39.0
1.2 推理环境配置
这里我的推理环境命名为 lmdeploy:
conda create -n lmdeploy python=3.10 -y
conda activate lmdeploy
pip install lmdeploy gradio==4.44.1 timm==1.0.9
2. LMDeploy 部署
2.1 网页应用部署体验
先拉取本教程的 github 仓库:
git clone https://github.com/Control-derek/InternVL2-Tutorial.git
cd InternVL2-Tutorial
在 InternVL2-Tutorial 文件夹下的 demo.py 文件中,MODEL_PATH 表示传入的模型路径,这里默认为 InternVL2-2B,如果你使用的是 InternStudio 开发机进行实验则该路径无需修改,但如果你使用的是 VSCode 远程连接开发机则需要把这个路径修改成自己的本地路径。
然后我们运行这个 demo.py 文件:
conda activate lmdeploy
python demo.py
看到如下界面说明我们的 Web demo 在开发机上运行起来了:
接下来,如果你是在 VSCode 下运行的命令则不需要做额外的操作,因为 VSCode 自带端口转发,可以把部署在服务器上的网页服务转发到本地。但是如果你是在 Internstudio 上运行的话则需要手动在本地做一下端口转发。打开本地的 cmd 或者 powershell 终端,运行下面命令:
ssh -CNg -L 1096:127.0.0.1:1096 root@ssh.intern-ai.org.cn -p 你的ssh端口号
ssh 端口号在开发机连接服务的
ssh 连接
选项中可以找到。如果你不是第一次做端口映射,这条命令不会输出任何东西,不要以为卡住了。
正确做完映射后在本地浏览器访问 127.0.0.1:1096
,即可看到 Web 部署页面:
点击 Start Chat,等模型准备好后即可开始聊天,下方食物快捷栏可以快速输入图片,点击输入示例可以快速输入文字。输入完毕后,按 enter 键即可发送,下面是我跟模型聊天的一个示例:
2.2 可能遇到的 Bug
在开展多轮对话时可能会碰到模型无法回复或者回复为空的情况,这时查看终端会发现这样的输出:
解决方法:
找到 /root/.conda/envs/lmdeploy/lib/python3.10/site-packages/lmdeploy/vl/
文件夹下的 engine.py
文件,修改下图中的这部分代码即可解决上面的报错:
3. XTuner 微调实践
3.1 配置文件准备
先进入工作目录并激活训练环境:
cd root/xtuner
conda activate Xtuner_InternVL # 或者是你自命名的训练环境
如果你的开发机的 root 目录下没有 xtuner 文件夹,在 root 目录下自己拉一下远程仓库就行:
git clone https://github.com/InternLM/xtuner.git
原始 internvl 的微调配置文件在路径 /root/xtuner/xtuner/configs/internvl/v2/internvl_v2_internlm2_2b_lora_finetune_food.py
下,我们复制该配置文件到我们的项目目录 InternVL2-Tutorial
下:
cp /root/InternVL2-Tutorial/xtuner_config/internvl_v2_internlm2_2b_lora_finetune_food.py /root/xtuner/xtuner/configs/internvl/v2/internvl_v2_internlm2_2b_lora_finetune_food.py
3.2 配置文件参数解读
在第一部分的设置中,有如下参数:
- path:需要微调的模型路径,在 InternStudio 环境下无需修改
- data_root:数据集所在路径
- data_path:训练数据文件路径
- image_folder:训练图像根路径
- prompt_temple:配置模型训练时使用的聊天模板、系统提示等。使用默认配置即可
- max_length:每一条训练数据的最大 token 数
- batch_size:训练批次大小,可以根据显存大小调整
- accumulative_counts:梯度累积的步数,用于模拟较大的 batch_size,在显存有限的情况下,提高训练稳定性
- dataloader_num_workers:指定数据集加载时子进程的个数
- max_epochs:训练轮次
- optim_type:优化器类型
- lr:学习率
- betas:Adam 优化器的 beta1,beta2 参数
- weight_decay:权重衰减,起防止训练过拟合的作用
- max_norm:梯度裁剪时的梯度最大值
- warmup_ratio:预热比例,前多少的数据训练时,学习率将会逐步增加
- save_steps:多少步存一次 checkpoint
- save_total_limit:最多保存几个 checkpoint,设为 -1 即无限制
第二部分则是 LoRA 相关参数:
- r:低秩矩阵的秩,决定了低秩矩阵的维度
- lora_alpha:缩放因子,用于调整低秩矩阵的权重
- lora_dropout:dropout概率,用于防止过拟合
如果想设置模型断点重训,可以修改红框中的这些参数:
把这里的 load_from 设置为你想要载入的 checkpoint,并设置 resume=True 即可开启断点重训。
3.3 开始微调
这里我们直接使用处理好的数据集(这样就不需要修改配置文件了),运行下面命令即可开始微调:
xtuner train /root/InternVL2-Tutorial/xtuner_config/internvl_v2_internlm2_2b_lora_finetune_food.py --deepspeed deepspeed_zero2
微调大概会花一个半小时的样子,微调完成后,运行下面命令把模型 checkpoint 的格式转化为便于测试的格式(这里我是在 root 目录下执行的,如果你不想在 root 目录下执行,请修改下面命令中的第一条路径):
python xtuner/xtuner/configs/internvl/v1_5/convert_to_official.py /root/InternVL2-Tutorial/xtuner_config/internvl_v2_internlm2_2b_lora_finetune_food.py ./work_dirs/internvl_v2_internlm2_2b_lora_finetune_food/iter_640.pth ./work_dirs/internvl_v2_internlm2_2b_lora_finetune_food/lr35_ep10/
如果你上面的实现跟我不完全一致,请注意对比命令中涉及的四个路径并将其改成符合你项目结构的形式。
4. 测试微调后的模型
在微调完成后,找到 InternVL2-Tutorial 文件夹下的 demo.py 文件,修改文件中的模型路径为刚刚转换后保存的模型路径(也就是转换格式命令中的第四个路径):
保存修改后,运行下面命令启动网页应用:
cd /root/InternVL2-Tutorial
conda activate lmdeploy
python demo.py
这里举两个例子说明一下微调前后模型表现的区别:
(1)微调前,模型把贵州的豆腐圆子错认成了炸丸子:
(2) 微调前模型不认识锅包肉,将其错认成炸猪排:
微调后,模型成功识别这两类食物:
至此,书生大模型实训营第4期进阶岛第四关任务完成~