Transformers 文档
VipLlava
并获取增强的文档体验
开始使用
VipLlava
概述
VipLlava 模型在 Making Large Multimodal Models Understand Arbitrary Visual Prompts 中被提出,作者为 Mu Cai, Haotian Liu, Siva Karthik Mustikovela, Gregory P. Meyer, Yuning Chai, Dennis Park, Yong Jae Lee。
VipLlava 通过在训练期间标记图像并使用自然提示(如“红色边框”或“指向箭头”)与模型交互,从而增强了 Llava 的训练协议。
该论文的摘要如下:
虽然现有的大型视觉-语言多模态模型侧重于整体图像理解,但在实现特定区域的理解方面存在显著差距。目前使用文本坐标或空间编码的方法通常无法为视觉提示提供用户友好的界面。为了应对这一挑战,我们引入了一种新型的多模态模型,该模型能够解码任意视觉提示。这允许用户直观地标记图像,并使用自然提示(如“红色边框”或“指向箭头”)与模型进行交互。我们简单的设计直接将视觉标记叠加到 RGB 图像上,无需复杂的区域编码,但在区域理解任务(如 Visual7W、PointQA 和 Visual Commonsense Reasoning 基准测试)上实现了最先进的性能。此外,我们提出了 ViP-Bench,这是一个全面的基准测试,用于评估模型在理解跨多个维度的视觉提示方面的能力,从而推动该领域未来的研究。代码、数据和模型已公开可用。
原始代码可以在这里找到。
此模型由 Younes Belkada 贡献。
使用技巧:
该架构与 llava 架构类似,不同之处在于多模态投影器采用一组连接的视觉隐藏状态,并且在该模块上有一个额外的 layernorm 层。
我们建议用户在计算批量生成时使用
padding_side="left"
,因为它会带来更准确的结果。只需确保在生成之前调用processor.tokenizer.padding_side = "left"
。请注意,该模型尚未经过明确训练以处理同一提示中的多张图像,尽管这在技术上是可能的,但您可能会遇到不准确的结果。
[!NOTE] 在 v4.46 版本之后,LLaVA 模型会引发关于添加
processor.patch_size = {{patch_size}}
、processor.num_additional_image_tokens = {{num_additional_image_tokens}}
和 processor.vision_feature_select_strategy = {{vision_feature_select_strategy}} 的警告。强烈建议如果您拥有模型检查点,则将这些属性添加到处理器,或者如果不是您拥有的,则打开一个 PR。添加这些属性意味着 LLaVA 将尝试推断每张图像所需的图像令牌数量,并使用尽可能多的
<image>占位符扩展文本,因为会有令牌。通常,每张图像大约需要 500 个令牌,因此请确保文本没有被截断,否则在合并嵌入时会发生故障。这些属性可以从模型配置中获得,如
model.config.vision_config.patch_size或
model.config.vision_feature_select_strategy。如果视觉骨干网络添加了 CLS 令牌,则
num_additional_image_tokens应为
1,如果视觉补丁没有添加任何额外内容,则应为
0`。
- 为了获得更好的结果,我们建议用户使用处理器的
apply_chat_template()
方法来正确格式化您的提示。为此,您需要构建对话历史记录,传入纯字符串将不会格式化您的提示。聊天模板的对话历史记录中的每条消息都是一个字典,其中包含键“role”和“content”。“content”应该是一个字典列表,用于“text”和“image”模态,如下所示:
from transformers import AutoProcessor
processor = AutoProcessor.from_pretrained("llava-hf/vip-llava-7b-hf")
conversation = [
{
"role": "user",
"content": [
{"type": "image"},
{"type": "text", "text": "What’s shown in this image?"},
],
},
{
"role": "assistant",
"content": [{"type": "text", "text": "This image shows a red stop sign."},]
},
{
"role": "user",
"content": [
{"type": "text", "text": "Describe the image in more details."},
],
},
]
text_prompt = processor.apply_chat_template(conversation, add_generation_prompt=True)
# Note that the template simply formats your prompt, you still have to tokenize it and obtain pixel values for your images
print(text_prompt)
>>> "###Human: <image>\nWhat’s shown in this image?###Assistant: This image shows a red stop sign.###Human: Describe the image in more details.###Assistant:"
- 如果您想自己构建聊天提示,以下是 VipLLaVa 检查点接受的提示格式列表:
A chat between a curious human and an artificial intelligence assistant. The assistant gives helpful, detailed, and polite answers to the human's questions.###Human: <image>\n<prompt>###Assistant:
对于多轮对话
A chat between a curious human and an artificial intelligence assistant. The assistant gives helpful, detailed, and polite answers to the human's questions.###Human: <image>\n<prompt1>###Assistant: <answer1>###Human: <prompt2>###Assistant:
VipLlavaConfig
class transformers.VipLlavaConfig
< source >( vision_config = None text_config = None image_token_index = 32000 projector_hidden_act = 'gelu' projector_layernorm_eps = 1e-05 vision_feature_layers = [-2, -5, -8, -11, 6] image_seq_length = 576 **kwargs )
参数
- vision_config (
VipLlavaVisionConfig
, 可选) — 自定义视觉配置或字典 - text_config (
Union[AutoConfig, dict]
, 可选) — 文本骨干网络的配置对象。可以是LlamaConfig
或MistralConfig
中的任何一个。 - image_token_index (
int
, 可选, 默认为 32000) — 用于编码图像提示的图像令牌索引。 - projector_hidden_act (
str
, 可选, 默认为"gelu"
) — 多模态投影器使用的激活函数。 - projector_layernorm_eps (
float
, 可选, 默认为 1e-05) — 投影器 layernorm 的 layer norm epsilon - vision_feature_layers (
Union[int, List[int]]
, 可选, 默认为[-2, -5, -8, -11, 6]
) — 视觉特征层,或用于从中选择视觉特征的层列表。 - image_seq_length (
int
, 可选, 默认为 576) — 单个图像嵌入的序列长度。
这是用于存储 VipLlavaForConditionalGeneration 配置的配置类。它用于根据指定的参数实例化 VipLlava 模型,定义模型架构。使用默认值实例化配置将产生与 VipLlava-9B 类似的配置。
配置对象继承自 PretrainedConfig,可用于控制模型输出。阅读 PretrainedConfig 的文档以获取更多信息。
示例
>>> from transformers import VipLlavaForConditionalGeneration, VipLlavaConfig, CLIPVisionConfig, LlamaConfig
>>> # Initializing a CLIP-vision config
>>> vision_config = CLIPVisionConfig()
>>> # Initializing a Llama config
>>> text_config = LlamaConfig()
>>> # Initializing a VipLlava vipllava-7b style configuration
>>> configuration = VipLlavaConfig(vision_config, text_config)
>>> # Initializing a model from the vipllava-7b style configuration
>>> model = VipLlavaForConditionalGeneration(configuration)
>>> # Accessing the model configuration
>>> configuration = model.config
VipLlavaForConditionalGeneration
class transformers.VipLlavaForConditionalGeneration
< source >( config: VipLlavaConfig )
参数
- config (VipLlavaConfig 或
VipLlavaVisionConfig
) — 包含模型所有参数的模型配置类。使用配置文件初始化不会加载与模型相关的权重,仅加载配置。查看 from_pretrained() 方法以加载模型权重。
VIPLLAVA 模型由视觉骨干网络和语言模型组成。此模型继承自 PreTrainedModel。查看超类文档以获取库为其所有模型实现的通用方法(例如下载或保存、调整输入嵌入大小、剪枝头等)。
此模型也是 PyTorch torch.nn.Module 子类。将其用作常规 PyTorch 模块,并参考 PyTorch 文档以了解与通用用法和行为相关的所有事项。
forward(前向传播)
< source >( input_ids: LongTensor = None pixel_values: FloatTensor = None attention_mask: typing.Optional[torch.Tensor] = None position_ids: typing.Optional[torch.LongTensor] = None past_key_values: typing.Optional[typing.List[torch.FloatTensor]] = None inputs_embeds: typing.Optional[torch.FloatTensor] = None vision_feature_layers: typing.Union[int, typing.List[int], NoneType] = None labels: typing.Optional[torch.LongTensor] = None use_cache: typing.Optional[bool] = None output_attentions: typing.Optional[bool] = None output_hidden_states: typing.Optional[bool] = None return_dict: typing.Optional[bool] = None cache_position: typing.Optional[torch.LongTensor] = None logits_to_keep: typing.Union[int, torch.Tensor] = 0 **lm_kwargs ) → transformers.models.vipllava.modeling_vipllava.VipLlavaCausalLMOutputWithPast
或 tuple(torch.FloatTensor)
参数
- input_ids (
torch.LongTensor
类型,形状为(batch_size, sequence_length)
) — 词汇表中输入序列标记的索引。如果您提供填充,默认情况下将忽略填充。索引可以使用 AutoTokenizer 获得。有关详细信息,请参阅 PreTrainedTokenizer.encode() 和 PreTrainedTokenizer.call()。
- pixel_values (
torch.FloatTensor
类型,形状为(batch_size, num_channels, image_size, image_size))
) -- 与输入图像对应的张量。像素值可以使用 [AutoImageProcessor](/docs/transformers/v4.50.0/en/model_doc/auto#transformers.AutoImageProcessor) 获得。有关详细信息,请参阅 [CLIPImageProcessor.__call__()](/docs/transformers/v4.50.0/en/model_doc/vilt#transformers.ViltFeatureExtractor.__call__) ([`LlavaProcessor`] 使用 CLIPImageProcessor 处理图像)。 - attention_mask (
torch.Tensor
类型,形状为(batch_size, sequence_length)
, *可选*) — 掩码,用于避免对填充标记索引执行注意力机制。掩码值在[0, 1]
中选择:- 1 表示未被掩码的标记,
- 0 表示被掩码的标记。
索引可以使用 AutoTokenizer 获得。有关详细信息,请参阅 PreTrainedTokenizer.encode() 和 PreTrainedTokenizer.call()。
如果使用
past_key_values
,则可以选择仅输入最后的decoder_input_ids
(请参阅past_key_values
)。如果您想更改填充行为,则应阅读
modeling_opt._prepare_decoder_attention_mask
并根据您的需要进行修改。有关默认策略的更多信息,请参见 论文 中的图 1。- 1 表示 head 未被掩码,
- 0 表示 head 被掩码。
- position_ids (
torch.LongTensor
类型,形状为(batch_size, sequence_length)
, *可选*) — 每个输入序列标记在位置嵌入中的位置索引。在范围[0, config.n_positions - 1]
中选择。 什么是位置 ID? - past_key_values (
tuple(tuple(torch.FloatTensor))
类型, *可选*, 当传递use_cache=True
或当config.use_cache=True
时返回) — 长度为config.n_layers
的tuple(tuple(torch.FloatTensor))
元组,其中每个元组都有 2 个形状为(batch_size, num_heads, sequence_length, embed_size_per_head)
的张量和 2 个形状为(batch_size, num_heads, encoder_sequence_length, embed_size_per_head)
的附加张量。包含预先计算的隐藏状态(自注意力模块和交叉注意力模块中的键和值),可以用于(请参阅
past_key_values
输入)加速顺序解码。如果使用
past_key_values
,则用户可以选择仅输入最后的decoder_input_ids
(那些没有将其过去的键值状态提供给此模型的)形状为(batch_size, 1)
,而不是所有形状为(batch_size, sequence_length)
的decoder_input_ids
。 - inputs_embeds (
torch.FloatTensor
类型,形状为(batch_size, sequence_length, hidden_size)
, *可选*) — 可选地,您可以选择直接传递嵌入表示,而不是传递input_ids
。如果您希望比模型的内部嵌入查找矩阵更灵活地控制如何将input_ids
索引转换为关联向量,这将非常有用。 - use_cache (
bool
类型, *可选*) — 如果设置为True
,则返回past_key_values
键值状态,并且可以用于加速解码(请参阅past_key_values
)。 - output_attentions (
bool
类型, *可选*) — 是否返回所有注意力层的注意力张量。有关更多详细信息,请参见返回张量下的attentions
。 - output_hidden_states (
bool
类型, *可选*) — 是否返回所有层的隐藏状态。有关更多详细信息,请参见返回张量下的hidden_states
。 - return_dict (
bool
类型, *可选*) — 是否返回 ModelOutput 而不是普通元组。 - cache_position (
torch.LongTensor
类型,形状为(sequence_length)
, *可选*) — 描述输入序列标记在序列中位置的索引。与position_ids
相反,此张量不受填充的影响。它用于在正确的位置更新缓存,并推断完整的序列长度。 - labels (
torch.LongTensor
类型,形状为(batch_size, sequence_length)
, *可选*) — 用于计算掩码语言建模损失的标签。索引应在[0, ..., config.vocab_size]
或 -100 中(请参阅input_ids
文档字符串)。索引设置为-100
的标记将被忽略(掩码),损失仅针对标签在[0, ..., config.vocab_size]
中的标记计算。 - logits_to_keep (
int
或torch.Tensor
类型, *可选*) — 如果是int
,则计算最后logits_to_keep
个标记的 logits。如果为0
,则计算所有input_ids
的 logits(特殊情况)。生成只需要最后一个标记 logits,并且仅为该标记计算它们可以节省内存,这对于长序列或大词汇量大小而言变得非常重要。如果为torch.Tensor
,则必须是与序列长度维度中要保留的索引相对应的 1D 张量。当使用打包张量格式(批次和序列长度的单个维度)时,这非常有用。
返回值
transformers.models.vipllava.modeling_vipllava.VipLlavaCausalLMOutputWithPast
或 tuple(torch.FloatTensor)
一个 transformers.models.vipllava.modeling_vipllava.VipLlavaCausalLMOutputWithPast
或 torch.FloatTensor
的元组(如果传递 return_dict=False
或当 config.return_dict=False
时),包括各种元素,具体取决于配置 (VipLlavaConfig) 和输入。
-
loss (
torch.FloatTensor
类型,形状为(1,)
, *可选*, 当提供labels
时返回) — 语言建模损失(用于下一个标记预测)。 -
logits (
torch.FloatTensor
类型,形状为(batch_size, sequence_length, config.vocab_size)
) — 语言建模头的预测分数(SoftMax 之前每个词汇表标记的分数)。 -
past_key_values (
tuple(tuple(torch.FloatTensor))
类型, *可选*, 当传递use_cache=True
或当config.use_cache=True
时返回) — 长度为config.n_layers
的tuple(tuple(torch.FloatTensor))
元组,其中每个元组都有 2 个形状为(batch_size, num_heads, sequence_length, embed_size_per_head)
的张量)包含预先计算的隐藏状态(自注意力模块中的键和值),可以用于(请参阅
past_key_values
输入)加速顺序解码。 -
hidden_states (
tuple(torch.FloatTensor)
类型, *可选*, 当传递output_hidden_states=True
或当config.output_hidden_states=True
时返回) —torch.FloatTensor
的元组(如果模型具有嵌入层,则为嵌入输出的元组 + 每个层输出的元组),形状为(batch_size, sequence_length, hidden_size)
。模型在每个层输出处的隐藏状态加上可选的初始嵌入输出。
-
attentions (
tuple(torch.FloatTensor)
类型, *可选*, 当传递output_attentions=True
或当config.output_attentions=True
时返回) —torch.FloatTensor
的元组(每层一个),形状为(batch_size, num_heads, sequence_length, sequence_length)
。注意力 softmax 之后的注意力权重,用于计算自注意力头中的加权平均值。
-
image_hidden_states (
torch.FloatTensor
类型, *可选*) — 大小为 (batch_size, num_images, sequence_length, hidden_size)` 的 `torch.FloatTensor`。由视觉编码器生成并在投影最后一个隐藏状态之后的模型的 image_hidden_states。
VipLlavaForConditionalGeneration 前向传播方法,覆盖了 __call__
特殊方法。
尽管前向传播的配方需要在该函数中定义,但应该在此之后调用 Module
实例,而不是调用此函数,因为前者负责运行预处理和后处理步骤,而后者会默默地忽略它们。
示例
>>> import torch
>>> from PIL import Image
>>> import requests
>>> from transformers import AutoProcessor, VipLlavaForConditionalGeneration
>>> model = VipLlavaForConditionalGeneration.from_pretrained("llava-hf/vip-llava-7b-hf", device_map="auto", torch_dtype=torch.float16)
>>> processor = AutoProcessor.from_pretrained("llava-hf/vip-llava-7b-hf")
>>> prompt = "A chat between a curious human and an artificial intelligence assistant. The assistant gives helpful, detailed, and polite answers to the human's questions.###Human: <image>\n{}###Assistant:"
>>> question = "Can you please describe this image?"
>>> prompt = prompt.format(question)
>>> url = "https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/diffusers/compel-neg.png"
>>> image = Image.open(requests.get(url, stream=True).raw)
>>> inputs = processor(text=text, images=image, return_tensors="pt").to(0, torch.float16)
>>> # Generate
>>> generate_ids = model.generate(**inputs, max_new_tokens=20)
>>> processor.decode(generate_ids[0][len(inputs["input_ids"][0]):], skip_special_tokens=True)
The image features a brown and white cat sitting on a green surface, with a red ball in its