自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

MLLM QLoRA微調(diào)實(shí)戰(zhàn):基于最新的袖珍Mini-InternVL模型 原創(chuàng)

發(fā)布于 2024-6-30 23:04
瀏覽
0收藏

譯者 | 朱先忠

審校 | 重樓

引言

大型語(yǔ)言模型(LLM)的世界正在不斷發(fā)展,新的進(jìn)步正在迅速出現(xiàn)。一個(gè)令人興奮的領(lǐng)域是多模態(tài)LLM(MLLMs)的發(fā)展,這種模型既能夠理解文本又能夠理解圖像,并與之進(jìn)行交互。因此,這種多模態(tài)模型的出現(xiàn)將為文檔理解、視覺問(wèn)答等任務(wù)打開一個(gè)新的可能性的世界。

我最近寫了一篇關(guān)于這種模型的文章??《微軟最新的Phi-3視覺語(yǔ)言模型的6種現(xiàn)實(shí)應(yīng)用》??(6 Real-World Uses of Microsoft’s Newest Phi-3 Vision-Language Model)。這篇文章探索了微軟新發(fā)布的模型Phi-3-Vision的可能使用場(chǎng)景,這是一種小型但功能強(qiáng)大的MLLM,可以在本地運(yùn)行(文章中的鏈接提供了相應(yīng)的代碼示例)。

但在本篇文章中,我們將探索一個(gè)強(qiáng)大的組合:InternVL模型和QLoRA微調(diào)技術(shù)。我們將專注于如何輕松地為任何特定使用場(chǎng)景定制此類模型。我們將使用這些工具創(chuàng)建一個(gè)收據(jù)信息理解程序,以便以高精度從中提取公司名稱、地址和購(gòu)買總額等關(guān)鍵信息。

了解任務(wù)和數(shù)據(jù)集

該項(xiàng)目旨在開發(fā)一個(gè)系統(tǒng),利用InternVL的功能,準(zhǔn)確地從掃描的收據(jù)中提取特定信息。該任務(wù)提出了一個(gè)獨(dú)特的挑戰(zhàn),不僅需要強(qiáng)大的自然語(yǔ)言處理(NLP),還需要解釋輸入圖像的視覺布局的能力。這將使我們能夠創(chuàng)建一個(gè)單一的、無(wú)OCR的端到端管道,從而在復(fù)雜文檔中表現(xiàn)出強(qiáng)大的通用性。

為了訓(xùn)練和評(píng)估我們的模型,我們將使用??SROIE??數(shù)據(jù)集。SROIE提供了1000張掃描的收據(jù)圖像,每張圖像都標(biāo)注了關(guān)鍵實(shí)體,如:

  • 公司:商店或企業(yè)的名稱?
  • 日期:購(gòu)買日期?
  • 地址:商店的地址?
  • 總計(jì):支付的總金額?

MLLM QLoRA微調(diào)實(shí)戰(zhàn):基于最新的袖珍Mini-InternVL模型-AI.x社區(qū)

來(lái)源:??https://arxiv.org/pdf/2103.10213.pdf??。?

我們將使用模糊相似性得分來(lái)評(píng)估我們模型的性能,這是一種衡量預(yù)測(cè)實(shí)體和基本事實(shí)實(shí)體之間相似性的指標(biāo)。這個(gè)指標(biāo)的數(shù)據(jù)值范圍是從0(不相關(guān)的結(jié)果)到100(完美的預(yù)測(cè))之間。

InternVL:一個(gè)多模式的發(fā)電站

InternVL是OpenGVLab的一個(gè)多模型LLM家族,旨在擅長(zhǎng)圖像和文本任務(wù)。它的體系結(jié)構(gòu)將視覺模型(如InternetViT)與語(yǔ)言模型(如InternLM2或Phi-3)相結(jié)合。這里,我們將重點(diǎn)介紹Mini-InterneVL-Chat-2B-V1-5變體,這是一個(gè)非常適合在消費(fèi)級(jí)GPU上運(yùn)行的較小版本。

InternVL的主要優(yōu)勢(shì)表現(xiàn)在:

  • 效率:其緊湊的尺寸允許高效的訓(xùn)練和推理。?
  • 準(zhǔn)確性:盡管體積較小,但它在各種基準(zhǔn)測(cè)試中都具有競(jìng)爭(zhēng)力。?
  • 多模態(tài)功能:它將圖像和文本理解無(wú)縫結(jié)合。?

演示程序:您可以在鏈接https://huggingface.co/spaces/OpenGVLab/InternVL處探索一下有關(guān)InternetVL的實(shí)時(shí)演示情況。

QLoRA微調(diào):一種內(nèi)存高效的方法

為了進(jìn)一步提高我們模型的性能,我們將使用QLoRA,這是一種微調(diào)技術(shù),可以在保持性能的同時(shí)顯著減少內(nèi)存消耗。以下是它的工作原理:

  1. 量化:預(yù)訓(xùn)練的LLM被量化為4位精度,減少了其內(nèi)存占用。?
  2. 低級(jí)別適配器(LoRA):LoRA不修改預(yù)訓(xùn)練模型的所有參數(shù),而是向網(wǎng)絡(luò)添加小型可訓(xùn)練適配器。這些適配器能夠捕獲特定任務(wù)的信息,而無(wú)需更改主模型。?
  3. 高效訓(xùn)練:量化和LoRA的結(jié)合即使在內(nèi)存有限的GPU上也能實(shí)現(xiàn)高效的微調(diào)。?

