神经网络:模型部署

【一】模型压缩的必要性与可行性?

模型压缩是指对算法模型进行精简,进而得到一个轻量且性能相当的小模型,压缩后的模型具有更小的结构和更少的参数,可以有效降低计算和存储开销,便于部署在端侧设备中。

随着AI技术的飞速发展,不管是移动端产品还是线上产品,进行AI赋能都成为了趋势。这种情况下,AI算法的实时性与减少内存占用都显得极为重要。AI模型的参数在一定程度上能够表达其复杂性,但并不是所有的参数都在模型中发挥作用,部分参数作用有限,表达冗余,甚至会降低模型的性能。

【二】X86和ARM架构在深度学习侧的区别?

AI服务器与PC端一般都是使用X86架构,因为其高性能;AI端侧设备(手机/端侧盒子等)一般使用ARM架构,因为需要低功耗

X86指令集中的指令是复杂的,一条很长指令就可以很多功能;而ARM指令集的指令是很精简的,需要几条精简的短指令完成很多功能。

X86的方向是高性能方向,因为它追求一条指令完成很多功能;而ARM的方向是面向低功耗,要求指令尽可能精简。

【三】FP32,FP16以及Int8的区别?

常规精度一般使用FP32(32位浮点,单精度)占用4个字节,共32位;低精度则使用FP16(半精度浮点)占用2个字节,共16位,INT8(8位的定点整数)八位整型,占用1个字节等。

混合精度(Mixed precision)指使用FP32和FP16。 使用FP16 可以减少模型一半内存,但有些参数必须采用FP32才能保持模型性能。

虽然INT8精度低,但是数据量小、能耗低,计算速度相对更快,更符合端侧运算的特点。

不同精度进行量化的归程中,量化误差不可避免

在模型训练阶段,梯度的更新往往是很微小的,需要相对较高的精度,一般要用到FP32以上。在inference的阶段,精度要求没有那么高,一般F16或者INT8就足够了,精度影响不会很大。同时低精度的模型占用空间更小了,有利于部署在端侧设备中。

【四】GPU显存占用和GPU利用率的定义

GPU在训练时有两个重要指标可以查看,即显存占用和GPU利用率。

显存指的是GPU的空间,即内存大小。显存可以用来放模型,数据等。

GPU 利用率主要的统计方式为:在采样周期内,GPU 上有 kernel 执行的时间百分比。可以简单理解为GPU计算单元的使用率。

【五】神经网络的显存占用分析

Float32 是在深度学习中最常用的数值类型,称为单精度浮点数,每一个单精度浮点数占用4Byte的显存。

在整个神经网络训练周期中,在GPU上的显存占用主要包括:数据,模型参数,模型输出等。

数据侧:举个🌰,一个323128128的四维矩阵,其占用的显存 = 323128128*4 /1000 / 1000 = 6.3M

模型侧:占用显存的层包括卷积层,全连接层,BN层,梯度,优化器的参数等。

输出侧:占用的显存包括网络每一层计算出来的feature map以及对应的梯度等。

【六】算法模型部署逻辑?

我在之前专门沉淀了一篇关于算法模型部署逻辑的文章,大家可以直接进行阅读取用:

【CV算法上下游】系列之浅谈算法模型部署逻辑

【七】影响模型inference速度的因素?

  1. FLOPs(模型总的加乘运算)
  2. MAC(内存访问成本)
  3. 并行度(模型inference时操作的并行度越高,速度越快)
  4. 计算平台(GPU,AI协处理器,CPU等)

【八】为何在AI端侧设备一般不使用传统图像算法?

AI端侧设备多聚焦于深度学习算法模型的加速与赋能,而传统图像算法在没有加速算子赋能的情况下,在AI端侧设备无法发挥最优的性能。

【九】减小模型内存占用有哪些办法?

  1. 模型剪枝
  2. 模型蒸馏
  3. 模型量化
  4. 模型结构调整

【十】有哪些经典的轻量化网络?

  1. SqueezeNet
  2. MobileNet
  3. ShuffleNet
  4. Xception
  5. GhostNet

【十一】模型参数计算?

