【大模型应用开发】Qwen2.5-VL-3B识别视频

0. 编写代码并尝试运行

克隆以下代码

bash 复制代码
git clone https://gitee.com/ai-trailblazer/qwen-vl-hello.git

尝试运行qwen-vl-hello.py,报错原因缺少modelscope:

1. 安装qwen-vl-utils工具包

bash 复制代码
pip install qwen-vl-utils[decord]==0.0.8

尝试运行,不出意外的话肯定运行不了,报错原因依然是缺少modelscope:

2. 安装modelscope

bash 复制代码
 pip install modelscope -i https://pypi.tuna.tsinghua.edu.cn/simple

再次尝试运行,依然无法运行,报错原因modelscope下未找到Qwen2_5_VLForConditionalGeneration:

3.安装transformers

bash 复制代码
pip install git+https://github.com/huggingface/transformers accelerate

经历10分钟的漫长等待,终于下载安装完成。再次尝试运行,依然运行失败,报错原因缺少torchvision模块:

4.安装torchvision

bash 复制代码
pip install torchvision

5.尝试进行视频识别(失败)

再次尝试运行,事情出现转机,开始下载模型,并进行漫长的等待(在等待过程中,顺手去清理一些爆红的C盘!)

经历九九八十一分钟后,发生了意外(我没有碰它呀)

再次尝试运行,执行失败,报错原因是TypeError: process_vision_info() got an unexpected keyword argument 'return_video_kwargs':

下面先进行图片识别,排查一下是否是环境问题。

6. 尝试图片识别(成功)

先运行图片识别的代码(qwen-vl-img-hello.py)吧,没想到又发生更大意外惊喜,wsl系统连不上了!

Reload Window后,重新连接了

再次运行,图片识别成功。

图片识别成功,初步假设运行环境已经没有问题了,下面再次尝试视频识别。

7.尝试进行视频识别(失败)

依然是第5节的执行失败原因:

检查代码问题。先删除当前不必要的代码

然后脑袋总算是要清醒一点了,即这一行代码就是设置一个意料之外的参数return_video_kwargs。

python 复制代码
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")

继续思考解决方案:后面又要使用到这个video_kwargs,如果不配置它会不会无法返回这个参数......,管它呢,先删除return_video_kwargs=True,反正电脑又不会炸掉!(继续Run Python,并战术性的喝了一口水)。

嗯哼,报错了:Error reading?难道是视频链接失效了,复制到浏览器查看没问题呀,视频链接是有效的。

bash 复制代码
https://qianwen-res.oss-cn-beijing.aliyuncs.com/Qwen2-VL/space_woaudio.mp4

下面将继续排查,瞅一眼qwen-vl-utils的版本为0.0.8,没错儿呀,是文档里的版本咧。

看看源码,这个函数返回了None,但是这个函数的源码又看不到!暂且不继续了看源码了,换个方向再试试。

继续排查,尝试识别本地视频。(再喝一口水缓解一下压力)

python 复制代码
messages = [
    {
        "role": "user",
        "content": [
            {
                "type": "video",
                "video": "file:///mnt/e/WORK/project/ai/qwen-vl-hello/demo.mp4",
            },
            {"type": "text", "text": "Describe this video."},
        ],
    }
]

wsl又无法连接了!

再次连接后,再次尝试运行,虽然报错了,但是至少视频是能读取了,报错只是说明video_kwargs这个不能用了。

修改代码再次尝试运行,wsl又断连接了

直接在命令行执行

运行失败,报错原因fps未定义(这官方教程存在问题哦,艾特一下qwen官方)。修改代码,删除fps=fps。修改后再次运行

python 复制代码
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")

显存溢出!我不服,再次尝试还是显存溢出,我服了。

继续尝试量化模型Qwen/Qwen2.5-VL-3B-Instruct-AWQ

python 复制代码
# 第一处修改
model = Qwen2_5_VLForConditionalGeneration.from_pretrained(
    "Qwen/Qwen2.5-VL-3B-Instruct-AWQ", torch_dtype="auto", device_map="auto"
)

