MindSpore 模型格式

MindSpore计算图结构

MindSpore模型初始化流程

  1. LiteModel::ConstructModel() 从flatbuffers创建LiteModel对象。
    1. LiteModel::ConvertNodes() 从flatbuffers初始化mindspore::lite::LiteGraph::Node对象
    2. LiteModel::ConvertTensors() 从flatbuffers初始化mindspore::schema::Tensor对象
  2. LiteSession::CompileGraph(Model *model)
    1. LiteSession::ConvertTensors() 根据模型中定义的mindspore::schema::Tensor对象实例化成mindspore::lite::Tensor对象
    2. Scheduler::Schedule(std::vector<kernel::KernelExec *> *dst_kernels) 实例化mindspore::kernel::KernelExec对象
      1. Scheduler::ScheduleGraphToKernels() 将图转换成KernelExec对象
      2. 进行拓扑排序、将连续的Kernel按照arch类型合并成SubGraph

MindSpore的扩展

  1. 自定义运行时算子——通用算子:对Primitive列表中,已有算子(如Add)实现的重写

  2. 自定义运行时算子——Custom算子:定义一种新的算子,使用Primitive列表中的Primitive::Custom算子接口,构建专属的实现。其中type和attr是可以自定义的属性

    table Custom {
         type: string;
         attr: [Attribute];
    }
    
  3. 模型Delegate 提供将模型中的一部分子图卸载到别的框架执行的能力

  4. 模型转换中定义算子 converter工具提供了一种称为「图优化扩展」的能力(实际上是实现一个自定义的Pass),可以在获得MindSpore定义的图结构的基础上,对图进行修改,可将部分节点转换成Custom算子。