鴻蒙進階——Mindspore Lite AI框架源碼解讀之模型加載詳解(一)

文章大綱

  • 引言
  • 一、模型加載概述
  • 二、核心數據結構
  • 三、模型加載核心流程

引言

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 buffervirtual void Free() = 0;/// \brief Free all temporary buffer.EG: nodes in the model.virtual void Destroy() = 0;/// \brief Model destruct, free all memoryvirtual ~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.pswp.cn/diannao/85653.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/85653.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/85653.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

AI煉丹日志-24 - MCP 自動操作 提高模型上下文能力 Cursor + Sequential Thinking Server Memory

點一下關注吧&#xff01;&#xff01;&#xff01;非常感謝&#xff01;&#xff01;持續更新&#xff01;&#xff01;&#xff01; Java篇&#xff1a; MyBatis 更新完畢目前開始更新 Spring&#xff0c;一起深入淺出&#xff01; 大數據篇 300&#xff1a; Hadoop&…

【仿muduo庫實現并發服務器】實現時間輪定時器

實現時間輪定時器 1.時間輪定時器原理2.項目中實現目的3.實現功能3.1構造定時任務類3.2構造時間輪定時器每秒鐘往后移動添加定時任務刷新定時任務取消定時任務 4.完整代碼 1.時間輪定時器原理 時間輪定時器的原理類似于時鐘&#xff0c;比如現在12點&#xff0c;定一個3點的鬧…

Windows10下搭建sftp服務器(附:詳細搭建過程、CMD連接測試、連接失敗問題分析解決等)

最終連接sftp效果 搭建sftp服務器 1、這里附上作者已找好的 freeSSHd安裝包 ,使用它進行搭建sftp服務器。 2、打開freeSSHd安裝包,進行安裝 (1)、選擇完全安裝 (2)、安裝完成后,對提示窗口選擇關閉 (3)、安裝完成后,提示是否安裝私有密鑰。我們選擇"是" (4)、安…

推薦幾個不錯的AI入門學習視頻

引言&#xff1a;昨天推薦了幾本AI入門書&#xff08;AI入門書&#xff09;&#xff0c;反響還不錯。今天&#xff0c;我再推薦幾個不錯的AI學習視頻&#xff0c;希望對大家有幫助。 網上關于AI的學習視頻特別多。有收費的&#xff0c;也有免費的。我今天只推薦免費的。 我們按…

點擊啟動「高效模式」:大騰智能 CAD 重構研發設計生產力

在制造業數字化轉型浪潮中&#xff0c;設計工具的革新正成為企業突破效率瓶頸的關鍵。傳統CAD軟件因本地硬件依賴、協作壁壘高筑、復雜場景響應遲緩等問題&#xff0c;長期困擾設計團隊。 大騰智能CAD依托華為云底座、自研幾何引擎及AI技術深度融合&#xff0c;為制造行業各細…

cursor如何開啟自動運行模式

在Cursor中&#xff0c;開啟自動運行模式即啟用“Yolo Mode”&#xff0c;具體操作如下&#xff1a; 按下Ctrl Shift J&#xff08;Windows/Linux&#xff09;或Cmd Shift J&#xff08;Mac&#xff09;打開Cursor設置。導航到“Features”&#xff08;功能&#xff09;選…

Windows10-ltsc-2019 使用 PowerShell 安裝安裝TranslucentTB教程(不通過微軟商店安裝)

Windows10-ltsc-2019 使用 PowerShell 安裝安裝TranslucentTB教程&#xff08;不通過微軟商店安裝&#xff09; 下載 v2020.4&#xff08;最后一個兼容 1809 的版本&#xff09;&#xff1a; TranslucentTB安裝包(下載不了上面有安裝包)安裝依賴項&#xff08;如未安裝&#x…

分布式拜占庭容錯算法——實現工作量證明(PoW)算法詳解

Java 實現工作量證明&#xff08;PoW&#xff09;算法詳解 一、PoW 核心原理 #mermaid-svg-AAj0Pvst1PVcVy5v {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-AAj0Pvst1PVcVy5v .error-icon{fill:#552222;}#mermaid…

黑馬Java面試筆記之框架篇(Spring、SpringMvc、Springboot)

一. 單例bean Spring框架中的單例bean是線程安全的嗎&#xff1f; Spring框架中的bean是單例的&#xff0c;可以在注解Scope()進行設置 singleton&#xff1a;bean在每一個Spring IOC容器中只有一個實例。prototype&#xff1a;一個bean的定義可以有多個實例 總結 二. AOP AOP稱…

