寒武纪及瑞芯微平台调用加速调研

文章目录

    • 1 寒武纪加速平台简介
      • 1.1 加速平台简介
        • 1.1.1 算力硬件
        • 1.1.2 配套软件
      • 1.2 部署流程简介
      • 1.3 部署环境搭建
          • 1.3.1 安装驱动
          • 1.3.2 安装CNToolKit
          • 1.3.3 配置模型移植开发环境
      • 1.4 模型部署
        • 1.4.1 模型转换旧文件格式
        • 1.4.2 量化模型生成
        • 1.4.3 验证结果
        • 1.4.4 离线模型生成

1 寒武纪加速平台简介

1.1 加速平台简介

1.1.1 算力硬件
系列推理训练应用类型备注
MLU220☑️边缘端INT8 8T算力+8.25W功耗; INT8 16T算力+16.5W;CPU计算能力较弱需要其他主控例如瑞芯微3588
MLU270☑️服务器端部署服务端的智能分析算法;模型移植硬件平台;
MLU290☑️☑️训练卡应用在各云厂商、机房和服务中心等,主要用于训练
1.1.2 配套软件

在这里插入图片描述

主要组成为:

  • 驱动
  • 运行库插件
  • 开源框架

推理部分包括两个开源部分:

EasyDK:基于其运行时库封装的一些常用和简易接口,对我们来说,可能最常用的就是关于离线模型推理部分。相关介绍请参见其官网: https://github.com/Cambricon/easydk

CNStream:基于EasyDK封装的一套应用层库,类似于deepstreamMediaPipe。相关介绍请参见其官网:https://github.com/Cambricon/CNStream

1.2 部署流程简介

寒武纪平台的部署流程有一条主线是将一个原始模型转为一个离线模型。基本流程如下:

  1. 得到算法的原始模型,如caffe/pytorch/tensorflow等框架的模型。
  2. 配置对应框架模型的模型转换环境,手动配置/docker。
  3. 使用对应的框架模型转换环境。
  4. 进行模型量化、转换得到离线模型。
  5. 开发支持离线模型的程序应用。
  6. 调用离线模型进行推理并做其他处理。

1.3 部署环境搭建

推荐系统:ubuntu 18.04,ubuntu 20.04 , ubuntu 22.04

推理模式:一个是cnrt,一个是easydk。easydk是基于cnrt封装的api,大大简化了离线模型推理的开发流程。

主体流程:初始化mlu设备,加载模型,预处理,模型推理,后处理,处理结果。

寒武纪还提供了CNStream程序框架,基于EasyDk开发,以pipeline+observer的方式,提供了一个简单易用的框架,如果有兴趣,请查看其官网 https://github.com/Cambricon/CNStream 。其实要用的是EasyDK+CNRT的这种开发方式,构造一个类似CNStream这样的程序。

1.3.1 安装驱动

两个系列的os

  • ubuntu/debian
  • centos

下载得到驱动包名:neuware-mlu270-driver-dkms_xxx_all.deb

sudo dpkg -i neuware-mlu270-driver-dkms_xxx_all.deb

查看显卡命令,类似于nvidia-smi:

cnmon
1.3.2 安装CNToolKit

方法1:查看官网

sudo dpkg -i cntoolkit_xxx.deb
sudo apt update
sudo apt-get install cnas cncc cncodec cndev cndrv cnlicense cnpapi cnperf cnrt cnrtc cnstudio

野路子:

  • 解压cntoolkit_xxx.deb。
  • 找到里面的所有deb文件,选择自己需要的,直接解压安装。
  • 注意,野路子在边缘端环境配置的时候、边缘端程序生成的时候有奇效。

配置相关环境变量:

export NEUWARE_HOME="/usr/local/neuware"
export PATH="${NEUWARE_HOME}/bin:${PATH}"
1.3.3 配置模型移植开发环境

寒武纪官方支持3种常见框架的模型移植,分别是caffe/tensorflow/pytorch,官方资料如下:

caffe: https://www.cambricon.com/docs/caffe/index.html
tensorflow: https://www.cambricon.com/docs/tensorflow/user_guide/index.html
pytorch: https://www.cambricon.com/docs/pytorch/index.html

1.4 模型部署

