四. TensorRT模型部署优化-模型部署的基础知识

目录

    • 前言
    • 0. 简介
    • 1. FLOPS
    • 2. TOPS
    • 3. HPC的排行,CPU/GPU比较
    • 4. FLOPs
    • 5. FLOPS是如何计算的
    • 6. CUDA Core vs Tensor Core
    • 总结
    • 参考

前言

自动驾驶之心推出的 《CUDA与TensorRT部署实战课程》,链接。记录下个人学习笔记,仅供自己参考

本次课程我们来学习课程第四章—TensorRT 模型部署优化,一起来了解模型部署的基础知识

课程大纲可以看下面的思维导图

在这里插入图片描述

0. 简介

本小节目标:理解 FLOPS 和 TOPS 是什么,CPU/GPU 中计算 FLOPS/TOPS 的公式,以及 CUDA Core 和 Tensor Core 的区别

这节课程开始我们进入第四章节—TensorRT 模型部署优化的学习,这章节是偏理论的部分,知识点比较碎片化。我们这节主要讲模型部署的基础知识,这部分内容其实不仅仅局限于 TensorRT 模型部署,大家在做其它硬件上的模型部署的时候很多概念都是通用的

第四章节主要分为以下几个部分:

  • 模型部署基础知识
  • 模型部署的几大误区
  • 模型量化
  • 模型剪枝
  • 层融合

模型部署基础知识这小节主要教大家一些常见的东西比如 FLOPS、TOPS 等等,同时跟大家介绍一下 CUDA Core 和 Tensor Core 它们核心的区别是什么以及各个模型的 TOPS 是怎么计算的

模型部署的几大误区这小节简单过一下,主要是大家在做模型部署时可能存在的一些误解

模型量化这小节会跟大家讲得比较细,不仅仅是大家常听到的 PTQ 量化和 QAT 量化,会从基础的地方去讲模型量化是怎么做的以及模型量化的量化密度、校准算法选取、校准数据集 batch size 大小的影响、量化层融合等等

模型剪枝这小节会教大家 sparse pruning 是什么东西以及对 kernel 的剪枝和对 channnel 的剪枝它们的区别是什么,还有现在硬件上对模型剪枝的性能支持是怎么样的

层融合这小节主要是做一个总结性的小节,层融合这个概念其实在前面的很多部分都会涉及到,比如 TensorRT 优化有涉及层融合,模型量化也有涉及层融合

今天我们来讲第四章节第一小节—模型部署的基础知识,这节课学完之后希望大家理解 FLOPS 和 TOPS 是什么,CPU/GPU 中的计算 FLOPS/TOPS 的公式以及 CUDA Core 和 Tensor Core 的区别

1. FLOPS

FLOPSFLoating point number Operations Per Second)

  • 指的是一秒钟可以计算处理的浮动小数点运算的次数
  • 衡量计算机硬件性能、计算能力的一个单位
  • FLOPS 也可以写作 FLOP/s,是一个意思,但千万不能写成 FLOPs

常见的 FLOPS 如下表所示:

在这里插入图片描述

2. TOPS

TOPSTera Operations Per Second)

  • 指的是一秒钟可以处理的整型运算的次数
  • 衡量计算机硬件性能、计算能力的一个单位

在这里插入图片描述

NVIDIA Ampere架构的TESLA A100的性能

3. HPC的排行,CPU/GPU比较

HPCHigh Performance Compute)排名如下所示:

在这里插入图片描述

HPC历年的排名

CPU 与 GPU 在 FLOPS 上的性能比如下图所示:

在这里插入图片描述

CPU与GPU在FLOPS上的性能比

我们可以看到 CPU 与 GPU 在 FLOPS 上的性能比还是比较大的,CPU 主要是处理复杂逻辑的,GPU 主要是做并行处理所以它的计算密度比较大,在 FLOPS 上的性能也比较强

4. FLOPs

FLOPsFloating point number operations)

  • 是衡量模型大小的一个指标
  • 大家在 CVPR 的 paper 或者 Github 里经常能够看到的就是这个信息

在这里插入图片描述

Swin Transformer中的FLOPs

在这里插入图片描述

EfficientNetV2中的FLOPs

值得注意的是 FLOPs 不能够用来衡量模型的推理性能,具体我们还是要看 FLOPS,看模型在硬件设备上的 FLOPS,FLOPs 只是衡量模型大小的一个指标具体还是要看硬件的

