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 ps –a|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-SSH、Remote-Containers、Docker等插件。
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”文件中增加OpenCV与numpy包的引用,修改其中的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视频文件。
- 点赞
- 收藏
- 关注作者
评论(0)