四. 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.rhkb.cn/news/332129.html

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

相关文章

蓝桥杯物联网竞赛_STM32L071_17_DMA收发 不定长DMA接收

前言: 前面已经说过,由于国赛的代码量的增加,cpu在其他代码的时间块会较省赛大大增加,为了减少对cpu的依赖所以学习DMA收发数据 对于串口中断收发来说串口接收数据无法收取不定长数据所以不好用,而DMA有收集不定长数…

Android硬件渲染流程

Android硬件渲染流程 一.渲染流程1.VSync信号的监听2.VSync信号触发绘制 二.渲染原理1.画布的获取1.1 画布的创建1.2 渲染指令列表的创建 2.绘制与渲染指令2.1 矩形的绘制2.2 硬件渲染指令2.3 节点的绘制 3.绘制的提交3.1 绘制结果的保存3.2 绘制结果的获取 4.层级的构建4.1 绘…

解决Vue3+TS+vite,VSCode 高亮语法错误

一般像这种提示,有可能就是TypeScript语法的识别问题, 一般我们重装一下Vue - Official插件 或者将tcconfig.json中的moduleResolution改为node模式, 基本都是TypeScript无法识别vue文件中的TypeScript语句导致的

单片机原理及技术(二)—— AT89S51单片机(一)(C51编程)