1.4.1 模型转换旧文件格式
# 存在一个模型test.pth(zip格式)
# 存在一个获取的模型网络结构类:TestModel
import torchmodel = TestModel()
state_dict = torch.load('test.pth', map_location=torch.device('cpu'))
model.load_state_dict(state_dict, strict=True)           torch.save(model, 'new_test.pth', _use_new_zipfile_serialization=False)
# 得到了旧版本的pth文件。方便pytorch 1.6以下进行加载
1.4.2 量化模型生成
# 存在一个模型new_test.pth(非zip格式)
# 存在一个获取的模型网络结构类:TestModel
import torch
import torch_mlu.core.mlu_quantize as mlu_quantizemodel = TestModel()
state_dict = torch.load('new_test.pth', map_location=torch.device('cpu'))
model.load_state_dict(state_dict, False)          
mean=[]
std=[] 
# 注意此接口,这里不使用firstconv优化,它的作用是将归一化放到第一层去一起加速做,但是有些模型的前处理是不需要这样做的,具体信息,请参考寒武纪官方文档。
net_quantization = mlu_quantize.quantize_dynamic_mlu(model, {'mean':mean, 'std':std, 'firstconv':False}, dtype='int8', gen_quant=True)
torch.save(net_quantization.state_dict(), 'test_quantization.pth')# 得到了INT8的量化模型文件test_quantization.pth
1.4.3 验证结果
# 存在一个INT8的量化模型文件test_quantization.pth
# 存在一个获取的模型网络结构类:TestModel
import torch_mlu
import torch_mlu.core.mlu_model as ct
import torch_mlu.core.mlu_quantize as mlu_quantizemodel = TestModel()# step 1
net = mlu_quantize.quantize_dynamic_mlu(model)
# step 2
net.load_state_dict(torch.load('test_quantization.pth'))
# 这里是
input_data=torch.randn((1,3,480,480))
# step 3
net_mlu = net.to(ct.mlu_device())
input_mlu = input_data.to(ct.mlu_device())
# step 4
output=net_mlu(input_mlu)
print(output.cpu())
# output的shape是480*480
1.4.4 离线模型生成
# 存在一个INT8的量化模型文件test_quantization.pth
# 存在一个获取的模型网络结构类:TestModel
import torch_mlu
import torch_mlu.core.mlu_model as ct
import torch_mlu.core.mlu_quantize as mlu_quantizemodel = TestModel()# step 1
net = mlu_quantize.quantize_dynamic_mlu(model)
# step 2
net.load_state_dict(torch.load('test_quantization.pth'))
# 
input_data=torch.randn((1,3,480,480))
# step 3
net_mlu = net.to(ct.mlu_device())
input_mlu = input_data.to(ct.mlu_device())# 详细查看文档,一般4
core_number = 4
ct.set_core_number(core_number)
ct.set_core_version('MLU220')
# torch_mlu.core.mlu_model.set_input_format(input_format)
ct.save_as_cambricon('test')net_trace = torch.jit.trace(net_mlu, input_mlu, check_trace=False)net_trace(input_mlu) torch_mlu.core.mlu_model.save_as_cambricon("")# 最终,我们得到了test.cambricon 和 test.cambricon_twins。test.cambricon_twins是离线模型的说明文件,包含输入数据格式通道等信息,也包含输出相关的信息。

上文的第三四五步其实对应的是

  • EasyInfer下面的ModelLoader模块

  • 初始化ModelLoader模块

  • 传参给EasyInfer实例

  • 为模型在cpu和mlu上申请相关的内存空间。在EasyDk中有对应的接口直接完成内存申请

  • 图像数据预处理,到图像数据类型转换,再到图像数据输入到mlu内存

  • 推理准备参数

  • 开始推理

  • mlu内存中拷贝出推理结果到cpu内存,然后进行后处理

  • 清理环境

  • EasyInfer下面的ModelLoader模块

  • 初始化ModelLoader模块

  • 传参给EasyInfer实例

  • 为模型在cpu和mlu上申请相关的内存空间。在EasyDk中有对应的接口直接完成内存申请

  • 图像数据预处理,到图像数据类型转换,再到图像数据输入到mlu内存

  • 推理准备参数

  • 开始推理

  • mlu内存中拷贝出推理结果到cpu内存,然后进行后处理

  • 清理环境

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

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

相关文章

远程服务器 docker XRDP 桌面访问 记录

需求描述: 我现在在远程连接 一台服务器,由于需要实验环境需要GUI 和 桌面系统,但是又想在 docker 中运行。因此,我现在首先需要通过 ssh 连接服务器,然后再服务器中连接 docker. REF: https://github.com/danielguerra69/ubuntu-…

3D相机及应用

无论是2D相机和3D相机,在工业应用中都有着不可或缺的作用。3D相机与2D相机的最大区别在于,3D相机可以获取真实世界尺度下的3D信息,而2D相机只能获取像素尺度下的2D平面图像信息。通过3D相机得到的数据,我们可以还原出被测量物体的…

NumPy及Matplotlib基本用法

NumPy及Matplotlib基本用法 导语NumPy导入与生成算术运算N维数组广播元素访问 Matplotlib简单图案绘制多函数绘制图像显示参考文献 导语 深度学习中经常需要对图像和矩阵进行操作,好在python提供了Numpy和Matplotlib库,前者类似一个已经定义的数组类&am…

基于Springboot+Vue的Java项目-鲜牛奶订购系统开发实战(附演示视频+源码+LW)

大家好!我是程序员一帆,感谢您阅读本文,欢迎一键三连哦。 💞当前专栏:Java毕业设计 精彩专栏推荐👇🏻👇🏻👇🏻 🎀 Python毕业设计 &am…

资料总结分享:SAM,bam,bed文件格式

目录 sam文件 bam文件 bed 文件 sam文件 SAM(Sequence Alignment/Map)文件是存储测序数据比对结果的一种常见格式。SAM文件通常用于存储DNA或RNA测序数据在参考基因组上的比对结果。 SAM文件由多行文本组成,每一行代表一个比对结果。SAM文…