代碼演練:基線性能

讓我們深入研究一下相關(guān)的代碼實(shí)現(xiàn)吧。首先,我們將在沒有任何微調(diào)的情況下評(píng)估一下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參數(shù)中設(shè)置圖片小塊的最大數(shù)量

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,
)

# 單輪單圖像對(duì)話
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)
上述代碼的輸出結(jié)果是:
```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"
}
```

上面的代碼實(shí)現(xiàn)了:

  1. 從Hugging Face云端加載模型。?
  2. 加載樣本收據(jù)圖像并將其轉(zhuǎn)換為張量。?
  3. 提出一個(gè)問(wèn)題,要求模型從圖像中提取相關(guān)信息。?
  4. 運(yùn)行模型,并以JSON格式輸出提取的信息。?

這項(xiàng)零樣本評(píng)估顯示了令人印象深刻的結(jié)果,實(shí)現(xiàn)了74.24% 的平均模糊相似性得分。這證明了InternVL在無(wú)需微調(diào)的情況下理解收據(jù)和提取信息的能力。

微調(diào):使用QLoRA增強(qiáng)性能

為了進(jìn)一步提高準(zhǔn)確性,我們將使用QLoRA對(duì)模型進(jìn)行微調(diào)。以下展示了我們使用這種微調(diào)技術(shù)的實(shí)現(xiàn)代碼:

_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參數(shù)中設(shè)置圖片小塊的最大數(shù)量
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,
)
# 訓(xùn)練器
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())
# 開始訓(xùn)練
fine_tuning.train()
# 保存模型
fine_tuning.model.save_pretrained(refined_model)

上面的代碼實(shí)現(xiàn)了:

  1. 加載啟用量化支持的模型。?
  2. 用LoRA微調(diào)模型,添加可訓(xùn)練的適配器。?
  3. 從SROIE數(shù)據(jù)集創(chuàng)建數(shù)據(jù)集。?
  4. 定義訓(xùn)練參數(shù),如學(xué)習(xí)率、批量大小和訓(xùn)練輪數(shù)。?
  5. 初始化訓(xùn)練器以處理訓(xùn)練過(guò)程。?
  6. 在SROIE數(shù)據(jù)集上訓(xùn)練模型。?
  7. 保存微調(diào)后的模型。?

以下是基本模型和QLoRA微調(diào)模型之間的示例比較:

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"
}

實(shí)驗(yàn)結(jié)果

在使用QLoRA進(jìn)行微調(diào)后,我們的模型獲得了95.4% 的顯著模糊相似性得分,比基線性能(74.24%)有了顯著提高。這證明了QLoRA在不需要大量計(jì)算資源的情況下提高模型精度的能力(在RTX 3080 GPU上對(duì)600個(gè)樣本進(jìn)行15分鐘的訓(xùn)練)。

我們使用InternVL和QLoRA成功構(gòu)建了一個(gè)強(qiáng)大的收據(jù)數(shù)據(jù)理解程序。這種方法展示了多模式LLM在文檔分析和信息提取等現(xiàn)實(shí)任務(wù)中的潛力。在這個(gè)示例用例中,我們使用幾百個(gè)樣本和消費(fèi)者級(jí)別的GPU上幾分鐘的計(jì)算時(shí)間,在預(yù)測(cè)質(zhì)量上獲得了30分。

注意:您可以在鏈接https://github.com/CVxTz/doc-llm處找到該項(xiàng)目的完整代碼實(shí)現(xiàn)。

結(jié)語(yǔ)

當(dāng)今,多模式LLM的發(fā)展才剛剛開始,未來(lái)充滿了令人興奮的可能性。自動(dòng)化文檔處理領(lǐng)域在MLLM(多模態(tài)大型語(yǔ)言模型)時(shí)代具有巨大的潛力。這些模型可以徹底改變我們從合同、發(fā)票和其他文檔中提取信息的方式,只需要最少的訓(xùn)練數(shù)據(jù)。通過(guò)整合文本和視覺,他們可以以前所未有的精度分析復(fù)雜文檔的布局,為更高效、更智能的信息管理鋪平道路。

人工智能的未來(lái)是多模式的,InternVL和QLoRA是幫助我們?cè)谛⌒偷挠?jì)算預(yù)算上釋放其潛力的強(qiáng)大工具。

參考鏈接

譯者介紹

朱先忠,51CTO社區(qū)編輯,51CTO專家博客、講師,濰坊一所高校計(jì)算機(jī)教師,自由編程界老兵一枚。

原文標(biāo)題: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


?著作權(quán)歸作者所有,如需轉(zhuǎn)載,請(qǐng)注明出處,否則將追究法律責(zé)任
收藏
回復(fù)
舉報(bào)
回復(fù)
相關(guān)推薦