5. FLOPS是如何计算的

跟 FLOPS 有关的概念:

  • Core 数量
  • 时钟频率
  • 每个时钟周期可以处理的 FLOPS

FLOPS = 频率 * core数量 * 每个时钟周期可以处理的FLOPS \text{FLOPS = 频率 * core数量 * 每个时钟周期可以处理的FLOPS} FLOPS = 频率 * core数量 * 每个时钟周期可以处理的FLOPS

比如说 Intel i7 Haswell 架构(8 核,频率 3.0GHz)它的 FLOPS 在双精度的时候就是:
3.0*10^9Hz * 8 core * 16 FLOPS/clk = 0.38 TFLOPS \text{3.0*10\textasciicircum 9Hz * 8 core * 16 FLOPS/clk = 0.38 TFLOPS} 3.0*10^9Hz * 8 core * 16 FLOPS/clk = 0.38 TFLOPS
那么它的 FLOPS 在单精度的时候就是:
3.0 * 10^9Hz * 8 core * 32 FLOPS/clk = 0.76 TFLOPS \text{3.0 * 10\textasciicircum9Hz * 8 core * 32 FLOPS/clk = 0.76 TFLOPS} 3.0 * 10^9Hz * 8 core * 32 FLOPS/clk = 0.76 TFLOPS
我们思考下 16 FLOPS/clk 和 32 FLOPS/clk 是如何计算的呢?也就是每个时钟周期可以处理的 FLOPS 是怎么来的呢?

这个其实和硬件的架构相关:

在这里插入图片描述

Intel Haswell计算单元架构图

上图是 Interl Haswell 的架构图,可以看到它有两个 FMA 以及支持 AVX-256 指令集

FMAFused Multiply Accumulation)是计算的一个硬件单元,下图展示了 FMA 的功能:

在这里插入图片描述

我们可以看到没有 FMA 乘法加法分开算,计算 D=A*B+C 需要两个时钟周期;有 FMA 乘法加法一起算,计算 D=A*B+C 需要一个时钟周期

AVX-256 指令集其实跟我们之前讲的 SIMD 操作相关即一个指令去处理多个数据,AVX-256 中一个寄存器可以存储 8 个 32-bit 的 float 或者 4 个 64-bit 的 double(如下图所示)那这也就意味着 AVX-256 在做 SIMD 操作时一个时钟周期就可以处理 8 个 FP32 或者 4 个 FP64 的计算

在这里插入图片描述

AVX-256的数据类型

在这里插入图片描述

AVX-256的SIMD操作

所以我们回到之前的问题,16 FLOPS/clk 的计算如下:
2 FMA * 4个FP64的SIMD运算 * 2 乘加融合 = 16 FLOPS/clk \text{2 FMA * 4个FP64的SIMD运算 * 2 乘加融合 = 16 FLOPS/clk} 2 FMA * 4FP64SIMD运算 * 2 乘加融合 = 16 FLOPS/clk
32 FLOPS/clk 的计算如下:
2 FMA * 8个FP32的SIMD运算 * 2 乘加融合 = 32 FLOPS/clk \text{2 FMA * 8个FP32的SIMD运算 * 2 乘加融合 = 32 FLOPS/clk} 2 FMA * 8FP32SIMD运算 * 2 乘加融合 = 32 FLOPS/clk
FPLOS 在 GPU 中是如何计算的呢?跟 CPU 不同的是 GPU 它的特性如下:

  • 没有 AVX 这种东西
  • 但是有大量的 core 来提高吞吐量
  • 有 Tensor Core 来优化矩阵运算
  • 有 Tensor Core 来优化矩阵运算

在这里插入图片描述

NVIDIA TESLA A100, Ampere Architecture, 一共108个SM

下图展示了 Ampere 架构中一个 SM:

在这里插入图片描述

Ampere SM Block diagram

从上图中我们可以看到一个 SM 里面有:

  • 64 个处理 INT32 的 CUDA Core
  • 64 个处理 FP32 的 CUDA Core
  • 32 个处理 FP64 的 CUDA Core
  • 4 个处理矩阵计算的 Tensor Core

每一种精度在一个 SM 中的吞吐量(一个时钟周期可以处理的浮点运算的个数)如下表所示:

在这里插入图片描述

我们再来看 Ampere 架构的各个精度的吞吐量,如下图所示:

在这里插入图片描述

