- Java锁的逻辑(结合对象头和ObjectMonitor)
- 还在用饼状图?来瞧瞧这些炫酷的百分比可视化新图形(附代码实现)⛵
- 自动注册实体类到EntityFrameworkCore上下文,并适配ABP及ABPVNext
- 基于Sklearn机器学习代码实战
文章同步发于 github 仓库 和 csdn 博客 ,最新板以 github 为主。 本人水平有限,文章如有问题,欢迎及时指出。如果看完文章有所收获,一定要先点赞后收藏。毕竟, 赠人玫瑰,手有余香 .
关于如何手动设计轻量级网络的研究,目前还没有广泛通用的准则,只有一些指导思想,和针对不同芯片平台(不同芯片架构)的一些设计总结,建议大家从经典论文中吸取指导思想和建议,然后自己实际做各个硬件平台的部署和模型性能测试.
FLOPs
: floating point operations
指的是浮点运算次数,理解为 计算量 ,可以用来衡量 算法/模型时间的复杂度 。 FLOPS
:(全部大写), Floating-point Operations Per Second
,每秒所执行的浮点运算次数,理解为计算速度, 是一个衡量硬件性能/模型速度的指标,即一个芯片的算力。 MACCs
: multiply-accumulate operations
,乘-加操作次数, MACCs
大约是 FLOPs
的一半。将 w[0]∗x[0]+... 视为一个乘法累加或 1
个 MACC
。 MAC : Memory Access Cost 内存访问代价。指的是输入单个样本(一张图像),模型/卷积层完成 一次前向传播所发生的内存交换总量 ,即模型的空间复杂度,单位是 Byte .
FLOPs 和 MAC 的计算方式,请参考我之前写的文章 神经网络模型复杂度分析 .
GPU
的内存带宽决定了它将数据从内存 ( vRAM
) 移动到计算核心的速度,是比 GPU
内存速度更具代表性的指标。 GPU
的内存带宽的值取决于 内存和计算核心之间的数据传输速度,以及这两个部分之间总线中单独并行链路的数量 。 NVIDIA RTX A4000 建立在 NVIDIA Ampere 架构之上,其芯片规格如下所示
A4000 芯片配备 16 GB 的 GDDR6 显存、 256 位显存接口( GPU 和 VRAM 之间总线上的独立链路数量),因为这些与显存相关的特性,所以 A4000 内存带宽可以达到 448 GB/s .
参考英伟达-Ashu RegeDirector of Developer Technology 的 ppt 文档 An Introduction to Modern GPU Architecture .
深度学习领域 延迟 Latency 和 吞吐量 Throughput 的一般解释:
Latency
): 人和机器做决策或采取行动时都需要反应时间。延迟是指 提出请求与收到反应之间经过的时间 。大部分人性化软件系统(不只是 AI 系统),延迟都是以 毫秒 来计量的。 Throughput
): 在给定创建或部署的深度学习网络规模的情况下,可以传递多少推断结果。简单理解就是在 一个时间单元(如:一秒)内网络能处理的最大输入样例数 。 CPU 是低延迟低吞吐量处理器; GPU 是高延迟高吞吐量处理器 .
一般,很多人通过 nvidia-smi 命令查看 Volatile GPU Util 数据来得出 GPU 利用率,但是!关于这个利用率( GPU Util ),容易产生 两个误区 :
GPU
的利用率 = GPU
内计算单元干活的比例。利用率越高,算力就必然发挥得越充分。 但实际上, GPU Util 的本质只是反应了,在采样时间段内,一个或多个内核( kernel )在 GPU 上执行的时间百分比,采样时间段取值 1/6s~1s .
原文为 Percent of time over the past sample period during which one or more kernels was executing on the GPU. The sample period may be between 1 second and 1/6 second depending on the product. 来源文档 nvidia-smi.txt 。
通俗来讲,就是,在一段时间范围内, GPU 内核运行的时间占总时间的比例。比如 GPU Util 是 69% ,时间段是 1s ,那么在过去的 1s 中内, GPU 内核运行的时间是 0.69s 。如果 GPU Util 是 0% ,则说明 GPU 没有被使用,处于空闲中.
也就是说 它并没有告诉我们使用了多少个 SM 做计算,或者程序有多“忙”,或者内存使用方式是什么样的,简而言之即不能体现出算力的发挥情况 .
GPU Util 的本质参考知乎文章- 教你如何继续压榨GPU的算力 和 stackoverflow 问答 .
GPU 设计了更多的晶体管( transistors )用于数据处理( data process )而不是数据缓冲( data caching )和流控( flow control ),因此 GPU 很适合做 高度并行计算 ( highly parallel computations )。同时, GPU 提供比 CPU 更高的 指令吞吐量 和 内存带宽 ( instruction throughput and memory bandwidth ).
CPU 和 GPU 的直观对比图如下所示 。
图片来源 CUDA C++ Programming Guide 。
最后简单总结下英伟达 GPU 架构的一些特点
SIMT
( Single Instruction Multiple Threads
) 模式,即多个 Core
同一时刻只能执行同样的指令。虽然看起来与现代 CPU
的 SIMD
(单指令多数据)有些相似,但实际上有着根本差别。 Cache
和 Control
。 2008-2020 英伟达 GPU 架构进化史如下图所示
另外,英伟达 GPU 架构从 2010 年开始到 2020 年这十年间的架构演进历史概述,可以参考知乎的文章- 英伟达GPU架构演进近十年,从费米到安培 .
GPU 架构的深入理解可以参考博客园的文章- 深入GPU硬件架构及运行机制 .
在一定的程度上,网络越深越宽,性能越好。宽度,即通道( channel )的数量,网络深度,及 layer 的层数,如 resnet18 有 18 层网络。注意我们这里说的和宽度学习一类的模型没有关系,而是特指深度卷积神经网络的(通道)宽度.
CNN
的网络层能够对输入图像数据进行逐层抽象,比如第一层学习到了图像边缘特征,第二层学习到了简单形状特征,第三层学习到了目标形状的特征,网络深度增加也提高了模型的抽象能力。 3
维)的数量,滤波器越多,对目标特征的提取能力越强,即让每一层网络学习到更加丰富的特征,比如不同方向、不同频率的纹理特征等。 GPU
、移动端 ARM
CPU
、端侧 NPU
芯片等);目前已知影响 CNN
模型推理性能的因素包括: 算子计算量 FLOPs
(参数量 Params
)、卷积 block
的内存访问代价(访存带宽)、网络并行度等。但相同硬件平台、相同网络架构条件下, FLOPs
加速比与推理时间加速比成正比。 metric
(例如速度 speed
),而不是间接 metric
(例如 FLOPs
)。 FLOPs
低不等于 latency
低,尤其是在有加速功能的硬体 ( GPU
、 DSP
与 TPU
)上不成立,得结合具硬件架构具体分析 。 CNN
模型,即使是 FLOPs
相同,但其 MAC
也可能差异巨大。 GPU
芯片, Depthwise
卷积算子实际上是使用了大量的低 FLOPs
、高数据读写量的操作。因为这些具有高数据读写量的操作,再加上 多数时候 GPU
芯片算力的瓶颈在于访存带宽 ,使得模型把大量的时间浪费在了从显存中读写数据上,导致 GPU
的算力没有得到“充分利用”。结论来源知乎文章- FLOPs与模型推理速度 。 channel
数为 16
的倍数比较有利高效计算。如海思 351x
系列芯片,当输入通道为 4
倍数和输出通道数为 16
倍数时,时间加速比会近似等于 FLOPs
加速比,有利于提供 NNIE
硬件计算利用率。(来源海思 351X
芯片文档和 MobileDets
论文) channel
数的情况下 (如网路的前几层),在有加速功能的硬件使用普通 convolution
通常会比 separable convolution
有效率。(来源 MobileDets 论文 ) MAC
、G2-分组数太多的卷积会增加 MAC
、G3-网络碎片化会降低并行度、G4-逐元素的操作不可忽视。 GPU
芯片上 \(3\times 3\) 卷积非常快,其计算密度(理论运算量除以所用时间)可达 \(1\times 1\) 和 \(5\times 5\) 卷积的四倍。(来源 RepVGG 论文 ) DenseNet
的密集连接带来的高内存访问成本和能耗问题入手,如 VoVNet 网络,其由 OSA
( One-Shot Aggregation
,一次聚合)模块组成。 在阅读和理解经典的轻量级网络 mobilenet 系列、 MobileDets 、 shufflenet 系列、 cspnet 、 vovnet 、 repvgg 等论文的基础上,做了以下总结:
cpu
硬件,考虑 mobilenetv1
(深度可分离卷机架构-低 FLOPs
)、低 FLOPs
和 低 MAC
的 shuffletnetv2
( channel_shuffle
算子在推理框架上可能不支持) asic
硬件设备- npu
芯片(地平线 x3/x4
等、海思 3519
、安霸 cv22
等),目标检测问题考虑 cspnet
网络(减少重复梯度信息)、 repvgg
(直连架构-部署简单,网络并行度高有利于发挥 GPU
算力,量化后有掉点风险) gpu
硬件- t4
芯片,考虑 repvgg
网络(类 vgg
卷积架构-高并行度带来高速度、单路架构省显存/内存) MobileNet block (深度可分离卷积 block , depthwise separable convolution block )在有加速功能的硬件(专用硬件设计- NPU 芯片)上比较没有效率.
这个结论在 CSPNet 和 MobileDets 论文中都有提到.
除非芯片厂商做了定制优化来提高深度可分离卷积 block 的计算效率,比如地平线机器人 x3 芯片对深度可分离卷积 block 做了定制优化.
下表是 MobileNetv2 和 ResNet50 在一些常见 NPU 芯片平台上做的性能测试结果.
以上,均是看了轻量级网络论文总结出来的一些 不同硬件平台部署轻量级模型的经验 ,实际结果还需要自己手动运行测试.
最后此篇关于轻量级模型设计与部署总结的文章就讲到这里了,如果你想了解更多关于轻量级模型设计与部署总结的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我在 *.sql 文件中得到了我的数据库转储(表、函数、触发器等)。此时我正在通过 jenkins 部署它们,通过传递执行 shell 命令: sudo -u postgres psql -d my_
我正在使用网络部署 API 来部署网络包(.zip 文件,由 MSDeploy.exe 创建)以编程方式将包发布到服务器(在发布包之前我们需要做一些其他事情这就是为什么我们不使用 MSDeploy.e
我们正在使用 Web Deploy 3 的(几乎完全未记录的)“公共(public) API”来创建我们网站的 .zip 包,然后将其同步到服务器: DeploymentBaseOptions des
将 clojure 应用程序制作成可执行文件的最简单方法是什么,例如 http://rawr.rubyforge.org/ ruby 吗? (exe 和 app 文件也是) 最佳答案 使用 leini
是否可以下载 Android 源代码并针对任何设备进行编译? 我想做的是尝试 GSM 代码部分并编译操作系统并将其部署到我的摩托罗拉手机上。 谢谢! 最佳答案 是的,但这很难,因为大多数手机不共享驱动
我正在考虑用 c/c++ 编写需要在大多数个人计算机上运行的 nbody 样式模拟。本质上是一个 O(n^2) 粒子模拟器。 因为这需要相当用户友好,所以我希望有 1 个不需要用户安装任何东西的 Wi
需要了解 kubernetes 部署中 kube_deployment_status_replicas 和 kube_deployment_spec_replicas 指标的区别 最佳答案 简而言之,
我正在尝试使用分类器部署 Maven Artifact 。由于我需要源代码和 JAR(我从 GWT 使用它),我想获得 artifact-version-classifier.jar 和 artifa
我设置部署以将我的项目代码与存储我的网站的 FTP 服务器上的项目同步。 但是,每次尝试同步时,我总是必须登录。 我什至检查了记住,但它不起作用! 我正在使用最新的 PhpStorm 2017.1.4
我在 Visual Studio 2008 中开发了一个 ASP.NET 网站。现在我想在其他机器上部署它。我怎样才能做到这一点??就像我们为 Windows 应用程序制作安装包一样,我们可以为 AS
将 QT 框架添加到我的 .app 包中 我正在关注 Qt 站点上关于部署的文档。 我创建了一个名为 HTTPClient.app 的应用程序 我在 Contents 下创建了 Framework 文
这个问题不太可能对任何 future 的访客有帮助;它只与一个小的地理区域、一个特定的时间点或一个非常狭窄的情况相关,通常不适用于互联网的全局受众。如需帮助使这个问题更广泛适用,visit the h
我正在研究改变我目前创建营销网站的策略。目前,我完全用 PHP 从头开始构建网站,使用一个简单的包含系统。所有代码(以及内容)都存储在文件(而不是数据库)中,允许我使用 Subversion 进行
我有一个长期运行的服务(在 while 1 循环中)并通过 GCloud pub/sub 处理有效负载,之后它将结果写入数据库。 该服务不需要监听任何端口。 Kind=Deployment 的声明性
似乎部署已停滞不前。我该如何进一步诊断? kubectl rollout status deployment/wordpress Waiting for rollout to finish: 2 ou
我正在Dart中使用前端的Angular和后端的Shelf构建一个客户端/服务器应用程序。当我执行pub build时,它会按预期生成Dart文件的javascript,但不会替换HTML文件中的Da
我在 Azure 部署中心的下拉列表中看不到我的所有 Github 组织存储库。 Azure 很久以前就已经被授权了,下拉列表正确地显示了所有的存储库,直到上周我在 DevOps 中玩游戏时,不得不再
我认为标题几乎说明了一切...对于 Deployd 来说是全新的,所以任何关于如何最好地实现这一点的指示都值得赞赏。 最佳答案 要获取用户创建的集合中的对象(我假设您使用的是 javascript 库
我有一个试图用于CD服务器的部署脚本,但是在编写bash脚本以完成一些所需的步骤(例如运行npm和迁移命令)时遇到了问题。 我将如何从该脚本进入容器bash,运行下面的命令,然后退出以完成对更改的提取
我想在使用 kubectl 时将参数传递给 Kubernetes 部署命令应用部署文件。 示例:在我的部署 .yaml 中,我有如下参数,我想在使用 kubectl apply - f .yaml 运
我是一名优秀的程序员,十分优秀!