鸿蒙进阶——Mindspore Lite AI框架源码解读之模型加载详解(一)

news2025/6/5 2:08:22

文章大纲

  • 引言
  • 一、模型加载概述
  • 二、核心数据结构
  • 三、模型加载核心流程

引言

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 的输出索引作为输入以便获取计算所需的数据。

struct MS_API LiteGraph {
  struct Node {
    std::string name_;
    std::string op_type_;
    int node_type_;
    const void *primitive_ = nullptr;
    std::shared_ptr<void> base_operator_ = nullptr;
    std::vector<uint32_t> input_indices_;
    std::vector<uint32_t> output_indices_;
    int quant_type_;
    int device_type_ = -1;
  };
  struct SubGraph {
    std::string name_;
    std::vector<uint32_t> input_indices_;
    std::vector<uint32_t> output_indices_;
    std::vector<uint32_t> node_indices_;
    std::vector<uint32_t> tensor_indices_;
  };
  std::string name_;
  std::string version_;
  std::vector<uint32_t> input_indices_;
  std::vector<uint32_t> output_indices_;
  std::vector<mindspore::schema::Tensor *> all_tensors_;
  std::vector<Node *> all_nodes_;
  std::vector<SubGraph *> sub_graphs_;
  std::string ToString() const;
};

struct MS_API Model {
  LiteGraph graph_;
  char *buf = nullptr;
  size_t buf_size_ = 0;
  LiteModelType model_type_ = mindspore::lite::ModelType_MSLite;
  void *deobf = nullptr;
  /// \brief Static method to create a Model pointer.
  static Model *Import(const char *model_buf, size_t size);
  /// \brief Static method to create a Model pointer.
  static Model *Import(const char *filename);
  /// \brief  method to export model to file.
  static int Export(Model *model, const char *filename);
  /// \brief  method to export model to buffer.
  static int Export(Model *model, char *buf, size_t *size);
  /// \brief Free meta graph temporary buffer
  virtual void Free() = 0;
  /// \brief Free all temporary buffer.EG: nodes in the model.
  virtual void Destroy() = 0;
  /// \brief Model destruct, free all memory
  virtual ~Model() = default;
};
Struct LiteGraph{
	struct Node {
		std::string name_;
		std::string op_type_;
		int node_type_;
		const void *primitive_ = nullptr;
		std::shared_ptr<void> base_operator_ = nullptr;
		std::vector<uint32_t> input_indices_;
		std::vector<uint32_t> output_indices_;
		int quant_type_;
		int device_type_ = -1;
	};
  struct SubGraph {
    std::string name_;
    std::vector<uint32_t> input_indices_;
    std::vector<uint32_t> output_indices_;
    std::vector<uint32_t> node_indices_;
    std::vector<uint32_t> tensor_indices_;
  };
  std::string name_;
  std::string version_;
  std::vector<uint32_t> input_indices_;
  std::vector<uint32_t> output_indices_;
  std::vector<mindspore::schema::Tensor *> all_tensors_;
  std::vector<Node *> all_nodes_;
  std::vector<SubGraph *> sub_graphs_;
  std::string ToString() const;
}
class MS_API LiteModel : public Model {
    ...
}

三、模型加载核心流程

在这里插入图片描述未完待续…

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2396713.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【数据结构】图论核心算法解析:深度优先搜索(DFS)的纵深遍历与生成树实战指南​

深度优先搜索 导读&#xff1a;从广度到深度&#xff0c;探索图的遍历奥秘一、深度优先搜索二、算法思路三、算法逻辑四、算法评价五、深度优先生成树六、有向图与无向图结语&#xff1a;深潜与回溯&#xff0c;揭开图论世界的另一面 导读&#xff1a;从广度到深度&#xff0c;…

RESTful APInahamcon Fuzzies-write-up

