ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Qwen2.5-VL喂图不再炸显存:qwen-vl-utils像素控制完整教程

Qwen2.5-VL喂图不再炸显存:qwen-vl-utils像素控制完整教程 Qwen2.5-VL喂图不再炸显存qwen-vl-utils像素控制完整教程【免费下载链接】Qwen3-VLQwen3-VL is the multimodal large language model series developed by Qwen team, Alibaba Cloud.项目地址: https://gitcode.com/GitHub_Trending/qw/Qwen3-VL你有没有遇到过这样的崩溃现场随手把一张 4000×3000 的原图塞进 Qwen2.5-VL推理直接 OOM或者一段 5 分钟的视频丢进去卡半天还在抽帧最后返回的答案却只描述了前几秒的画面。问题往往不在模型本身而在视觉输入进模型之前没人替你管好多大、多少帧这件事。qwen-vl-utils 就是干这个的Qwen2.5-VL 仓库自带的预处理工具包源码在 qwen-vl-utils/核心是process_vision_info这一个入口——你把图片和视频路径写进对话消息它负责缩放尺寸、抽帧数、转张量产出的东西可以直接交给 processor。下面按先跑通、再分场景调参、最后排坑的顺序讲。30 秒装好并跑通第一次调用一行安装pip install qwen-vl-utils跑通的最小路径只有三步把图片路径写进 messages、调用process_vision_info拿到处理后的视觉输入、把结果和文本一起送进 processor。以仓库里这张鸟的照片为例qwen-vl-utils/README.md 里的官方示例就是这个写法from qwen_vl_utils import process_vision_info messages [[ {role: user, content: [ {type: image, image: file:///path/to/bird.jpg}, {type: text, text: 图里有几只鸟分别是什么颜色} ]} ]] images, videos process_vision_info(messages) # images: 缩放后的 PIL 图像列表videos: 本例没有视频为 Noneprocess_vision_info只做一件事扫描 messages 里所有type: image/video的元素逐个处理完返回两个列表。你不需要关心缩放公式也不需要手动抽帧——这正是引入它的意义。装好 transformers 之后完整链路只需四行from transformers import Qwen2_5_VLForConditionalGeneration, AutoProcessor processor AutoProcessor.from_pretrained(model_path) model Qwen2_5_VLForConditionalGeneration.from_pretrained( model_path, torch_dtypeauto, device_mapauto) text processor.apply_chat_template(messages, tokenizeFalse, add_generation_promptTrue) images, videos, video_kwargs process_vision_info(messages, return_video_kwargsTrue) inputs processor(texttext, imagesimages, videosvideos, paddingTrue, return_tensorspt, **video_kwargs) generated_ids model.generate(**inputs)注意return_video_kwargsTrueQwen2.5-VL 需要把实际抽到的采样帧率fps传回 processor这个开关让函数把{do_sample_frames: False, fps: [...]}一并吐出来。少传它视频时间轴信息就会错位。我要处理图像默认就够特殊比例才动手默认行为不写任何尺寸参数时工具包按原始分辨率调用smart_resize实现在 vision_process.py规则是三条——高、宽最终都是 28 的整数倍14 的 patch × 2 的空间合并28 这个数在代码里由image_patch_size * SPATIAL_MERGE_SIZE推出来总像素落在 4 到 16384 个 token 对应的区间内超出就整体缩放尽量贴着原始宽高比不拉伸。所以一张 4000×3000 的图进去会自动缩小不会爆显存一张 32×32 的缩略图进去会被放大到至少 4 token避免被抹平。何时要改你明确知道下游要固定分辨率比如批量对比、对齐多模态特征或者想省 token 时直接在消息里写死目标尺寸{type: image, image: file:///path/to/img.jpg, resized_height: 280, resized_width: 420}给了resized_height/width后就不再按原图比例推算而是对你给的值再做一次 28 对齐这里建议直接给 280×420 这类 28 的倍数免得又被四舍五入。另外两个隐藏旋钮min_pixels/max_pixels分别覆盖默认的上下限用于这张图我就是要 1024 像素以内的场景。一个必知限制高宽比超过 200:1 的图会直接抛错代码里MAX_RATIO 200。长条拼接图、扫描横幅先裁段再喂别指望工具包救你。我要处理视频抽几帧、多大帧都先想清楚最小用法视频路径写进去就行默认按 2 fps 采样、帧数夹在 4768 之间{type: video, video: file:///path/to/video.mp4}工具包内部先用后端读出总帧数和原始帧率再交给smart_nframes算出实际抽几帧。它支持两种写法二选一给fps按这个帧率算结果被min_frames默认 4和max_frames默认 768且不超过总帧数夹住最后向下取到偶数帧数必须是 2 的倍数代码里FRAME_FACTOR 2给nframes直接定死帧数同样对齐到偶数。两者同时给会直接断言失败这是最常见的视频报错之一。进阶配置想控制单帧大小就加resized_height/width例子里统一压到 280×280想只处理片段就加video_start/video_end单位秒{type: video, video: file:///path/to/video.mp4, fps: 2.0, resized_height: 280, resized_width: 280, video_start: 10, video_end: 60}上面这段的意思取 1060 秒区间按 2 fps 抽帧每帧缩放到 280×280 附近。像这类界面截图视频cookbooks/computer_use.ipynb 演示的就是它帧内文字密集resized_width别压得太狠280 是下限文字小的场景可以放宽到 336 或 448。已经是帧序列的情况video字段可以传图片路径列表本地抽好的帧工具包会用ThreadPoolExecutor并行读取、不足偶数帧时用最后一帧补齐sample_fps默认按 2.0 处理。你不需要自己写并发代码。我要批量跑三条提速与省内存建议批量任务的瓶颈通常在读视频和缩放两处对应三件事帧列表输入天然并行。把视频文件→帧列表的拆帧提前做掉比如 ffmpeg 批量抽帧批量推理时就走ThreadPoolExecutor那条路实测比每个样本都现场解码文件快。卡住总像素上限。视频单帧的max_pixels默认还会受MODEL_SEQ_LEN推导的全局上限约束见下表显存紧张时把上限调小比降帧率对效果伤害小——帧数决定看得全不全单帧像素决定看得清不清。解码线程数按机器调。走 torchcodec 后端时FFmpeg 解码线程数由环境变量TORCHCODEC_NUM_THREADS控制默认 8多任务同机跑时调低它避免线程争抢把吞吐打下来。参数与环境变量速查消息级参数写在 image/video 元素里参数默认值作用什么时候需要改resized_height/resized_width按原图自适应指定目标尺寸再经 28 对齐要固定分辨率、省 token、做多模态对齐min_pixels/max_pixels图像4 / 16384 token 对应像素图像总像素上下限原图过小被放大、或想硬压小图fps2.0视频采样帧率动作快的事件调高静态长视频调低nframes—直接指定抽帧数与fps二选一要精确控制 token 量min_frames/max_frames4 / 768fps模式下的帧数夹逼长视频要更多帧、或显存吃紧video_start/video_end全片按秒截取片段只处理视频中的一段total_pixels由MODEL_SEQ_LEN推导视频总像素硬上限超长视频、长上下文场景环境变量变量默认值作用VIDEO_MAX_PIXELS—视频 token 上限官方给的建议值是32000 * 28 * 28 * 0.9MODEL_SEQ_LEN128000模型序列长度参与视频总像素上限推导FORCE_QWENVL_VIDEO_READER自动强制指定读视频后端decord/torchvision/torchcodecTORCHCODEC_NUM_THREADS8torchcodec 的 FFmpeg 解码线程数后端选择逻辑未设FORCE_QWENVL_VIDEO_READER时装了 torchcodec 就用 torchcodec否则有 decord 用 decord最后兜底 torchvision。stderr 里那行qwen-vl-utils using xxx to read video.会告诉你实际用了哪个。批量跑 mmcode.ipynb 这类图片→代码任务时输入往往是整页手稿或截图类似上面这张分辨率普遍偏高建议统一在消息里带上resized_height/width保证每条样本的 token 预算一致日志里的耗时才好横向对比。避坑与调优现象→原因→解法现象fps和nframes同时出现时直接断言报错。原因smart_nframes只接受两种模式之一。解法要按时间密度就用fps要按绝对数量就用nframes删掉另一个。现象视频读取报错后被替换成 torchvision 重新读日志里多一条 warning。原因首选后端decord/torchcodec对这个文件解码失败工具包自动降级。解法偶发可忽略同一批视频频繁降级多半是编码格式冷门export FORCE_QWENVL_VIDEO_READERdecord固定后端后统一验证文件兼容性。现象提示nframes should in interval [2, total_frames]。原因指定的nframes小于 2 或大于视频实际帧数比如 3 帧的短视频指定了 8 帧。解法把nframes降到不超过总帧数短视频干脆直接传帧列表绕开帧率计算。现象图像抛aspect ratio must be smaller than 200。原因超高宽比超出工具包硬限制。解法长图先切成正常比例的分段再分别处理。现象给了max_pixels但日志提示超过 limit、实际生效的是更小值。原因单帧上限还要被MODEL_SEQ_LEN推导的全局预算压制两者取小。解法长上下文需求就同时调大MODEL_SEQ_LEN或VIDEO_MAX_PIXELS别只调一处。现象批量解码时 CPU 打满、吞吐反而下降。原因torchcodec 默认 8 个 FFmpeg 线程多进程并发时线程超卖。解法export TORCHCODEC_NUM_THREADS4或更低按并发样本数反推。收尾提交代码前的自检清单跑正式批处理之前逐项过一遍所有图片宽高比都在 200:1 以内超长的已裁段视频消息里fps与nframes只出现了一个nframes不超过目标视频的实际总帧数调用了process_vision_info(..., return_video_kwargsTrue)并把**video_kwargs传给了 processor显存吃紧的机器上VIDEO_MAX_PIXELS或MODEL_SEQ_LEN已按预算下调多任务同机时TORCHCODEC_NUM_THREADS已按并发数调低stderr 里确认过实际使用的视频后端且没有反复降级 warning下一步建议图像链路通了之后先拿 video_understanding.ipynb 里的样例视频把fps/max_frames各扫一组值记录 token 数和效果差异再定你业务里的默认参数——比看文档猜参数快得多。【免费下载链接】Qwen3-VLQwen3-VL is the multimodal large language model series developed by Qwen team, Alibaba Cloud.项目地址: https://gitcode.com/GitHub_Trending/qw/Qwen3-VL创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表