MLLM QLoRA微调实战:基于最新的袖珍Mini-InternVL模型

引言

大型语言模型(LLM)的世界正在不断发展,新的进步正在迅速出现。一个令人兴奋的领域是多模态LLM(MLLMs)的发展,这种模型既能够理解文本又能够理解图像,并与之进行交互。因此,这种多模态模型的出现将为文档理解、视觉问答等任务打开一个新的可能性的世界。

我最近写了一篇关于这种模型的文章《微软最新的Phi-3视觉语言模型的6种现实应用》(6 Real-World Uses of Microsoft’s Newest Phi-3 Vision-Language Model)。这篇文章探索了微软新发布的模型Phi-3-Vision的可能使用场景,这是一种小型但功能强大的MLLM,可以在本地运行(文章中的链接提供了相应的代码示例)。

但在本篇文章中,我们将探索一个强大的组合:InternVL模型和QLoRA微调技术。我们将专注于如何轻松地为任何特定使用场景定制此类模型。我们将使用这些工具创建一个收据信息理解程序,以便以高精度从中提取公司名称、地址和购买总额等关键信息。

了解任务和数据集

该项目旨在开发一个系统,利用InternVL的功能,准确地从扫描的收据中提取特定信息。该任务提出了一个独特的挑战,不仅需要强大的自然语言处理(NLP),还需要解释输入图像的视觉布局的能力。这将使我们能够创建一个单一的、无OCR的端到端管道,从而在复杂文档中表现出强大的通用性。

为了训练和评估我们的模型,我们将使用SROIE数据集。SROIE提供了1000张扫描的收据图像,每张图像都标注了关键实体,如:

  • 公司:商店或企业的名称
  • 日期:购买日期
  • 地址:商店的地址
  • 总计:支付的总金额

来源:https://arxiv.org/pdf/2103.10213.pdf

我们将使用模糊相似性得分来评估我们模型的性能,这是一种衡量预测实体和基本事实实体之间相似性的指标。这个指标的数据值范围是从0(不相关的结果)到100(完美的预测)之间。

InternVL:一个多模式的发电站

InternVL是OpenGVLab的一个多模型LLM家族,旨在擅长图像和文本任务。它的体系结构将视觉模型(如InternetViT)与语言模型(如InternLM2或Phi-3)相结合。这里,我们将重点介绍Mini-InterneVL-Chat-2B-V1-5变体,这是一个非常适合在消费级GPU上运行的较小版本。

InternVL的主要优势表现在:

  • 效率:其紧凑的尺寸允许高效的训练和推理。
  • 准确性:尽管体积较小,但它在各种基准测试中都具有竞争力。
  • 多模态功能:它将图像和文本理解无缝结合。

演示程序:您可以在链接https://huggingface.co/spaces/OpenGVLab/InternVL处探索一下有关InternetVL的实时演示情况。

QLoRA微调:一种内存高效的方法

为了进一步提高我们模型的性能,我们将使用QLoRA,这是一种微调技术,可以在保持性能的同时显著减少内存消耗。以下是它的工作原理:

  1. 量化:预训练的LLM被量化为4位精度,减少了其内存占用。
  2. 低级别适配器(LoRA):LoRA不修改预训练模型的所有参数,而是向网络添加小型可训练适配器。这些适配器能够捕获特定任务的信息,而无需更改主模型。
  3. 高效训练:量化和LoRA的结合即使在内存有限的GPU上也能实现高效的微调。
代码演练:基线性能

让我们深入研究一下相关的代码实现吧。首先,我们将在没有任何微调的情况下评估一下Mini-InterVL-Chat-2B-V1-5的基线性能:

quant_config = BitsAndBytesConfig(load_in_4bit=True,bnb_4bit_quant_type="nf4",bnb_4bit_compute_dtype=torch.bfloat16,
)model = InternVLChatModel.from_pretrained(args.path,device_map={"": 0},quantization_cnotallow=quant_config if args.quant else None,torch_dtype=torch.bfloat16,
)tokenizer = InternLM2Tokenizer.from_pretrained(args.path)
# 在max_num参数中设置图片小块的最大数量model.eval()pixel_values = (load_image(image_base_path / "X51005255805.jpg", max_num=6).to(torch.bfloat16).cuda()
)generation_config = dict(num_beams=1,max_new_tokens=512,do_sample=False,
)# 单轮单图像对话
question = ("Extract the company, date, address and total in json format.""Respond with a valid JSON only."
)
# print(model)
response = model.chat(tokenizer, pixel_values, question, generation_config)print(response)
上述代码的输出结果是:
```json
{"company": "SAM SAM TRADING CO","date": "Fri, 29-12-2017","address": "67, JLN MENHAW 25/63 TNN SRI HUDA, 40400 SHAH ALAM","total": "RM 14.10"
}
```