首先,假设卷积核的尺寸是 K × K K \times K K×K,有 C C C个特征图作为输入,每个输出的特征图大小为 H × W H \times W H×W,输出为 M M M个特征图。

由于模型参数量主要由卷积,全连接层,BatchNorm层等部分组成,我们以卷积的参数量为例进行参数量的计算分析:

卷积核参数量:

M × C × K × K M\times C\times K\times K M×C×K×K

偏置参数量:

M M M

总体参数量:

M × C × K × K + M M\times C\times K\times K + M M×C×K×K+M

【十二】模型FLOPs怎么算?

同样,我们假设卷积核的尺寸是 K × K K\times K K×K,有 C C C个特征图作为输入,每个输出的特征图大小为 H × W H \times W H×W,输出为 M M M个特征图。

由于在模型中卷积一般占计算量的比重是最高的,我们依旧以卷积的计算量为例进行分析:

FLOPS(全大写):是floating point operations per second的缩写,意指每秒浮点运算次数,理解为计算速度。是一个衡量硬件性能的指标。

FLOPs(s小写):是floating point operations的缩写(s表示复数),意指浮点运算数,理解为计算量。可以用来衡量算法/模型的复杂度。

针对模型的计算量应该指的是FLOPs。

在上述情况下,卷积神经网络一次前向传播需要的乘法运算次数为:

H × W × M × C × K × K H\times W\times M\times C\times K\times K H×W×M×C×K×K

同时,所要进行的加法计算次数分为考虑偏置和不考虑偏置:

(1)考虑偏置的情况:

为了得到输出的特征图的一个未知的像素,我们需要进行
( C × K × K − 1 ) + ( C − 1 ) + 1 = C × K × K (C\times K\times K - 1) + (C - 1) + 1 = C \times K \times K (C×K×K1)+(C1)+1=C×K×K
次加法操作,其中 K × K K\times K K×K大小的卷积操作需要 K × K − 1 K\times K - 1 K×K1次加法,由于有C个通道,所以需要将结果乘以C,每个通道间的数要相加,所以需要C - 1次加法,最后再加上偏置的1次加法。

所以总的加法计算量如下:

H × W × M × C × K × K H\times W\times M\times C\times K\times K H×W×M×C×K×K

所以总的卷积运算计算量(乘法+加法):

2 × H × W × M × C × K × K 2 \times H\times W\times M\times C\times K\times K 2×H×W×M×C×K×K

(2)不考虑偏置的情况:

总的卷积计算量:

H × W × M × ( 2 × C × K × K − 1 ) H\times W\times M\times (2\times C\times K\times K - 1) H×W×M×(2×C×K×K1)

卷积运算过程

【十三】什么是异构计算?

首先,异构现象是指不同计算平台之间,由于硬件结构(包括计算核心和内存),指令集和底层软件实现等方面的不同而有着不同的特性。

异构计算是指联合使用两个或者多个不同的计算平台,并进行协同运算。比如CPU和GPU的异构计算,TPU和GPU的异构计算以及TPU/GPU/CPU的异构计算等等。

【十四】端侧部署时整个解决方案的核心指标?

  1. 精度
  2. 耗时
  3. 内存占用
  4. 功耗

【十五】什么是模型量化?

通常的深度学习模型参数是FP32浮点型的,而模型量化主要是使用FP16,INT8以及INT4等低精度类型来保存模型参数,从而有效的降低模型计算量和内存占用,并将精度损失限制在一个可接受的范围内

模型量化主要分在线量化和离线量化。在线量化在模型训练阶段采用量化方法进行量化。离线量化主要在模型离线工具(模型转换阶段)中采用量化方法进行量化。

工业界中主要使用离线量化作为通用模型量化的解决方案。

【十六】什么是模型剪枝?

模型剪枝按照剪枝粒度可分为突触剪枝、神经元剪枝、权重矩阵剪枝等,主要是将权重矩阵中不重要的参数设置为0,结合稀疏矩阵来进行存储和计算。通常为了保证性能,需要逐步进行迭代剪枝,让精度损失限制在一个可接受的范围。

突触剪枝剪掉神经元之间的不重要的连接。对应到权重矩阵中,相当于将某个参数设置为0。

