模型概述
模型特點
模型能力
使用案例
🚀 Qwen2.5-VL-72B-Instruct
Qwen2.5-VL-72B-Instruct是Qwen家族的最新成員,它是一款強大的視覺語言模型。該模型在視覺理解、視頻分析、智能代理等方面具有顯著優勢,能廣泛應用於金融、商業等領域,為用戶提供更智能、高效的服務。
🚀 快速開始
Qwen2.5-VL的代碼已集成在最新的Hugging face transformers中,建議使用以下命令從源代碼進行構建:
pip install git+https://github.com/huggingface/transformers accelerate
否則可能會遇到以下錯誤:
KeyError: 'qwen2_5_vl'
我們提供了一個工具包,可幫助你更方便地處理各種類型的視覺輸入,就像使用API一樣。可以使用以下命令進行安裝:
# 強烈建議使用 `[decord]` 特性以加快視頻加載速度
pip install qwen-vl-utils[decord]==0.0.8
如果你不使用Linux系統,可能無法從PyPI安裝decord
。在這種情況下,你可以使用pip install qwen-vl-utils
,它將回退到使用torchvision進行視頻處理。不過,你仍然可以從源代碼安裝decord,以便在加載視頻時使用decord。
使用 🤗 Transformers 進行對話
以下是一個代碼片段,展示瞭如何使用transformers
和qwen_vl_utils
來使用對話模型:
from transformers import Qwen2_5_VLForConditionalGeneration, AutoTokenizer, AutoProcessor
from qwen_vl_utils import process_vision_info
# 默認:將模型加載到可用設備上
model = Qwen2_5_VLForConditionalGeneration.from_pretrained(
"Qwen/Qwen2.5-VL-72B-Instruct", torch_dtype="auto", device_map="auto"
)
# 建議啟用 flash_attention_2 以獲得更好的加速和內存節省效果,特別是在多圖像和視頻場景中
# model = Qwen2_5_VLForConditionalGeneration.from_pretrained(
# "Qwen/Qwen2.5-VL-72B-Instruct",
# torch_dtype=torch.bfloat16,
# attn_implementation="flash_attention_2",
# device_map="auto",
# )
# 默認處理器
processor = AutoProcessor.from_pretrained("Qwen/Qwen2.5-VL-72B-Instruct")
# 模型中每張圖像的視覺令牌數量默認範圍是 4 - 16384
# 你可以根據需要設置 min_pixels 和 max_pixels,例如令牌範圍為 256 - 1280,以平衡性能和成本
# min_pixels = 256*28*28
# max_pixels = 1280*28*28
# processor = AutoProcessor.from_pretrained("Qwen/Qwen2.5-VL-72B-Instruct", min_pixels=min_pixels, max_pixels=max_pixels)
messages = [
{
"role": "user",
"content": [
{
"type": "image",
"image": "https://qianwen-res.oss-cn-beijing.aliyuncs.com/Qwen-VL/assets/demo.jpeg",
},
{"type": "text", "text": "Describe this image."},
],
}
]
# 推理準備
text = processor.apply_chat_template(
messages, tokenize=False, add_generation_prompt=True
)
image_inputs, video_inputs = process_vision_info(messages)
inputs = processor(
text=[text],
images=image_inputs,
videos=video_inputs,
padding=True,
return_tensors="pt",
)
inputs = inputs.to("cuda")
# 推理:生成輸出
generated_ids = model.generate(**inputs, max_new_tokens=128)
generated_ids_trimmed = [
out_ids[len(in_ids) :] for in_ids, out_ids in zip(inputs.input_ids, generated_ids)
]
output_text = processor.batch_decode(
generated_ids_trimmed, skip_special_tokens=True, clean_up_tokenization_spaces=False
)
print(output_text)
多圖像推理
# 包含多個圖像和文本查詢的消息
messages = [
{
"role": "user",
"content": [
{"type": "image", "image": "file:///path/to/image1.jpg"},
{"type": "image", "image": "file:///path/to/image2.jpg"},
{"type": "text", "text": "Identify the similarities between these images."},
],
}
]
# 推理準備
text = processor.apply_chat_template(
messages, tokenize=False, add_generation_prompt=True
)
image_inputs, video_inputs = process_vision_info(messages)
inputs = processor(
text=[text],
images=image_inputs,
videos=video_inputs,
padding=True,
return_tensors="pt",
)
inputs = inputs.to("cuda")
# 推理
generated_ids = model.generate(**inputs, max_new_tokens=128)
generated_ids_trimmed = [
out_ids[len(in_ids) :] for in_ids, out_ids in zip(inputs.input_ids, generated_ids)
]
output_text = processor.batch_decode(
generated_ids_trimmed, skip_special_tokens=True, clean_up_tokenization_spaces=False
)
print(output_text)
視頻推理
# 包含圖像列表作為視頻和文本查詢的消息
messages = [
{
"role": "user",
"content": [
{
"type": "video",
"video": [
"file:///path/to/frame1.jpg",
"file:///path/to/frame2.jpg",
"file:///path/to/frame3.jpg",
"file:///path/to/frame4.jpg",
],
},
{"type": "text", "text": "Describe this video."},
],
}
]
# 包含本地視頻路徑和文本查詢的消息
messages = [
{
"role": "user",
"content": [
{
"type": "video",
"video": "file:///path/to/video1.mp4",
"max_pixels": 360 * 420,
"fps": 1.0,
},
{"type": "text", "text": "Describe this video."},
],
}
]
# 包含視頻URL和文本查詢的消息
messages = [
{
"role": "user",
"content": [
{
"type": "video",
"video": "https://qianwen-res.oss-cn-beijing.aliyuncs.com/Qwen2-VL/space_woaudio.mp4",
},
{"type": "text", "text": "Describe this video."},
],
}
]
# 在 Qwen 2.5 VL 中,幀率信息也會輸入到模型中以與絕對時間對齊
# 推理準備
text = processor.apply_chat_template(
messages, tokenize=False, add_generation_prompt=True
)
image_inputs, video_inputs, video_kwargs = process_vision_info(messages, return_video_kwargs=True)
inputs = processor(
text=[text],
images=image_inputs,
videos=video_inputs,
fps=fps,
padding=True,
return_tensors="pt",
**video_kwargs,
)
inputs = inputs.to("cuda")
# 推理
generated_ids = model.generate(**inputs, max_new_tokens=128)
generated_ids_trimmed = [
out_ids[len(in_ids) :] for in_ids, out_ids in zip(inputs.input_ids, generated_ids)
]
output_text = processor.batch_decode(
generated_ids_trimmed, skip_special_tokens=True, clean_up_tokenization_spaces=False
)
print(output_text)
視頻URL的兼容性在很大程度上取決於第三方庫的版本。詳細信息如下表所示。如果你不想使用默認的後端,可以通過FORCE_QWENVL_VIDEO_READER=torchvision
或FORCE_QWENVL_VIDEO_READER=decord
來更改後端。
後端 | HTTP | HTTPS |
---|---|---|
torchvision >= 0.19.0 | ✅ | ✅ |
torchvision < 0.19.0 | ❌ | ❌ |
decord | ✅ | ❌ |
批量推理
# 批量推理的示例消息
messages1 = [
{
"role": "user",
"content": [
{"type": "image", "image": "file:///path/to/image1.jpg"},
{"type": "image", "image": "file:///path/to/image2.jpg"},
{"type": "text", "text": "What are the common elements in these pictures?"},
],
}
]
messages2 = [
{"role": "system", "content": "You are a helpful assistant."},
{"role": "user", "content": "Who are you?"},
]
# 合併消息以進行批量處理
messages = [messages1, messages2]
# 批量推理準備
texts = [
processor.apply_chat_template(msg, tokenize=False, add_generation_prompt=True)
for msg in messages
]
image_inputs, video_inputs = process_vision_info(messages)
inputs = processor(
text=texts,
images=image_inputs,
videos=video_inputs,
padding=True,
return_tensors="pt",
)
inputs = inputs.to("cuda")
# 批量推理
generated_ids = model.generate(**inputs, max_new_tokens=128)
generated_ids_trimmed = [
out_ids[len(in_ids) :] for in_ids, out_ids in zip(inputs.input_ids, generated_ids)
]
output_texts = processor.batch_decode(
generated_ids_trimmed, skip_special_tokens=True, clean_up_tokenization_spaces=False
)
print(output_texts)
🤖 ModelScope
強烈建議用戶(特別是中國大陸的用戶)使用ModelScope。snapshot_download
可以幫助你解決下載檢查點的問題。
更多使用提示
對於輸入圖像,我們支持本地文件、base64編碼和URL。對於視頻,目前僅支持本地文件。
# 你可以直接在文本中需要的位置插入本地文件路徑、URL或base64編碼的圖像
## 本地文件路徑
messages = [
{
"role": "user",
"content": [
{"type": "image", "image": "file:///path/to/your/image.jpg"},
{"type": "text", "text": "Describe this image."},
],
}
]
## 圖像URL
messages = [
{
"role": "user",
"content": [
{"type": "image", "image": "http://path/to/your/image.jpg"},
{"type": "text", "text": "Describe this image."},
],
}
]
## Base64編碼的圖像
messages = [
{
"role": "user",
"content": [
{"type": "image", "image": "data:image;base64,/9j/..."},
{"type": "text", "text": "Describe this image."},
],
}
]
調整圖像分辨率以提升性能
該模型支持廣泛的分辨率輸入。默認情況下,它使用原始分辨率進行輸入,但更高的分辨率可以提高性能,但會增加計算量。用戶可以設置最小和最大像素數,以實現適合自己需求的最佳配置,例如令牌數量範圍為256 - 1280,以平衡速度和內存使用。
min_pixels = 256 * 28 * 28
max_pixels = 1280 * 28 * 28
processor = AutoProcessor.from_pretrained(
"Qwen/Qwen2.5-VL-72B-Instruct", min_pixels=min_pixels, max_pixels=max_pixels
)
此外,我們提供了兩種方法來精細控制輸入到模型的圖像大小:
- 定義min_pixels和max_pixels:圖像將被調整大小,以保持其寬高比在min_pixels和max_pixels的範圍內。
- 指定確切的尺寸:直接設置
resized_height
和resized_width
。這些值將被四捨五入到最接近的28的倍數。
# min_pixels 和 max_pixels
messages = [
{
"role": "user",
"content": [
{
"type": "image",
"image": "file:///path/to/your/image.jpg",
"resized_height": 280,
"resized_width": 420,
},
{"type": "text", "text": "Describe this image."},
],
}
]
# resized_height 和 resized_width
messages = [
{
"role": "user",
"content": [
{
"type": "image",
"image": "file:///path/to/your/image.jpg",
"min_pixels": 50176,
"max_pixels": 50176,
},
{"type": "text", "text": "Describe this image."},
],
}
]
處理長文本
當前的config.json
設置的上下文長度最大為32,768個令牌。
為了處理超過32,768個令牌的大量輸入,我們使用了YaRN技術,該技術用於增強模型的長度外推能力,確保在長文本上的最佳性能。
對於支持的框架,你可以在config.json
中添加以下內容以啟用YaRN:
{
...,
"type": "yarn",
"mrope_section": [
16,
24,
24
],
"factor": 4,
"original_max_position_embeddings": 32768
}
需要注意的是,這種方法對時間和空間定位任務的性能有顯著影響,因此不建議使用。 同時,對於長視頻輸入,由於MRoPE本身在ids方面更節省,因此可以直接將max_position_embeddings修改為更大的值,例如64k。
✨ 主要特性
關鍵增強功能
- 視覺理解能力強:Qwen2.5-VL不僅擅長識別常見的物體,如花鳥魚蟲,還能高度準確地分析圖像中的文本、圖表、圖標、圖形和佈局。
- 具備智能代理能力:Qwen2.5-VL可直接作為視覺代理,能夠進行推理並動態調用工具,具備計算機和手機使用能力。
- 理解長視頻並捕捉事件:Qwen2.5-VL可以理解超過1小時的視頻,並且此次新增了通過精確確定相關視頻片段來捕捉事件的能力。
- 支持不同格式的視覺定位:Qwen2.5-VL可以通過生成邊界框或點來準確地定位圖像中的物體,並能為座標和屬性提供穩定的JSON輸出。
- 生成結構化輸出:對於發票、表單、表格等掃描數據,Qwen2.5-VL支持對其內容進行結構化輸出,有利於金融、商業等領域的應用。
模型架構更新
- 用於視頻理解的動態分辨率和幀率訓練:通過採用動態FPS採樣,將動態分辨率擴展到時間維度,使模型能夠理解不同採樣率的視頻。相應地,在時間維度上使用ID和絕對時間對齊更新mRoPE,使模型能夠學習時間序列和速度,最終獲得精確確定特定時刻的能力。
- 精簡高效的視覺編碼器:通過策略性地將窗口注意力機制應用於ViT,提高了訓練和推理速度。同時,使用SwiGLU和RMSNorm進一步優化了ViT架構,使其與Qwen2.5 LLM的結構保持一致。
我們有參數為30億、70億和720億的三種模型。本倉庫包含經過指令微調的72B Qwen2.5-VL模型。更多信息,請訪問我們的博客和GitHub。
📚 詳細文檔
評估
圖像基準測試
基準測試 | GPT4o | Claude3.5 Sonnet | Gemini-2-flash | InternVL2.5-78B | Qwen2-VL-72B | Qwen2.5-VL-72B |
---|---|---|---|---|---|---|
MMMUval | 70.3 | 70.4 | 70.7 | 70.1 | 64.5 | 70.2 |
MMMU_Pro | 54.5 | 54.7 | 57.0 | 48.6 | 46.2 | 51.1 |
MathVista_MINI | 63.8 | 65.4 | 73.1 | 76.6 | 70.5 | 74.8 |
MathVision_FULL | 30.4 | 38.3 | 41.3 | 32.2 | 25.9 | 38.1 |
Hallusion Bench | 55.0 | 55.16 | 57.4 | 58.1 | 55.16 | |
MMBench_DEV_EN_V11 | 82.1 | 83.4 | 83.0 | 88.5 | 86.6 | 88 |
AI2D_TEST | 84.6 | 81.2 | 89.1 | 88.1 | 88.4 | |
ChartQA_TEST | 86.7 | 90.8 | 85.2 | 88.3 | 88.3 | 89.5 |
DocVQA_VAL | 91.1 | 95.2 | 92.1 | 96.5 | 96.1 | 96.4 |
MMStar | 64.7 | 65.1 | 69.4 | 69.5 | 68.3 | 70.8 |
MMVet_turbo | 69.1 | 70.1 | 72.3 | 74.0 | 76.19 | |
OCRBench | 736 | 788 | 854 | 877 | 885 | |
OCRBench-V2(en/zh) | 46.5/32.3 | 45.2/39.6 | 51.9/43.1 | 45/46.2 | 47.8/46.1 | 61.5/63.7 |
CC-OCR | 66.6 | 62.7 | 73.0 | 64.7 | 68.7 | 79.8 |
視頻基準測試
基準測試 | GPT4o | Gemini-1.5-Pro | InternVL2.5-78B | Qwen2VL-72B | Qwen2.5VL-72B |
---|---|---|---|---|---|
VideoMME w/o sub. | 71.9 | 75.0 | 72.1 | 71.2 | 73.3 |
VideoMME w sub. | 77.2 | 81.3 | 74.0 | 77.8 | 79.1 |
MVBench | 64.6 | 60.5 | 76.4 | 73.6 | 70.4 |
MMBench-Video | 1.63 | 1.30 | 1.97 | 1.70 | 2.02 |
LVBench | 30.8 | 33.1 | - | 41.3 | 47.3 |
EgoSchema | 72.2 | 71.2 | - | 77.9 | 76.2 |
PerceptionTest_test | - | - | - | 68.0 | 73.2 |
MLVU_M-Avg_dev | 64.6 | - | 75.7 | 74.6 | |
TempCompass_overall | 73.8 | - | - | 74.8 |
代理基準測試
基準測試 | GPT4o | Gemini 2.0 | Claude | Aguvis-72B | Qwen2VL-72B | Qwen2.5VL-72B |
---|---|---|---|---|---|---|
ScreenSpot | 18.1 | 84.0 | 83.0 | 87.1 | ||
ScreenSpot Pro | 17.1 | 1.6 | 43.6 | |||
AITZ_EM | 35.3 | 72.8 | 83.2 | |||
Android Control High_EM | 66.4 | 59.1 | 67.36 | |||
Android Control Low_EM | 84.4 | 59.2 | 93.7 | |||
AndroidWorld_SR | 34.5% (SoM) | 27.9% | 26.1% | 35% | ||
MobileMiniWob++_SR | 66% | 68% | ||||
OSWorld | 14.90 | 10.26 | 8.83 |
📄 許可證
本項目採用Qwen許可證。









