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_id

model.config.llm_config.use_cache = False

model = 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是帮助我们在小型的计算预算上释放其潜力的强大工具。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

ICCV2023鲁棒性相关论文速览

Paper1 Towards Better Robustness against Common Corruptions for Unsupervised Domain Adaptation 摘要原文: Recent studies have investigated how to achieve robustness for unsupervised domain adaptation (UDA). While most efforts focus on adversarial robustnes…

udp发送数据如果超过1个mtu时,抓包所遇到的问题记录说明

最近在测试Syslog udp发送相关功能,测试环境是centos udp头部的数据长度是2个字节,最大传输长度理论上是65535,除去头部这些字节,可以大概的说是64k。 写了一个超过64k的数据(随便用了一个7w字节的buffer)发送demo,打…

Geotools系列说明之LineString仿高德航路截取说明

需求分析 我们在做webgl的时候经常会遇到这样的需求,计算给定航路的拥堵情况,不同的拥堵显示不同的颜色,航路截取计算等等。基于这类问题统一都可以使用LineString进行处理 实现思路 如上图所示,航路是几个关键的点然后练成线&a…

MySql Innodb 索引有哪些与详解

概述 对于MYSQL的INNODB存储引擎的索引,大家是不陌生的,都能想到是 B树结构,可以加速SQL查询。但对于B树索引,它到底“长”得什么样子,它具体如何由一个个字节构成的,这些的基础知识鲜有人深究。本篇文章从…

2本Top,4本纯正刊,25天即录!7月刊源表已更新!

本周投稿推荐 SCI • 能源技术类,1.5-2.0(来稿即录25天) • 计算机类,2.0-3.0(纯正刊29天录用) EI • 各领域沾边均可(2天录用) CNKI • 7天录用-检索(急录友好&a…

【微信小程序开发实战项目】——如何制作一个属于自己的花店微信小程序(2)

👨‍💻个人主页:开发者-曼亿点 👨‍💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍💻 本文由 曼亿点 原创 👨‍💻 收录于专栏&#xff1a…

Python基于决策树回归模型、多元线性回归模型、随机森林回归模型和LightGBM回归模型实现波士顿房价预测项目实战

说明:这是一个机器学习实战项目(附带数据代码文档视频讲解),如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 城市住房市场的稳定与健康发展是衡量一个地区经济活力和社会福祉的重要指标之一。波士顿,作…

Three-pass authentication

7.2.3 Mechanism MUT.CR — Three-pass authentication # 参考符号 ![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/7aed1610e49e48729933f8160e5228af.png)

研发驱动 再谱新篇丨美格智能南通研发中心正式成立

近日,美格智能全资设立的众格智能技术(南通)有限公司,正式在江苏省南通市紫琅科技城揭牌成立,此举也标志着继上海、西安、深圳之后,美格智能研发力量布局再谱新篇:美格智能南通研发中心正式成立…

工商业光伏项目如何快速开发?

一、前期调研与规划 1、屋顶资源评估:详细测量屋顶面积、承重能力及朝向,利用光伏业务管理软件进行日照分析和发电量预测,确保项目可行性。 2、政策与补贴研究:深入了解当地政府对工商业光伏项目的政策支持和补贴情况&#xff0…

KES数据库实践指南:探索KES数据库的事务隔离级别

并发控制 并发控制的重要性 并发控制是数据库管理系统中的一个核心概念,它确保在多用户环境中,对数据库的并发访问不会破坏数据的完整性和一致性。 当多个用户同时对数据库进行读写操作时,如果缺乏有效的并发控制机制,可能会导致数…

动态规划精品课 2024.6.26-24.7.3

一、斐波那契数列模型 0、第N个泰波那契数 class Solution {public int tribonacci(int n) {// 1. 创建 dp 表// 2. 初始化// 3. 填表// 4. 返回结果// 处理边界情况if (n 0)return 0;if (n 1 || n 2)return 1;int[] dp new int[n 1];dp[0] 0;dp[1] dp[2] 1;for (int i…

类型转换与数据绑定【Spring源码学习】

simpleTypeConverter 类型转换 SimpleTypeConverter typeConverter new SimpleTypeConverter(); Integer number typeConverter.convertIfNecessary("13",int.class); System.out.println(number);BeanWrapper 通过反射原理为bean赋值,走的是set方法…

使用机器学习,通过文本分析,轻松实现原本复杂的情感分析

01、案例说明 本期分享案例是:文字分析-情感分析,内容是关于某部电影评论好坏的分析,使用大量的已知数据,通过监督学习的方法,可以对于未知的评论进行判断其为正面还是负面的评价。 对于数据分析,原来都是…

小阿轩yx-LVS负载均衡群集

小阿轩yx-LVS负载均衡群集 构建群集服务器—通过整合多台服务器使用 LVS 达到服务器的高可用和负载均衡并以同一个 IP 地址对外提供相同的服务 LVS 群集应用基础 群集称呼来自英文单词“Cluster”在服务器领域则表示大量服务器的集合体,区分单个服务器 Cluster …

PLC边缘网关在实际应用中的作用-天拓四方

随着工业自动化的快速发展,PLC已成为工业自动化领域中不可或缺的核心设备。然而,随着工业物联网的兴起,PLC设备面临着数据集成、远程监控以及安全性等方面的挑战。为了解决这些问题,PLC边缘网关应运而生,它作为连接PLC…

[go-zero] goctl 生成api和rpc

文章目录 1.goctl 概述2.go-zero 需要安装的组件3.生成 api4.生成 rpc 1.goctl 概述 goctl支持多种rpc,较为流行的是google开源的grpc,这里主要介绍goctl rpc protoc的代码生成与使用。protoc是grpc的命令,作用是将proto buffer文件转化为相…

《梦醒蝶飞:释放Excel函数与公式的力量》8.3 COUNTBLANK函数

8.3 COUNTBLANK函数 在数据处理和分析中,我们经常需要识别和统计数据集中的空白单元格。COUNTBLANK函数是Excel中用于统计某个范围内空白单元格数量的强大工具。 8.3.1 函数简介 COUNTBLANK函数用于统计指定范围内的空白单元格数量。这在数据清洗、数据完整性检查…

头条系统-05-延迟队列精准发布文章-概述添加任务(db和redis实现延迟任务)、取消拉取任务定时刷新(redis管道、分布式锁setNx)...

文章目录 延迟任务精准发布文章 1)文章定时发布2)延迟任务概述 2.1)什么是延迟任务2.2)技术对比 2.2.1)DelayQueue2.2.2)RabbitMQ实现延迟任务2.2.3)redis实现 3)redis实现延迟任务4)延迟任务服务实现 4.1)搭建heima-leadnews-schedule模块4.2)数据库准备4.3)安装redis4.4)项目…

【OpenSSH】立即检测 OpenSSH 的 regreSSHion 漏洞

OpenSSH regreSSHion 漏洞简介 OpenSSH 是一种广泛使用的网络协议,提供加密的数据通信和远程登录功能。然而,最近发现的一个漏洞(CVE-2024-6387),被称为 regreSSHion,使得未经身份验证的攻击者能够在 Linu…