視覺語言模型可以同時(shí)從圖像和文本中學(xué)習(xí),因此可用于視覺問答、圖像描述等多種任務(wù)。本文,我們將帶大家一覽視覺語言模型領(lǐng)域: 作個(gè)概述、了解其工作原理、搞清楚如何找到真命天“!薄⑷绾螌(duì)其進(jìn)行推理以及如何使用最新版的 trl 輕松對(duì)其進(jìn)行微調(diào)。 什么是視覺語言模型? 視覺語言模型是可以同時(shí)從圖像和文本中
視覺語言模型可以同時(shí)從圖像和文本中學(xué)習(xí),因此可用于視覺問答、圖像描述等多種任務(wù)。本文,我們將帶大家一覽視覺語言模型領(lǐng)域: 作個(gè)概述、了解其工作原理、搞清楚如何找到真命天“!、如何對(duì)其進(jìn)行推理以及如何使用最新版的 trl 輕松對(duì)其進(jìn)行微調(diào)。
視覺語言模型是可以同時(shí)從圖像和文本中學(xué)習(xí)的多模態(tài)模型,其屬于生成模型,輸入為圖像和文本,輸出為文本。大視覺語言模型具有良好的零樣本能力,泛化能力良好,并且可以處理包括文檔、網(wǎng)頁等在內(nèi)的多種類型的圖像。其擁有廣泛的應(yīng)用,包括基于圖像的聊天、根據(jù)指令的圖像識(shí)別、視覺問答、文檔理解、圖像描述等。一些視覺語言模型還可以捕獲圖像中的空間信息,當(dāng)提示要求其檢測(cè)或分割特定目標(biāo)時(shí),這些模型可以輸出邊界框或分割掩模,有些模型還可以定位不同的目標(biāo)或回答其相對(duì)或絕對(duì)位置相關(guān)的問題,F(xiàn)有的大視覺語言模型在訓(xùn)練數(shù)據(jù)、圖像編碼方式等方面采用的方法很多樣,因而其能力差異也很大。
Hugging Face Hub 上有很多開放視覺語言模型,下表列出了其中一些佼佼者。
模型 | 可否商用 | 模型尺寸 | 圖像分辨率 | 其它能力 |
---|---|---|---|---|
LLaVA 1.6 (Hermes 34B) | ? | 34B | 672x672 | |
deepseek-vl-7b-base | ? | 7B | 384x384 | |
DeepSeek-VL-Chat | ? | 7B | 384x384 | 聊天 |
moondream2 | ? | ~2B | 378x378 | |
CogVLM-base | ? | 17B | 490x490 | |
CogVLM-Chat | ? | 17B | 490x490 | 接地、聊天 |
Fuyu-8B | ? | 8B | 300x300 | 圖像中的文本檢測(cè) |
KOSMOS-2 | ? | ~2B | 224x224 | 接地、零樣本目標(biāo)檢測(cè) |
Qwen-VL | ? | 4B | 448x448 | 零樣本目標(biāo)檢測(cè) |
Qwen-VL-Chat | ? | 4B | 448x448 | 聊天 |
Yi-VL-34B | ? | 34B | 448x448 | 雙語 (英文、中文) |
有多種途徑可幫助你選擇最適合自己的模型。
視覺競(jìng)技場(chǎng) (Vision Arena) 是一個(gè)完全基于模型輸出進(jìn)行匿名投票的排行榜,其排名會(huì)不斷刷新。在該競(jìng)技場(chǎng)上,用戶輸入圖像和提示,會(huì)有兩個(gè)匿名的不同的模型為其生成輸出,然后用戶可以基于他們的喜好選擇一個(gè)輸出。這種方式生成的排名完全是基于人類的喜好的。
開放 VLM 排行榜 提供了另一種選擇,各種視覺語言模型按照所有指標(biāo)的平均分進(jìn)行排名。你還可以按照模型尺寸、私有或開源許可證來篩選模型,并按照自己選定的指標(biāo)進(jìn)行排名。
VLMEvalKit 是一個(gè)工具包,用于在視覺語言模型上運(yùn)行基準(zhǔn)測(cè)試,開放 VLM 排行榜就是基于該工具包的。
還有一個(gè)評(píng)估套件是 LMMS-Eval ,其提供了一個(gè)標(biāo)準(zhǔn)命令行界面,你可以使用 Hugging Face Hub 上托管的數(shù)據(jù)集來對(duì)選定的 Hugging Face 模型進(jìn)行評(píng)估,如下所示:
accelerate launch --num_processes=8 -m lmms_eval --model llava --model_args pretrained="liuhaotian/llava-v1.5-7b" --tasks mme,mmbench_en --batch_size 1 --log_samples --log_samples_suffix llava_v1.5_mme_mmbenchen --output_path ./logs/
視覺競(jìng)技場(chǎng)和開放 VLM 排行榜都僅限于提交給它們的模型,且需要更新才能添加新模型。如果你想查找其他模型,可以在
image-text-to-text
任務(wù)下瀏覽 hub 中的
模型
。
在排行榜中,你會(huì)看到各種不同的用于評(píng)估視覺語言模型的基準(zhǔn),下面我們選擇其中幾個(gè)介紹一下。
針對(duì)專家型 AGI 的海量、多學(xué)科、多模態(tài)理解與推理基準(zhǔn) (A Massive Multi-discipline Multimodal Understanding and Reasoning Benchmark for Expert AGI,MMMU) 是評(píng)估視覺語言模型的最全面的基準(zhǔn)。它包含 11.5K 個(gè)多模態(tài)問題,這些問題需要大學(xué)水平的學(xué)科知識(shí)以及跨學(xué)科 (如藝術(shù)和工程) 推理能力。
MMBench
由涵蓋超過 20 種不同技能的 3000 道單選題組成,包括 OCR、目標(biāo)定位等。論文還介紹了一種名為
CircularEval
的評(píng)估策略,其每輪都會(huì)對(duì)問題的選項(xiàng)進(jìn)行不同的組合及洗牌,并期望模型每輪都能給出正確答案。
另外,針對(duì)不同的應(yīng)用領(lǐng)域還有其他更有針對(duì)性的基準(zhǔn),如 MathVista (視覺數(shù)學(xué)推理) 、AI2D (圖表理解) 、ScienceQA (科學(xué)問答) 以及 OCRBench (文檔理解)。
對(duì)視覺語言模型進(jìn)行預(yù)訓(xùn)練的方法很多。主要技巧是統(tǒng)一圖像和文本表征以將其輸入給文本解碼器用于文本生成。最常見且表現(xiàn)最好的模型通常由圖像編碼器、用于對(duì)齊圖像和文本表征的嵌入投影子模型 (通常是一個(gè)稠密神經(jīng)網(wǎng)絡(luò)) 以及文本解碼器按序堆疊而成。至于訓(xùn)練部分,不同的模型采用的方法也各不相同。
例如,LLaVA 由 CLIP 圖像編碼器、多模態(tài)投影子模型和 Vicuna 文本解碼器組合而成。作者將包含圖像和描述文本的數(shù)據(jù)集輸入 GPT-4,讓其描述文本和圖像生成相關(guān)的問題。作者凍結(jié)了圖像編碼器和文本解碼器,僅通過給模型饋送圖像與問題并將模型輸出與描述文本進(jìn)行比較來訓(xùn)練多模態(tài)投影子模型,從而達(dá)到對(duì)齊圖像和文本特征的目的。在對(duì)投影子模型預(yù)訓(xùn)練之后,作者把圖像編碼器繼續(xù)保持在凍結(jié)狀態(tài),解凍文本解碼器,然后繼續(xù)對(duì)解碼器和投影子模型進(jìn)行訓(xùn)練。這種預(yù)訓(xùn)練加微調(diào)的方法是訓(xùn)練視覺語言模型最常見的做法。
再舉一個(gè) KOSMOS-2 的例子,作者選擇了端到端地對(duì)模型進(jìn)行完全訓(xùn)練的方法,這種方法與 LLaVA 式的預(yù)訓(xùn)練方法相比,計(jì)算上昂貴不少。預(yù)訓(xùn)練完成后,作者還要用純語言指令對(duì)模型進(jìn)行微調(diào)以對(duì)齊。還有一種做法,F(xiàn)uyu-8B 甚至都沒有圖像編碼器,直接把圖像塊饋送到投影子模型,然后將其輸出與文本序列直接串接送給自回歸解碼器。
大多數(shù)時(shí)候,我們不需要預(yù)訓(xùn)練視覺語言模型,僅需使用現(xiàn)有的模型進(jìn)行推理,抑或是根據(jù)自己的場(chǎng)景對(duì)其進(jìn)行微調(diào)。下面,我們介紹如何在
transformers
中使用這些模型,以及如何使用
SFTTrainer
對(duì)它們進(jìn)行微調(diào)。
你可以使用
LlavaNext
模型對(duì) Llava 進(jìn)行推理,如下所示。
首先,我們初始化模型和數(shù)據(jù)處理器。
from transformers import LlavaNextProcessor, LlavaNextForConditionalGeneration
import torch
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
processor = LlavaNextProcessor.from_pretrained("llava-hf/llava-v1.6-mistral-7b-hf")
model = LlavaNextForConditionalGeneration.from_pretrained(
"llava-hf/llava-v1.6-mistral-7b-hf",
torch_dtype=torch.float16,
low_cpu_mem_usage=True
)
model.to(device)
現(xiàn)在,將圖像和文本提示傳給數(shù)據(jù)處理器,然后將處理后的輸入傳給
generate
方法。請(qǐng)注意,每個(gè)模型都有自己的提示模板,請(qǐng)務(wù)必根據(jù)模型選用正確的模板,以避免性能下降。
from PIL import Image
import requests
url = "https://github.com/haotian-liu/LLaVA/blob/1a91fc274d7c35a9b50b3cb29c4247ae5837ce39/images/llava_v1_5_radar.jpg?raw=true"
image = Image.open(requests.get(url, stream=True).raw)
prompt = "[INST] \nWhat is shown in this image? [/INST]"
inputs = processor(prompt, image, return_tensors="pt").to(device)
output = model.generate(**inputs, max_new_tokens=100)
調(diào)用
decode
對(duì)輸出詞元進(jìn)行解碼。
print(processor.decode(output[0], skip_special_tokens=True))
我們很高興地宣布,作為一個(gè)實(shí)驗(yàn)性功能,
TRL
的
SFTTrainer
現(xiàn)已支持視覺語言模型!這里,我們給出了一個(gè)例子,以展示如何在
llava-instruct
數(shù)據(jù)集上進(jìn)行 SFT,該數(shù)據(jù)集包含 260k 個(gè)圖像對(duì)話對(duì)。
llava-instruct
數(shù)據(jù)集將用戶與助理之間的交互組織成消息序列的格式,且每個(gè)消息序列皆與用戶問題所指的圖像配對(duì)。
要用上 VLM 訓(xùn)練的功能,你必須使用
pip install -U trl
安裝最新版本的 TRL。你可在
此處
找到完整的示例腳本。
from trl.commands.cli_utils import SftScriptArguments, TrlParser
parser = TrlParser((SftScriptArguments, TrainingArguments))
args, training_args = parser.parse_args_and_config()
初始化聊天模板以進(jìn)行指令微調(diào)。
LLAVA_CHAT_TEMPLATE = """A chat between a curious user and an artificial intelligence assistant. The assistant gives helpful, detailed, and polite answers to the user's questions. {% for message in messages %}{% if message['role'] == 'user' %}USER: {% else %}ASSISTANT: {% endif %}{% for item in message['content'] %}{% if item['type'] == 'text' %}{{ item['text'] }}{% elif item['type'] == 'image' %}{% endif %}{% endfor %}{% if message['role'] == 'user' %} {% else %}{{eos_token}}{% endif %}{% endfor %}"""
現(xiàn)在,初始化模型和分詞器。
from transformers import AutoTokenizer, AutoProcessor, TrainingArguments, LlavaForConditionalGeneration
import torch
model_id = "llava-hf/llava-1.5-7b-hf"
tokenizer = AutoTokenizer.from_pretrained(model_id)
tokenizer.chat_template = LLAVA_CHAT_TEMPLATE
processor = AutoProcessor.from_pretrained(model_id)
processor.tokenizer = tokenizer
model = LlavaForConditionalGeneration.from_pretrained(model_id, torch_dtype=torch.float16)
建一個(gè)數(shù)據(jù)整理器來組合文本和圖像對(duì)。
class LLavaDataCollator:
def __init__(self, processor):
self.processor = processor
def __call__(self, examples):
texts = []
images = []
for example in examples:
messages = example["messages"]
text = self.processor.tokenizer.apply_chat_template(
messages, tokenize=False, add_generation_prompt=False
)
texts.append(text)
images.append(example["images"][0])
batch = self.processor(texts, images, return_tensors="pt", padding=True)
labels = batch["input_ids"].clone()
if self.processor.tokenizer.pad_token_id is not None:
labels[labels == self.processor.tokenizer.pad_token_id] = -100
batch["labels"] = labels
return batch
data_collator = LLavaDataCollator(processor)
加載數(shù)據(jù)集。
from datasets import load_dataset
raw_datasets = load_dataset("HuggingFaceH4/llava-instruct-mix-vsft")
train_dataset = raw_datasets["train"]
eval_dataset = raw_datasets["test"]
初始化
SFTTrainer
,傳入模型、數(shù)據(jù)子集、PEFT 配置以及數(shù)據(jù)整理器,然后調(diào)用
train()
。要將最終 checkpoint 推送到 Hub,需調(diào)用
push_to_hub()
。
from trl import SFTTrainer
trainer = SFTTrainer(
model=model,
args=training_args,
train_dataset=train_dataset,
eval_dataset=eval_dataset,
dataset_text_field="text", # need a dummy field
tokenizer=tokenizer,
data_collator=data_collator,
dataset_kwargs={"skip_prepare_dataset": True},
)
trainer.train()
保存模型并推送到 Hugging Face Hub。
trainer.save_model(training_args.output_dir)
trainer.push_to_hub()
你可在 此處 找到訓(xùn)得的模型。你也可以通過下面的頁面試玩一下我們訓(xùn)得的模型??。
致謝
我們感謝 Pedro Cuenca、Lewis Tunstall、Kashif Rasul 和 Omar Sanseviero 對(duì)本文的評(píng)論和建議。
英文原文: https://hf.co/blog/vlms
原文作者: Merve Noyan,Edward Beeching
譯者: Matrix Yao (姚偉峰),英特爾深度學(xué)習(xí)工程師,工作方向?yàn)?transformer-family 模型在各模態(tài)數(shù)據(jù)上的應(yīng)用及大規(guī)模模型的訓(xùn)練推理。
機(jī)器學(xué)習(xí):神經(jīng)網(wǎng)絡(luò)構(gòu)建(下)
閱讀華為Mate品牌盛典:HarmonyOS NEXT加持下游戲性能得到充分釋放
閱讀實(shí)現(xiàn)對(duì)象集合與DataTable的相互轉(zhuǎn)換
閱讀鴻蒙NEXT元服務(wù):論如何免費(fèi)快速上架作品
閱讀算法與數(shù)據(jù)結(jié)構(gòu) 1 - 模擬
閱讀5. Spring Cloud OpenFeign 聲明式 WebService 客戶端的超詳細(xì)使用
閱讀Java代理模式:靜態(tài)代理和動(dòng)態(tài)代理的對(duì)比分析
閱讀Win11筆記本“自動(dòng)管理應(yīng)用的顏色”顯示規(guī)則
閱讀本站所有軟件,都由網(wǎng)友上傳,如有侵犯你的版權(quán),請(qǐng)發(fā)郵件[email protected]
湘ICP備2022002427號(hào)-10 湘公網(wǎng)安備:43070202000427號(hào)© 2013~2025 haote.com 好特網(wǎng)