Ampere架构的各个精度的Throughput

我们思考下这些值是如何被计算出来的呢?我们以 Peak FP64 为例来讲解,我们前面说过一个 SM 里面有 32 个处理 FP64 的 CUDA Core,每一个时钟周期计算一个 FP64,而 Ampere 架构中的各项指标如下:

  • 频率:1.41 GHz
  • SM 数量:108
  • 一个 SM 中计算 FP64 的 CUDA core 的数量:32
  • 一个 CUDA core 一个时钟周期可以处理的 FP64:1
  • 乘加:2

Throughout = 1.41 GHz * 108 * 32 * 1 * 2 = 9.7 TFLOPS \text{Throughout = 1.41 GHz * 108 * 32 * 1 * 2 = 9.7 TFLOPS} Throughout = 1.41 GHz * 108 * 32 * 1 * 2 = 9.7 TFLOPS

Peak FP32 也可以进行类似的计算,其吞吐量为:
Throughout = 1.41 GHz * 108 * 64 * 1 * 2 = 19.4 TFLOPS \text{Throughout = 1.41 GHz * 108 * 64 * 1 * 2 = 19.4 TFLOPS} Throughout = 1.41 GHz * 108 * 64 * 1 * 2 = 19.4 TFLOPS
值得注意的是 Ampere 中没有专门针对 FP16 的 CUDA core,而是将 FP32 的 CUDA Core 和 FP64 的 CUDA Core 一起使用来计算 FP16。因此我们暂且说一个 SM 中计算 FP16 的 CUDA Core 的数量是:64x2+32x4=256

因此 Peak FP16 的吞吐量为:
Throughout = 1.41 GHz * 108 * 256 * 1 * 2 = 78 TFLOPS \text{Throughout = 1.41 GHz * 108 * 256 * 1 * 2 = 78 TFLOPS} Throughout = 1.41 GHz * 108 * 256 * 1 * 2 = 78 TFLOPS
同理 Ampere 中也没有专门针对 INT8 的 CUDA Core,而是使用 INT32 的 CUDA Core 计算 INT8。因此我们暂且说一个 SM 中计算 INT8 的 CUDA Core 的数量是:64x4=256

因此 Peak INT8 的吞吐量为:
Throughout = 1.41 GHz * 108 * 256 * 1 * 2 = 78 TFLOPS \text{Throughout = 1.41 GHz * 108 * 256 * 1 * 2 = 78 TFLOPS} Throughout = 1.41 GHz * 108 * 256 * 1 * 2 = 78 TFLOPS
看完 CUDA Core 之后我们来分析 Tensor Core,Ampere 架构使用的是第三代 Tensor Core,它一个时钟周期可以完成 256x4=1024 个 FP16 运算,准确来说是 4x8 的矩阵与 8x8 的矩阵的 FMA,而 Ampere 的各项指标如下:

  • 频率:1.41 GHz
  • SM 数量:108
  • 一个 SM 中计算 FP16 的 Tensor core 的数量:4
  • 一个 Tensor core 一个时钟周期可以处理的 FP16:256
  • 乘加:2

因此 Peak FP16 Tensor Core 的吞吐量为:
Throughout = 1.41 GHz * 108 * 4 * 256 * 2 = 312 TFLOPS \text{Throughout = 1.41 GHz * 108 * 4 * 256 * 2 = 312 TFLOPS} Throughout = 1.41 GHz * 108 * 4 * 256 * 2 = 312 TFLOPS

6. CUDA Core vs Tensor Core

下面我们来看 CUDA Core 和 Tensor Core 的一个比较,我们如果使用一个 CUDA Core 计算矩阵乘法 A * B = C,则计算过程如下图所示:

在这里插入图片描述

可以看到如果使用 CUDA Core 来做矩阵乘法的话,输出中的一个元素就需要 8 次 FMA,也就是需要 8 个时钟周期才可以完成一个 c(0,0) 的计算。要完成矩阵 4x8 与 8x4 的计算则需要 8x16=128 个时钟周期才可以完成

当然如果我们有 16 个 CUDA Core 的话,这些计算其实是并行的,实际上只需要 8 个时钟周期,不过为了与 Tensor Core 比较这里只用了一个 CUDA Core

我们再来看使用 1st Gen. Tensor Core(Volta 架构) 来计算矩阵乘法 A * B = C,其计算过程如下图所示:

在这里插入图片描述