electron下載文件

const http require(http); const https require(https); const fs require(fs); const { URL } require(url); const path require(path);// 下載文件函數 function downloadFile(url, savePath) {return new Promise((resolve, reject) > {try {console.log(開始下載…

快速掌握 GO 之 RabbitMQ 結合 gin+gorm 案例

更多個人筆記見&#xff1a; &#xff08;注意點擊“繼續”&#xff0c;而不是“發現新項目”&#xff09; github個人筆記倉庫 https://github.com/ZHLOVEYY/IT_note gitee 個人筆記倉庫 https://gitee.com/harryhack/it_note 個人學習&#xff0c;學習過程中還會不斷補充&…

android FragmentManager 刪除所有Fragment 重建

在Android開發中&#xff0c;管理Fragment是一項常見任務&#xff0c;有時需要刪除所有Fragment并重新創建。這在某些場景下&#xff0c;例如用戶需要重置應用狀態或切換內容時&#xff0c;顯得尤為重要。本文將詳細介紹如何通過 FragmentManager刪除所有Fragment并重建。 一、…

ubuntu之開機自啟frpc

在 Ubuntu 系統中為 frpc 設置開機自啟&#xff08;以 frpc -c frpc.toml 命令為例&#xff09;&#xff0c;可以通過 systemd 服務實現。以下是詳細步驟&#xff1a; 創建 systemd 服務文件 sudo vim /etc/systemd/system/frpc.service 寫入以下內容&#xff08;根據你的路…

推薦一款PDF壓縮的工具

今天一位小伙伴找來&#xff0c;問我有沒有辦法將PDF變小的辦法。 詳細了解了一下使用場景&#xff1a; 小伙伴要在某系統上傳一個PDF文件&#xff0c;原文件是11.6MB&#xff0c;但是上傳時系統做了限制&#xff0c;只能上傳小于10MB的文件&#xff0c;如圖&#xff1a; 我聽…

JDK21深度解密 Day 11:云原生環境中的JDK21應用

【JDK21深度解密 Day 111】云原生環境中的JDK21應用 本文是《JDK21深度解密:從新特性到生產實踐的全棧指南》專欄的第11天內容,聚焦云原生環境中的JDK21應用。我們將深入探討如何在容器化、微服務、Serverless等云原生架構中充分發揮JDK21的技術優勢,提升Java應用的性能、穩…

Java-redis實現限時在線秒殺功能

1.使用redisson pom文件添加redisson <!--redisson--><dependency><groupId>org.redisson</groupId><artifactId>redisson-spring-boot-starter</artifactId><version>3.23.4</version></dependency> 2.mysql數據庫表設…

QT- QML Layout+anchors 布局+錨點實現窗口部件權重比例分配

布局管理 簡單比較兩種界面管理錨點布局實現比例布局布局管理實現比例布局循環依賴問題簡談 在日常打螺絲中&#xff0c;我們偶爾會需要實現界面各組件能按比例放置&#xff0c;自適應各種分辨率的需求。我用錨點和布局都實現過相關界面&#xff0c;記錄下來兩種方式實現的差異…

Java項目OOM排查

排查思路 Java項目出現OOM&#xff08;Out Of Memory&#xff0c;內存溢出&#xff09;問題時&#xff0c;排查思路如下&#xff1a; 確認OOM類型&#xff1a; Java Heap Space&#xff1a;堆內存溢出&#xff0c;通常是對象創建過多或內存泄漏。PermGen Space&#xff1a;永久…

vue+threeJs 生成云狀特效屏幕

嗨&#xff0c;我是小路。今天主要和大家分享的主題是“vuethreeJs 生成云狀特效屏幕”。 動態云狀特效示例圖 二、實例代碼 <!--創建一個動態數字屏幕--> <template><div class"pageBox"><div class"leftBox" ref"lef…

ABAP設計模式之---“高內聚,低耦合(High Cohesion Low Coupling)”

“高內聚、低耦合”是面向對象編程中非常重要的設計原則&#xff0c;它有助于提高代碼的可維護性、擴展性和復用性。 1. 初衷&#xff1a;為什么會有這個原則&#xff1f; 在軟件開發中&#xff0c;隨著業務需求的復雜化&#xff0c;代碼難免會變得越來越龐大。如果開發者將一…