神经元剪枝则直接将某个节点直接裁剪。对应到权重矩阵中,相当于某一行和某一列置零。

除此之外,也可以将整个权重矩阵裁剪,每一层中只保留最重要的部分,这就是权重矩阵剪枝。相比突触剪枝和神经元剪枝,权重矩阵剪枝压缩率要大很多。

【十七】主流AI端侧硬件平台有哪些?

  1. 英伟达
  2. 海思
  3. 寒武纪
  4. 比特大陆
  5. 昇腾
  6. 登临
  7. 联咏
  8. 安霸
  9. 耐能
  10. 爱芯
  11. 瑞芯

【十八】主流AI端侧硬件平台一般包含哪些模块?

  1. 视频编解码模块
  2. CPU核心处理模块
  3. AI协处理器模块
  4. GPU模块
  5. DSP模块
  6. DDR内存模块
  7. 数字图像处理模块

【十九】算法工程师该如何看待硬件侧知识?

GPU乃至硬件侧的整体逻辑,是CV算法工作中必不可少的组成部分,也是算法模型所依赖的重要物理载体。

GPU的相关知识

现在AI行业有个共识,认为是数据的爆发和算力的突破开启了深度学习在计算机视觉领域的“乘风破浪”,而其中的算力,主要就是指以GPU为首的计算平台。

GPU(Graphical Processing Unit)从最初用来进行图形处理和渲染(玩游戏),到通过CUDA/OpenCL库以及相应的工程开发之后,成为深度学习模型在学术界和工业界的底层计算工具,其有以下的一些特征:

  1. 异构计算:GPU能作为CPU的协处理器与CPU协同运算。
  2. 单指令流多数据流(SIMD)架构:使得同一个指令(比如对图像数据的一些操作),可以同时在多个像素点上并行计算,从而得到比较大的吞吐量,深度学习中大量的矩阵操作,让GPU成为一个非常适合的计算平台。
  3. 多计算核心。比如Nvidia的GTX980GPU中,在和i7-5960CPU差不多的芯片面积上,有其128倍的运算速度。GTX980中有16个流处理单元,每个流处理单元中包含着128个CUDA计算核心,共有2048个GPU运算单元,与此同时i7-5960CPU只有16个类似的计算单元。
  4. CUDA模块。作为GPU架构中的最小单元,它的设计和CPU有着非常类似的结构,其中包括了一个浮点运算单元,整型运算单元以及控制单元。一个流处理单元中的CUDA模块将执行同一个指令,但是会作用在不同的数据上。多CUDA模块意味着GPU有更加高的计算性能,但更重要的是在算法侧有没有高效地调度和使用
  5. 计算核心频率。即时钟频率,代表每一秒内能进行同步脉冲次数。就核心频率而言,CPU要高于GPU。由于GPU采用了多核逻辑,即使提高一些频率,其实对于总体性能影响不会特别大。
  6. 内存架构。GPU的多层内存架构包括全局内存,2级缓存,和芯片上的存储(包括寄存器,和1级缓存共用的共享内存,只读/纹理缓存和常量缓存)。

CUDA/cuDNN/OpenCL科普小知识:

  1. CUDA是NVIDIA推出的用于GPU的并行计算框架。
  2. cuDNN是NVIDIA打造的针对深度神经网络的加速库,是一个用于深层神经网络的GPU加速库。
  3. OpenCL是由苹果(Apple)公司发起,业界众多著名厂商共同制作的面向异构系统通用目的并行编程的开放式、免费标准,也是一个统一的编程环境。

深度学习的端侧设备

深度学习的端侧设备,又可以叫做边缘计算设备,深度学习特别是CV领域中,模型+端侧设备的组合能够加快业务的即时计算,决策和反馈能力,极大释放AI可能性

深度学习的端侧设备主要由ARM架构的CPU+ GPU/TPU/NPU等协处理器 + 整体功耗 + 外围接口 + 工具链等部分组成,也是算法侧对端侧设备进行选型要考虑的维度。

