一、安装依赖
pip install "transformers>=4.57.1" "qwen_vl_utils>=0.0.14" pip install "ms-swift>=3.9.1" #modelscope依赖 pip install modelscope #下载模型 modelscope download --model Qwen/Qwen3-VL-2B-Instruct --local_dir /root/Qwen

成功安装!!
编写demo.py,让Qwen3-VL-2B帮我描述一张图片
python
import torch
from transformers import AutoModelForCausalLM, AutoTokenizer, AutoProcessor
from qwen_vl_utils import process_vision_info
# 指定模型路径(本地或Hugging Face模型ID)
model_dir = "Qwen" # 请确保这是正确的本地路径,或使用 "Qwen/Qwen3-VL-8B-Instruct"
# 1. 使用 AutoModelForCausalLM 加载模型,这是正确的方法
model = AutoModelForCausalLM.from_pretrained(
model_dir,
torch_dtype=torch.float16,
device_map="cuda:0",
trust_remote_code=True # Qwen模型可能需要此选项
)
# 2. 加载处理器和分词器
processor = AutoProcessor.from_pretrained(model_dir)
# 你也可以单独加载tokenizer用于文本处理,与processor中的tokenizer功能相同
# tokenizer = AutoTokenizer.from_pretrained(model_dir)
messages = [
{
"role": "user",
"content": [
{"type": "image", "image": "Qwen/OIP-C.webp.jpg"}, # 请确认图片路径正确
{"type": "text", "text": "描述这张图片。"}
],
}
]
# 应用聊天模板
text = processor.apply_chat_template(messages, tokenize=False, add_generation_prompt=True)
# 处理图像信息
image_inputs, _ = process_vision_info(messages)
# 准备模型输入
inputs = processor(text=[text], images=image_inputs, padding=True, return_tensors="pt").to(model.device)
# 生成回复
with torch.no_grad():
generated_ids = model.generate(**inputs, max_new_tokens=128)
# 解码输出
output_text = processor.batch_decode(generated_ids, skip_special_tokens=True)
print(output_text)
二、报错的解决
昨天在实践的过程中就遇到这个报错:
Traceback (most recent call last): File "/root/Qwen/demo.py", line 31, in <module> generated_ids = model.generate(**inputs, max_new_tokens=128) # 此时model应具备generate方法 ^^^^^^^^^^^^^^ File "/root/miniconda3/lib/python3.12/site-packages/torch/nn/modules/module.py", line 1931, in __getattr__ raise AttributeError( AttributeError: 'Qwen3VLModel' object has no attribute 'generate'
貌似是模型没有生成正确
重新编写模型下载脚本:
-
安装modelscope依赖
-
运行脚本gen_model.py
python
from modelscope import AutoModel, AutoTokenizer
import torch
model_id = "qwen/Qwen3-VL-2B-Instruct"
model = AutoModel.from_pretrained(
model_id,
torch_dtype=torch.float16,
device_map="auto",
trust_remote_code=True
).eval()
# ModelScope的处理器加载方式可能略有不同,请参考其官方文档。
新的报错:
Traceback (most recent call last): File "/root/Qwen/demo.py", line 3, in <module> from qwen_vl_utils import process_vision_info ModuleNotFoundError: No module named 'qwen_vl_utils'
可以pip进行安装,再次运行demo.py
新的报错:
'(MaxRetryError("HTTPSConnectionPool(host='huggingface.co', port=443): Max retries exceeded with url: /Qwen/Qwen3-VL-2B-Instruct/resolve/main/config.json (Caused by ConnectTimeoutError(<urllib3.connection.HTTPSConnection object at 0x7fa3408cb7d0>, 'Connection to huggingface.co timed out. (connect timeout=10)'))"), '(Request ID: c4914ba4-decc-4b15-b526-988fef47d6e2)')' thrown while requesting HEAD https://huggingface.co/Qwen/Qwen3-VL-2B-Instruct/resolve/main/config.json Retrying in 8s [Retry 5/5].
好像是链接不上huggingface
bash
source /etc/network_turbo
尝试开启加速节点,但是没用,于是改用v2-2B模型,据说兼容性更强一些
成功!!
输出结果:
=== 图片描述结果 ===
system You are a helpful assistant. user 详细描述这张图片中的内容。
assistant
这张图片展示了一位女性,她似乎正在经历某种不适或疾病。她用手捂住鼻子,似乎在打喷嚏或咳嗽。她的表情看起来很痛苦或不舒服。她穿着一件浅色的上衣,背景模糊不清,可能是在室内。图片的右下角有一些中文文字,但无法确定其具体含义。\

结果符合预期,我们去拿一张交通状况的图片试试;
user 详细描述这张图片中的交通状况。
assistant 这张图片展示了一条正在施工的高速公路。画面中有三辆大型黄色卡车,其中两辆卡车正在装载或卸载材料,第三辆卡车则停在路边。卡车的后面有一条白色的路缘石,旁边有几名穿着反光背心的工人,他们正在监督施工过程。工人们站在路缘石旁边,似乎在检查或监督施工进度。背景中可以看到一些绿色的植被和远处的山丘,表明施工地点可能位于山区或丘陵地带。整体来看,这张图片展示了高速公路建设过程中的一幕繁忙场景。

可以看出描述的细节非常充分,虽然并不一定全然正确,但也几乎和人类视觉没有太大差异了。并且这个对于全局的特征描述能力是传统视觉模型无法比拟的。
三、最终的demo.py文件
python
import os
os.environ['HF_ENDPOINT'] = 'https://hf-mirror.com' # 国内镜像,加速下载
import torch
from transformers import AutoProcessor
# 核心修正:直接从模型定义模块导入正确的生成类
from transformers.models.qwen2_vl.modeling_qwen2_vl import Qwen2VLForConditionalGeneration
from qwen_vl_utils import process_vision_info
# 指定模型(也可以使用魔搭社区的路径 "qwen/Qwen2-VL-2B-Instruct")
model_id = "Qwen/Qwen2-VL-2B-Instruct"
print("开始加载模型...")
# 使用专用类加载,这是最直接的方式
model = Qwen2VLForConditionalGeneration.from_pretrained(
model_id,
torch_dtype=torch.float16, # 如果仍有警告,可改为 dtype=torch.float16
device_map="auto",
trust_remote_code=False # 使用专用类时,此项通常不再需要
).eval()
print("模型加载成功,开始加载处理器...")
processor = AutoProcessor.from_pretrained(model_id)
# 准备输入(请确保图片路径 'Qwen/OIP-C.webp.jpg' 存在)
messages = [
{
"role": "user",
"content": [
{"type": "image", "image": "demo.jpg"},
{"type": "text", "text": "详细描述这张图片中的交通状况。"}
],
}
]
text = processor.apply_chat_template(messages, tokenize=False, add_generation_prompt=True)
image_inputs, _ = process_vision_info(messages)
inputs = processor(text=[text], images=image_inputs, padding=True, return_tensors="pt").to(model.device)
print("正在生成描述...")
with torch.no_grad():
generated_ids = model.generate(
**inputs,
max_new_tokens=256,
do_sample=True,
temperature=0.7
)
output_text = processor.batch_decode(generated_ids, skip_special_tokens=True)
print("\n=== 图片描述结果 ===")
print(output_text[0])