Qwen2-VL多模态大模型微调实战教程

Qwen2-VL多模态大模型微调实战教程

Qwen2-VL是通义千问团队最近开源的大语言模型,由阿里云通义实验室研发。

以Qwen2-VL作为基座多模态大模型,通过指令微调的方式实现特定场景下的OCR,是学习多模态LLM微调的入门任务。

在这里插入图片描述

本文我们将简要介绍基于 transformers、peft 等框架,使用 Qwen2-VL-2B-Instruct 模型在LaTeX_OCR 上进行Lora微调训练,同时使用 SwanLab 监控训练过程与评估模型效果。

  • 训练过程:ZeyiLin/Qwen2-VL-ft-latexocr
  • 代码:Zeyi-Lin/Qwen2-VL-finetune-LatexOCR
  • 数据集:LaTeX_OCR
  • 模型:Qwen2-VL-2B-Instruct
  • 在线LaTex公式预览网站:latexlive
  • 显存占用:约20GB,如显存不足,请调低per_device_train_batch_size

视觉大模型是指能够支持图片/视频输入的大语言模型,能够极大丰富与LLM的交互方式。

对视觉大模型做微调的一个典型场景,是让它特化成一个更强大、更智能的计算机视觉模型,执行图像分类、目标检测、语义分割、OCR、图像描述任务等等。

并且由于视觉大模型强大的基础能力,所以训练流程变得非常统一——无论是分类、检测还是分割,只需要构建好数据对(图像 -> 文本),都可以用同一套代码完成,相比以往针对不同任务就要构建迥异的训练代码而言,视觉大模型微调要简单粗暴得多,而且效果还更好。

当然,硬币的另一面是要承担更高的计算开销,但在大模型逐渐轻量化的趋势下,可以预想这种训练范式将逐渐成为主流。

在这里插入图片描述

SwanLab 是一个开源的模型训练记录工具,常被称为”中国版 Weights&Biases + Tensorboard”。SwanLab面向AI研究者,提供了训练可视化、自动日志记录、超参数记录、实验对比、多人协同等功能。在SwanLab上,研究者能基于直观的可视化图表发现训练问题,对比多个实验找到研究灵感,并通过在线链接的分享与基于组织的多人协同训练,打破团队沟通的壁垒。

千问 Qwen 教程

为什么要记录训练?
相较于软件开发,模型训练更像一个实验科学。一个品质优秀的模型背后,往往是成千上万次实验。研究者需要不断尝试、记录、对比,积累经验,才能找到最佳的模型结构、超参数与数据配比。在这之中,如何高效进行记录与对比,对于研究效率的提升至关重要。

可视化的价值在哪里?

机器学习模型训练往往伴随着大量的超参数、指标、日志等数据,很多关键信息往往存在于实验的中间而非结尾,如果不对连续的指标通过图表进行可视化,往往会错失发现问题的最佳时机,甚至错过关键信息。同时不进行可视化,也难以对比多个实验之间的差异。 可视化也为AI研究者提供了良好的交流基础,研究者们可以基于图表进行沟通、分析与优化,而非以往看着枯燥的终端打印。这打破了团队沟通的壁垒,提高了整体的研发效率。

环境配置分为三步:

  1. 确保你的电脑上至少有一张英伟达显卡,并已安装好了CUDA环境。
  2. 安装Python(版本>=3.8)以及能够调用CUDA加速的PyTorch
  3. 安装与Qwen2-VL微调相关的第三方库,可以使用以下命令:

本节使用的是 LaTex_OCR 数据集,这个数据集包含了大量的数学公式图片,以及对应的LaTex语法字符串。可以看到,下图中的image就是学术公式图,text就是对应的LaTex语法字符串:

在这里插入图片描述

将这些LaTex语法字符串粘贴到latexlive中,可以预览对应的数学公式:

在这里插入图片描述

了解了数据集结构之后,我们需要做的是将这些数据整理成Qwen2-VL需要的json格式,下面是目标的格式:


