ModelBox上手指南

举报
EI_DTSE_feige 发表于 2021/08/31 21:52:18 2021/08/31
【摘要】 ModelBox是一个专门为开发者,研究人,学生提供的一个易于使用,高效,高扩展的AI推理开发框架,可以帮助开发者快速完成AI推理应用的开发和上线工作。本文档以一个简单的应用为例,帮助您快速熟悉端到端使用ModelBox开发应用的流程。

ModelBox使用简介

ModelBox是一个专门为开发者,研究人,学生提供的一个易于使用,高效,高扩展的AI推理开发框架,可以帮助开发者快速完成AI推理应用的开发和上线工作。

ModelBox的目标就是解决AI开发者在开发AI应用时的编程复杂度,降低AI应用的开发难度,将复杂的数据处理,并发互斥,多设备协同,组件复用,数据通信,交由ModelBox处理。开发者主要聚焦业务逻辑本身,而不是软件细节。 在提高AI推理开发的效率同时,保证软件的性能,可靠性,安全性等属性。

常用概念

使用ModelBox前,请提前了解ModelBox相关概念和介绍。


流程图

ModelBox中用流程图(Graph)来表达应用逻辑。采用有向图的方式,将应用的执行逻辑表达为顶点和边,其中顶点表示了应用的某个数据处理逻辑单元,边则表示了逻辑单元之间的数据传递关系。在ModelBox中,针对流程图的开发,既可以使用文本方式直接编辑,也可以使用可视化的编辑器进行编辑。对于流程图的表述,ModelBox默认采用Graphviz进行解释,即图的表述需要满足Graphviz的语法要求。

流单元

ModelBox将流程图中的顶点称为流单元(FlowUnit)。流单元是应用的基本组成部分,也是ModelBox的执行单元。在ModelBox中,内置了大量的基础流单元,开发者可以将这些流单元直接集成到应用流程图中,这也是基于流程图开发的一大好处。除内置流单元外,ModelBox支持流单元的自定义开发,支持的流单元形式多样,如C/C++动态库、Python脚本、模型+Toml配置文件等。

ModelBox

在应用构建完成后,结合ModelBox的框架才能形成完整可运行的应用。ModelBox作为应用入口,首先进行流单元的扫描加载、应用流程图读取构建,然后接收数据处理请求,数据触发ModelBox中的执行引擎对流单元进行调度,最终完成请求的数据处理任务。

使用流程

本文档以一个简单的应用为例,帮助您快速熟悉端到端使用ModelBox开发应用的流程。本文档开发的应用即打开一个mp4视频文件,推送到RTSP服务器,然后在PC端使用PotPlayer播放该mp4视频文件。

步骤:启动ModelBox开发镜像

准备工作

已下载SSH登录工具,如PuTTY

操作步骤

1. 运行PuTTY,单击“Session”,在“Host Name(or IP address)”的输入框中输入服务器IP,在“Port”输入框中输入端口号,如2-1所示。

2. 单击“open”,登录端侧设备

3. 输入账户密码,登录服务器。

4. 根据服务器端硬件规格下载ModelBox开发镜像。

X86+GPU服务器,执行如下命令下载镜像

docker pull registry-cbu.huawei.com/modelbox/euler/modelbox_cuda101_develop:v1.0.8

ARM+D310服务器(如Atlas500),执行如下命令下载镜像

docker pull registry-cbu.huawei.com/modelbox/euler/modelbox_ascend_aarch64_develop:v1.0.8

5. 在系统中创建如下docker启动脚本,或将如下脚本按需修改后,粘贴到ssh终端中执行。

注意脚本中注明[modify]的地方都可以根据自己的需要修改。

X86+GPU服务器可使用如下脚本。

#! /bin/bash

# ssh map port [modify]
SSH_MAP_PORT=50011

# editor map port [modify]
EDITOR_MAP_PORT=1104

# http server port [modify]
HTTP_SERVER_PORT=7788

# container name [modify]
CONTAINER_NAME="modelbox_instance_`date +%s`_xxx" # xxx可自定义。

HTTP_DOCKER_PORT_COMMAND="-p $HTTP_SERVER_PORT:$HTTP_SERVER_PORT"
sudo docker run -itd --gpus all \
-e NVIDIA_DRIVER_CAPABILITIES=compute,utility,video \
--tmpfs /tmp \
--tmpfs /run \
-v /sys/fs/cgroup:/sys/fs/cgroup:ro \
--name $CONTAINER_NAME \
-v /opt/modelbox:/opt/modelbox \
-v /home:/home \
-p $SSH_MAP_PORT:22 \
-p $EDITOR_MAP_PORT: 1104 $HTTP_DOCKER_PORT_COMMAND \
registry-cbu.huawei.com/modelbox/euler/modelbox_cuda101_develop:v1.0.8 /usr/sbin/init