值得注意的是 Tensor Core 不是一个一个的对 FP16 进行处理,而是 4x4 个 FP16 一起处理,第一个时钟周期先做 A 和 B 的前半段结果先存着,第二个时钟周期再处理 A 和 B 的后半段,最后和前半段结果做个累加完成计算。所以说 Tensor Core 处理 4x8*8x4 的计算只需要 1+1=2 个时钟周期

在这里插入图片描述

另外想说的是现在的 Ampere 架构中的 Tensor Core 已经是 3rd Gen. 了,它在一个时钟周期就可以处理 4x8*8x8 的计算,也就是说一个时钟周期可以处理 256 个 FP16

在这里插入图片描述

关于 CUDA Core 和 Tensor Core 的区别还可以看下图更直观的感受:

在这里插入图片描述

总结

本次课程我们主要学习了模型部署的一些基础知识,包括 FLOPS、TOPS、FLOPs 代表的含义以及 FLOPS 是如何计算的,最后我们简单聊了下 CUDA Core 和 Tensor Core 的一个区别。

OK,以上就是第 1 小节有关模型部署的基础知识的全部内容了,下节我们来学习 Roofline model,敬请期待😄

参考

  • AI Chips: A100 GPU with Nvidia Ampere architecture
  • High performance computer TOP 6 in JUNE 2024
  • A Massively Parallel Processor: the GPU
  • Github: Swin Transformer
  • EfficientNetV2: Smaller Models and Faster Training
  • Intel Processor Architecture
  • What is SSE and AVX?
  • 深度了解 NVIDIA Ampere 架构
  • AI Chips: A100 GPU with Nvidia Ampere architecture
  • Programming Tensor Cores in CUDA 9
  • YouTube: About NVIDIA Tensor Core

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

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

相关文章

最小二乘法-超详细推导(转换为矩阵乘法推导,矩阵求导推导)

最小二乘法就是让均方误差最小。 下面是损失函数转换为矩阵方式的详解 如何让其最小,在导数为0的地方取极小值。 问:导数为0的地方可能去极大值,也可能是极小值,凭什么说导数为0就是极小值? 答:因为使用…

酷黑简洁大气体育直播自适应模板赛事直播门户网站源码

源码名称:酷黑简洁大气体育直播自适应模板赛事直播门户网站源码 开发环境:帝国cms 7.5 安装环境:phpmysql 支持PC与手机端同步生成html(多端同步生成插件) 带软件采集,可以挂着自动采集发布,无…

某某某加固系统分析

某某某加固系统内核so dump和修复: 某某某加固系统采取了内外两层native代码模式,外层主要为了保护内层核心代码,从分析来看外层模块主要用来反调试,释放内层模块,维护内存模块的某些运行环境达到防止分离内外模块&am…

网上比较受认可的赚钱软件有哪些?众多兼职选择中总有一个适合你

在这个互联网高速发展的时代,网上赚钱似乎成了一种潮流。但是,你是否还在靠运气寻找赚钱的机会?是否还在为找不到靠谱的兼职平台而苦恼? 今天,就为你揭秘那些真正靠谱的网上赚钱平台,让你的赚钱之路不再迷…

Python--List列表

list列表⭐⭐ 1高级数据类型 Python中的数据类型可以分为:数字型(基本数据类型)和非数字型(高级数据类型) ●数字型包含:整型int、浮点型float、布尔型bool、复数型complex ●非数字型包含:字符…

整合SSM框架笔记

整合SSM框架笔记 Spring5 Spring MVC MyBatis Druid MySQL Thymeleaf 感谢尚硅谷课程:B站课程 前言 单Spring框架时,是Java工程。 Spring与Spring MVC可以共用一个配置文件,也可以不共用一个,推荐不共用一个。 Spring与Sp…

Quartus 联合 ModelSim 仿真 IP 核(RAM)

文章目录 ModelSim 路径设置创建 RAM进行仿真 本文主要介绍如何在包含 IP 核的 Quartus 项目中使用 Modelsim 进行仿真,本文基于 IP 核 RAM: 2-PORT,其他 IP 核类似。 ModelSim 路径设置 点击 Tools->Options 点击 EDA Tool Options,设置…

string OJ题

下面分享一下string做题心得 1. 明白字符串中存储的数字为0 8 9与0 8 9 完全不同,字符0其实在串中存储的是48,要有意识的转化。字符串中如果存数字8,意味着存了BS(退格) 例如1: 算出结果为5,存…

