多模态大模型概述

“ 早上微软的wizardLM(博客、模型官方版本已删除,能找到网友上传的) 和 Reka AI(有博客,未发布模型) 的大模型比较火。但是懒得写了。今天arxiv挂的文章没啥好玩的,复制一个hf的博客过来


        
          
https://huggingface.co/blog/vlms  

      

视觉语言模型是可以同时从图像和文本中学习以处理许多任务的模型,从视觉问答到图像标题。在这篇文章中,我们将介绍视觉语言模型的主要构建块:概述,掌握它们的工作原理,弄清楚如何找到正确的模型,如何使用它们进行推理,以及如何使用今天发布的新版本 trl 轻松微调它们!

什么是视觉语言模型?

视觉语言模型被广泛定义为可以从图像和文本中学习的多模态模型。它们是一种生成模型,用于获取图像和文本输入,并生成文本输出。大型视觉语言模型具有良好的零样本能力,可以很好地泛化,并且可以处理多种类型的图像,包括文档、网页等。用例包括聊天图像、通过说明进行图像识别、视觉问答、文档理解、图像标题等。一些视觉语言模型还可以捕获图像中的空间属性。当系统提示检测或分割特定主体时,这些模型可以输出边界框或分割掩码,或者它们可以定位不同的实体或回答有关其相对或绝对位置的问题。现有的大型视觉语言模型集、它们所训练的数据、它们如何编码图像以及它们的能力都存在很多多样性。

picture.image

开源视觉语言模型概述

Hugging Face Hub 上有许多开源的视觉语言模型。下表显示了一些最突出的。

  • 有基本模型,以及针对聊天进行微调的模型,可以在对话模式下使用。
  • 其中一些模型具有称为“grounding”的功能,可减少模型幻觉。
  • 除非另有说明,否则所有模型均接受英语训练。

picture.image

寻找合适的视觉语言模型

有很多方法可以为您的用例选择最合适的模型。

Vision Arena是一个视觉大模型排行榜,完全基于模型输出的匿名投票,并不断更新。在这个场景中,用户输入图像和提示,并匿名采样来自两个不同模型的输出,然后用户可以选择他们喜欢的输出。这样,排行榜就完全基于人类的喜好来构建。


        
          
https://huggingface.co/spaces/WildVision/vision-arena  

      

picture.image

Open VLM Leaderboard 是另一个排行榜,其中根据这些指标和平均分数对各种视觉语言模型进行排名。您还可以根据模型大小、专有或开源许可证筛选模型,并针对不同的指标进行排名。


        
          
https://huggingface.co/spaces/opencompass/open_vlm_leaderboard  

      

picture.image

VLMEvalKit 是一个工具包,用于在为 Open VLM 排行榜提供支持的视觉语言模型上运行基准测试。另一个评估套件是 LMMS-Eval,它提供了一个标准的命令行界面,用于使用 Hugging Face Hub 上托管的数据集来评估您选择的 Hugging Face 模型,如下所示:


        
          
https://github.com/open-compass/VLMEvalKit  
https://github.com/EvolvingLMMs-Lab/lmms-eval  
  
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/   

      

在排行榜中可能会遇到不同的基准来评估视觉语言模型。我们将介绍MMMU和MMBench

MMMU公司 MMMU 是评估视觉语言模型的最全面的基准。它包含 11.5K 多模态挑战,需要跨艺术和工程等不同学科的大学水平学科知识和推理。

MMBench

MMBench 是一个评估基准测试,由 3000 道单选题组成,涉及 20 种不同的技能,包括 OCR、对象定位等。本文还介绍了一种称为CircularEval的评估策略,其中问题的答案选择以不同的组合进行洗牌,并且该模型期望在每个转折点都给出正确的答案。在不同领域还有其他更具体的基准测试,包括 MathVista(视觉数学推理)、AI2D(图表理解)、ScienceQA(科学问答)和 OCRBench(文档理解)。

技术细节

有多种方法可以预训练视觉语言模型。主要诀窍是统一图像和文本表示,并将其提供给文本解码器进行生成。最常见和最突出的模型通常由图像编码器、用于对齐图像和文本表示的嵌入(通常是密集神经网络)和按此顺序堆叠的文本解码器组成。至于训练部分,不同的模型一直遵循不同的方法。

例如,LLaVA由CLIP图像编码器、多模态投影器和Vicuna文本解码器组成。作者将一组图像和标题的数据集输入到GPT-4中,并生成与标题和图像相关的问题。作者冻结了图像编码器和文本解码器,仅训练了多模态投影器,通过向模型输入图像和生成的问题,并将模型输出与真实标题进行比较,来对齐图像和文本特征。在投影器预训练后,他们保持图像编码器冻结,解冻文本解码器,并与投影器一起训练。这种预训练和微调的方式是训练视觉语言模型最常见的方法。

picture.image

picture.image

另一个例子是 KOSMOS-2,作者选择端到端地完全训练模型,与类似 LLaVA 的预训练相比,这在计算上很昂贵。作者后来进行了纯语言教学微调,以对齐模型。另一个例子是,Fuyu-8B甚至没有图像编码器。取而代之的是,图像块直接馈送到投影层,然后序列通过自动回归解码器。大多数情况下,你不需要预先训练视觉语言模型,因为你可以使用现有的模型之一,也可以根据自己的用例对它们进行微调。我们将介绍如何使用 transformers 使用这些模型,并使用SFTTrainer进行微调。

将视觉语言模型与transformers配合使用

您可以使用如下所示的模型对 Llava 进行推断。LlavaNext

让我们先初始化模型和处理器。


        
          
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)  

      

现在,我们将图像和文本提示传递给处理器,然后将处理后的输入传递给 .请注意,每个模型都使用自己的提示模板,请注意使用正确的模板以避免性能下降。


        
          
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] <image>\nWhat is shown in this image? [/INST]"  
  
inputs = processor(prompt, image, return_tensors="pt").to(device)  
output = model.generate(**inputs, max_new_tokens=100)  

      

调用 decode 以解码输出令牌。


        
          
print(processor.decode(output[0], skip_special_tokens=True))  

      
使用 TRL 微调视觉语言模型

TRL现在包括对视觉语言模型的实验性支持!我们在这里提供了一个示例,说明如何使用包含 260k 图像对话对的 llava-instruct 数据集在 Llava 1.5 VLM 上执行 SFT。数据集包含格式化为消息序列的用户助手交互。

要使用实验性 VLM 训练支持,必须安装最新版本的 TRL


        
          
from trl.commands.cli_utils import SftScriptArguments, TrlParser  
  
parser = TrlParser((SftScriptArguments, TrainingArguments))  
args, training_args = parser.parse_args_and_config()  

      

初始化聊天模板以进行指令微调。


        
          
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' %}<image>{% endif %}{% endfor %}{% if message['role'] == 'user' %} {% else %}{{eos\_token}}{% endif %}{% endfor %}"""  

      

现在,我们将初始化我们的模型和分词器。


        
          
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)  

      

让我们创建一个数据整理器来组合文本和图像对。


        
          
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)  

      

加载我们的数据集。


        
          
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,传入模型,数据集拆分,PEFT配置和数据整理器并调用。要将我们的最后一个检查点推送到中心,请调用 。train()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()  

      

保存模型


        
          
trainer.save_model(training_args.output_dir)  
trainer.push_to_hub()  

      

最后,hf开源了Idefics2 8B 视觉多模态模型


        
          
https://huggingface.co/HuggingFaceM4/idefics2-8b  

      
0
0
0
0
评论
未登录
暂无评论