视频内容理解-QwenVL系列模型
更新时间:2026-05-18
视频内容理解(Qwen VL 系列模型)
简介
QwenVLVideoUnderstandingVLLM 是基于 Daft + Ray 分布式框架的视频理解组件,利用 Qwen2.5-VL 多模态大模型通过 vLLM 推理引擎对视频内容进行理解和描述生成,适用于视频字幕生成、内容审核、视频标注等场景。
功能
- 支持通过视频进行内容理解
- 基于 Qwen2.5-VL 多模态大模型生成视频描述
- 使用 vLLM 推理引擎,支持高吞吐并行推理
- 支持自定义 prompt,灵活指定理解任务
输入
| 输入列名 | 说明 |
|---|---|
| videos | 包含视频数据的数组,元素类型为 字符串 或者 二进制。 |
| user_prompts | 视频理解对应的prompt,默认为None。如果不传入,则默认使用参数中的prompt。 |
参数
| 参数名称 | 类型 | 默认值 | 描述 |
|---|---|---|---|
| video_src_type | str | video_url | 输入视频的格式类型。支持:"video_url": bos/http地址"video_base64": base64编码"video_binary": 二进制流可选值:["video_url", "video_base64", "video_binary"]默认值:"video_url" |
| model_path | str | /opt/aihc/models | 本地模型文件存储的绝对路径。默认为容器内预置路径,当使用自定义模型时需修改此路径。默认值:"/opt/aihc/models" |
| model_name | str | Qwen/Qwen2.5-VL-7B-Instruct | 支持的视觉语言模型版本。当前仅支持Qwen2.5-VL系列模型。可选值:["Qwen/Qwen2.5-VL-7B-Instruct-AWQ", "Qwen/Qwen2.5-VL-7B-Instruct", "Qwen/Qwen2.5-VL-32B-Instruct-AWQ", "Qwen/Qwen2.5-VL-32B-Instruct"]默认值:"Qwen/Qwen2.5-VL-7B-Instruct" |
| prompt | str | 请给出这段视频的详细描述。 | 用户理解视频内容的提示词,模型会根据提示词来生成视频的描述。设置为空时,建议针对每条数据传入特定的prompt。默认值:"请给出这段视频的详细描述。" |
| batch_size | int | 4 | 单次推理处理的样本数量。较大的batch_size可提升吞吐但增加显存消耗,建议根据GPU显存调整。默认值:4 |
| dtype | str | bfloat16 | 模型推理精度选择。"bfloat16": 平衡精度与速度"float16": 更快的推理速度"float32": 最高精度但显存消耗最大可选值:["bfloat16", "float16", "float32"]默认值:"bfloat16" |
| max_model_len | int | 128000 | 支持的最大模型输入长度(token数),影响可处理视频描述的长度,不能超过128000。默认值:128000 |
| max_num_seqs | int | 128 | 单批次最大序列数,影响并发推理能力。默认值:128 |
| enable_prefix_caching | bool | True | 是否启用前缀缓存以加速多轮推理。默认值:True |
| gpu_memory_utilization | float | 0.9 | 单卡GPU显存利用率上限,范围0~1。默认值:0.9 |
| enforce_eager | bool | False | 是否强制使用eager模式推理,调试或特殊场景可用。默认值:False |
| min_pixels | int or None | None | 视频最小像素。不设置时,默认使用视频的原像素。视频像素越大,GPU显存占用越高。默认值:None |
| max_pixels | int or None | None | 视频最大像素。不设置时,默认使用视频的原像素。视频像素越大,GPU显存占用越高。默认值:None |
| fps | float or None | None | 视频帧率。不设置时,默认使用视频的原帧率。视频帧率越高,GPU显存占用越高。建议设置特定的帧率值。默认值:None |
| temperature | float | 1.0 | 采样温度,控制生成内容的多样性。值越高生成越随机。默认值:1.0 |
| top_p | float | 0.2 | nucleus采样的概率阈值,控制生成内容的多样性。值越小生成越保守。默认值:0.2 |
| repetition_penalty | float | 1.05 | 重复惩罚系数,防止生成重复内容。值越大重复内容越少。默认值:1.05 |
| max_tokens | int | 8192 | 单次生成的最大token数,影响描述长度。默认值:8192 |
| stop_token_ids | list | [] | 生成时遇到这些token id则停止。用于自定义生成终止条件。默认值:[] |
| seed | int | 42 | 随机种子,保证推理结果可复现。默认值:42 |
输出
处理后的数组,元素为每个视频的视觉理解结果。
使用示例
Plain Text
1from __future__ import annotations
2
3import os
4import daft
5from daft import col
6from daft.aihc.common.udf import aihc_udf
7from daft.aihc.functions.multimodal.qwen_vl_video_understanding_vllm import QwenVLVideoUnderstandingVLLM
8
9if __name__ == "__main__":
10 if os.getenv("DAFT_RUNNER", "native") == "ray":
11 import ray
12 ray.init(dashboard_host="0.0.0.0", ignore_reinit_error=True)
13 daft.set_runner_ray()
14 daft.set_execution_config(actor_udf_ready_timeout=6000, min_cpu_per_task=0)
15
16 samples = {
17 "video_path": [
18 f"https://{bucket}.bj.bcebos.com/sample.mp4"
19 ],
20 "prompt": ["请给出视频的详细描述。"]
21 }
22
23 video_src_type = "video_url"
24 model_path = os.getenv("MODEL_PATH", "/opt/aihc/models")
25 model_name = os.getenv("MODEL_NAME", "Qwen/Qwen2.5-VL-7B-Instruct")
26 dtype = "bfloat16"
27 default_prompt = None
28 max_caption_length = 256
29 min_pixels = 320 * 160
30 max_pixels = 320 * 160
31 fps = 1
32 batch_size = 2
33 seed = 42
34 max_model_len = 12800
35 max_num_seqs = 128
36 enable_prefix_caching = True
37 gpu_memory_utilization = 0.95
38 enforce_eager = True
39
40 ds = daft.from_pydict(samples)
41 ds = ds.with_column(
42 "caption",
43 aihc_udf(
44 QwenVLVideoUnderstandingVLLM,
45 construct_args={
46 "video_src_type": video_src_type,
47 "model_path": model_path,
48 "model_name": model_name,
49 "dtype": dtype,
50 "prompt": default_prompt,
51 "max_caption_length": max_caption_length,
52 "min_pixels": min_pixels,
53 "max_pixels": max_pixels,
54 "fps": fps,
55 "batch_size": batch_size,
56 "seed": seed,
57 "max_model_len": max_model_len,
58 "max_num_seqs": max_num_seqs,
59 "enable_prefix_caching": enable_prefix_caching,
60 "gpu_memory_utilization": gpu_memory_utilization,
61 "enforce_eager": enforce_eager,
62 },
63 num_gpus=1,
64 batch_size=batch_size,
65 concurrency=1,
66 )(col("video_path"), col("prompt")),
67 )
68
69 ds.show()
70#╭────────────────────────────────┬────────────────────────┬─────────────────────────────────────────────────────────────╮
71#│ video_path ┆ prompt ┆ caption │
72#│ --- ┆ --- ┆ --- │
73#│ String ┆ String ┆ String │
74#╞════════════════════════════════╪════════════════════════╪═════════════════════════════════════════════════════════════╡
75#│ https://{bucket}.bj.bcebos.com/┆ 请给出视频的详细描述。 ┆ 这段视频展示了一对男女在室内对话的场景。背景中可以看到一些… │
76#╰────────────────────────────────┴────────────────────────┴─────────────────────────────────────────────────────────────╯
评价此篇文章