ARM+D310服务器可使用如下脚本。

#!/bin/bash

# ssh map port, [modify]
SSH_MAP_PORT=50011

# editor map port [modify]
EDITOR_MAP_PORT=1144

# http server port [modify]
HTTP_SERVER_PORT=7788

# container name [modify]
CONTAINER_NAME="modelbox_instance_arm64_`date +%s`_xxx" # xxx可自定义。

HTTP_DOCKER_PORT_COMMAND="-p $HTTP_SERVER_PORT:$HTTP_SERVER_PORT"
sudo docker run -itd --privileged --cap-add=SYS_PTRACE \
--tmpfs /tmp --tmpfs /run -v /sys/fs/cgroup:/sys/fs/cgroup:ro \
--device=/dev/davinci0 --device=/dev/davinci_manager --device=/dev/hisi_hdc --device=/dev/devmm_svm \
--name $CONTAINER_NAME -v /opt/modelbox:/opt/modelbox -v /home:/home \
-p $SSH_MAP_PORT:22 -p $EDITOR_MAP_PORT:1144 $HTTP_DOCKER_PORT_COMMAND \
registry-cbu.huawei.com/modelbox/euler/modelbox_ascend_aarch64_develop:v1.0.8 /usr/sbin/init

6. 执行如下命令查看本服务器已启动的所有镜像,保存新启动的镜像ID

docker psa|grep modelbox

7. 执行如下命令进入ModelBox

docker exec -it $docker_id bash # 其中$docker_id 指新启动的镜像ID

8. 执行如下命令修改root用户密码。密码要求至少三类字符组合,如数字、字母、特殊符号。

passwd root

9. 退出容器,安装RTSP服务器,用于推送实时的RTSP视频流。

X86+GPU服务器可选择下载 EasyDarwin ,下载后解压文件,相关配置在easydarwin.ini文件中其中默认RTSP端口号为554记住它后面会用到

执行start.sh启动RTSP服务器。


ARM+D310服务器可选择下载 rtsp-simple-server ,下载后解压得到可执行文件和配置文件。


打开rtsp-simple-server.yml可修改RTSP服务相关的配置参数,如端口号默认为8554,可以根据需要修改。


修改后,执行如下命令后台启动RTSP服务器。

nohup ./rtsp-simple-server &


步骤二:远程连接ModelBox

准备工作

已下载并安装Visual Studio Code。注意:请下载1.57.1及以下版本的Visual Studio Code。

操作步骤

1. 打开Visual Studio Code,单击左侧图标,搜索并安装Remote-SSHRemote-ContainersDocker等插件。


2. 单击左侧图标,鼠标移至“SSH TARGETS”右侧的,在右侧搜索框中选择“config


3. 配置ModelBox容器的远程连接,如上图所示。

Host:用户可自定义本次远程连接的名称。

HostName:服务器IP

Port:与步骤 :启动 ModelBox 开发镜像 创建docker“SSH_MAP_PORT”的值一致。

User:填写“root”

4. 配置完,单击“SSH TARGETS”下方出现的图标。新弹出一个窗口。


5. 在新窗口,按提示输入ModelBox容器root帐号的密码,即步骤 :启动 ModelBox 开发镜像 中修改后的新密码。

等待一会,即可连接上ModelBox容器。

连接成功后,单击“Open folder”可直接打开ModelBox容器中的文件。


步骤三:开发ModelBox应用

开发流程图

本章节以开发一个简单的应用为例,介绍如何在Visual Studio Code开发ModelBox应用,该应用即打开一个mp4视频文件,推送到RTSP服务器,然后在PC端使用PotPlayer播放该mp4视频文件。

准备工作

在PC端安装PotPlayer播放器,用于播放RTSP视频流。

操作步骤

1. 在服务器创建“toml”格式文件,用来描述流程图。

ModelBox会根据流程图构建应用处理逻辑。

[driver]
dir = ["/usr/local/"]
skip-default = false
[profile]
profile=false
trace=false
dir="/tmp/"
[log]
level="DEBUG"
[graph]
format = "graphviz"
graphconf = """digraph test {
node [shape=Mrecord]
queue_size = 16
video_input[type=flowunit, flowunit=video_input, device=cpu, deviceid=0, source_url="XXX/XXX/XXX.mp4"]
videodemuxer[type=flowunit, flowunit=videodemuxer, device=cpu, deviceid=0]
videodecoder[type=flowunit, flowunit=videodecoder, device=cpu, deviceid=0, pix_fmt=rgb]
videoencoder[type=flowunit, flowunit=videoencoder, device=cpu, deviceid=0, default_dest_url="rtsp://IP:PORT/stream", format=rtsp]
video_input:stream_meta -> videodemuxer:stream_meta
videodemuxer:video_packet -> videodecoder:video_packet
videodecoder:frame_info -> videoencoder: frame_info
}"""
[flow]
desc = "test for video streams"