RESTful API 路径详解 RESTful API&#xff08;Representational State Transfer&#xff09;是一种 基于 HTTP 协议的 API 设计风格&#xff0c;它通过 URL 路径 和 HTTP 方法&#xff08;GET、POST、PUT、DELETE 等&#xff09;来定义资源的访问方式。它的核心思想是 将数据…

2025年机械化设计制造与计算机工程国际会议(MDMCE 2025)

2025年机械化设计制造与计算机工程国际会议&#xff08;MDMCE 2025&#xff09; 2025 International Conference on Mechanized Design, Manufacturing, and Computer Engineering 一、大会信息 会议简称&#xff1a;MDMCE 2025 大会地点&#xff1a;中国贵阳 审稿通知&#…

Jmeter逻辑控制器、定时器

目录 一、Jmeter逻辑控制器 ①IF(如果)控制器 作用&#xff1a; 位置&#xff1a; 参数介绍&#xff1a; 步骤&#xff1a; ②循环控制器 作用&#xff1a; 位置&#xff1a; 步骤&#xff1a; 线程组属性VS循环控制器 ③ForEach控制器 作用&#xff1a; 位置&am…

R3GAN利用配置好的Pytorch训练自己的数据集

简介 简介:这篇论文挑战了"GANs难以训练"的广泛观点,通过提出一个更稳定的损失函数和现代化的网络架构,构建了一个简洁而高效的GAN基线模型R3GAN。作者证明了通过合适的理论基础和架构设计,GANs可以稳定训练并达到优异性能。 论文题目:The GAN is dead; long l…

吴恩达机器学习笔记(1)—引言

目录 一、欢迎 二、机器学习是什么 三、监督学习 四、无监督学习 一、欢迎 机器学习是当前信息技术领域中最令人兴奋的方向之一。在这门课程中&#xff0c;你不仅会学习机器学习的前沿知识&#xff0c;还将亲手实现相关算法&#xff0c;从而深入理解其内部机理。 事实上&…

【笔记】Windows 部署 Suna 开源项目完整流程记录

#工作记录 因篇幅有限&#xff0c;所有涉及处理步骤的详细处理办法请参考文末资料。 Microsoft Windows [Version 10.0.27868.1000] (c) Microsoft Corporation. All rights reserved.(suna-py3.12) F:\PythonProjects\suna>python setup.py --admin███████╗██╗…

【Elasticsearch】Elasticsearch 核心技术(一):索引

Elasticsearch 核心技术&#xff08;一&#xff09;&#xff1a;索引 1.索引的定义2.索引的命名规范3.索引的增、删、改、查3.1 创建索引3.1.1 创建空索引 3.2 删除索引3.3 文档操作3.3.1 添加/更新文档&#xff08;指定ID&#xff09;3.3.2 添加文档&#xff08;自动生成ID&am…

Fullstack 面试复习笔记:操作系统 / 网络 / HTTP / 设计模式梳理

Fullstack 面试复习笔记&#xff1a;操作系统 / 网络 / HTTP / 设计模式梳理 面试周期就是要根据JD调整准备内容&#xff08;挠头&#xff09;&#xff0c;最近会混合复习针对全栈这块的内容&#xff0c;目前是根据受伤的JD&#xff0c;优先选择一些基础的操作系统、Java、Nod…

中科院报道铁电液晶:从实验室突破到多场景应用展望

2020年的时候&#xff0c;相信很多关注科技前沿的朋友都注意到&#xff0c;中国科学院一篇报道聚焦一项有望改写显示产业格局的新技术 —— 铁电液晶&#xff08;FeLC&#xff09;。这项被业内称为 "下一代显示核心材料" 的研究&#xff0c;究竟取得了哪些实质性进展…

智慧政务标准规范介绍:构建高效、协同的政务信息体系

