探索阿里通義千問的 Qwen2-VL:新一代視覺語言模型本地體驗實戰(zhàn)大全
在人工智能領(lǐng)域,多模態(tài)模型的發(fā)展一直備受關(guān)注。阿里通義千問的 Qwen2-VL 的發(fā)布,為多模態(tài)技術(shù)的發(fā)展注入了新的活力。它不僅在圖像和視頻理解方面取得了顯著的突破,還具備強大的視覺智能體能力,能夠與各種設備進行交互,為用戶帶來全新的體驗。
一、模型特點
1. 強大的視覺理解能力
- 任意分辨率圖像識別:Qwen2-VL 可以讀懂不同分辨率和不同長寬比的圖片,無論圖像的清晰度或大小如何,都能輕松識別。這得益于其獨特的 naive dynamic resolution 支持,能夠?qū)⑷我夥直媛实膱D像映射成動態(tài)數(shù)量的視覺 token,保證了模型輸入和圖像信息的一致性,模擬了人類視覺感知的自然方式。
- 長視頻理解:該模型能夠理解超過 20 分鐘的長視頻,這在多模態(tài)模型中是一項重大的突破。通過在線流媒體能力,它可以支持高質(zhì)量的視頻問答、對話和內(nèi)容創(chuàng)作等應用,為視頻領(lǐng)域的智能化發(fā)展提供了有力的支持。
2. 多語言支持
Qwen2-VL 除了支持英語和中文外,還能理解圖像視頻中的多種語言文本,包括大多數(shù)歐洲語言、日語、韓語、阿拉伯語、越南語等,真正做到了面向全球用戶,打破了語言的障礙,為多語言環(huán)境下的應用提供了便利。
3. 視覺智能體能力
Qwen2-VL 具備強大的視覺智能體能力,可自主操作手機和機器人等設備。借助其復雜的推理和決策能力,能夠根據(jù)視覺環(huán)境和文字指令進行自動操作,實現(xiàn)了人工智能與現(xiàn)實世界的更緊密結(jié)合,為智能家居、智能機器人等領(lǐng)域的發(fā)展帶來了新的機遇。
二、模型架構(gòu)
1. 模型結(jié)構(gòu)
Qwen2-VL 延續(xù)了上一代 Qwen-VL 中 ViT 加 Qwen2 的串聯(lián)結(jié)構(gòu),三個不同規(guī)模的模型都采用了 600M 規(guī)模大小的 ViT,支持圖像和視頻統(tǒng)一輸入。這種結(jié)構(gòu)使得模型能夠更好地融合視覺和語言信息,提高對多模態(tài)數(shù)據(jù)的理解能力。
圖片
2. 多模態(tài)旋轉(zhuǎn)位置編碼(M-ROPE)
傳統(tǒng)的旋轉(zhuǎn)位置嵌入只能捕捉一維序列的位置信息,而 Qwen2-VL 采用的 M-ROPE 將旋轉(zhuǎn)位置編碼分解成時間、空間(高度和寬度)三部分,使大規(guī)模語言模型能夠同時捕捉和整合一維文本、二維視覺和三維視頻的位置信息,賦予了模型強大的多模態(tài)處理和推理能力,能夠更好地理解和建模復雜的多模態(tài)數(shù)據(jù)。
圖片
三、模型性能
1. 基準測試成績優(yōu)異
在多個權(quán)威測評中,Qwen2-VL 創(chuàng)造了同等規(guī)模開源模型的最佳成績。在 mathvista、docvqa、realworldqa、mtvqa 等基準測試中創(chuàng)下全球領(lǐng)先的表現(xiàn),在文檔理解方面優(yōu)勢尤其明顯。與 GPT-4O 和 Claude3.5-Sonnet 等閉源模型相比,Qwen2-VL 在大部分指標上都達到了最優(yōu)。
2. 高效的計算效率
在保證高性能的同時,Qwen2-VL 還具有較高的計算效率,能夠在不同的硬件平臺上快速運行,為大規(guī)模應用提供了可能。其量化版本的發(fā)布,進一步提高了模型的計算效率,降低了部署成本。
圖片
四、模型體驗
在線體驗:https://huggingface.co/spaces/Qwen/Qwen2-VL
圖片
五、模型下載
此次 Qwen2 - VL 進行了開源,其中包含兩個尺寸的模型,分別是 Qwen2 - VL - 2B - Instruct 以及 Qwen2 - VL - 7B - Instruct,同時還提供了其 GPTQ 和 AWQ 的量化版本。
以下是模型相關(guān)鏈接:
Qwen2 - VL - 2B - Instruct:https://www.modelscope.cn/models/qwen/Qwen2-VL-2B-Instruct
Qwen2 - VL - 7B - Instruct:https://www.modelscope.cn/models/qwen/Qwen2-VL-7B-Instruct
我們推薦使用 ModelScope CLI 進行模型下載,具體命令如下:
modelscope download --model=qwen/Qwen2-VL-7B-Instruct --local_dir ./Qwen2-VL-7B-Instruct
下載完成如下:
圖片
六、模型推理
1. 安裝依賴
pip install git+https://github.com/huggingface/transformers
pip install qwen-vl-utils
安裝如下:
圖片
2. 模型推理
from transformers import Qwen2VLForConditionalGeneration, AutoTokenizer, AutoProcessor
from qwen_vl_utils import process_vision_info
# default: Load the model on the available device(s)
# model = Qwen2VLForConditionalGeneration.from_pretrained(
# "./Qwen2-VL-7B-Instruct", torch_dtype="auto", device_map="auto"
# )
import torch
model = Qwen2VLForConditionalGeneration.from_pretrained(
"./Qwen2-VL-7B-Instruct",
torch_dtype=torch.bfloat16,
attn_implementatinotallow="flash_attention_2",
).to("cuda:0")
# We recommend enabling flash_attention_2 for better acceleration and memory saving, especially in multi-image and video scenarios.
# model = Qwen2VLForConditionalGeneration.from_pretrained(
# "Qwen/Qwen2-VL-7B-Instruct",
# torch_dtype=torch.bfloat16,
# attn_implementatinotallow="flash_attention_2",
# device_map="auto",
# )
# default processer
processor = AutoProcessor.from_pretrained("./Qwen2-VL-7B-Instruct")
# The default range for the number of visual tokens per image in the model is 4-16384.
# You can set min_pixels and max_pixels according to your needs, such as a token range of 256-1280, to balance performance and cost.
# min_pixels = 256*28*28
# max_pixels = 1280*28*28
# processor = AutoProcessor.from_pretrained("Qwen/Qwen2-VL-7B-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."},
],
}
]
# Preparation for inference
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")
# Inference: Generation of the output
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)
輸出如下:
圖片
七、模型微調(diào)
1. 安裝依賴
swift開源地址:https://github.com/modelscope/swift
在開始微調(diào)之前,先準備好環(huán)境
git clone https://github.com/modelscope/swift.git
cd swiftpip install -e .[llm]
pip install pyav qwen_vl_utils
2. 模型微調(diào)
圖像描述微調(diào)我們使用 coco-en-mini 數(shù)據(jù)集進行微調(diào),該數(shù)據(jù)集的任務是對圖片內(nèi)容進行描述。
可以在 modelscope 上找到該數(shù)據(jù)集:https://modelscope.cn/datasets/modelscope/coco_2014_caption/summary
# 默認會將lora_target_modules設置為llm的所有l(wèi)inear
CUDA_VISIBLE_DEVICES=0,1,2,3 NPROC_PER_NODE=4 swift sft \
--model_type qwen2-vl-7b-instruct \
--model_id_or_path qwen/Qwen2-VL-7B-Instruct \
--sft_type lora \
--dataset coco-en-mini#20000 \
--deepspeed default-zero2
如果要使用自定義數(shù)據(jù)集,只需按以下方式進行指定:
--dataset train.jsonl \
--val_dataset val.jsonl \
自定義數(shù)據(jù)集支持json和jsonl樣式,以下是自定義數(shù)據(jù)集的樣例:
{"query": "<image>55555", "response": "66666", "images": ["image_path"]}
{"query": "eeeee<image>eeeee<image>eeeee", "response": "fffff", "history": [], "images": ["image_path1", "image_path2"]}
{"query": "EEEEE", "response": "FFFFF", "history": [["query1", "response2"
微調(diào)后推理腳本如下:
CUDA_VISIBLE_DEVICES=0 swift infer \
--ckpt_dir output/qwen2-vl-7b-instruct/vx-xxx/checkpoint-xxx \
--load_dataset_config true --merge_lora true
八、結(jié)語
阿里通義千問的 Qwen2-VL 是一款具有強大功能和優(yōu)異性能的視覺語言模型,它的發(fā)布為多模態(tài)技術(shù)的發(fā)展帶來了新的機遇。無論是在視覺理解能力、多語言支持還是視覺智能體能力方面,Qwen2-VL 都表現(xiàn)出了卓越的性能,為各種應用場景的智能化發(fā)展提供了有力的支持。隨著技術(shù)的不斷發(fā)展和應用場景的不斷拓展,相信 Qwen2-VL 將在未來發(fā)揮更加重要的作用。