其中,“source_url”和“default_dest_url”需要根据实际情况自己配置。

XXX/XXX/XXX.mp4:实际mp4视频文件存放路径。

IP:服务器IP

PORT步骤 :启动 ModelBox 开发镜像 中安装的RTSP服务器配置端口号。

例如source_url="home/test.mp4"default_dest_url="rtsp://10.10.10.100:8554/stream"

2. ModelBox使用graphviz格式描述流程图,将流程图定义内容拷贝到graphhiz 工具 中进行查看。


3. Visual Studio Code执行如下命令,执行流程图。

modelbox-tool -verbose -log-level INFO flow -run xxx/xxx.toml

其中,“xxx/xxx.toml”为“toml”格式文件的实际存放路径。

4. 打开浏览器,输入“toml”格式文件中配置的“default_dest_url”地址,选择对话框中“打开PotPlayer专用播放”。

弹出的PotPlayer将会播放“toml”格式文件中配置的mp4视频文件。


开发流单元

上一节所开发的应用使用的是ModelBox自带的流单元,本章节在此基础上使用Python语言开发一个简单的流单元,嵌入到应用中,即在视频页面左上方写上“Hello World”。

1. Visual Studio Code执行如下命令,在指定路径下基于Python流单元模板生成“HelloWorld”流单元。

modelbox-tool create -t python -n HelloWorld -d ./examples/flowunits

其中,“./examples/flowunits”为存放流单元的实际路径。

生成的流单元包括“.py”文件和“.toml”配置文件。


2. .py”文件描述了流单元的处理逻辑,在“.py”文件中增加OpenCVnumpy包的引用,修改其中的process函数,具体如下。

import cv2
import numpy as np

def process(self, data_context):
# Process the data
in_data = data_context.input("Input")
out_data = data_context.output("Output")
for buffer_img in in_data:
width = buffer_img.get('width')
height = buffer_img.get('height')
channel = buffer_img.get('channel')
img_data = np.array(buffer_img.as_object(), copy=False)
img_data = img_data.reshape((height, width, channel))
cv2.putText(img_data, 'Hello World', (50, 50), cv2.FONT_HERSHEY_SIMPLEX, 1, (255, 0, 0), 2)
out_buffer = self.create_buffer(img_data)
out_buffer.copy_meta(buffer_img)
out_data.push_back(out_buffer)
return modelbox.Status.StatusCode.STATUS_SUCCESS

.toml”配置文件配置该流单元的名称、类别、输入输出端口等信息,当前不用修改。

3. 修改在4.2 开发流单元创建的流程图“toml”格式文件,具体内容如下。

[driver]
dir = ["/usr/local/" ,
"path-to-HelloWorld-flowunits"]
skip-default = false
[profile]
profile=false
trace=false
dir="/tmp/"
[log]
level="DEBUG"
[graph]
format = "graphviz"
graphconf = """digraph test {
node [shape=Mrecord]
queue_size = 16
video_input[type=flowunit, flowunit=video_input, device=cpu, deviceid=0, source_url="xxx/xxx.mp4"]
videodemuxer[type=flowunit, flowunit=videodemuxer, device=cpu, deviceid=0]
videodecoder[type=flowunit, flowunit=videodecoder, device=cpu, deviceid=0, pix_fmt=rgb]
HelloWorld[type=flowunit, flowunit=HelloWorld, device=cpu, deviceid=0]
videoencoder[type=flowunit, flowunit=videoencoder, device=cpu, deviceid=0, default_dest_url="rtsp://IP:PORT/stream", format=rtsp]
video_input:stream_meta -> videodemuxer:stream_meta
videodemuxer:video_packet -> videodecoder:video_packet
videodecoder:frame_info -> HelloWorld: Input
HelloWorld: Output -> videoencoder: frame_info
}"""
[flow]
desc = "test for video streams"

其中,

[driver]配置项的“dir”中添加了HelloWorld流单元的路径path-to-HelloWorld-flowunits”,根据实际路径配置

source_url”和“default_dest_url”需要根据实际情况自己配置,和上一节创建的“toml”格式文件内容一致。

4. ModelBox使用graphviz格式描述流程图,将流程图定义内容拷贝到graphhiz 工具 中进行查看。


5. Visual Studio Code执行如下命令,执行流程图。

modelbox-tool -verbose -log-level INFO flow -run xxx/xxx.toml

其中,“xxx/xxx.toml”为“toml”格式文件的实际存放路径。

6. 打开浏览器,输入“toml”格式文件中配置的“default_dest_url”地址,选择对话框中“打开PotPlayer专用播放”。

弹出的PotPlayer将会播放“toml”格式文件中配置的mp4视频文件。


【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。