文章大纲引言一、模型加载概述二、核心数据结构三、模型加载核心流程引言Mindspore 是一款华为开发开源的AI推理框架而Mindspore Lite则是华为为了适配在移动终端设备上运行专门定制的版本使得我们可以在OpenHarmony快速实现模型加载和推理等功能模型加载则是利用 Mindspore Lite 进行推理任务的首要步骤它犹如打开智能应用大门的钥匙精准且高效地将预训练模型导入到运行环境中为后续的推理计算奠定坚实基础。无论是在移动端的智能应用开发还是边缘计算设备的智能任务处理Mindspore Lite 加载模型的能力都直接影响着整个系统的运行效率与智能化表现值得我们深入探究其原理、流程与优化策略接下来就重点解读核心API 及其流程。本文非Mindspore入门科普文需要具备一定的Mindspore 知识。一、模型加载概述加载的本质就是把模型从文件Buffer 转为Mindspore 后续推理时所需要的模型的相关对象。CPU 方式直接加载的话就是直接通过本地设备的CPU完成这些工作这些作为推理的输入直接使用而通过NNRT 的话就是在CPU完成这第一步加载后再把转换完成后的输出作为输入通过Delegate 模式再次进行转换转为NNRT 所需要的模型的相关对象再把这些NNRT的对象通过NNRT传递到NNRT HOST 进而传递到NPU中进行运算。二、核心数据结构Model 由LiteGraph 呈现LiteGraph 保存着所有的Tensor列表、Node列表、SubGrapha列表和输出、输入的索引LiteGraph 包含着Node、和SubGrapha相当于所有的子结构信息都保存到LiteGraph中每个子结构只保存各自的索引数据计算后再通过索引从LiteGraph中获取得到对应的数据。图由多个Node构成每一个Node 承担一个运算操作。比如一个计算图有两个节点NodeA执行加法操作和NodeB执行乘法操作输入来自NodeA的输出NodeA 输出张量生成的索引将被记录在output_indices_ 表示这个节点的输出Tensor,NodeB 就使用NodeA 的输出索引作为输入以便获取计算所需的数据。structMS_APILiteGraph{structNode{std::string name_;std::string op_type_;intnode_type_;constvoid*primitive_nullptr;std::shared_ptrvoidbase_operator_nullptr;std::vectoruint32_tinput_indices_;std::vectoruint32_toutput_indices_;intquant_type_;intdevice_type_-1;};structSubGraph{std::string name_;std::vectoruint32_tinput_indices_;std::vectoruint32_toutput_indices_;std::vectoruint32_tnode_indices_;std::vectoruint32_ttensor_indices_;};std::string name_;std::string version_;std::vectoruint32_tinput_indices_;std::vectoruint32_toutput_indices_;std::vectormindspore::schema::Tensor*all_tensors_;std::vectorNode*all_nodes_;std::vectorSubGraph*sub_graphs_;std::stringToString()const;};structMS_APIModel{LiteGraph graph_;char*bufnullptr;size_t buf_size_0;LiteModelType model_type_mindspore::lite::ModelType_MSLite;void*deobfnullptr;/// \brief Static method to create a Model pointer.staticModel*Import(constchar*model_buf,size_t size);/// \brief Static method to create a Model pointer.staticModel*Import(constchar*filename);/// \brief method to export model to file.staticintExport(Model*model,constchar*filename);/// \brief method to export model to buffer.staticintExport(Model*model,char*buf,size_t*size);/// \brief Free meta graph temporary buffervirtualvoidFree()0;/// \brief Free all temporary buffer.EG: nodes in the model.virtualvoidDestroy()0;/// \brief Model destruct, free all memoryvirtual~Model()default;};Struct LiteGraph{structNode{std::string name_;std::string op_type_;intnode_type_;constvoid*primitive_nullptr;std::shared_ptrvoidbase_operator_nullptr;std::vectoruint32_tinput_indices_;std::vectoruint32_toutput_indices_;intquant_type_;intdevice_type_-1;};structSubGraph{std::string name_;std::vectoruint32_tinput_indices_;std::vectoruint32_toutput_indices_;std::vectoruint32_tnode_indices_;std::vectoruint32_ttensor_indices_;};std::string name_;std::string version_;std::vectoruint32_tinput_indices_;std::vectoruint32_toutput_indices_;std::vectormindspore::schema::Tensor*all_tensors_;std::vectorNode*all_nodes_;std::vectorSubGraph*sub_graphs_;std::stringToString()const;}classMS_APILiteModel:publicModel{...}三、模型加载核心流程未完待续…