You need to enable JavaScript to run this app.
AI 数据湖服务

AI 数据湖服务

复制全文
视频理解
视频内容理解(Qwen VL 系列模型,支持大尺寸模型)
复制全文
视频内容理解(Qwen VL 系列模型,支持大尺寸模型)

算子介绍

描述

Qwen2.5-VL 多模态视频理解模型,支持时序语义解析与自然语言描述生成,适用于多种视频分析场景。

主要功能

  • 多模态时序建模:支持三种视频输入格式(URL、Base64编码、二进制流),灵活适配不同数据源。
  • 时空联合建模:自动捕捉视频的时空特征与语义关联,实现更精准的视频内容理解。
  • 对话式提示支持:通过 prompt 参数自定义生成方向,满足多样化业务需求。
  • 高效推理:集成VLLM推理引擎,支持 bfloat16float16float32 三种精度,充分利用GPU算力。
  • 推荐使用48G及以上显存的GPU

适用场景

  • 视频内容理解与摘要
  • 智能监控与事件分析
  • 多模态对话与交互
  • 其他需要视频语义解析的AI应用

注意事项

  • 仅支持GPU环境,建议根据显存和业务需求合理设置参数。
  • 推荐在推理前统一视频尺寸和帧率,以获得最佳效果。

Daft 调用

算子参数

输入

输入列名

说明

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… ┆ 请给出视频的详细描述。…    ┆ 这是一段动画片段,画面中出现了一个卡通角色,它被设计成一个…           │
    # ╰────────────────────────────────┴─────────────────────────┴─────────────────────────────────────────────────────────────╯
最近更新时间:2026.01.08 19:15:09
这个页面对您有帮助吗?
有用
有用
无用
无用