作者:昇腾实战派

1 简介

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

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

2 支持的产品和版本

产品 CANN 版本 多模态SDK版本 系统推荐
Atlas 800I A2 8.2.RC1 7.2.T4 Ubuntu 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软件包(Ascend-mindxsdk-multimodal{version}linux-{arch}.run) https://gitcode.com/Ascend/MultimodalSDK/releases/v26.0.0
检查镜像加载情况
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/script/set_env.sh

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

import mm

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

. /home/work/Mind_SDK/multimodal/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 使用多模态视频知识提取

自定义插件示例

自定义视频抽帧插件,以插件目录为/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字段则默认使用固定长度分段插件
知识提取示例
from mm import SummarizeParams, MmKlgExtractHdlr, handle_response

if name == '__main__': 
	# 初始化知识提取参数配置类
	SummarizeParams params = SummarizeParams( 
		file_path="视频文件地址", # .mp4格式 
		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()

执行结果:
在这里插入图片描述

Logo

作为“人工智能6S店”的官方数字引擎,为AI开发者与企业提供一个覆盖软硬件全栈、一站式门户。

更多推荐