1. 整体流程
- 初始化一个graphManager类,用做主流程的管理
- Ascend 310芯片初始化
- 读取Graph配置文件,初始化Engine。这一步会自动初始化graph.config配置文件中的各个engine
- 数据的流动部分
- Graph 外传数据到 engine 的输入
- Engine 间的数据传输与处理
- 将处理得到的结果:Graph 内的 Engine 输出端口传输数据到 Graph 外
- 用Graph::SetDataRecvFunctor将推理结果返还给用户
附图
下图是我理解绘画的,整个编程和数据的流动是安装箭头的方法进行的。
2. 杂谈
- device的engines都有动态链接库,需要从host 将编译好的库文件copy到device侧。
engines {
id: 200
engine_name: "HelloDavinci"
side: DEVICE
thread_num: 1
so_name: "./libDevice.so"
ai_config {
}
- Graph主要功能是描述业务包含的Engine及Engine间的数据传输关系,Matrix框架通过Protobuf定义了Graph的数据结构,用户以配置文件的方式来定义Graph配置。
graphmanager主要用到三个接口函数
- Engine
-
Engine是Matrix框架定义的业务软件基本功能单元,用户可继承Matrix定义的Engine模板类,创建业务中各功能模块的Engine(读取输入文件,图像预处理,神经网络推理,推理结果后处理,host/device数据传输等),详情请参考文档《Atlas 500 MatrixAPI参考》。每一个Engine定义了函数Init()和Process(),在Graph初始化时,会自动运行Init(),从而实现Engine的参数初始化(包含内存分配和模型加载)。Process()接口实现数据的传输和业务逻辑。
所以,在demo中并没有显示的初始化各Engine
-
一个graph一般有多个engine,engine之间的协作需要进行数据的传输,需要手动实现。
-
device的Engine不知道如何debug
-
Graph::SetDataRecvFunctor该接口需要与DataRecvInterface::RecvData接口配合使用
-
该例子中没有graph->sentdata和graph->RecvData部分的实例