Qwen2.5-VL 多模态视频理解模型,支持时序语义解析与自然语言描述生成,适用于多种视频分析场景。
prompt 参数自定义生成方向,满足多样化业务需求。bfloat16、float16、float32 三种精度,充分利用GPU算力。输入列名 | 说明 |
|---|---|
videos | 包含视频数据的数组,元素类型为 字符串 或者 二进制。 |
user_prompts | 视频理解对应的prompt,默认为None。如果不传入,则默认使用参数中的prompt。 |
处理后的数组,元素为每个视频的视觉理解结果。
如参数没有默认值,则为必填参数
参数名称 | 类型 | 默认值 | 描述 |
|---|---|---|---|
video_src_type | str | video_url | 输入视频的格式类型。支持: - "video_url": tos/http地址 - "video_base64": base64编码 - "video_binary": 二进制流 可选值:["video_url", "video_base64", "video_binary"] 默认值:"video_url" |
model_path | str | /opt/las/models | 本地模型文件存储的绝对路径。默认为容器内预置路径,当使用自定义模型时需修改此路径。 默认值:"/opt/las/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-72B-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 |
tensor_parallel_size | int | 1 | 张量并行的GPU数量,提升推理速度。 默认值:1 |
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 |
下面的代码展示了如何使用 daft 运行算子理解视频内容,并按照指令生成描述。
from __future__ import annotations import logging import os import ray import daft from daft import col from daft.las.functions.multimodal.qwen_vl_video_understanding_vllm import QwenVLVideoUnderstandingVLLM from daft.las.functions.udf import las_udf if __name__ == "__main__": os.environ["DAFT_RUNNER"] = "ray" def configure_logging(): logging.basicConfig( level=logging.INFO, format="%(asctime)s - %(name)s - %(levelname)s - %(message)s", datefmt="%Y-%m-%d %H:%M:%S.%s".format(), ) logging.getLogger("tracing.span").setLevel(logging.WARNING) logging.getLogger("daft_io.stats").setLevel(logging.WARNING) logging.getLogger("DaftStatisticsManager").setLevel(logging.WARNING) logging.getLogger("DaftFlotillaScheduler").setLevel(logging.WARNING) logging.getLogger("DaftFlotillaDispatcher").setLevel(logging.WARNING) ray.init(dashboard_host="0.0.0.0", runtime_env={"worker_process_setup_hook": configure_logging}) daft.context.set_runner_ray() daft.set_execution_config(actor_udf_ready_timeout=600) daft.set_execution_config(min_cpu_per_task=0) tos_dir_url = os.getenv("TOS_DIR_URL", "las-cn-beijing-public-online.tos-cn-beijing.volces.com") samples = { "video_path": [ f"https://{tos_dir_url}/public/shared_video_dataset/eating_56.mp4" ], "prompt": ["请给出视频的详细描述。"] } video_src_type = "video_url" model_path = os.getenv("MODEL_PATH", "/opt/las/models") model_name = os.getenv("MODEL_NAME", "Qwen/Qwen2.5-VL-7B-Instruct") dtype = "bfloat16" default_prompt = None max_caption_length = 256 min_pixels = 320 * 160 max_pixels = 320 * 160 fps = 1 batch_size = 2 seed = 42 max_model_len = 12800 max_num_seqs = 128 tensor_parallel_size = 1 enable_prefix_caching = True gpu_memory_utilization = 0.95 enforce_eager = True ds = daft.from_pydict(samples) ds = ds.with_column( "caption", las_udf( QwenVLVideoUnderstandingVLLM, construct_args={ "video_src_type": video_src_type, "model_path": model_path, "model_name": model_name, "dtype": dtype, "prompt": default_prompt, "max_caption_length": max_caption_length, "min_pixels": min_pixels, "max_pixels": max_pixels, "fps": fps, "batch_size": batch_size, "seed": seed, "max_model_len": max_model_len, "max_num_seqs": max_num_seqs, "tensor_parallel_size": tensor_parallel_size, "enable_prefix_caching": enable_prefix_caching, "gpu_memory_utilization": gpu_memory_utilization, "enforce_eager": enforce_eager, }, num_gpus=tensor_parallel_size, batch_size=batch_size, concurrency=1, )(col("video_path"), col("prompt")), ) ds.show() # ╭────────────────────────────────┬─────────────────────────┬─────────────────────────────────────────────────────────────╮ # │ video_path ┆ prompt ┆ caption │ # │ --- ┆ --- ┆ --- │ # │ Utf8 ┆ Utf8 ┆ Utf8 │ # ╞════════════════════════════════╪═════════════════════════╪═════════════════════════════════════════════════════════════╡ # │ https://las-cn-beijing-public… ┆ 请给出视频的详细描述。… ┆ 这是一段动画片段,画面中出现了一个卡通角色,它被设计成一个… │ # ╰────────────────────────────────┴─────────────────────────┴─────────────────────────────────────────────────────────────╯