在实际业务中,根据公司的不同,算法工程师涉及到的硬件侧范围也会不一样。如果公司里硬件和算法由两个部门分别负责,那么算法工程师最多接触到的硬件侧知识就是硬件性能评估,模型转换与模型硬件侧验证,一些硬件高层API接口的开发与使用;如果公司里没有这么细分的部门,那么算法工程师可能就会接触到端侧的视频编解码,模型推理加速,Opencv,FFmpeg,Tensor RT,工具链开发等角度的知识。

算法工程师该如何看待硬件侧

首先,整体上还是要将硬件侧工具化,把端侧设备当做算法模型的一个下游载体,会熟练的选型与性能评估更加重要

端侧设备是算法产品整体解决方案中一个非常重要的模块,算法+硬件的范式将在未来的边缘计算与万物智能场景中持续发力。

在日常业务中,算法模型与端侧设备的适配性与兼容性是必须要考虑的问题,端侧设备是否兼容一些特殊的网络结构?算法模型转化并部署后,精度是否下降?功耗与耗时能否达标?等等都让算法工程师的模型设计逻辑有更多的抓手。

【二十】现有的一些移动端开源框架?

  1. NCNN,其GitHub地址:https://github.com/Tencent/ncnn
  2. Paddle Lite,其GitHub地址:https://github.com/PaddlePaddle/paddle-mobile
  3. MACE( Mobile AI Compute Engine),其GitHub地址:https://github.com/XiaoMi/mace
  4. TensorFlow Lite,其官网地址:https://www.tensorflow.org/lite?hl=zh-cn
  5. PocketFlow,其GitHub地址:https://github.com/Tencent/PocketFlow
  6. 等等。。。

【二十一】端侧静态多Batch和动态多Batch的区别

当设置静态多Batch后,如Batch=6,那么之后不管是输入2Batch还是4Batch,都会按照6Batch的预设开始申请资源。

而动态多Batch不用预设Batch数,会根据实际场景中的真实输入Batch数来优化资源的申请,提高端侧实际效率。

由于动态多Batch的高性能,通常Inference耗时和内存占用会比静态多Batch时要大。

【二十二】优化模型端侧性能的一些方法

  1. 设计能最大限度挖掘AI协处理器性能的模型结构。
  2. 多模型共享计算内存。
  3. 减少模型分支结构,减少模型元素级操作。
  4. 卷积层的输入和输出特征通道数相等时MAC最小,以提升模型Inference速度。

【二十三】ONNX的相关知识

ONNX是一种神经网络模型的框架,其最经典的作用是作为不同框架之间的中间件,成为模型表达的一个通用架构,来增加不同框架之间的交互性。

ONNX的优势

  1. ONNX的模型格式有极佳的细粒度。
  2. ONNX是模型表达的一个通用架构,主流框架都可以兼容。
  3. ONNX可以实现不同框架之间的互相转化。

【二十四】TensorRT的相关知识

TensorRT是一个高性能的深度学习前向Inference的优化器和运行的引擎。

TensorRT的核心:将现有的模型编译成一个engine,类似于C++的编译过程。在编译engine过程中,会为每一层的计算操作找寻最优的算子方法,将模型结构和参数以及相应kernel计算方法都编译成一个二进制engine,因此在部署之后大大加快了推理速度。

我们需要给TensorRT填充模型结构和参数,也就是解析我们自己的模型结构和参数文件,获取数据放到其中。官方给了三种主流框架模型格式的解析器(parser),分别是:ONNX,Caffe以及TensorFlow。

TensorRT的优势

  1. 把一些网络层进行了合并。具体🌰如下图所示。
  2. 取消一些不必要的操作。比如不用专门做concat的操作等。
  3. TensorRT会针对不同的硬件都相应的优化,得到优化后的engine。
  4. TensorRT支持INT8和FP16的计算,通过在减少计算量和保持精度之间达到一个理想的trade-off。

TensorRT对网络结构进行重构

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

浮点数表示法以及相关“小”知识点

浮点数的表示形式 小数点的位置是浮动的。 任意一个二进制数N可 以表示成:N=Sr^j 其中,S为尾数(可正可负),r为基数(数值),j是阶码(可正可负)。 1、对一个真值为23.25的十进制数,用浮点数格式表示其原码。 …