目录 一、AT89S51单片机的片内硬件结构 二、AT89S51的引脚功能 2.1 电源及时钟引脚 2.2 控制引脚 2.3 并行 I/O口引脚 三、AT89S51的CPU 3.1 运算器 3.1.1 算术逻辑单元(ALU) 3.1.2 累加器A 3.1.3 程序状态字寄存器(PSW&#xff09…

JRT1.7发布

JRT1.7连仪器在线演示视频 JRT1.5实现质控主体、1.6基本完成质控;本次版本推进到1.7,1.7集菜单权限、登录、打印导出客户端、初始化、质控、Linux客户端、仪器连接和监控体系各种功能大全,上十年写系统用到的都全了。 这次直接挑战检验最难…

【微服务】springboot 构建镜像多种模式使用详解

目录 一、前言 二、微服务常用的镜像构建方案 3.1 使用Dockerfile 3.2 使用docker plugin插件 3.3 使用docker compose 编排文件 三、环境准备 3.1 服务器 3.2 安装JDK环境 3.2.1 创建目录 3.2.2 下载安装包 3.2.3 配置环境变量 2.2.4 查看java版本 3.3 安装maven …

加拿大媒体广告投放:媒体宣发主流媒体《金融邮报》《埃德蒙顿日报》

介绍《埃德蒙顿日报》与《埃德蒙顿太阳报》 在加拿大阿尔伯塔省首府埃德蒙顿,有两份主流新闻类报纸。其中,《埃德蒙顿日报》是加拿大主要英文报纸之一,也被称为爱蒙顿新闻报。而另一份报纸则是《埃德蒙顿太阳报》,是加拿大阿尔伯…

Linux操作系统最著名的两大系列Red Hat和Debian

Linux操作系统可以根据其背后的项目或社区分为不同的系列,其中最著名的两大系列是Red Hat系列和Debian系列。 1.著名的两大系列是Red Hat和Debian Red Hat系列: Red Hat Enterprise Linux (RHEL):这是Red Hat公司推出的企业级操作系统&#…

香橙派AIpro(OrangePi AIPro)开发板初测评

开发板简介 最近,我拿到手一款Orange Pi AI Pro 开发板,它是香橙派联合华为精心打造的高性能AI 开发板,最早发布于2023年12月,其搭载了昇腾AI 处理器,可提供8TOPS INT8 的计算能力,内存提供了8GB 和16GB两…

【C++】---多态

【C】---多态 一、多态的概念二、多态的定义及实现1、构成多态的2个必要条件2、什么叫做虚函数的重写?3、虚函数重写的3个例外4、建议把 析构函数 都定义为:虚函数 三、C11的两个关键字:final override1、final:修饰虚函数&#x…

Spring—Spring配置文件概念及应用(实现一个图形验证码)

文章目录 配置文件配置文件作用配置文件的格式配置文件优先级说明配置文件书写代码的格式yml文件代码的格式 Value注解 properties 缺点分析properties VS yml实现一个验证码程序 配置文件 配置文件作用 整个项目的重要信息我们都会配置在配置文件中,比如说我们数…

VMware虚拟机-设置系统网络IP、快照、克隆

1.设置网络IP 1.点击右上角开关按钮-》有线 已连接-》有线设置 2.手动修改ip 3.重启或者把开关重新关闭开启 2.快照设置 快照介绍: 通过快照可快速保存虚拟机当前的状态,后续可以使用虚拟机还原到某个快照的状态。 1.添加快照(需要先关闭虚拟机) 2.在…

电子商务网站(网上商店PetShop)

PetShop是一个范例,微软用它来展示.Net企业系统开发的能力。PetShop随着版本的不断更新,至现在基于.Net2.0的PetShop 4.0为止,整个设计逐渐变得成熟而优雅,有很多可以借鉴之处。PetShop是一个小型的项目,系统架构与代码…

【设计模式深度剖析】【2】【结构型】【装饰器模式】| 以去咖啡馆买咖啡为例 | 以穿衣服出门类比

👈️上一篇:代理模式 | 下一篇:适配器模式👉️ 目 录 装饰器模式定义英文原话直译如何理解呢?4个角色类图1. 抽象构件(Component)角色2. 具体构件(Concrete Component)角色3. 装饰&#xf…

【调试笔记-20240526-Linux-在 OpenWrt-23.05 发行版上安装 cpolar】

调试笔记-系列文章目录 调试笔记-20240526-Linux-在 OpenWrt-23.05 发行版上安装 cpolar 文章目录 调试笔记-系列文章目录调试笔记-20240526-Linux-在 OpenWrt-23.05 发行版上安装 cpolar 前言一、调试环境操作系统:Windows 10 专业版调试环境调试目标 二、调试步骤…

【找出第 K 大的异或坐标值】python

4层循环暴力超时 class Solution:def kthLargestValue(self, matrix: List[List[int]], k: int) -> int:nums[]for a in range(len(matrix)):for b in range(len(matrix[0])):num0for i in range(a1):for j in range(b1):num^matrix[i][j]nums.append(num)nums.sort()retu…

部门来了个测试开发,听说是00后,上来一顿操作给我看蒙了...

公司新来了个同事,听说大学是学的广告专业,因为喜欢IT行业就找了个培训班,后来在一家小公司实习半年,现在跳槽来我们公司。来了之后把现有项目的性能优化了一遍,服务器缩减一半,性能反而提升4倍&#xff01…

Docker自定义镜像

镜像 镜像包含了应用程序、程序运行的系统函数库、运行配置等文件的文件包。构建自定义镜像就是把上述文件打包的过程。 镜像结构 入口(entrypoint):镜像运行入口,一般是程序的启动脚本和参数 层(layer)&am…

Tensorflow 2.0 安装过程

第一步:进入国内清华软件网站 anaconda | 镜像站使用帮助 | 清华大学开源软件镜像站 | Tsinghua Open Source Mirroranaconda 使用帮助 | 镜像站使用帮助 | 清华大学开源软件镜像站,致力于为国内和校内用户提供高质量的开源软件镜像、Linux 镜像源服务&…

怎么在Qt Designer设计的界面上显示Matplotlib的绘图?

首先,利用Qt Designer设计界面。 设计好后保存为ui文件。 接着,将ui文件转为py文件。 我喜欢在python中进行转换,因此把转换命令封装为函数,运行一下即可。 import os # pyuic5 -o output_file.py input_file.ui #通过命令把.ui…