流程图开发

流程图开发步骤

流程图开发是指开发者根据实际的业务需求,对业务处理流程进行设计拆分,最后按照流程图的开发规范创建流程图,形成ModelBox能识别的配置文件的过程。流程图基本概念可参考基础概念中的流程图章节。流程图的开发是首要进行的,流程图开发完毕后,才能明确业务处理流程,同时明确开发者还需要开发哪些功能单元。

car_detection_flow

如上图,以开发一个视频车辆检测的AI应用为例,流程图开发步骤如下:

  1. 根据业务流程可以将业务流程拆分为如下几个功能单元:视频输入、视频解封装、视频解码、图片缩放、图片颜色转换、归一化、车辆推理、原图画框、视频编码。确定哪些可以直接预置功能单元,哪些需要自定义开发。即确定流程图的点。

  2. 确定自定义功能单元的输入输出、类型,如原图画框步骤需要两个输入:车辆检测坐标、原始图片,输出为画框后的图片。即确定流程图的边。

  3. 确定自定义功能单元的类型和属性,是否是条件分支、展开、合并等。具体概念可参考基础概念中功能单元章节。

  4. 创建自定义功能单元,根据ModelBox流程图规范进行构图。可以通过ModelBox的可视化UI编排界面构图,也可以手工编写配置文件。

流程图设计原则

根据业务需求对业务流程进行拆分设计时,节点粒度越细并发度和复用度越高,但会带来节点间交互复杂度变高。流程图的设计一般可遵循以下几个原则:

  • 模型推理一般作为单独的功能单元;

  • ModelBox内置了大量高性能预处理功能单元,可直接作为流程图节点;

  • ModelBox也内置了部分后处理功能单元,如YOLO后处理,可直接作为流程图节点;

  • 如有业务逻辑在中有分支判断、拆分合并则需要作为单独的功能单元;

  • 条件/展开功能单元之前的功能单元不能直接连接到条件/展开的内部;

  • 其他业务逻辑,如果不是处理瓶颈,不需要拆分。

典型场景业务可以参考ModelBox提供的应用样例,具体可参考第一个应用中每个案例的的流程图开发章节。

流程图构建规范

ModelBox采用TOML配置格式作为流程图配置文件。一个流程图使用一份TOML格式的配置表示,配置文件内容如下:

[driver]                       
dir=["dir1","dir2"]           
[graph]                 
format = "graphviz"      
graphconf = '''digraph demo {
    # 定义节点属性
    httpserver_sync_receive[type=flowunit, flowunit=httpserver_sync_receive, device=cpu, time_out_ms=5000, endpoint="http://0.0.0.0:7770"]
    hello_world[type=flowunit, flowunit=hello_world, device=cpu]
    httpserver_sync_reply[type=flowunit, flowunit=httpserver_sync_reply, device=cpu]

    # 定义边,即节点关系
    httpserver_sync_receive:out_request_info -> hello_world:in_data
    hello_world:out_data -> httpserver_sync_reply:in_reply_info
}                            
'''
  • 配置文件说明:

    [driver]:用于配置功能单元的扫描路径。

    • dir: 指定功能单元等驱动加载路径,可以指定多个路径,通过[] 和 ,分隔。

    [graph]:用于定义流程图的描述。

    • format指定流程图的格式,目前仅支持graphviz。
    • graphconf为流程图的描述内容。

ModelBox流程图的描述采用Graphviz DOT语法表达,关于DOT语法,可以查看Graphviz DOT的指导。具体格式可包含三部分:

  1. 第一部分是图

    • 格式

      digraph [graph_name]
      
    • 说明

      digraph开头,[graph_name]可以是字符串。

  2. 第二部分是点Node的定义

    • 格式

      node_name[type=flowunit, flowunit=flowunit_name, key=value]
      
    • 说明

      node_name为点的名称,key为node的配置属性,每个节点不同,valuekey的配置值。

      type参数指定点node的类型,可以是input, output, flowunit,当未指定type参数时,node缺省为flowunit。不同取值含义如下:

    • flowunit: 表示此点为功能单元功能模块,配合flowunit=xx指定功能单元的执行实体。

        node[type=flowunit, flowunit=httpserver]
      

      上述配置表示,点的名称为node,类型为flowunit,其执行实体为httpserver

    • input:表示此点的类型为输入端口,为整个图的配置,表示图的数据输入端口,主要用于外部数据输入到流程图。

        graphinput[type=input]
      

      上述配置表示,图输入点的名称为graphinput,在使用SDK形式调用ModelBox时可以使用此名称发送数据给图。

    • output: 表示此点的类型为输出端口,为整个图的配置,表示图的数据输出端口,主要用于数据输出到流程图外。

        graphoutput[type=output]
      

      上述配置表示,图输出点的名称为graphoutput,在使用SDK形式调用ModelBox时可以使用此名称接收图处理后的数据。

  3. 第三部分是点的关系定义

    • 格式

      flowunit_name1:outport -> flowunit_name2:inport
      
    • 说明

      flowunit_name1为点的名称,outport为输出端口名称,inport为输入端口名称。

©2022 ModelBox Team all right reserved,powered by Gitbook文件修订时间: 2022-09-16 08:17:12

results matching ""

    No results matching ""