在当今信息化快速发展的时代&#xff0c;智慧政务作为政府数字化转型的重要方向&#xff0c;正逐步改变着政府管理和服务的方式。为了确保智慧政务系统的建设能够有序、高效地进行&#xff0c;国家制定了一系列标准规范&#xff0c;其中GB∕T 21062系列标准《政务信息资源交换体…

手机照片太多了存哪里?

手机相册里塞满了旅行照片、生活碎片&#xff0c;每次清理都舍不得删&#xff1f;NAS——一款超实用的存储方案&#xff0c;让你的回忆安全又有序&#xff5e; 1️⃣自动备份解放双手 手机 / 电脑 / 相机照片全自动同步到 NAS&#xff0c;再也不用手动传文件 2️⃣远程访问像…

OpenRouter使用指南

OpenRouter 是一个专注于大模型&#xff08;LLM&#xff09;API 聚合和路由的服务平台&#xff0c;旨在帮助开发者便捷地访问多种主流大语言模型&#xff08;如 GPT-4、Claude、Llama 等&#xff09;&#xff0c;并提供统一的接口、成本优化和智能路由功能。以下是它的核心功能…

【优选算法 | 队列 BFS】构建搜索流程的核心思维

算法相关知识点可以通过点击以下链接进行学习一起加油&#xff01;双指针滑动窗口二分查找前缀和位运算模拟链表哈希表字符串模拟栈模拟(非单调栈)优先级队列 很多人学 BFS 的时候都知道“用队列”&#xff0c;但为什么一定是队列&#xff1f;它到底在整个搜索流程中起了什么作…

设计模式(行为型)-中介者模式

目录 定义 类图结构展示 角色职责详解 模式的优缺点分析 优点 缺点 适用场景 应用实例 与其他模式的结合与拓展 总结 定义 中介者模式的核心思想可以概括为&#xff1a;用一个中介对象来封装一系列的对象交互。这个中介者就像一个通信枢纽&#xff0c;使各对象不需要…

【Java学习笔记】异常

异常&#xff08;Exception&#xff09; 一、基本介绍 在 Java 程序中&#xff0c;将运行中发生的不正常情况称为 “异常”&#xff0c;开发过程中的语法错误和运行时发生的异常情况是不一样的。 二、异常的分类 1. Error&#xff08;错误&#xff09;&#xff1a;Java 虚拟…

MySQL:视图+用户管理+访问+连接池原理

一、视图 视图是一个虚拟表&#xff0c;其内容由查询定义。同真实的表一样&#xff08;相当于是把查询的内容当成一个临时表来使用&#xff09;&#xff0c;视图包含一系列带有名称的列和行数据。视图的数据变化会影响到基表&#xff0c;基表的数据变化也会影响到视图。 1.1 为…

neo4j 5.19.0安装、apoc csv导入导出 及相关问题处理

前言 突然有需求需要用apoc 导入 低版本的图谱数据&#xff0c;网上资料又比较少&#xff0c;所以就看官网资料并处理了apoc 导入的一些问题。 相关地址 apoc 官方安装网址 apoc 官方导出csv 教程地址 apoc 官方 导入 csv 地址 docker 安装 执行如下命令启动镜像 doc…

无人机桥梁3D建模的拍摄频率

无人机桥梁3D建模的拍摄频率 无人机桥梁3D建模的拍摄频率&#xff08;每秒拍摄照片数&#xff09;需根据建模精度、飞行速度、相机性能等因素综合确定。以下是专业级作业的详细参数分析&#xff1a; 1. 核心计算公式 拍摄频率&#xff08;fps&#xff09; \frac{飞行速度&…

ESP32-idf学习(三)esp32C3连接iot

一、前言 上一篇用蓝牙作为通信方式&#xff0c;虽然勉强完成了控制&#xff0c;但结果显然不是那么符合我们的预期&#xff0c;既然用蓝牙还需要研究一段时间&#xff0c;那我们就先整一些现成的&#xff0c;不需要研究的&#xff01;iot云平台&#xff01;这里当然也是通过w…