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

news2024/10/7 20:30:03
引言

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ATG-2032:功率信号源的类型及应用领域简介

功率信号源是一种产生稳定、精确且可调节的电力信号的仪器,其主要作用是为测试和校准各种电子设备提供标准信号,以确保设备的精度和稳定性。 图:ATG-2000系列功率信号源 以下是功率信号源的主要类型和作用: 直流功率信号源 直流功…

Unity游戏帧率查看软件Fraps

Download Fraps 3.5.99 free version 下载、安装、运行这个软件,左上角就会自动显示帧率

SpringBoot的自动配置核心原理及拓展点

Spring Boot 的核心原理几个关键点 约定优于配置: Spring Boot 遵循约定优于配置的理念,通过预定义的约定,大大简化了 Spring 应用程序的配置和部署。例如,它自动配置了许多常见的开发任务(如数据库连接、Web 服务器配…

python提取图片中的文字写入excel文件,并打包为exe可执行文件

python提取图片数据写入excel,并打包为exe可执行文件 1. 以下面的图片为例2. python环境需要的依赖包3. 创建交互式窗口4. 读取文件夹下的所有文件并提取数据5. 提取图片中字段的代码6. 打包代码为exe可执行文件安装打包依赖文件运行打包代码 1. 以下面的图片为例 2…

大数据------JavaWeb------会话跟踪技术(Cookie、Session)(完整知识点汇总)

会话跟踪技术(Cookie&Session) 注意: HTTP协议是无状态 的,即每次浏览器向服务器请求时,服务器都会将该请求视为新的请求,因此我们需要会话跟踪技术来实现会话内的数据共享 会话 当用户打开浏览器&am…

基于STM32的智能仓储温湿度监控系统

目录 引言环境准备智能仓储温湿度监控系统基础代码实现:实现智能仓储温湿度监控系统 4.1 数据采集模块4.2 数据处理与分析4.3 控制系统实现4.4 用户界面与数据可视化应用场景:温湿度监控与管理问题解决方案与优化收尾与总结 1. 引言 智能仓储温湿度监…

【论文解读】Multiagent Multitraversal Multimodal Self-Driving: Open MARS Dataset

Open MARS Dataset 摘要引言Dataset CurationVehicle SetupData CollectionDataset Statistics Benchmark Task and ModelPlace RecognitionNeural Reconstruction Experimental ResultsVisual Place RecognitionNeural Reconstruction Opportunities and Challenges结论 摘要 …

echarts实现3D柱状图(视觉层面)

一、第一种效果 效果图 使用步骤 完整实例&#xff0c;copy就可直接使用 <template><div :class"className" :style"{height:height,width:width}" /> </template><script>import echarts from echartsrequire(echarts/theme/…

RAG技术下的文档智能检索

在数字化浪潮的推动下&#xff0c;信息检索已成为我们日常生活中不可或缺的一部分。然而&#xff0c;随着数据量的爆炸式增长&#xff0c;如何快速精准地从海量文档中检索出有价值的信息&#xff0c;成为了一个巨大的挑战。本文将带您走进 Pinecone 向量数据库的世界&#xff0…

计算机图形学games101——MVP

首先记得一个知识点 在旋转矩阵中&#xff0c;旋转矩阵的逆矩阵就是旋转矩阵的转置&#xff0c;这个矩阵是正交矩阵 我们需要做到的就是观测变换&#xff0c;这个变换包括视图变换和投影变换&#xff08;投影变换包含正交变换和透视变换&#xff09; 三维变换复习 首先复习…

Ubuntu20.04配置TurtleBot3 Waffle Pi远程控制

这里写目录标题 0. 机器人配置1. Ubuntu20.04配置TurtleBot3 Waffle Pi远程控制1.1 TurtleBot3 Waffle Pi端配置1.2 PC端配置1.2.1 安装turtlebot3的环境配置1.2.2 创建项目并安装Turtlebot31.2.3 配置环境变量 1.3 PC端与TurtleBot3进行通信1.3.1 PC端与机器人端互PING和SSH连…

ATA-L2水声功率放大器驱动水声换能器的测试研究

随着水声通信技术的发展&#xff0c;水下通信设备也开始逐步走向实用化&#xff0c;为了满足其实际的使用要求&#xff0c;功率放大器的设计需要具有高效率的特性&#xff0c;并能在水下长时间连续可靠的工作。 压电陶瓷换能器主要负责电信号与声信号之间的转换&#xff0c;换能…

ruoyi-cloud登录接口实现滑块验证码

一、前言 ruoyi项目默认的验证码是这样的 今天来尝试增加滑块验证码&#xff0c;我们用到的是tianai-captcha。 文档地址&#xff1a;http://doc.captcha.tianai.cloud/ 源码地址&#xff1a;https://gitee.com/tianai/tianai-captcha 下面来看具体的步骤。 二、后端 在g…

JL-33 手持式气象站/便携式气象站 小型气象站厂家 微型气象站

产品概述 手持式气象站是一款携带方便&#xff0c;操作简单&#xff0c;集多项气象要素于一体的可移动式气象观测仪器。产品采用传感器及芯片&#xff0c;能同时对空气温度、空气湿度、风速、风向、光照、大气压力、颗粒物、噪声等要素进行准确测量、记录并存储。仪器带有机械…

游泳哪个牌子好?6大游泳耳机选购技巧总结分享

游泳耳机作为水上运动爱好者和游泳专业人士的必备装备&#xff0c;不仅要能够抵御水的侵入&#xff0c;还要提供清晰的音质和舒适的佩戴体验。在市面上&#xff0c;不同品牌的游泳耳机琳琅满目&#xff0c;选择起来可能会令人头疼。本文旨在为您提供一份详尽的游泳耳机选购指南…

详细解释下flutter初始示例的代码

详细解释下flutter初始示例的代码 main 首句导入需要的包 类似于其他语言的import main函数为入口函数 包裹MyApp类 MyApp 这个类继承自无状态类 可见myapp不管理任何状态 build方法是所有widget内必须实现的方法 此处返回一个 ChangeNotferiProvider 可以看到它用于管理应…

2024年低碳发展与地球科学国际会议 (LCDES 2024)

2024年低碳发展与地球科学国际会议 (LCDES 2024) 2024 International Conference on Low Carbon Development and Earth Science 【重要信息】 大会地点&#xff1a;长沙 大会官网&#xff1a;http://www.iclcdes.com 投稿邮箱&#xff1a;iclcdessub-conf.com 【注意&#xf…

一个opencv实现检测程序

引言 图像处理是计算机视觉中的一个重要领域&#xff0c;它在许多应用中扮演着关键角色&#xff0c;如自动驾驶、医疗图像分析和人脸识别等。边缘检测是图像处理中的基本任务之一&#xff0c;它用于识别图像中的显著边界。本文将通过一个基于 Python 和 OpenCV 的示例程序&…

《昇思25天学习打卡营第6天|网络构建》

文章目录 前言&#xff1a;今日所学&#xff1a;1. 定义模型类2. 模型层3. 模型参数 前言&#xff1a; 在第六节中我们学习了网络构建&#xff0c;了解了神经网络模型是由神经网络层和Tensor操作构成&#xff0c;我们使用的mindspore.nn中提供了常见的升级网络层的实现&#x…

c++边界处理机制

1.vector std::vector&#xff1a;std::vector 是动态数组&#xff0c;它会在运行时动态地调整存储空间大小&#xff0c;因此当访问超出边界时&#xff0c;会触发运行时异常 std::out_of_range。可以通过try-catch块来捕获这种异常来处理越界访问。 #include <iostream>…