# 第二处修改
processor = AutoProcessor.from_pretrained("Qwen/Qwen2.5-VL-3B-Instruct-AWQ")

继续运行,开始下载模型,然后继续漫长的等待(顺便打开音乐播放器,放一首DJ串烧缓解一下情绪)

经过九九八十一天的等待后,模型下载完了,但是紧接着又报了一个错,报错意思是`autoawq`的版本太低。

先不急,再运行一次看看,报错依然如此。通过pip list|grep autoawq发现并没有安装autoawq,那就尝试用pip安装一个autoawq

bash 复制代码
pip install autoawq

继续尝试运行,显存溢出!

但是,细心的我发现这样一行输出,于是我虚心的请教了Deepseek

bash 复制代码
Unused or unrecognized kwargs: return_tensors, fps.

修改代码

python 复制代码
image_inputs, video_inputs = process_vision_info(messages)
inputs = processor(
    text=[text],
    images=image_inputs,
    videos=video_inputs,
    fps=30,
    padding=True,
    return_tensors="pt"
)
inputs = inputs.to("cuda")

仍然报错显存溢出!但是这个输出内容有点奇怪,区别如下(虚心的我又去查了一下这个单词的意思unrecognized-无法识别的,也就是说:这两个参数没有意义加和不加都一样!):

bash 复制代码
# 不添加fps参数
Unused or unrecognized kwargs: return_tensors, fps.

# 添加fps=30后
Unused or unrecognized kwargs: fps, return_tensors.

有进行了多次尝试,添加PYTORCH_CUDA_ALLOC_CONF环境变量、指定torch_dtype,都以显存溢出为结局

python 复制代码
from modelscope import Qwen2_5_VLForConditionalGeneration, AutoTokenizer, AutoProcessor
from qwen_vl_utils import process_vision_info
import torch

import os
os.environ["PYTORCH_CUDA_ALLOC_CONF"] = "expandable_segments:True"

# default: Load the model on the available device(s)
model = Qwen2_5_VLForConditionalGeneration.from_pretrained(
    "Qwen/Qwen2.5-VL-3B-Instruct-AWQ", torch_dtype=torch.float16, device_map="auto"
)

于是,我不得不承认本地的GPU显存确实有限,下面我改变策略,在云服务进行尝试。

8.借用云服务器进行视频识别(失败)

在魔塔选择赠送的GPU服务器使用时长,点击启动并稍等2分钟左右

克隆代码仓库

bash 复制代码
https://gitee.com/ai-trailblazer/qwen-vl-hello.git

代码拉取完成后,继续查看conda版本和显存。

发现没有conda,那就先在常规python环境尝试。

bash 复制代码
pip install qwen-vl-utils[decord]==0.0.8
pip install modelscope -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install git+https://github.com/huggingface/transformers accelerate

安装transformers报错了,暂且不管,先运行代码

bash 复制代码
python qwen-vl-video-hello.py

第一行运行报错,找不到Qwen2_5_VLForConditionalGeneration

此时回忆一下在本地的经验,安装transformers可是花费了十分钟之久,并且下载了很多内容,但是此时马上下载完毕并且还报错了,仔细分析错误原因,发现是很多python三方库版本不兼容的问题。所以后面还是启动一个conda环境吧

【AI训练环境搭建】在Windows11上搭建WSL2+Ubuntu22.04+Tensorflow+GPU机器学习训练环境

创建新的conda环境,名称为vlenv

bash 复制代码
conda create -n vlenv python=3.12

安装依赖

bash 复制代码
pip install qwen-vl-utils[decord]==0.0.8
pip install modelscope
pip install git+https://github.com/huggingface/transformers accelerate

安装transformers报错了

重新创建一个3.11 python版本的conda环境,名称为t1

bash 复制代码
conda create -n t1 python=3.11

尝试安装

