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

文章目录

    • 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://www.mzph.cn/bicheng/7264.shtml

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

相关文章

【自用】了解移动存储卡的基本信息

前言 本文是看B站视频做的一个简单笔记,方便日后自己快速回顾,内容主要介绍了存储卡基本参数,了解卡面上的数字、图标代表的含义。对于日后如何挑选判断一张存储卡的好坏、判别一张存储卡是否合格有一定帮助。 视频参考链接:【硬…

【StarRocks系列】 Trino 方言支持

我们在之前的文章中,介绍了 Doris 官方提供的两种方言转换工具,分别是 sql convertor 和方言 plugin。StarRocks 目前同样也提供了类似的方言转换功能。本文我们就一起来看一下这个功能的实现与 Doris 相比有何不同。 一、Trino 方言验证 我们可以通过…

HTTP、RTSP、RTMP、RTP,RTCP,HLS,MMS的概念、区别、用法

背景知识 先有TCP/IP协议簇 5层模型,后有DoD 4层模型,再有OSI 7层模型。 TCP/IP协议簇(TCP/IP Suite)除了代表TCP与IP这两种通讯协议外,更包含了与TCP/IP相关的数十种通讯协议,例如:SMTP、DNS、…

使用docker-compose编排Lnmp(dockerfile) 完成Wordpress

目录 一、 Docker-Compose 1.1Docker-Compose介绍 1.2环境准备 1.2.1准备容器目录及相关文件 1.2.2关闭防火墙关闭防护 1.2.3下载centos:7镜像 1.3Docker-Compose 编排nginx 1.3.1切换工作目录 1.3.2编写 Dockerfile 文件 1.3.3修改nginx.conf配置文件 1.4Docker-Co…

SpringBoot+Vue+Element-UI实现学生综合成绩测评系统

前言介绍 学生成绩是高校人才培养计划的重要组成部分,是实现人才培养目标、培养学生科研能力与创新思维、检验学生综合素质与实践能力的重要手段与综合性实践教学环节。而学生所在学院多采用半手工管理学生成绩的方式,所以有必要开发学生综合成绩测评系…

机器学习——2.损失函数loss

基本概念 损失函数也叫代价函数。损失函数就是计算预测结果和实际结果差距的函数,机器学习的过程就是试图将损失函数的值降到最小。 图左:|t_p - t_c| 图右:(t_p - t_c)**2 代码实…

图像分割入门-Unet++理论与实践

探索 U-net:改进的图像分割神经网络 引言 图像分割是计算机视觉领域中的重要任务,旨在将图像中的每个像素分配到特定的类别或区域。在许多应用中,如医学影像分析、自动驾驶和地块识别等领域,图像分割都扮演着关键角色。 U-net …

echars设置渐变颜色的方法

在我们日常的开发中,难免会遇到有需求,需要使用echars设置渐变的图表,如果我们需要设置给图表设置渐变颜色的话,我们只需要在 series 配置项中 添加相应的属性配置项即可。 方式一:colorStops type:‘lin…

基于EWT联合SVD去噪

一、代码原理 (1)基于EWT-SVD的信号去噪算法原理 经验小波变换(Empirical Wavelet Transform,EWT):EWT是一种基于信号局部特征的小波变换方法,能够更好地适应非线性和非平稳信号的特性。奇异值…

Maria DB 安装(含客户端),看这一篇就够了

文章目录 一 安装前准备1 版本与Win平台对应2 推荐安装 二 安装步骤1 安装主体程序2 添加系统路径Path 三 客户端 一 安装前准备 1 版本与Win平台对应 版本对应关系可参考: https://www.codebye.com/mariadb-deprecated-package-platforms.html。 2 推荐安装 经…

【driver1】内核模块,设备号,字符驱动

文章目录 1.内核模块:必须包含module.h2.内核模块参数:权限位S_IRUGO是用在sysfs文件系统里2.1 extern:声明来自另一个模块 3.设备号:主设备号对应驱动程序,具有相同主设备号设备使用相同驱动程序,次设备号…

cURL:命令行下的网络工具

序言 在当今互联网时代,我们经常需要与远程服务器通信,获取数据、发送请求或下载文件。在这些情况下,cURL 是一个强大而灵活的工具,它允许我们通过命令行进行各种类型的网络交互。本文将深入探讨 cURL 的基本用法以及一些高级功能…

C++:特殊类的设计 | 单例模式

目录 1、特殊类的设计 2、设计一个类,不能被拷贝 3、设计一个类,只能在堆上创建对象 4、设计一个类,只能在栈上创建对象 5、设计一个类,不能被继承 6、单例模式 1、饿汉模式 2、懒汉模式 1、特殊类的设计 在实际应用场景中…

系统镜像地址

系统镜像 Linux 官网下载地址:Downloadhttps://www.centos.org/download/ 阿里云镜像下载地址:https://mirrors.aliyun.com/centos/https://mirrors.aliyun.com/centos/?spma2c6h.13651104.d-2001.6.6554320cwFqB8E 清华大学镜像下载地址&#xff1…

SCI一区 | WOA-BiTCN-BiGRU-Attention多输入单输出回归预测(Matlab)

SCI一区 | WOA-BiTCN-BiGRU-Attention多输入单输出回归预测(Matlab) 目录 SCI一区 | WOA-BiTCN-BiGRU-Attention多输入单输出回归预测(Matlab)效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.Matlab实现WOA-BiTCN-BiGRU-A…

【C++】学习笔记——list

文章目录 八、list1. list的介绍2. list的使用3. list的模拟实现4. list模拟实现的代码整合1. list.h2. test.cpp 未完待续 八、list list链接 1. list的介绍 是的, list 就是带头双向循环链表。 2. list的使用 通过 string 和 vector 的学习,我们差…

基于TL431和CSA的恒压与负压输出

Hello uu们,51去那里玩了呀?该收心回来上班了,嘿嘿! 为什么会有这个命题,因为我的手头只有这些东西如何去实现呢?让我们一起来看电路图吧.电路图如下图1所示 图1:CSA恒压输出电路 图1中,R1给U2提供偏置,Q1给R1提供电流,当U1-VOUT输出大于2.5V时候,U2内部的三极管CE导通,使得…

第四百九十二回

文章目录 1. 概念介绍2. 使用方法2.1 SegmentedButton2.2 ButtonSegment 3. 代码与效果3.1 示例代码3.2 运行效果 4. 内容总结 我们在上一章回中介绍了"SearchBar组件"相关的内容,本章回中将介绍SegmentedButton组件.闲话休提,让我们一起Talk …

Qt扫盲-Qt D-Bus概述

Qt D-Bus概述 一、概述二、总线三、相关概念1. 消息2. 服务名称3. 对象的路径4. 接口5. 备忘单 四、调试五、使用Qt D-Bus 适配器1. 在 D-Bus 适配器中声明槽函数1. 异步槽2. 只输入槽3. 输入输出槽4. 自动回复5. 延迟回复 一、概述 D-Bus是一种进程间通信(IPC)和远程过程调用…

分布式与一致性协议之ZAB协议(四)

ZAB协议 ZooKeeper是如何选举领导者的。 首先我们来看看ZooKeeper是如何实现成员身份的? 在ZooKeeper中,成员状态是在QuorumPeer.java中实现的,为枚举型变量 public enum ServerState { LOOKING, FOLLOWING, LEADING, OBSERVING }其实&…