Transformers 文件
LLaVA-NeXT
並獲得增強的文件體驗
開始使用
LLaVA-NeXT
概述
LLaVA-NeXT 模型由 Haotian Liu、Chunyuan Li、Yuheng Li、Bo Li、Yuanhan Zhang、Sheng Shen、Yong Jae Lee 在 LLaVA-NeXT: 改進的推理、OCR 和世界知識 中提出。LLaVA-NeXT(也稱為 LLaVA-1.6)透過增加輸入影像解析度和在改進的視覺指令微調資料集上進行訓練,在 LLaVA 的基礎上進行了改進,以提高 OCR 和常識推理能力。
該部落格的介紹如下:
*2023 年 10 月,我們釋出了 LLaVA-1.5,它具有簡單高效的設計,並在 12 個數據集的基準套件上表現出色。自那時以來,它已成為許多關於大型多模態模型 (LMM) 資料、模型和能力的綜合研究的基礎,並支援了各種新應用。
今天,我們很高興推出 LLaVA-NeXT,它在推理、OCR 和世界知識方面有所改進。LLaVA-NeXT 在多項基準測試中甚至超越了 Gemini Pro。
與 LLaVA-1.5 相比,LLaVA-NeXT 有多項改進:
將輸入影像解析度提高到 4 倍畫素。這使其能夠捕捉更多視覺細節。它支援三種寬高比,最高可達 672x672、336x1344、1344x336 解析度。透過改進的視覺指令微調資料混合,實現了更好的視覺推理和 OCR 能力。針對更多場景(涵蓋不同應用)進行了更好的視覺對話。更好的世界知識和邏輯推理。透過 SGLang 實現高效部署和推理。除了效能改進,LLaVA-NeXT 保持了 LLaVA-1.5 的極簡設計和資料效率。它重用了 LLaVA-1.5 的預訓練聯結器,並且仍然使用不到 1M 的視覺指令微調樣本。最大的 34B 變體在約 1 天內使用 32 個 A100 完成訓練。*