上面的代码实现了:

  1. 从Hugging Face云端加载模型。
  2. 加载样本收据图像并将其转换为张量。
  3. 提出一个问题,要求模型从图像中提取相关信息。
  4. 运行模型,并以JSON格式输出提取的信息。

这项零样本评估显示了令人印象深刻的结果,实现了74.24% 的平均模糊相似性得分。这证明了InternVL在无需微调的情况下理解收据和提取信息的能力。

微调:使用QLoRA增强性能

为了进一步提高准确性,我们将使用QLoRA对模型进行微调。以下展示了我们使用这种微调技术的实现代码:

_data = load_data(args.data_path, fold="train")# 量化配置
quant_config = BitsAndBytesConfig(load_in_4bit=True,bnb_4bit_quant_type="nf4",bnb_4bit_compute_dtype=torch.bfloat16,
)model = InternVLChatModel.from_pretrained(path,device_map={"": 0},quantization_cnotallow=quant_config,torch_dtype=torch.bfloat16,
)tokenizer = InternLM2Tokenizer.from_pretrained(path)# 在max_num参数中设置图片小块的最大数量
img_context_token_id = tokenizer.convert_tokens_to_ids(IMG_CONTEXT_TOKEN)
print("img_context_token_id", img_context_token_id)
model.img_context_token_id = img_context_token_idmodel.config.llm_config.use_cache = Falsemodel = wrap_lora(model, r=128, lora_alpha=256)training_data = SFTDataset(data=_data, template=model.config.template, tokenizer=tokenizer
)collator = CustomDataCollator(pad_token=tokenizer.pad_token_id, ignore_index=-100)img_context_token_id = tokenizer.convert_tokens_to_ids(IMG_CONTEXT_TOKEN)
print("img_context_token_id", img_context_token_id)
model.img_context_token_id = img_context_token_id
print("model.img_context_token_id", model.img_context_token_id)train_params = TrainingArguments(output_dir=str(BASE_PATH / "results_modified"),num_train_epochs=EPOCHS,per_device_train_batch_size=1,gradient_accumulation_steps=16,optim="paged_adamw_32bit",save_steps=len(training_data) // 10,logging_steps=len(training_data) // 50,learning_rate=5e-4,lr_scheduler_type="cosine",warmup_steps=100,weight_decay=0.001,max_steps=-1,group_by_length=False,max_grad_norm=1.0,
)
# 训练器
fine_tuning = SFTTrainer(model=model,train_dataset=training_data,dataset_text_field="###",tokenizer=tokenizer,args=train_params,data_collator=collator,max_seq_length=tokenizer.model_max_length,
)print(fine_tuning.model.print_trainable_parameters())
# 开始训练
fine_tuning.train()
# 保存模型
fine_tuning.model.save_pretrained(refined_model)

上面的代码实现了:

  1. 加载启用量化支持的模型。
  2. 用LoRA微调模型,添加可训练的适配器。
  3. 从SROIE数据集创建数据集。
  4. 定义训练参数,如学习率、批量大小和训练轮数。
  5. 初始化训练器以处理训练过程。
  6. 在SROIE数据集上训练模型。
  7. 保存微调后的模型。

以下是基本模型和QLoRA微调模型之间的示例比较:

实验结果

在使用QLoRA进行微调后,我们的模型获得了95.4% 的显著模糊相似性得分,比基线性能(74.24%)有了显著提高。这证明了QLoRA在不需要大量计算资源的情况下提高模型精度的能力(在RTX 3080 GPU上对600个样本进行15分钟的训练)。

我们使用InternVL和QLoRA成功构建了一个强大的收据数据理解程序。这种方法展示了多模式LLM在文档分析和信息提取等现实任务中的潜力。在这个示例用例中,我们使用几百个样本和消费者级别的GPU上几分钟的计算时间,在预测质量上获得了30分。

注意:您可以在链接https://github.com/CVxTz/doc-llm处找到该项目的完整代码实现。

结语

当今,多模式LLM的发展才刚刚开始,未来充满了令人兴奋的可能性。自动化文档处理领域在MLLM(多模态大型语言模型)时代具有巨大的潜力。这些模型可以彻底改变我们从合同、发票和其他文档中提取信息的方式,只需要最少的训练数据。通过整合文本和视觉,他们可以以前所未有的精度分析复杂文档的布局,为更高效、更智能的信息管理铺平道路。