.[[MyFile@waifu.club]].svh勒索病毒数据库恢复方案

.[[MyFilewaifu.club]].svh勒索病毒有什么特点? .[[MyFilewaifu.club]].svh是一种最近多发的勒索病毒,它通过加密受害者的文件并要求支付赎金来解锁,从而达到勒索钱财的目的。恢复重要数据请添加技术服务号(safe130)。以下是关于这种病毒的详…

数字社交风潮:解析Facebook的影响力

随着互联网的普及和科技的发展,数字社交媒体已经成为现代社会不可或缺的一部分。在众多的社交媒体平台中,Facebook作为其中的佼佼者,影响着数以亿计的用户。本文将深入解析Facebook的影响力,探讨其在数字社交风潮中的地位和作用。…

Python网络协议socket

01 协议基础 01 网络协议 协议:一种规则 网络协议:网络规则,一种在网络通信中的数据包的数据规则 02 TCP/IP协议 osi模型 tcp/ip协议 03 tcp协议 TCP协议提供了一种端到端的、基于连接的、可靠的通信服务。 三次握手 创建连接 四次挥手…

Internet接入技术

internet接入技术 发展 1960s-1980s 早期互联网雏形ARPANET发展,主要限于研究机构和大学之间,通过专用线路连接。 1990s初期 拨号接入开始普及,用户通过电话线和调制解调器以低速(起初为14.4Kbps,后来提升到56Kbps&a…

unity华为sdk接入指路指南

目前比较靠谱的几个方案:试过几个仅供参考 温馨提示:最高目前可支持方案到unity2021版本以下,以上请联系华为官方寻求技术支持 Unity集成华为游戏服务SDK方式(一):集成Unity官方游戏SDK: 华为…

SQL查询语句(二)逻辑运算关键字

上一篇文章中我们提到了条件查询除了一些简单的数学符号之外,还有一些用于条件判断的关键字,如逻辑判断 关键字AND,OR,NOT和范围查找关键字BETWEEN,IN等;下面我们来介绍一些这些关键字的用法以及他们所表达的含义。 目录 逻辑运算关键字 AND…

Python类方法探秘:从单例模式到版本控制

引言: 在Python编程中,类方法作为一种特殊的实例方法,以其独特的魅力在众多编程范式中脱颖而出。它们不仅提供了无需实例即可调用的便捷性,还在设计模式、版本控制等方面发挥着重要作用。本文将通过几个生动的示例,带您…

搭建Springboot的基础开发框架-01

本系列专题虽然是按教学的深度来定稿的,但在项目结构和代码组织方面是按公司系统的要求来书定的。在本章中主要介绍下基础开发框架的功能。后续所有章节的项目全是在本基础框架的基础上演进的。 工程结构介绍 SpringbootSeries:父工程,定义一…

医药垃圾分类管理系统|基于SSM医药垃圾分类管理系统的系统设计与实现(源码+数据库+文档)

医药垃圾分类管理系统 目录 基于SSM医药垃圾分类管理系统设计与实现 一、前言 二、系统设计 三、系统功能设计 1系统登录模块 2管理员模块实现 3用户模块实现 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取: 博…

【C语言】精品练习题

目录 题目一: 题目二: 题目三: 题目四: 题目五: 题目六: 题目七: 题目八: 题目九: 题目十: 题目十一: 题目十二: 题目十…

HarmonyOS开发案例:【计算器】

介绍 基于基础组件、容器组件,实现一个支持加减乘除混合运算的计算器。 说明: 由于数字都是双精度浮点数,在计算机中是二进制存储数据的,因此小数和非安全整数(超过整数的安全范围[-Math.pow(2, 53),Math.…

董事长张轶群刚被罚,合规问题屡见不鲜,富友支付IPO胜算几何?

第三方支付机构富友支付又双叒来冲刺上市了。 与此前两次冲刺A股不同的是,富友支付此次选择在港股上市。近日,富友支付向港交所主板递交上市申请,联席保荐人为中信证券、申万宏源香港。值得一提的是,此前的2018年、2021年&#x…

【C++】从零开始认识多态

送给大家一句话: 一个犹豫不决的灵魂,奋起抗击无穷的忧患,而内心又矛盾重重,真实生活就是如此。 ​​​​ – 詹姆斯・乔伊斯 《尤利西斯》 _φ(* ̄ω ̄)ノ_φ(* ̄ω ̄)&…

Redis(Redis配置和订阅发布)

文章目录 1.Redis配置1.网络配置1.配置文件位置 /etc/redis.conf2.bind(注销支持远程访问)1.默认情况bind 127.0.0.1 只能接受本机的访问2.首先编辑配置文件3.进入命令模式输入/bind定位,输入n查找下一个,shift n查找上一个&…

SpringBoot的@Async注解有什么坑?

前言 SpringBoot中,Async注解可以实现异步线程调用,用法简单,体验舒适。 但是你一定碰到过异步调用不生效的情况,今天这篇文章总结了Async注解的坑点,希望对你会有所帮助。 未启用异步支持 Spring Boot默认情况下不启…