昇腾社区首页
中文
注册
昇腾推理微服务+多模态SDK,构建视频知识提取应用实践

昇腾推理微服务+多模态SDK,构建视频知识提取应用实践

推理微服务多模态

发表于 2025/09/29

昇腾推理微服务+多模态SDK,构建视频知识提取应用实践

1 简介

本文基于Atlas 800I A2服务器,使用:视频分析与理解推理微服务(基于qwen2.5-vl-32b-instruct)以及多模态SDK,构建了视频知识提取应用。

多模态视频知识提取应用框架图​

组件名功能简介
多模态SDK多模态SDK提供了视频分块、帧抽取、视频解码、视频预处理、多模态知识提取等原子加速能力。
视频分析与理解推理微服务视频分析与理解的智能服务。为开发者提供RESTful API接口以高效处理和分析视觉数据,提供精准的视图理解能力。

2 支持的产品和版本

产品CANN 版本多模态SDK版本系统推荐
Atlas 800I A28.2.RC17.2.T4Ubuntu 20.04.6

3 快速部署

步骤1:下载微服务容器镜像、下载多模态SDK软件包并安装;

步骤2:启动推理微服务容器;

步骤3:使用多模态视频知识提取应用

3.1 下载微服务镜像与安装多模态SDK软件包

下载

镜像名称镜像仓库地址
视频分析与理解推理微服务镜像(qwen2.5-vl-32b-instruct)https://www.hiascend.com/developer/ascendhub/detail/3c2cac7ad7f74583bfe419800a71341c
多模态SDK软件包https://support.huawei.com/enterprise/zh/ascend-computing/mindx-pid-252501207/software/266619255?idAbsPath=fixnode01|23710424|251366513|254884019|261408772|252501207

检查镜像加载情况

docker images

检查软件包完整性

chmod u+x Ascend-mindxsdk-multimodal_{version}_linux-{arch}.run./Ascend-mindxsdk-multimodal_{version}_linux-{arch}.run --check

若显示如下信息,说明软件包已通过校验。

Verifying archive integrity...  100%   SHA256 checksums are OK. All good.    

安装多模态SDK软件包

若用户未指定安装路径,则将安装在当前路径下。若用户指定了安装路径,将安装在指定的路径下。以安装路径“/home/work/Mind_SDK”为例

./Ascend-mindxsdk-multimodal_{version}_linux-{arch}.run --install --install-path=/home/work/Mind_SDK

设置安装包的环境变量

. /home/work/Mind_SDK/multimodal-7.2.T4/script/set_env.sh

安装结果验证,打开python3,执行如下命令导入包,包导入成功则表示安装成功:

import mm

如果需要卸载,请执行如下命令:

. /home/work/Mind_SDK/multimodal-7.2.T4/script/uninstall.sh

3.2 启动推理微服务

启动视频分析与理解推理微服务

# 设置本地缓存路径
export LOCAL_CACHE_PATH=/data/models

# 设置容器名称
export CONTAINER_NAME=qwen2.5-vl-32b-instruct

# 选择镜像
export IMG_NAME=swr.cn-south-1.myhuaweicloud.com/ascendhub/qwen2.5-vl-32b-instruct:7.2.T4-aarch64

# 启动推理微服务,使用ASCEND_VISIBLE_DEVICES选择卡号,范围[0,7]
docker run -itd \
    --name=$CONTAINER_NAME \
    -e ASCEND_VISIBLE_DEVICES=0,1,2,3 \
    -e MIS_CONFIG=atlas800ia2-4x32gb-bf16-vllm-default \
    -e MIS_LIMIT_VIDEO_PER_PROMPT=1 \
    -v $LOCAL_CACHE_PATH:/opt/mis/.cache \
    -p 8000:8000 \
    --shm-size 1gb \
    $IMG_NAME

# 查看推理容器日志
docker logs -f ${CONTAINER_NAME}

确认推理微服务启动状态

执行启动命令后,在对应的微服务启动界面显示如下内容则表示启动成功:

Application startup complete

如需关闭对应的推理微服务,执行如下命令即可:

docker stop $CONTAINER_NAME

3.3 使用多模态视频知识提取

3.3.1 自定义插件示例

