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

译文 精选
人工智能
本文将展示如何使用QLoRA技术对来自中国上海的一家AI公司的通用视觉开源平台OpenGVLab最新发布的袖珍多模态大型语言模型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微调模型之间的示例比较:

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



责任编辑:华轩 来源: 51CTO
相关推荐

2023-06-09 08:00:00

QLoRa语言模型微调

2023-06-02 15:47:49

2023-09-28 08:23:18

AI模型

2024-09-26 10:42:20

2023-06-07 08:22:59

LLM微调技术

2024-10-09 08:27:30

2024-11-11 13:33:28

2024-05-06 12:24:00

模型训练

2024-05-06 12:22:00

AI训练

2024-11-04 14:42:12

2024-06-05 09:22:43

2024-07-24 12:40:44

2024-04-15 12:50:00

大型语言模型ReFT

2023-06-08 11:27:10

模型AI

2023-10-07 10:41:54

语言模型微调BitFit

2024-09-09 07:46:16

2024-05-07 08:00:00

自然语言处理机器学习

2024-11-21 08:22:45

2023-11-22 09:00:00

NLP语言模型LSTM

2024-04-18 10:39:57

点赞
收藏

51CTO技术栈公众号