C语言——小细节和小知识7

一、逆序字符串 1、递归1 #include <stdio.h> #include <string.h>void ReverseArray(char *str) {char temp *str;//1int len (int)strlen(str);*str *(str len - 1);//2*(str len - 1) \0;//3if(strlen(str 1) > 2)//只要字符串还大于2&#xff0c;就…

uniapp框架——vue3+uniFilePicker+fastapi实现文件上传(搭建ai项目第二步)

文章目录 ⭐前言&#x1f496; 小程序系列文章 ⭐uni-file-picker 组件&#x1f496; 绑定事件&#x1f496; uploadFile api&#x1f496; 自定义上传 ⭐后端fastapi定义上传接口⭐uniapp开启本地请求代理devServer⭐前后端联调⭐总结⭐结束 ⭐前言 大家好&#xff0c;我是ym…

分享72个NodeJs项目源码总有一个是你想要的

分享72个NodeJs项目源码总有一个是你想要的 学习知识费力气&#xff0c;收集整理更不易。 知识付费甚欢喜&#xff0c;为咱码农谋福利。 链接&#xff1a;https://pan.baidu.com/s/1_bzxbmBlN8ga4-Ci1I0-0w?pwd6666 提取码&#xff1a;6666 项目名称 A lottery webapp …

智慧启航:机场管理系统的革新与飞机航天展馆的视觉盛宴

随着科技的飞速发展&#xff0c;我们的生活方式正在不断地被改变和提升。而在航空领域&#xff0c;这种变化则更加明显。从机场的智慧管理系统大屏&#xff0c;到飞机航天展馆的三维可视化&#xff0c;再到飞机涡轮发动机的3D模型&#xff0c;科技的力量正在带我们进入一个前所…

再谈动态SQL

专栏精选 引入Mybatis Mybatis的快速入门 Mybatis的增删改查扩展功能说明 mapper映射的参数和结果 Mybatis复杂类型的结果映射 Mybatis基于注解的结果映射 Mybatis枚举类型处理和类型处理器 文章目录 专栏精选摘要引言正文动态sql标签ifchoose...when...otherwisewhere、…

电脑开机自动断电,简单4招,快速解决!

“不知道我的电脑最近是怎么回事&#xff0c;每次一开机就会出现自动断电的情况&#xff0c;有什么方法可以解决吗&#xff1f;” 在使用电脑时&#xff0c;由于电源供应不稳定或过热&#xff0c;以及各种硬件问题&#xff0c;可能会导致电脑开机自动断电。遇到这种情况&#x…

CNAS中兴新支点——源代码审计对企业有哪些好处?

源代码扫描&#xff0c;对应用程序进行静态漏洞扫描&#xff0c;分析源代码中存在的安全风险&#xff0c;运行应用于模拟器中对应用进行实时漏洞攻击检测。 你是否了解源代码扫描对企业的好处&#xff1f; 一、源代码扫描&#xff0c;通常能够帮助企业解决这些问题&#xff1…

TinyGPT-V:小而强大,轻量级骨架打造高效多模态大语言模型!

独家作者&#xff08;csdn、掘金、知乎、微信公众号&#xff09;&#xff1a;PaperAgent 每天一篇大模型&#xff08;LLM&#xff09;文章来锻炼我们的思维&#xff0c;简单的例子&#xff0c;不简单的方法&#xff0c;提升自己 一、论文信息 论文题目&#xff1a;TinyGPT-V…

爬虫学习(1)--requests模块的使用

前言 什么是爬虫 爬虫是一种自动化工具&#xff0c;用于从互联网或其他计算机网络上获取数据。它可以模拟人的行为&#xff0c;自动访问网页&#xff0c;提取感兴趣的数据&#xff0c;并将其存储到本地计算机或数据库中。爬虫通常用于搜索引擎、数据分析、信息聚合等领域&…

Spire.Office 8.12.2 for .NET

Spire.Office 8.12.2 发布。在此版本中&#xff0c;Spire.Doc支持Word到PCL和PostScript转换中的文本整形以及确定文档是否加密&#xff1b;Spire.Presentation支持将母版页转换为图像&#xff1b;Spire.PDFViewer支持在WinForm项目中使用Ctrl滚轮实现界面缩放效果。此外&#…

