应用篇#4:Qwen2视觉语言模型(VLM)的服务器部署

一、安装依赖

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'

貌似是模型没有生成正确

重新编写模型下载脚本:

  1. 安装modelscope依赖

  2. 运行脚本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])
相关推荐
小陈phd1 小时前
大模型从入门到精通(一)——大语言模型微调的前沿技术与应用
人工智能·语言模型·自然语言处理
Aze..1 小时前
PVE安装 Ubuntu 服务器版
运维·服务器·数据库
花开花富贵1 小时前
Python 温度数据处理与可视化全流程:从读取到保存1.2
python
InfiSight智睿视界1 小时前
连锁餐饮管理的“不可能三角”:如何用技术实现规模、效率与体验的平衡?
人工智能
iiiiii111 小时前
【论文阅读笔记】FOCAL 离线元强化学习,从静态数据中快速适应新任务
论文阅读·人工智能·笔记·学习·机器学习·学习方法·具身智能
百胜软件@百胜软件1 小时前
百胜软件×头部影院:以数字之力,重塑影院零售新体验
人工智能
小肖爱笑不爱笑1 小时前
LSDSSMs: 基于低秩稀疏分解状态空间模型的红外小目标检测网络(2025, TGRS)
人工智能·目标检测·计算机视觉
荒野火狐1 小时前
【强化学习】关于PPO收敛问题
python·深度学习·机器学习·强化学习