我们来解读一下这个json:

  • id:数据对的编号
  • conversations:人类与LLM的对话,类型是列表
  • role:角色,user代表人类,assistant代表模型
  • content:聊天发送的内容,其中user的value是图片路径,assistant的回复是LaTex公式

接下来让我们下载数据集并进行处理:

  1. 我们需要做四件事情:
    • 通过Modelscope下载LaTex_OCR数据集
    • 加载数据集,将图像保存到本地
    • 将图像路径和描述文本转换为一个csv文件
    • 将csv文件转换为json文件,包含1个训练集和验证集
  2. 使用下面的代码完成从数据下载到生成csv的过程:

data2csv.py:


3. 在同一目录下,用以下代码,将csv文件转换为json文件(训练集+验证集):

csv2json.py:


此时目录下会多出3个文件:

  • latex_ocr_train.csv
  • latex_ocr_train.json
  • latex_ocr_val.json

至此,我们完成了数据集的准备。

这里我们使用modelscope下载Qwen2-VL-2B-Instruct模型,然后把它加载到Transformers中进行训练:


模型大小为 4.5GB,下载模型大概需要 5 分钟。

在这里插入图片描述

SwanLab 是一个开源的模型训练记录工具,常被称为”中国版 Weights&Biases + Tensorboard”。SwanLab面向AI研究者,提供了训练可视化、自动日志记录、超参数记录、实验对比、多人协同等功能。在SwanLab上,研究者能基于直观的可视化图表发现训练问题,对比多个实验找到研究灵感,并通过在线链接的分享与基于组织的多人协同训练,打破团队沟通的壁垒。

SwanLab与Transformers已经做好了集成,用法是在Trainer的参数中添加实例,就可以自动记录超参数和训练指标,简化代码如下:


首次使用SwanLab,需要先在官网注册一个账号,然后在用户设置页面复制你的API Key,然后在训练开始提示登录时粘贴即可,后续无需再次登录:

在这里插入图片描述

更多用法可参考快速开始、Transformers集成。

查看可视化训练过程:ZeyiLin/Qwen2-VL-ft-latexocr

本节代码做了以下几件事:

  1. 下载并加载Qwen2-VL-2B-Instruct模型
  2. 加载数据集,取前996条数据参与训练,4条数据进行主观评测
  3. 配置Lora,参数为r=64, lora_alpha=16, lora_dropout=0.05
  4. 使用SwanLab记录训练过程,包括超参数、指标和最终的模型输出结果
  5. 训练2个epoch

开始执行代码时的目录结构应该是:


完整代码如下

train.py:


看到下面的进度条即代表训练开始:

在这里插入图片描述

详细训练过程请看这里:ZeyiLin/Qwen2-VL-ft-latexocr

在这里插入图片描述

从SwanLab图表中我们可以看到,学习率的下降策略是线性下降,loss随epoch呈现下降趋势,同时grad_norm也呈现下降趋势。这种形态反映了模型的训练效果是符合预期的。

在图表中记录着模型最终的输出结果,可以看到模型在回答的风格已经是标准的LaTex语法。

在这里插入图片描述

对这四个结果进行验证,跟输入图像完成一致。

在这里插入图片描述
在这里插入图片描述

那么与没有微调的模型进行效果对比,我们选择997.jpg:

在这里插入图片描述


可以看到没有微调的模型,对于这张图片的输出明显是错误的;

而微调后的模型,有着非常完美表现:

在这里插入图片描述

加载lora微调后的模型,并进行推理:


详细硬件配置和参数说明

使用4张A100 40GB显卡(总显存占用大约),batch size为4,gradient accumulation steps为4,训练2个epoch的用时为8分钟51秒。

在这里插入图片描述

在这里插入图片描述

注意

  • 在微调脚本中,加载的是一共固定的checkpoint文件,如果你添加了数据或超参数,请根据实际情况修改checkpoint文件路径。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/257307.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月13日 上午10:23
下一篇 2026年3月13日 上午10:23


相关推荐

关注全栈程序员社区公众号