自定义视频抽帧插件,以插件目录为/home/code/sampler/plugins/sampler_case.py为例:

from mm import FrameSampler

@FrameSampler.register("sample_all")
def sampler_case(
        frames: list) -> list:
	return frames	# Sample all frames

注意事项:

1. 自定义插件目录和文件权限需为0o550

2. 用户自定义的插件实现,需要通过装饰器来修饰注册,如@FrameSampler.register("插件名")

3. 用户自定义的插件实现,接口格式需为: def sampler(name: str, frames: List[Frame], **params) -> List[Frame],其中Frame为泛帧类型

4. 当前软件包内提供默认均匀采样器功能,不配置frame_sampler_method、frame_sampler_plugin_path字段则默认使用均匀采样抽帧插件


自定义视频分块插件,以插件目录为/home/code/segmenter/plugins/segmenter_case.py为例:

import cv2
from mm import VideoSegmenter

@VideoSegmenter.register("segmenter_one")
def segmenter_case(
        video_path: str
) -> list[tuple[float, float]]:
    cap = cv2.VideoCapture(video_path)
    if not cap.isOpened():
        raise ValueError("Unable to open video file!")
    
    fps = cap.get(cv2.CAP_PROP_FPS)
    frame_count = cap.get(cv2.CAP_PROP_FRAME_COUNT)
    duration = frame_count / fps
    
    cap.release()
    return [(0.0,duration)]

注意事项:

1. 自定义插件目录和文件权限需为0o550

2. 用户自定义的插件实现,需要通过装饰器来修饰注册,如@VideoSegmenter.register("插件名")

3. 用户自定义的插件实现,接口格式需为: def segment(name: str, video_path: str = None, **params) -> List[Tuple[float, float]]

4. 当前软件包内提供默认固定长度分段功能,不配置video_segmenter_method、video_segmenter_plugin_path字段则默认使用固定长度分段插件


3.3.2 知识提取示例

from mm import SummarizeParams, MmKlgExtractHdlr, handle_response

if __name__ == '__main__':
    # 初始化知识提取参数配置类SummarizeParams
    params = SummarizeParams(
        file_path="视频文件地址",
        prompt="请对该视频进行摘要总结。",
        chunk_time=30.0,			# 视频分块的时间长度(以秒为单位)
        sample_num_per_chunk=60,	# 每个视频分块经帧采样后保留的帧数目
        batch_size=1,				# 批处理的大小,默认值为1,当前仅支持1
        top_p=0.8,				# 控制VLM大模型生成过程中考虑的词汇范围
        temperature=0.9,			# 控制VLM大模型生成的随机性
        max_tokens=8092)			# 控制VLM大模型输入输出长度

    # 初始化多模态知识提取处理器MmKlgExtractHdlr
    args = {
        "npu_num": 4,				# VLM大模型部署的卡数
        "npu_ids": [0, 1, 2, 3],	# VLM大模型推理使用的NPU卡ID
        "vlm_url": http://${微服务机器IP}:8000/openai/v1,        # VLM推理微服务地址
        "vlm_model_name": "Qwen2.5-VL-32B-Instruct",
        "frame_sampler_method": "sample_all",         # 视频抽帧插件名,不配置该字段则使用默认均匀采样抽帧插件
        "video_segmenter_method": "segmenter_one",    # 视频分块插件名,不配置该字段则使用默认固定长度分段插件
        "frame_sampler_plugin_path": "/home/code/sampler/plugins",        # 视频抽帧插件地址,不配置该字段则使用默认均匀采样抽帧插件
        "video_segmenter_plugin_path": "/home/code/segmenter/plugins"     # 视频分块插件地址,不配置该字段则使用默认固定长度分段插件
    }
    handler = MmKlgExtractHdlr(args)
    
    # 调用总结接口
    req_id = handler.summarize(params)
    # 获取多模态知识提取响应结果
    response_list = handle_response(handler, req_id)
    for idx, chunk_resp in enumerate(response_list):
        # 打印输出每一个视频分块的摘要总结
        print(f"chunk {idx}: {chunk_resp.vlm_response}")
    # 停止多模态知识提取服务
    handler.stop()

执行结果:

本页内容