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

发布于 2024-6-30 23:04
浏览
0收藏

译者 | 朱先忠

审校 | 重楼

引言

大型语言模型(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张扫描的收据图像,每张图像都标注了关键实体,如:

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

MLLM QLoRA微调实战:基于最新的袖珍Mini-InternVL模型-AI.x社区

来源:​​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微调模型之间的示例比较:

Ground Truth: 

{
 "company": "YONG TAT HARDWARE TRADING",
 "date": "13/03/2018",
 "address": "NO 4,JALAN PERJIRANAN 10, TAMAN AIR BIRU, 81700 PASIR GUDANG, JOHOR.",
 "total": "72.00"
}

Prediction Base: KO

```json
{
 "company": "YONG TAT HARDWARE TRADING",
 "date": "13/03/2016",
 "address": "JM092487-D",
 "total": "67.92"
}
```

Prediction QLoRA: OK

{
 "company": "YONG TAT HARDWARE TRADING",
 "date": "13/03/2018",
 "address": "NO 4, JALAN PERUBANAN 10, TAMAN AIR BIRU, 81700 PASIR GUDANG, JOHOR",
 "total": "72.00"
}

实验结果

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

参考链接

译者介绍

朱先忠,51CTO社区编辑,51CTO专家博客、讲师,潍坊一所高校计算机教师,自由编程界老兵一枚。

原文标题:A Simple Recipe to Boost the Performance of MLLMs on Your Custom Use Case,作者:Youness Mansar​

链接:https://towardsdatascience.com/a-simple-recipe-to-boost-the-performance-of-mllms-on-your-custom-use-case-6014440f5373


©著作权归作者所有,如需转载,请注明出处,否则将追究法律责任
收藏
回复
举报
回复
相关推荐