此模型由 nielsr 貢獻。原始程式碼可以在 這裡 找到。
使用技巧
- 我們建議使用者在計算批生成時使用
padding_side="left"
,因為它能帶來更準確的結果。只需確保在生成前呼叫processor.tokenizer.padding_side = "left"
。
- Llava-Next 對影像使用不同數量的補丁,因此除了在處理輸入時進行的填充之外,還必須在建模程式碼內部填充輸入。如果模型處於
eval()
模式,預設設定為“左填充”,否則為“右填充”。
[!注意] 版本 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 將嘗試推斷每張影像所需的影像 token 數量,並用與 token 數量相同的<image>
佔位符來擴充套件文字。通常每張影像大約有 500 個 token,因此請確保文字沒有被截斷,否則在合併嵌入時會出現故障。這些屬性可以從模型配置中獲取,如model.config.vision_config.patch_size
或model.config.vision_feature_select_strategy
。如果視覺骨幹網路添加了 CLS token,num_additional_image_tokens
應為1
;如果沒有額外內容新增到視覺補丁中,則為0
。
使用聊天模板格式化提示
每個 **檢查點** 都經過特定提示格式的訓練,具體取決於底層大型語言模型骨幹。為確保格式正確,請使用處理器的 apply_chat_template
方法。
重要提示
- 您必須構建一個對話歷史記錄——傳遞一個純字串將不起作用。
- 每條訊息都應該是一個帶有
"role"
和"content"
鍵的字典。 "content"
應該是一個包含不同模態(如"text"
和"image"
)的字典列表。
以下是如何構建輸入的示例。我們將使用 llava-v1.6-mistral-7b-hf 以及文字和影像的對話歷史記錄。
from transformers import LlavaNextProcessor
processor = LlavaNextProcessor.from_pretrained("llava-hf/llava-v1.6-mistral-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)
>>> "[INST] <image>\nWhat's shown in this image? [/INST] This image shows a red stop sign. [INST] Describe the image in more details. [/INST]"
- 如果您想自己構建聊天提示,下面是可能格式的列表。llava-v1.6-mistral-7b-hf 需要以下格式
"[INST] <image>\nWhat is shown in this image? [/INST]"
llava-v1.6-vicuna-7b-hf 和 llava-v1.6-vicuna-13b-hf 需要以下格式
"A chat between a curious human and an artificial intelligence assistant. The assistant gives helpful, detailed, and polite answers to the human's questions. USER: <image>\nWhat is shown in this image? ASSISTANT:"
llava-v1.6-34b-hf 需要以下格式
"<|im_start|>system\nAnswer the questions.<|im_end|><|im_start|>user\n<image>\nWhat is shown in this image?<|im_end|><|im_start|>assistant\n"
llama3-llava-next-8b-hf 需要以下格式
"<|start_header_id|>system<|end_header_id|>\n\nYou are a helpful language and vision assistant. You are able to understand the visual content that the user provides, and assist the user with a variety of tasks using natural language.<|eot_id|><|start_header_id|><|start_header_id|>user<|end_header_id|>\n\n<image>\nWhat is shown in this image?<|eot_id|><|start_header_id|>assistant<|end_header_id|>\n\n"
llava-next-72b-hf 和 llava-next-110b-hf 需要以下格式
"<|im_start|>system\nYou are a helpful assistant.<|im_end|>\n<|im_start|>user\n<image>\nWhat is shown in this image?<|im_end|>\n<|im_start|>assistant\n"
🚀 福利: 如果您使用的是 transformers>=4.49.0
,您還可以從 apply_chat_template
獲取向量化輸出。有關如何使用它的更多詳細資訊,請參閱下面的 使用示例。
使用示例
單影像推理
以下是如何載入模型並以半精度 (torch.float16
) 執行推理:
from transformers import LlavaNextProcessor, LlavaNextForConditionalGeneration
import torch
from PIL import Image
import requests
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)
model.to("cuda:0")
# prepare image and text prompt, using the appropriate prompt template
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)
conversation = [
{
"role": "user",
"content": [
{"type": "image"},
{"type": "text", "text": "What is shown in this image?"},
],
},
]
prompt = processor.apply_chat_template(conversation, add_generation_prompt=True)
inputs = processor(image, prompt, return_tensors="pt").to("cuda:0")
# autoregressively complete prompt
output = model.generate(**inputs, max_new_tokens=100)
print(processor.decode(output[0], skip_special_tokens=True))
多影像推理
LLaVa-Next 可以使用多張影像作為輸入進行推理,其中影像可以屬於相同的提示或不同的提示(在批次推理中)。以下是實現方法:
import requests
from PIL import Image
import torch
from transformers import AutoProcessor, AutoModelForImageTextToText
# Load the model in half-precision
model = AutoModelForImageTextToText.from_pretrained("llava-hf/llava-v1.6-mistral-7b-hf", torch_dtype=torch.float16, device_map="auto")
processor = AutoProcessor.from_pretrained("llava-hf/llava-v1.6-mistral-7b-hf")
# Get three different images
url = "https://www.ilankelman.org/stopsigns/australia.jpg"
image_stop = Image.open(requests.get(url, stream=True).raw)
url = "http://images.cocodataset.org/val2017/000000039769.jpg"
image_cats = Image.open(requests.get(url, stream=True).raw)
url = "https://huggingface.co/microsoft/kosmos-2-patch14-224/resolve/main/snowman.jpg"
image_snowman = Image.open(requests.get(url, stream=True).raw)
# Prepare a batch of two prompts, where the first one is a multi-turn conversation and the second is not
conversation_1 = [
{
"role": "user",
"content": [
{"type": "image"},
{"type": "text", "text": "What is shown in this image?"},
],
},
{
"role": "assistant",
"content": [
{"type": "text", "text": "There is a red stop sign in the image."},
],
},
{
"role": "user",
"content": [
{"type": "image"},
{"type": "text", "text": "What about this image? How many cats do you see?"},
],
},
]
conversation_2 = [
{
"role": "user",
"content": [
{"type": "image"},
{"type": "text", "text": "What is shown in this image?"},
],
},
]
prompt_1 = processor.apply_chat_template(conversation_1, add_generation_prompt=True)
prompt_2 = processor.apply_chat_template(conversation_2, add_generation_prompt=True)
prompts = [prompt_1, prompt_2]
# We can simply feed images in the order they have to be used in the text prompt
# Each "<image>" token uses one image leaving the next for the subsequent "<image>" tokens
inputs = processor(images=[image_stop, image_cats, image_snowman], text=prompts, padding=True, return_tensors="pt").to(model.device)
# Generate
generate_ids = model.generate(**inputs, max_new_tokens=30)
processor.batch_decode(generate_ids, skip_special_tokens=True, clean_up_tokenization_spaces=False)
模型最佳化
使用 Bitsandbytes 進行量化
該模型可以載入為 8 位或 4 位,大大減少了記憶體需求,同時保持了原始模型的效能。首先,請確保安裝 bitsandbytes(pip install bitsandbytes
),並可訪問該庫支援的 GPU/加速器。
Bitsandbytes 正在重構以支援 CUDA 以外的多個後端。目前,ROCm (AMD GPU) 和 Intel CPU 的實現已經成熟,Intel XPU 正在進行中,Apple Silicon 支援預計將在第四季度/第一季度提供。有關安裝說明和最新後端更新,請訪問 此連結。
我們重視您的反饋,以幫助在完整發布之前發現錯誤!請檢視 這些文件 獲取更多詳細資訊和反饋連結。
只需將上面的程式碼片段更改為
from transformers import AutoModelForImageTextToText, BitsAndBytesConfig
# specify how to quantize the model
quantization_config = BitsAndBytesConfig(
load_in_4bit=True,
bnb_4bit_quant_type="nf4",
bnb_4bit_compute_dtype=torch.float16,
)
model = AutoModelForImageTextToText.from_pretrained("llava-hf/llava-v1.6-mistral-7b-hf", quantization_config=quantization_config, device_map="auto")
使用 Flash-Attention 2 進一步加速生成
首先請確保安裝 flash-attn。有關該軟體包的安裝,請參閱 Flash Attention 原始倉庫。只需將上面的程式碼片段更改為
from transformers import AutoModelForImageTextToText
model = AutoModelForImageTextToText.from_pretrained(
model_id,
torch_dtype=torch.float16,
use_flash_attention_2=True
).to(0)
LlavaNextConfig
class transformers.LlavaNextConfig
< 來源 >( vision_config = None text_config = None image_token_index = 32000 projector_hidden_act = 'gelu' vision_feature_select_strategy = 'default' vision_feature_layer = -2 image_grid_pinpoints = None tie_word_embeddings = False image_seq_length = 576 multimodal_projector_bias = True **kwargs )
引數
- vision_config (
Union[AutoConfig, dict]
, 可選, 預設為CLIPVisionConfig
) — 視覺骨幹的配置物件或字典。 - text_config (
Union[AutoConfig, dict]
, 可選, 預設為LlamaConfig
) — 文字骨幹的配置物件或字典。 - image_token_index (
int
, 可選, 預設為 32000) — 用於編碼影像提示的影像 token 索引。 - projector_hidden_act (
str
, 可選, 預設為"gelu"
) — 多模態投影儀使用的啟用函式。 - vision_feature_select_strategy (
str
, 可選, 預設為"default"
) — 用於從視覺骨幹選擇視覺特徵的特徵選擇策略。可以是"default"
或"full"
之一。如果為"default"
,則從視覺特徵中刪除 CLS token。如果為"full"
,則使用完整的視覺特徵。 - vision_feature_layer (
Union[int, list[int]]
, 可選, 預設為 -2) — 選擇視覺特徵的層索引。如果提供多個索引,則將相應索引的視覺特徵連線起來形成視覺特徵。 - image_grid_pinpoints (
List
, 可選, 預設為[[336, 672], [672, 336], [672, 672], [1008, 336], [336, 1008]]
) — 用於處理高解析度影像的可能解析度列表。列表中的每個專案都應為(height, width)
形式的元組或列表。 - tie_word_embeddings (
bool
, 可選, 預設為False
) — 模型的輸入和輸出詞嵌入是否應該繫結。 - image_seq_length (
int
, 可選, 預設為 576) — 單張影像嵌入的序列長度。 - multimodal_projector_bias (
bool
, 可選, 預設為True
) — 是否在多模態投影儀中使用偏置。
這是用於儲存 LlavaNextForConditionalGeneration 配置的配置類。它用於根據指定的引數例項化 Llava-NeXT 模型,定義模型架構。使用預設值例項化配置將產生與 llava-hf/llava-v1.6-mistral-7b-hf 模型類似的配置。
配置物件繼承自 PretrainedConfig,可用於控制模型輸出。有關更多資訊,請閱讀 PretrainedConfig 的文件。
示例
>>> from transformers import LlavaNextForConditionalGeneration, LlavaNextConfig, CLIPVisionConfig, LlamaConfig
>>> # Initializing a CLIP-vision config
>>> vision_config = CLIPVisionConfig()
>>> # Initializing a Llama config
>>> text_config = LlamaConfig()
>>> # Initializing a Llava-Next llava-hf/llava-v1.6-mistral-7b-hf style configuration
>>> configuration = LlavaNextConfig(vision_config, text_config)
>>> # Initializing a model from the llava-hf/llava-v1.6-mistral-7b-hf style configuration
>>> model = LlavaNextForConditionalGeneration(configuration)
>>> # Accessing the model configuration
>>> configuration = model.config
LlavaNextImageProcessor
class transformers.LlavaNextImageProcessor
< 來源 >( do_resize: bool = True size: typing.Optional[dict[str, int]] = None image_grid_pinpoints: typing.Optional[list] = None resample: Resampling = <Resampling.BICUBIC: 3> do_center_crop: bool = True crop_size: typing.Optional[dict[str, int]] = None do_rescale: bool = True rescale_factor: typing.Union[int, float] = 0.00392156862745098 do_normalize: bool = True image_mean: typing.Union[float, list[float], NoneType] = None image_std: typing.Union[float, list[float], NoneType] = None do_pad: typing.Optional[bool] = True do_convert_rgb: bool = True **kwargs )
引數
- do_resize (
bool
, 可選, 預設為True
) — 是否將影像的 (高, 寬) 尺寸調整到指定的size
。可以透過preprocess
方法中的do_resize
覆蓋。 - size (
dict[str, int]
可選, 預設為{"shortest_edge" -- 224}
): 調整大小後圖像的尺寸。影像的最短邊將調整為 size["shortest_edge"],最長邊將調整以保持輸入寬高比。可以透過preprocess
方法中的size
覆蓋。 - image_grid_pinpoints (
List
可選, 預設為[[672, 336], [336, 672], [672, 672], [336, 1008], [1008, 336]]
) — 用於處理高解析度影像的可能解析度列表。最佳解析度根據影像原始尺寸選擇。可以透過preprocess
方法中的image_grid_pinpoints
覆蓋。 - resample (
PILImageResampling
, 可選, 預設為Resampling.BICUBIC
) — 如果調整影像大小,則使用的重取樣濾波器。可以透過preprocess
方法中的resample
覆蓋。 - do_center_crop (
bool
, 可選, 預設為True
) — 是否將影像中心裁剪到指定的crop_size
。可以透過preprocess
方法中的do_center_crop
覆蓋。 - crop_size (
dict[str, int]
可選, 預設為 224) — 應用center_crop
後輸出影像的尺寸。可以透過preprocess
方法中的crop_size
覆蓋。 - do_rescale (
bool
, 可選, 預設為True
) — 是否按指定的比例rescale_factor
重新縮放影像。可以透過preprocess
方法中的do_rescale
覆蓋。 - rescale_factor (
int
或float
, 可選, 預設為1/255
) — 如果重新縮放影像,則使用的縮放因子。可以透過preprocess
方法中的rescale_factor
覆蓋。 - do_normalize (
bool
, 可選, 預設為True
) — 是否對影像進行歸一化。可以透過preprocess
方法中的do_normalize
覆蓋。 - image_mean (
float
或list[float]
, 可選, 預設為[0.48145466, 0.4578275, 0.40821073]
) — 如果歸一化影像,則使用的均值。這是一個浮點數或浮點數列表,其長度與影像中的通道數相同。可以透過preprocess
方法中的image_mean
引數覆蓋。 - image_std (
float
或list[float]
, 可選, 預設為[0.26862954, 0.26130258, 0.27577711]
) — 如果歸一化影像,則使用的標準差。這是一個浮點數或浮點數列表,其長度與影像中的通道數相同。可以透過preprocess
方法中的image_std
引數覆蓋。 - do_pad (
bool
, 可選, 預設為True
) — 是否填充影像。如果為True
,則會將批次中影像的補丁維度填充到批次中最大補丁數。填充將應用於底部和右側,並用零填充。 - do_convert_rgb (
bool
, 可選, 預設為True
) — 是否將影像轉換為 RGB。
構建一個 LLaVa-NeXT 影像處理器。基於 CLIPImageProcessor,並結合了 LLaVa 論文 中解釋的 用於處理高解析度影像的附加技術。
預處理
< 來源 >( images: typing.Union[ForwardRef('PIL.Image.Image'), numpy.ndarray, ForwardRef('torch.Tensor'), list['PIL.Image.Image'], list[numpy.ndarray], list['torch.Tensor']] do_resize: typing.Optional[bool] = None size: typing.Optional[dict[str, int]] = None image_grid_pinpoints: typing.Optional[list] = None resample: Resampling = None do_center_crop: typing.Optional[bool] = None crop_size: typing.Optional[int] = None do_rescale: typing.Optional[bool] = None rescale_factor: typing.Optional[float] = None do_normalize: typing.Optional[bool] = None image_mean: typing.Union[float, list[float], NoneType] = None image_std: typing.Union[float, list[float], NoneType] = None do_pad: typing.Optional[bool] = None do_convert_rgb: typing.Optional[bool] = None return_tensors: typing.Union[str, transformers.utils.generic.TensorType, NoneType] = None data_format: typing.Optional[transformers.image_utils.ChannelDimension] = <ChannelDimension.FIRST: 'channels_first'> input_data_format: typing.Union[str, transformers.image_utils.ChannelDimension, NoneType] = None )
引數
- images (
ImageInput
) — 要預處理的影像。需要單張或批次影像,畫素值範圍為 0 到 255。如果傳入的影像畫素值在 0 到 1 之間,請設定do_rescale=False
。 - do_resize (
bool
, 可選, 預設為self.do_resize
) — 是否調整影像大小。 - size (
dict[str, int]
, 可選, 預設為self.size
) — 調整大小後圖像的尺寸。影像的最短邊將調整為 size[“shortest_edge”],最長邊將調整為保持輸入寬高比。 - image_grid_pinpoints (
List
可選, 預設為self.image_grid_pinpoints
) — 用於處理高解析度影像的可能解析度列表。根據影像的原始尺寸選擇最佳解析度。 - resample (
int
, 可選, 預設為self.resample
) — 如果調整影像大小,則使用的重取樣過濾器。可以是列舉PILImageResampling
之一。僅當do_resize
設定為True
時才生效。 - do_center_crop (
bool
, 可選, 預設為self.do_center_crop
) — 是否對影像進行中心裁剪。 - crop_size (
dict[str, int]
, 可選, 預設為self.crop_size
) — 中心裁剪的尺寸。僅當do_center_crop
設定為True
時才生效。 - do_rescale (
bool
, 可選, 預設為self.do_rescale
) — 是否對影像進行重新縮放。 - rescale_factor (
float
, 可選, 預設為self.rescale_factor
) — 如果do_rescale
設定為True
,則按此重新縮放因子對影像進行重新縮放。 - do_normalize (
bool
, 可選, 預設為self.do_normalize
) — 是否對影像進行歸一化。 - image_mean (
float
或list[float]
, 可選, 預設為self.image_mean
) — 用於歸一化的影像平均值。僅當do_normalize
設定為True
時才生效。 - image_std (
float
或list[float]
, 可選, 預設為self.image_std
) — 用於歸一化的影像標準差。僅當do_normalize
設定為True
時才生效。 - do_pad (
bool
, 可選, 預設為self.do_pad
) — 是否填充影像。如果設定為True
,將把批次中影像的補丁維度填充到批次中最大的補丁數量。填充將應用於底部和右側,填充值為零。 - do_convert_rgb (
bool
, 可選, 預設為self.do_convert_rgb
) — 是否將影像轉換為 RGB。 - return_tensors (
str
或TensorType
, 可選) — 要返回的張量型別。可以是以下之一:- 未設定:返回
np.ndarray
列表。 TensorType.TENSORFLOW
或'tf'
:返回tf.Tensor
型別的批次。TensorType.PYTORCH
或'pt'
:返回torch.Tensor
型別的批次。TensorType.NUMPY
或'np'
:返回np.ndarray
型別的批次。TensorType.JAX
或'jax'
:返回jax.numpy.ndarray
型別的批次。
- 未設定:返回
- data_format (
ChannelDimension
或str
, 可選, 預設為ChannelDimension.FIRST
) — 輸出影像的通道維度格式。可以是以下之一:"channels_first"
或ChannelDimension.FIRST
:影像為 (num_channels, height, width) 格式。"channels_last"
或ChannelDimension.LAST
:影像為 (height, width, num_channels) 格式。- 未設定:使用輸入影像的通道維度格式。
- input_data_format (
ChannelDimension
或str
, 可選) — 輸入影像的通道維度格式。如果未設定,則從輸入影像推斷通道維度格式。可以是以下之一:"channels_first"
或ChannelDimension.FIRST
:影像為 (num_channels, height, width) 格式。"channels_last"
或ChannelDimension.LAST
:影像為 (height, width, num_channels) 格式。"none"
或ChannelDimension.NONE
:影像為 (height, width) 格式。
LlavaNextImageProcessorFast
class transformers.LlavaNextImageProcessorFast
< source >( **kwargs: typing_extensions.Unpack[transformers.models.llava_next.image_processing_llava_next_fast.LlavaNextFastImageProcessorKwargs] )
構建一個快速 Llava Next 影像處理器。
預處理
< source >( images: typing.Union[ForwardRef('PIL.Image.Image'), numpy.ndarray, ForwardRef('torch.Tensor'), list['PIL.Image.Image'], list[numpy.ndarray], list['torch.Tensor']] **kwargs: typing_extensions.Unpack[transformers.models.llava_next.image_processing_llava_next_fast.LlavaNextFastImageProcessorKwargs] ) → <class 'transformers.image_processing_base.BatchFeature'>
引數
- images (
Union[PIL.Image.Image, numpy.ndarray, torch.Tensor, list['PIL.Image.Image'], list[numpy.ndarray], list['torch.Tensor']]
) — 要預處理的影像。需要單張或批次影像,畫素值範圍為 0 到 255。如果傳入的影像畫素值在 0 到 1 之間,請設定do_rescale=False
。 - do_resize (
bool
, 可選) — 是否調整影像大小。 - size (
dict[str, int]
, 可選) — 模型的最大輸入尺寸。 - default_to_square (
bool
, 可選) — 如果尺寸為整數,調整大小時是否預設使用方形影像。 - resample (
Union[PILImageResampling, F.InterpolationMode, NoneType]
) — 如果調整影像大小,則使用的重取樣過濾器。可以是列舉PILImageResampling
之一。僅當do_resize
設定為True
時才生效。 - do_center_crop (
bool
, 可選) — 是否對影像進行中心裁剪。 - crop_size (
dict[str, int]
, 可選) — 應用center_crop
後輸出影像的尺寸。 - do_rescale (
bool
, 可選) — 是否重新縮放影像。 - rescale_factor (
Union[int, float, NoneType]
) — 如果do_rescale
設定為True
,則按此重新縮放因子對影像進行重新縮放。 - do_normalize (
bool
, 可選) — 是否對影像進行歸一化。 - image_mean (
Union[float, list[float], NoneType]
) — 用於歸一化的影像平均值。僅當do_normalize
設定為True
時才生效。 - image_std (
Union[float, list[float], NoneType]
) — 用於歸一化的影像標準差。僅當do_normalize
設定為True
時才生效。 - do_convert_rgb (
bool
, 可選) — 是否將影像轉換為 RGB。 - return_tensors (
Union[str, ~utils.generic.TensorType, NoneType]
) — 如果設定為 `pt` 則返回堆疊的張量,否則返回張量列表。 - data_format (
~image_utils.ChannelDimension
, 可選) — 僅支援ChannelDimension.FIRST
。為與慢速處理器相容而新增。 - input_data_format (
ChannelDimension
或str
, 可選) — 輸入影像的通道維度格式。如果未設定,則從輸入影像推斷通道維度格式。可以是以下之一:"channels_first"
或ChannelDimension.FIRST
:影像為 (num_channels, height, width) 格式。"channels_last"
或ChannelDimension.LAST
:影像為 (height, width, num_channels) 格式。"none"
或ChannelDimension.NONE
:影像為 (height, width) 格式。
- device (
torch.device
, 可選) — 處理影像的裝置。如果未設定,則從輸入影像推斷裝置。 - disable_grouping (
bool
, 可選) — 是否停用按尺寸分組影像以單獨而非批次處理它們。如果為 None,則如果影像在 CPU 上,將設定為 True,否則設定為 False。此選擇基於經驗觀察,詳情見此:https://github.com/huggingface/transformers/pull/38157 - image_grid_pinpoints (
list[list[int]]
, 可選) — 用於處理高解析度影像的可能解析度列表。根據影像的原始尺寸選擇最佳解析度。可以透過preprocess
方法中的image_grid_pinpoints
覆蓋。 - do_pad (
bool
, 可選) — 是否填充影像。如果設定為True
,將把批次中影像的補丁維度填充到批次中最大的補丁數量。填充將應用於底部和右側,填充值為零。
返回
<class 'transformers.image_processing_base.BatchFeature'>
- data (
dict
) — 由 call 方法返回的列表/陣列/張量字典(“pixel_values”等)。 - tensor_type (
Union[None, str, TensorType]
, 可選) — 您可以在此處提供一個`tensor_type`,以便在初始化時將整數列表轉換為PyTorch/TensorFlow/Numpy張量。
LlavaNextProcessor
class transformers.LlavaNextProcessor
< source >( image_processor = None tokenizer = None patch_size = None vision_feature_select_strategy = None chat_template = None image_token = '<image>' num_additional_image_tokens = 0 **kwargs )
引數
- image_processor (LlavaNextImageProcessor, 可選) — 影像處理器是一個必需的輸入。
- tokenizer (LlamaTokenizerFast, 可選) — 分詞器是一個必需的輸入。
- patch_size (
int
, 可選) — 視覺編碼器的補丁大小。 - vision_feature_select_strategy (
str
, 可選) — 用於從視覺骨幹網選擇視覺特徵的特徵選擇策略。應與模型配置中的策略相同。 - chat_template (
str
, 可選) — 一個 Jinja 模板,用於將聊天中的訊息列表轉換為可標記化的字串。 - image_token (
str
, 可選, 預設為"<image>"
) — 用於表示影像位置的特殊標記。 - num_additional_image_tokens (
int
, 可選, 預設為 0) — 新增到影像嵌入的額外標記數量,例如 CLS (+1)。如果骨幹網沒有 CLS 或其他額外標記,則無需設定此引數。
構建 LLaVa-NeXT 處理器,它將 LLaVa-NeXT 影像處理器和 LLaMa 分詞器包裝成一個單一的處理器。
LlavaNextProcessor 提供了 LlavaNextImageProcessor 和 LlamaTokenizerFast 的所有功能。有關更多資訊,請參閱 __call__()
和 decode()。
此方法將其所有引數轉發給 LlamaTokenizerFast 的 batch_decode()。有關更多資訊,請參閱此方法的文件字串。
此方法將其所有引數轉發給 LlamaTokenizerFast 的 decode()。有關更多資訊,請參閱此方法的文件字串。
LlavaNextModel
class transformers.LlavaNextModel
< source >( config: LlavaNextConfig )
引數
- config (LlavaNextConfig) — 模型配置類,包含模型的所有引數。使用配置檔案初始化不會載入與模型相關的權重,只會載入配置。請檢視 from_pretrained() 方法載入模型權重。
Llava-Next 模型由一個視覺骨幹和一個沒有語言建模頭的語言模型組成。
此模型繼承自 PreTrainedModel。請檢視超類文件,瞭解庫為其所有模型實現的通用方法(例如下載或儲存、調整輸入嵌入大小、修剪頭部等)。
此模型也是 PyTorch torch.nn.Module 子類。將其作為常規 PyTorch 模組使用,並參考 PyTorch 文件瞭解所有與通用用法和行為相關的事項。
forward
< source >( input_ids: LongTensor = None pixel_values: FloatTensor = None image_sizes: typing.Optional[torch.LongTensor] = None attention_mask: typing.Optional[torch.Tensor] = None position_ids: typing.Optional[torch.LongTensor] = None past_key_values: typing.Optional[list[torch.FloatTensor]] = None inputs_embeds: typing.Optional[torch.FloatTensor] = None vision_feature_layer: typing.Union[int, list[int], NoneType] = None vision_feature_select_strategy: typing.Optional[str] = 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 **kwargs: typing_extensions.Unpack[transformers.modeling_flash_attention_utils.FlashAttentionKwargs] ) → transformers.models.llava_next.modeling_llava_next.LlavaNextModelOutputWithPast
或 tuple(torch.FloatTensor)
引數
- input_ids (形狀為
(batch_size, sequence_length)
的torch.LongTensor
) — 詞彙表中輸入序列 token 的索引。預設情況下將忽略填充。可以使用 AutoTokenizer 獲取索引。有關詳細資訊,請參見 PreTrainedTokenizer.encode() 和 PreTrainedTokenizer.call()。
- pixel_values (形狀為
(batch_size, num_channels, image_size, image_size)
的torch.FloatTensor
) — 對應於輸入影像的張量。可以使用{image_processor_class}
獲取畫素值。有關詳細資訊,請參見{image_processor_class}.__call__
({processor_class}
使用{image_processor_class}
處理影像)。 - image_sizes (形狀為
(batch_size, 2)
的torch.LongTensor
, 可選) — 批處理中影像的大小,每個影像為 (height, width)。 - attention_mask (形狀為
(batch_size, sequence_length)
的torch.Tensor
, 可選) — 避免對填充 token 索引執行注意力操作的掩碼。掩碼值選擇在[0, 1]
之間:- 1 表示**未被掩碼**的 token,
- 0 表示**被掩碼**的 token。
- position_ids (形狀為
(batch_size, sequence_length)
的torch.LongTensor
, 可選) — 每個輸入序列 token 在位置嵌入中的位置索引。選擇範圍為[0, config.n_positions - 1]
。 - past_key_values (
list[torch.FloatTensor]
, 可選) — 預計算的隱藏狀態(自注意力塊和交叉注意力塊中的鍵和值),可用於加速順序解碼。這通常包括模型在解碼上一階段返回的past_key_values
,當use_cache=True
或config.use_cache=True
時。允許兩種格式:
- Cache 例項,請參見我們的 kv 快取指南;
- 長度為
config.n_layers
的tuple(tuple(torch.FloatTensor))
,每個元組包含 2 個形狀為(batch_size, num_heads, sequence_length, embed_size_per_head)
的張量。這也被稱為傳統快取格式。
模型將輸出與輸入相同的快取格式。如果沒有傳入
past_key_values
,則將返回傳統快取格式。如果使用
past_key_values
,使用者可以選擇僅輸入形狀為(batch_size, 1)
的最後input_ids
(那些沒有將其過去的鍵值狀態提供給此模型的 token),而不是形狀為(batch_size, sequence_length)
的所有input_ids
。 - inputs_embeds (形狀為
(batch_size, sequence_length, hidden_size)
的torch.FloatTensor
, 可選) — 可選地,您可以選擇直接傳遞嵌入表示,而不是傳遞input_ids
。如果您希望對input_ids
索引如何轉換為相關向量有更多的控制權,而不是模型的內部嵌入查詢矩陣,這將很有用。 - vision_feature_layer (
Union[int, list[int], NoneType]
) — 選擇視覺特徵的層索引。如果提供了多個索引,則相應索引的視覺特徵將連線起來形成視覺特徵。 - vision_feature_select_strategy (
str
, 可選, 預設為"default"
) — 用於從視覺骨幹選擇視覺特徵的特徵選擇策略。可以是"default"
或"full"
。如果為"default"
,則從視覺特徵中移除 CLS token。如果為"full"
,則使用完整的視覺特徵。 - 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 (形狀為
(sequence_length)
的torch.LongTensor
, 可選) — 表示輸入序列 token 在序列中的位置的索引。與position_ids
不同,此張量不受填充影響。它用於在正確位置更新快取並推斷完整的序列長度。
返回
transformers.models.llava_next.modeling_llava_next.LlavaNextModelOutputWithPast
或 tuple(torch.FloatTensor)
一個 transformers.models.llava_next.modeling_llava_next.LlavaNextModelOutputWithPast
或一個 torch.FloatTensor
的元組(如果傳入 return_dict=False
或當 config.return_dict=False
時),包含各種元素,具體取決於配置 (LlavaNextConfig) 和輸入。
-
last_hidden_state (形狀為
(batch_size, sequence_length, hidden_size)
的torch.FloatTensor
, 可選) — 模型最後一層輸出的隱藏狀態序列。 -
past_key_values (
tuple(tuple(torch.FloatTensor))
, 可選, 當use_cache=True
傳入或當config.use_cache=True
時返回) — 長度為config.n_layers
的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
時返回) — 形狀為(batch_size, sequence_length, hidden_size)
的torch.FloatTensor
元組(如果模型有嵌入層,則一個用於嵌入輸出,加上一個用於每個層的輸出)。模型在每個層輸出的隱藏狀態以及可選的初始嵌入輸出。
-
attentions (
tuple[torch.FloatTensor, ...]
, 可選, 當output_attentions=True
傳入或當config.output_attentions=True
時返回) — 形狀為(batch_size, num_heads, sequence_length, sequence_length)
的torch.FloatTensor
元組(每個層一個)。注意力 softmax 後的注意力權重,用於計算自注意力頭中的加權平均值。
-
image_hidden_states (
torch.FloatTensor
, 可選) — 形狀為(batch_size, num_images, sequence_length, hidden_size)
的torch.FloatTensor
。由視覺編碼器生成並經過最後隱藏狀態投影后的模型影像隱藏狀態。
LlavaNextModel forward 方法,覆蓋了 __call__
特殊方法。
儘管前向傳播的配方需要在此函式中定義,但在此之後應該呼叫 Module
例項而不是此函式,因為前者負責執行預處理和後處理步驟,而後者則默默地忽略它們。
get_image_features
< source >( pixel_values: FloatTensor image_sizes: Tensor vision_feature_layer: typing.Union[int, list[int], NoneType] = None vision_feature_select_strategy: typing.Optional[str] = None ) → image_features (listtorch.Tensor
)
引數
- pixel_values (形狀為
(batch_size, num_patches, channels, height, width)
的torch.FloatTensor]
) — 對應於輸入影像的張量。 - image_sizes (形狀為
(num_images, 2)
的torch.Tensor
) — 每張影像的實際影像大小 (H, W)。 - vision_feature_layer (
Union[int, list[int]]
, 可選) — 選擇視覺特徵的層索引。如果提供了多個索引,則相應索引的視覺特徵將連線起來形成視覺特徵。 - vision_feature_select_strategy (
str
, 可選) — 用於從視覺骨幹選擇視覺特徵的特徵選擇策略。可以是"default"
或"full"
返回
image_features (listtorch.Tensor
)
影像特徵張量列表,每個張量包含所有補丁的所有視覺特徵,形狀為 (num_patches, image_length, embed_dim)
。
從視覺塔獲取影像最後隱藏狀態並應用多模態投影。
pack_image_features
< source >( image_features image_sizes vision_feature_select_strategy image_newline = None )
引數
- image_features (長度為 num_images 的
list[torch.Tensor]
,每個形狀為(num_patches, image_length, embed_dim)
) — 影像特徵張量列表,每個張量包含所有補丁的所有視覺特徵。 - image_sizes (形狀為
(num_images, 2)
的torch.Tensor
) — 每張影像的實際影像大小 (H, W)。 - vision_feature_select_strategy (
str
) — 用於從視覺骨幹選擇視覺特徵的特徵選擇策略。 - image_newline (形狀為
(embed_dim)
的torch.Tensor
) — 換行嵌入向量。
重塑、取消填充,然後將每個 image_feature
打包成一個包含所有視覺向量的單個 image_features
張量。
LlavaNextForConditionalGeneration
class transformers.LlavaNextForConditionalGeneration
< source >( config: LlavaNextConfig )
引數
- config (LlavaNextConfig) — 模型配置類,包含模型的所有引數。使用配置檔案初始化不會載入與模型相關的權重,只會載入配置。請檢視 from_pretrained() 方法載入模型權重。
LLAVA-NeXT 模型由一個視覺骨幹和一個語言模型組成。
此模型繼承自 PreTrainedModel。請檢視超類文件,瞭解庫為其所有模型實現的通用方法(例如下載或儲存、調整輸入嵌入大小、修剪頭部等)。
此模型也是 PyTorch torch.nn.Module 子類。將其作為常規 PyTorch 模組使用,並參考 PyTorch 文件瞭解所有與通用用法和行為相關的事項。
forward
< source >( input_ids: LongTensor = None pixel_values: FloatTensor = None image_sizes: typing.Optional[torch.LongTensor] = None attention_mask: typing.Optional[torch.Tensor] = None position_ids: typing.Optional[torch.LongTensor] = None past_key_values: typing.Optional[list[torch.FloatTensor]] = None inputs_embeds: typing.Optional[torch.FloatTensor] = None vision_feature_layer: typing.Union[int, list[int], NoneType] = None vision_feature_select_strategy: typing.Optional[str] = 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 cache_position: typing.Optional[torch.LongTensor] = None logits_to_keep: typing.Union[int, torch.Tensor] = 0 **kwargs: typing_extensions.Unpack[transformers.models.llava_next.modeling_llava_next.KwargsForCausalLM] ) → transformers.models.llava_next.modeling_llava_next.LlavaNextCausalLMOutputWithPast
或 tuple(torch.FloatTensor)
引數
- input_ids (形狀為
(batch_size, sequence_length)
的torch.LongTensor
) — 詞彙表中輸入序列 token 的索引。預設情況下將忽略填充。可以使用 AutoTokenizer 獲取索引。有關詳細資訊,請參見 PreTrainedTokenizer.encode() 和 PreTrainedTokenizer.call()。
- pixel_values (形狀為
(batch_size, num_channels, image_size, image_size)
的torch.FloatTensor
) — 對應於輸入影像的張量。可以使用{image_processor_class}
獲取畫素值。有關詳細資訊,請參見{image_processor_class}.__call__
({processor_class}
使用{image_processor_class}
處理影像)。 - image_sizes (形狀為
(batch_size, 2)
的torch.LongTensor
, 可選) — 批處理中影像的大小,每個影像為 (height, width)。 - attention_mask (形狀為
(batch_size, sequence_length)
的torch.Tensor
, 可選) — 避免對填充 token 索引執行注意力操作的掩碼。掩碼值選擇在[0, 1]
之間:- 1 表示**未被掩碼**的 token,
- 0 表示**被掩碼**的 token。
- position_ids (形狀為
(batch_size, sequence_length)
的torch.LongTensor
, 可選) — 每個輸入序列 token 在位置嵌入中的位置索引。選擇範圍為[0, config.n_positions - 1]
。 - past_key_values (
list[torch.FloatTensor]
, 可選) — 預計算的隱藏狀態(自注意力塊和交叉注意力塊中的鍵和值),可用於加速順序解碼。這通常包括模型在解碼上一階段返回的past_key_values
,當use_cache=True
或config.use_cache=True
時。允許兩種格式:
- Cache 例項,請參見我們的 kv 快取指南;
- 長度為
config.n_layers
的tuple(tuple(torch.FloatTensor))
,每個元組包含 2 個形狀為(batch_size, num_heads, sequence_length, embed_size_per_head)
的張量。這也被稱為傳統快取格式。
模型將輸出與輸入相同的快取格式。如果沒有傳入
past_key_values
,則將返回傳統快取格式。如果使用
past_key_values
,使用者可以選擇僅輸入形狀為(batch_size, 1)
的最後input_ids
(那些沒有將其過去的鍵值狀態提供給此模型的 token),而不是形狀為(batch_size, sequence_length)
的所有input_ids
。 - inputs_embeds (形狀為
(batch_size, sequence_length, hidden_size)
的torch.FloatTensor
, 可選) — 可選地,您可以選擇直接傳遞嵌入表示,而不是傳遞input_ids
。如果您希望對input_ids
索引如何轉換為相關向量有更多的控制權,而不是模型的內部嵌入查詢矩陣,這將很有用。 - vision_feature_layer (
Union[int, list[int], NoneType]
) — 選擇視覺特徵的層索引。如果提供了多個索引,則相應索引的視覺特徵將連線起來形成視覺特徵。 - vision_feature_select_strategy (
str
, 可選, 預設為"default"
) — 用於從視覺骨幹選擇視覺特徵的特徵選擇策略。可以是"default"
或"full"
。如果為"default"
,則從視覺特徵中移除 CLS token。如果為"full"
,則使用完整的視覺特徵。 - labels (形狀為
(batch_size, sequence_length)
的torch.LongTensor
, 可選) — 用於計算掩碼語言建模損失的標籤。索引應為[0, ..., config.vocab_size]
或 -100(參見input_ids
文件字串)。索引設定為-100
的 token 將被忽略(掩碼),損失僅針對標籤在[0, ..., config.vocab_size]
中的 token 計算。 - use_cache (
bool
, 可選) — 如果設定為True
,則返回past_key_values
鍵值狀態,可用於加速解碼(參見past_key_values
)。 - output_attentions (
bool
, 可選) — 是否返回所有注意力層的注意力張量。更多詳細資訊請參閱返回張量中的attentions
。 - output_hidden_states (
bool
, 可選) — 是否返回所有層的隱藏狀態。更多詳細資訊請參閱返回張量中的hidden_states
。 - cache_position (
torch.LongTensor
,形狀為(sequence_length)
,可選) — 表示輸入序列標記在序列中位置的索引。與position_ids
不同,此張量不受填充影響。它用於在正確位置更新快取並推斷完整的序列長度。 - logits_to_keep (
Union[int, torch.Tensor]
,預設為0
) — 如果是int
,則計算最後logits_to_keep
個標記的 logits。如果是0
,則計算所有input_ids
的 logits(特殊情況)。生成時只需要最後一個標記的 logits,僅計算該標記的 logits 可以節省記憶體,這對於長序列或大詞彙量來說非常重要。如果是torch.Tensor
,則必須是 1D,對應於在序列長度維度中要保留的索引。這在使用 packed tensor 格式(批次和序列長度的單維度)時非常有用。
返回
transformers.models.llava_next.modeling_llava_next.LlavaNextCausalLMOutputWithPast
或 tuple(torch.FloatTensor)
一個 transformers.models.llava_next.modeling_llava_next.LlavaNextCausalLMOutputWithPast
或一個 torch.FloatTensor
元組(如果傳遞 return_dict=False
或當 config.return_dict=False
時),根據配置(LlavaNextConfig)和輸入包含各種元素。
-
loss (
torch.FloatTensor
形狀為(1,)
,可選,當提供labels
時返回) — 語言建模損失(用於下一個 token 預測)。 -
logits (形狀為
(batch_size, sequence_length, config.vocab_size)
的torch.FloatTensor
) — 語言建模頭部的預測分數(SoftMax 之前的每個詞彙標記的分數)。 -
past_key_values (
tuple(tuple(torch.FloatTensor))
, 可選, 當use_cache=True
傳入或當config.use_cache=True
時返回) — 長度為config.n_layers
的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_patches, num_images, sequence_length, hidden_size)
的torch.FloatTensor
。由視覺編碼器生成並投影最後一個隱藏狀態後的模型影像隱藏狀態。
LlavaNextForConditionalGeneration 前向方法,覆蓋 __call__
特殊方法。
儘管前向傳播的配方需要在此函式中定義,但在此之後應該呼叫 Module
例項而不是此函式,因為前者負責執行預處理和後處理步驟,而後者則默默地忽略它們。
示例
>>> from PIL import Image
>>> import requests
>>> from transformers import AutoProcessor, LlavaNextForConditionalGeneration
>>> model = LlavaNextForConditionalGeneration.from_pretrained("llava-hf/llava-v1.6-mistral-7b-hf")
>>> processor = AutoProcessor.from_pretrained("llava-hf/llava-v1.6-mistral-7b-hf")
>>> prompt = "[INST] <image>\nWhat is shown in this image? [/INST]"
>>> url = "https://www.ilankelman.org/stopsigns/australia.jpg"
>>> image = Image.open(requests.get(url, stream=True).raw)
>>> inputs = processor(images=image, text=prompt, return_tensors="pt")
>>> # Generate
>>> generate_ids = model.generate(**inputs, max_length=30)
>>> processor.batch_decode(generate_ids, skip_special_tokens=True, clean_up_tokenization_spaces=False)[0]
"[INST] \nWhat is shown in this image? [/INST] The image appears to be a radar chart, which is a type of multi-dimensional plot (...)"