ChatGPT4.0(中文版)国内无限制免费版(附网址)

ChatGPT&#xff0c;由OpenAI开发的人工智能语言模型。它是你的数字对话伙伴&#xff0c;无论你有何问题或需要什么帮助&#xff0c;它都能提供有用的信息。 经过不断的研发和更新&#xff0c;ChatGPT的性能和功能得到了显著提升。现在&#xff0c;我们将重点介绍ChatGPT的两个…

Kubernetes弃用Dockershim,转向Containerd:影响及如何应对

Kubernetes1.24 版本发布时&#xff0c;正式宣布弃用 Dockershim&#xff0c;转向 Containerd 作为默认的容器运行环境。Kubernetes 以 CRI(Container Runtime Interface) 容器运行时接口制定接入准则&#xff0c;用户可以使用 Containerd、CRI-O、CRI- Dockerd 及其他容器运行…

Apple Unity Plugins 接入GameCenter 崩溃解决方案

目录 问题问题原因解决方案可直接使用的UnityPlugins 问题 调用 GKLocalPlayer.Local.FetchItems() 程序崩溃&#xff0c;报错&#xff1a;Thread 1: EXC_BAD_ACCESS (code257, address0x8000000000000002) 启动崩溃&#xff0c;报错&#xff1a;Library not loaded: rpath/Ap…

13. 罗马数字转整数

罗马数字包含以下七种字符: I&#xff0c; V&#xff0c; X&#xff0c; L&#xff0c;C&#xff0c;D 和 M。 字符 数值 I 1 V 5 X 10 L 50 C 100 D 500 M 1000 例如&#x…

深入浅出图解C#堆与栈 C# Heap(ing) VS Stack(ing) 第三节 栈与堆,值类型与引用类型

深入浅出图解C#堆与栈 C# Heaping VS Stacking 第三节 栈与堆&#xff0c;值类型与引用类型 [深入浅出图解C#堆与栈 C# Heap(ing) VS Stack(ing) 第一节 理解堆与栈](https://mp.csdn.net/mdeditor/101021023)[深入浅出图解C#堆与栈 C# Heap(ing) VS Stack(ing) 第二节 栈基本工…

RFID珠宝门店智能管理设计解决方案

一、项目背景 目前&#xff0c;珠宝行业的盘点工作主要依靠人工操作完成&#xff0c;然而由于珠宝产品体积小、数量大&#xff0c;大数量的产品由少量营业人员花费大量时间进行盘点&#xff0c;这导致盘点效率低下&#xff0c;进而减少了珠宝店在客户营销方面的时间投入。 二、…

1.DQL查询数据(超重点)以及distinct(去重)

DQL(Data Query Language:数据查询语言) 1.所有查询操作都用 SELECT 2.无论是简单的查询还是复杂的查询它都能做 3.数据库中最核心的语言&#xff0c;最重要的语句 4.使用频率最高的语句 语法&#xff1a; SELECT 字段1&#xff0c;字段2&#xff0c;……FROM 表 有时候…

【技术揭秘】软网关BLIoTLink,轻松部署至工控机,实现协议转换网关的快速搭建!

本文教你使用钡铼提供的协议转换软件BLIoTLink &#xff0c;快速搭载在ARM工控机上&#xff0c;变成迷你边缘计算网关。话不多说&#xff0c;跟着操作起来吧&#xff01; 功能简介 BLIoTLink是由深圳市钡铼技术有限公司为推进工业物联网发展而研发的一款免费的嵌入式物联网协…

PC9095高性能可调限流OVP过压过流保护 软启动 抗浪涌 集成功率FET开关

特点 •输入电压范围&#xff1a; •PC9095A、PC9095KA:2.5伏~13.5伏 •PC9095B&#xff0c;PC9095KB:2.5伏~10伏 •PC9095C&#xff0c;PC9095KC:2.5伏~5.5伏 •28V绝对最大额定电压VOUT •带外部电阻器的可调限流器 •集成功率FET开关&#xff0c;53mΩRds&#xff08…