Selenium 自动化测试工具<2>(Selenium 常用API的使用方法)

文章目录 浏览器操作浏览器最大化设置浏览器的大小浏览器的前进和后退操作浏览器滚动条 键盘事件单个按键用法键盘组合键用法 鼠标事件不同窗口搜索定位一组元素定位多层框架下拉框定位alert、confirm、prompt 的处理上传文件操作自动截屏 继上一篇文章对 Selenium API 的使用&…

RT-DRET在实时目标检测上超越YOLO8

导读 目标检测作为计算机视觉的核心任务之一,其研究已经从基于CNN的架构发展到基于Transformer的架构,如DETR,后者通过简化流程实现端到端检测,消除了手工设计的组件。尽管如此,DETR的高计算成本限制了其在实时目标检测…

搭建属于自己的 Git 仓库:GitLab

搭建属于自己的 Git 仓库:使用 GitLab 文章目录 搭建属于自己的 Git 仓库:使用 GitLab什么是 GitLab?准备工作安装 Docker使用Docker Compose 快速构建GitLab1、从docker compose快速搭建GitLab2、部署到服务器并访问3、浏览器访问 在现代软件…

【数据结构】------C语言实现二叉树

作者主页:作者主页 数据结构专栏:数据结构 创作时间 :2024年5月20日 一、二叉树的定义 二叉树(Binary Tree) 是由n个结点构成的有限集(n≥0),n0时为空树,n>0时为非空树。 对于非空树: 有且仅有一个根…

腾讯Java社招面试题真题,最新面试题

Java中synchronized和ReentrantLock有什么区别? 1、锁的实现方式不同: synchronized是JVM层面的锁,主要依赖于监视器对象(monitor)实现。ReentrantLock是JDK层面的锁,通过Java代码实现,提供了更…

语雀——云知识库/笔记

对于日常进行学习/创作或是记录学习、工作内容与心得的群体来说,能够及时同步的云笔记应用有着广泛的应用场景。近期,我也探索了许多款不同的软件应用,今天来分享一款很有特点的应用——语雀。 语雀,为每一个人提供优秀的文档和知…

1.6 什么是程序-编译与调试

目录 1 程序的作用 2 新建项目及编译运行 2.1 新建项目 2.2 HelloWorld 程序说明 2.3 printf 打印输出 2.4 注释 3 程序的编译过程及项目位置 4 断点及调试窗口设置 5 学习C语言后的境界 1 程序的作用 如下图所示,我们编写了一个可以做加法的程序&#xf…

vue3 vite项目配置了proxy代理情况下查看真实的接口调用地址

vite配置了proxy代理情况下如何查看真实的接口调用地址? 使用vite进行代理 在vite.config.ts配置了代理 在浏览器查看请求头和响应头发现只有代理前的url,没有显示代理后的路径 然后发现一个bypass函数,但是此函数只能修改res响应头的数据&#xff0…

Dockerfile文件详细介绍

前言 Dockerfile是一个文本文件,包含了用于构建Docker镜像的所有命令和说明。它定义了容器的运行环境、依赖以及启动方式,是创建Docker镜像的核心部分。 由于制作镜像的过程中,需要逐层处理和打包,比较复杂,所以Docke…

实战复盘:内网环境渗透ms-SQL数据库

渗透环境:如下图所示,web服务器、ms-SQL服务器、PC客户端在同一个网络中,彼此之间,没有路由器或防火墙的隔离,这是一种危险的网络结构,入侵ms-SQL服务器,非常容易。(实战中&#xff…

整理了10个靠谱且热门的赚钱软件,适合普通人长期做的赚钱副业

作为一名普通的上班族,我们每天都在辛勤工作,但工资的增长速度却如同蜗牛般缓慢。不过,别担心,信息时代总是带给我们无尽的惊喜!今天,我将为大家推荐一些赚钱的宝藏软件,让你在闲暇之余轻松实现…

IEDA常用快捷键(后续更新ing)

1. 快速生成语句 1.快速生成main()方法 psvm或者main回车 2.快速生成输出语句 sout,回车 3.快速生成for循环 fori或者itar,回车 2.快捷键 含义操作查找文本CtrlF替换文本CtrlR单行注释Ctrl/多行注释CtrlShift/格式化CtrlAltL复制当前内容至下一行CtrlD补全代码Alt/快速生成…