人工智能的未来是多模式的,InternVL和QLoRA是帮助我们在小型的计算预算上释放其潜力的强大工具。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/367367.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Apache IoTDB 监控详解 | 分布式系统监控基础

IoTDB 分布式系统监控的基础“须知”! 我这个环境的系统性能一直无法提升,能否帮我找到系统的瓶颈在哪里? 系统优化后,虽然写入性能有所提升,但查询延迟却增加了,下一步我该如何排查和优化呢? 请…

DEPTHAI 2.27.0 发布!

小伙伴们大家好,我们发布了DepthAI 2.27.0版本,本次对DepthAI库有了一些小更新,以下是更新内容。 功能 设置DEPTHAI_ENABLE_FEEDBACK_CRASHDUMP时自动故障转储收集; 漏洞修补 修复深度超出ImageAlign节点时生成PointCloud的问…

文华财经macd-kdj-ZIGZAG顶底买卖点-大资金活动指标公式源码

VAR3:(CLOSE-MA(CLOSE,6))/MA(CLOSE,6)*100; VAR4:(CLOSE-MA(CLOSE,24))/MA(CLOSE,24)*100; VAR5:(CLOSE-MA(CLOSE,32))/MA(CLOSE,32)*100; VAR6:(VAR3VAR4VAR5)/3; VAR7:EMA(VAR6,5); 指标: EMA(EMA(VAR3,5),5)*3, COLORSTICK; VAR8:IF(VAR6<-20,10,0); VAR9:HHV(VA…

AI是在帮助开发者还是取代他们

目录 1.概述 1.1.AI助力开发者 1.2.AI对开发者的挑战 2.AI工具现状 2.1. GitHub Copilot 2.2. TabNine 2.3.小结 3.AI对开发者的影响 3.1.对开发者的影响 3.2.开发者需要掌握的新技能 3.3.在AI辅助的环境中保持竞争力的策略 4.AI开发的未来 5.总结 1.概述 生成式…

第十四章 Qt绘图

目录 一、Qt绘图基础 1、主要的类 2、paintEvent 事件 二、坐标体系 三、画笔 1、画笔的常用接口 2、画笔样式 3、画笔画线时的端点样式 4、画笔画线时,连接点的样式 5、实例 四、画刷 1、画刷的填充样式 2、实例 五、基本图形的绘制 1、画矩形 drawRect 2、画…

YOLO在目标检测与视频轨迹追踪中的应用

YOLO在目标检测与视频轨迹追踪中的应用 引言 在计算机视觉领域&#xff0c;目标检测与视频轨迹追踪是两个至关重要的研究方向。随着深度学习技术的飞速发展&#xff0c;尤其是卷积神经网络&#xff08;CNN&#xff09;的广泛应用&#xff0c;目标检测与视频轨迹追踪的性能得到…

GAMES104:04游戏引擎中的渲染系统1:游戏渲染基础-学习笔记

文章目录 概览&#xff1a;游戏引擎中的渲染系统四个课时概览 一&#xff0c;渲染管线流程二&#xff0c;了解GPUSIMD 和 SIMTGPU 架构CPU到GPU的数据传输GPU性能限制 三&#xff0c;可见性Renderable可渲染对象提高渲染效率Visibility Culling 可见性裁剪 四&#xff0c;纹理压…

分析逆向案例九——奥鹏教育教师登录密码加密

网址&#xff1a;aHR0cHM6Ly9wYXNzcG9ydC5vdXJ0ZWFjaGVyLmNvbS5jbi9BY2NvdW50L1BvcnRhbExvZ2luSW5kZXg 登陆接口分析 发现密码和用户名都进行了加密 跟栈进行分析&#xff0c;找加密位置 熟悉的ajax,打上断点&#xff0c;重复登录 加密函数为encrypt() 进入函数&#xff0c;发…

使用目标检测模型YOLO V10 OBB进行旋转目标的检测:训练自己的数据集(基于卫星和无人机的农业大棚数据集)

这个是在YOLO V10源码的基础上实现的。我只是在源码的基础上做了些许的改动。 YOLO V10源码&#xff1a;YOLO V10源码 YOLOv10是清华大学的研究人员在Ultralytics Python包的基础上&#xff0c;引入了一种新的实时目标检测方法&#xff0c;解决了YOLO 以前版本在后处理和模型架…

ubuntu 系统中 使用docker 制作 Windows 系统,从此告别 vmware虚拟机

我的系统是 ubuntu 24 前期准备工作&#xff1a; 安装dockerdocker pull 或者 手动制作镜像 docker build 的话 必须要 科学上网&#xff0c; 好像阿里镜像都下不下来。需要 知道 docker 和docker compose 命令的使用方式 我是给docker 挂了 http代理 如果你能pull下来镜像 …

React+TS前台项目实战(二十一)-- Search业务组件封装实现全局搜索

文章目录 前言一、Search组件封装1. 效果展示2. 功能分析3. 代码详细注释4. 使用方式 二、搜索结果展示组件封装1. 功能分析2. 代码详细注释 三、引用到文件&#xff0c;自行取用总结 前言 今天&#xff0c;我们来封装一个业务灵巧的组件&#xff0c;它集成了全局搜索和展示搜…

JCR一区级 | Matlab实现BO-Transformer-LSTM多变量回归预测

JCR一区级 | Matlab实现BO-Transformer-LSTM多变量回归预测 目录 JCR一区级 | Matlab实现BO-Transformer-LSTM多变量回归预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.Matlab实现BO-Transformer-LSTM多变量回归预测&#xff0c;贝叶斯优化Transformer结合LSTM长…

迅睿CMS 后端配置项没有正常加载,上传插件不能正常使用

首先&#xff0c;尝试迅睿CMS官方提供的【百度编辑器问题汇总】解决方案来解决你的问题。你可以访问这个链接&#xff1a;官方解决方案。 如果按照【百度编辑器问题汇总】解决方案操作后&#xff0c;依然遇到“后端配置项没有正常加载&#xff0c;上传插件不能正常使用”的问题…

算法体系-25 第二十五节:窗口内最大值或最小值的更新结构

一 滑动窗口设计知识点 滑动窗口是什么&#xff1f; 滑动窗口是一种想象出来的数据结构&#xff1a; 滑动窗口有左边界L和有边界R 在数组或者字符串或者一个序列上&#xff0c;记为S&#xff0c;窗口就是S[L..R]这一部分 L往右滑意味着一个样本出了窗口&#xff0c;R往右滑意味…

ubuntu 安装并启用 samba

环境&#xff1a;ubuntu server 24.04 步骤如下&#xff1a; sudo apt update sudo apt install samba修改配置文件&#xff1a; sudo vi /etc/samba/smb.conf新增内容&#xff1a; [username]path /home/[username]available yesvalid users [username]read only nobrow…

Python基础入门知识

目录 引言 简要介绍Python语言 为什么要学习Python Python的应用领域 Python安装和环境配置 Python的下载和安装(Windows, macOS, Linux) 配置Python环境变量 安装和使用IDE(如PyCharm, VS Code) Python基本语法 注释 变量和数据类型(数字,字符串,列表,元组,字典,…

【干货】SaaS企业使用PLG模式实现用户自增长与留存的三大战略

近年来越来越多toB厂商开始采用SaaS模式&#xff0c;消费者的体验需求和购买行为也逐渐转变。根据Forrester研究调查显示&#xff0c;B端购买者现在越来越倾向于进行产品体验和产品调研与评估&#xff0c;而非如传统的方式那样直接与销售人员接触。 因此&#xff0c;SaaS&…

帮找Java Bug,面试,项目,解决Java问题

本人是个Java老程序员&#xff0c;如果你有解决不了的问题&#xff0c;或者面试的时候需要人帮助&#xff0c;或者求职就业上任何问题都可以联系我&#xff0c;下面是我微信&#xff0c;欢迎联系我&#xff01;

【算法专题--栈】用栈实现队列 -- 高频面试题(图文详解,小白一看就懂!!)

目录 一、前言 二、题目描述 三、解题方法 ⭐双栈 模拟 队列 &#x1f95d;栈 和 队列 的特性 &#x1f34d;具体思路 &#x1f34d;案例图解 四、总结与提炼 五、共勉 一、前言 用栈实现队列 这道题&#xff0c;可以说是--栈专题--&#xff0c;最经典的一道题&…

记一次阿里云服务器java应用无法响应且无法远程连接的问题排查

问题表现 java服务无响应&#xff0c;无法远程链接到服务器。 今天中午12点多&#xff0c;应用直接崩溃。后续进入到服务器&#xff0c;发现java进程都不在了&#xff0c; 排查过程 先安装atop工具 安装、配置并使用atop监控工具 等下次再出现时看相关时间点日志&#xff…