bash 复制代码
pip install qwen-vl-utils[decord]==0.0.8
pip install modelscope -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install git+https://github.com/huggingface/transformers accelerate

这次看起来能正常安装了

安装完成

尝试运行,报出熟悉的异常

安装torchvision

bash 复制代码
pip install torchvision

再次尝试运行

bash 复制代码
python qwen-vl-video-hello.py

依然报显存溢出(这可是20多个G的显存哦)

(本次实践从本地到云服务,共花费7个多小时光阴,虽然目前没有运行成功,但是至少在这过程中实践了很多经验,后续我将尝试找一个比较小的视频再次验证。)

9.使用一个较小的视频进行识别(成功)

在以上实践中,使用的是一个21M的视频,视频时长约三分钟。而后我又拿了一个只有291KB的视频,视频时长只有1s。

功夫不负有心人,终于成功识别了一个视频!尽管这个视频只有1s,可以看到GPU也占用了9G(该显卡总共只有12G)。

10. 总结和展望

在本次实践中,主要采用transformers拉起Qwen2.5-VL-3B大模型进行视频识别,尽管这并不是工程化的运行方式,但是有作为入门实践的价值。

在整个过程中,总结出以下经验:

(1)鉴于网络原因,最好使用modelscope来下载模型;

(2)在vscode中使用wsl的conda环境,可能会出现无响应的情况,此时直接使用cmd命令行可能更加方便;

(3)当一条路走不通时,可以换一条路,如果换一条路还是走不通,这时在回头看方法是否有问题,很多时候就是在你回头思考的过程中解决掉问题的,但是你还是得感谢你在另一条路上探索,因为你至少知道了那条路行不通,否则你的思维陷入到不确定中;

(4)云服务器的网络和硬件优势可以加速我们进行AI方面的实践,本次实践中在云服务器上花费的实践仅仅只占总时长的30%,但是产生的效果却很显著,在这里也非常感谢modelscope社区和阿X云为我们提供的免费实例环境,非常感谢;

(5)conda是个好东西,其提供的强大的隔离式python环境,在解决各种依赖库版本库问题的时候非常有用,本次实践中,在云服务器最终使用的是python3.11版本,而我本地电脑是使用的python3.12,这些经验在工程成产过程中也很有价值;

后续的实际计划和展望:

(1)达到这个目标"Qwen2.5-VL 可以理解超过1小时的视频",所需要的条件和方式有哪些?

(2)考虑更加工程化和轻量化的通过Qwen2.5-VL进行视频识别的方案;

(3)其它模型或方案进行视频识别的使用资源和效果对比;

相关推荐
盛夏绽放34 分钟前
Python常用高阶函数全面解析:通俗易懂的指南
前端·windows·python
仟濹1 小时前
Python - 文件部分
python
一点.点1 小时前
李沐动手深度学习(pycharm中运行笔记)——10.多层感知机+从零实现+简介实现
人工智能·笔记·python·深度学习·pycharm
那雨倾城2 小时前
使用 OpenCV 实现哈哈镜效果
人工智能·python·opencv·计算机视觉
蹦蹦跳跳真可爱5893 小时前
Python----循环神经网络(LSTM:长短期记忆网络)
人工智能·python·rnn·深度学习·神经网络·lstm
大模型铲屎官3 小时前
【深度学习-Day 16】梯度下降法 - 如何让模型自动变聪明?
开发语言·人工智能·pytorch·python·深度学习·llm·梯度下降
ZWaruler3 小时前
十三: 神经网络的学习
人工智能·python·神经网络·机器学习·损失函数
moxiaoran57533 小时前
Python学习笔记--Django 表单处理
笔记·python·学习
zhangfeng11334 小时前
Python 和 matplotlib 保存图像时,确保图像的分辨率和像素符合特定要求(如 64x64),批量保存 不溢出内存
开发语言·python·matplotlib
FL16238631294 小时前
[yolov11改进系列]基于yolov11的修改检测头为自适应特征融合模块为ASFFHead检测头的python源码+训练源码
python·深度学习·yolo