四. 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,一经查实,立即删除!

相关文章

记一次Spark cache table导致的数据问题以及思考

目前在做 Spark 升级(3.1.1升级到3.5.0)的时候,遇到了cache table导致的数据重复问题,这种情况一般来说是很少见的,因为一般很少用cache table语句。 当然该问题已经在Spark3.5.1已经解决了,可以查看对应的 SPARK-46995和SPARK-45592 从以上的…

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

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

android ndc firewall 命令type 黑名单 白名单差异

可以看到以白名单方式使能防火墙,fw_FORWARD fw_INPUT fw_OUTPUT 的操作是DROP或REJEDCT。即默认所有应用不允许上网,需要 XXX:/ # ndc firewall enable whitelist 200 0 Firewall command succeeded XXX:/ # iptables -t filter -L Chain INPUT (polic…

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

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

【HSQL001】HiveSQL内置函数手册总结(更新中)

1.熟悉、梳理、总结下Hive SQL相关知识体系。 2.日常研发过程中使用较少,随着时间的推移,很快就忘得一干二净,所以梳理总结下,以备日常使用参考 3.欢迎批评指正,跪谢一键三连! 文章目录 1.函数清单 1.函数清…

某某某加固系统分析

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

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

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

等保测评的流程是怎样的

等保测评概述 等保测评,即信息安全等级保护测评,是指对信息系统安全性能进行等级评估的过程。其目的是通过评估系统的安全性能,为系统提供一个安全等级,并规定相应的保护措施。等保测评的流程通常包括定级、备案、安全建设、等级测…

Python--List列表

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

TypeScript-type注解对象类型

type注解对象类型 在TS中对于对象数据的类型注解,除了使用interface之外还可以使用类型别名来进行注解,作用类似 type Person {name: stringage: number }const p:Person {name: lily,age: 16 } type 交叉类型&模拟继承 类型别名配合交叉类型…

docker创建的rabbitmq,启动容器时报:Failed to create thread: Operation not permitted (1)

原因:docker内的用户权限受限 启动docker时加上参数 --privilegedtrue docker run --privilegedtrue -d --name rabbitmq --restartalways -p 5671:5671 -p 5672:5672 -p 15672:15672 -p 15671:15671 -p 25672:25672 -v /home/rabbitmq/data/:/var/rabbitm…

整合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,设置…

BeanFactory、FactroyBean、ApplicationContext

BeanFactory Ioc容器、定义接口规范来管理spring bean的生命周期、依赖、注入,spring中有各种Ioc容器 FactroyBean 定制的工厂Bean,可以通过抽象工厂方式创建的bean,不纳入spring的生命周期、依赖、注入特性,相当于spring给第三…

string OJ题

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

MySQL 用户变量赋值、查询赋值、滚动赋值

在MySQL中,用户变量是一种在会话级别存储和重用值的方式,它们以符号开头。用户变量可以在查询中用来存储和传递数据,增强SQL脚本的功能性。 定义和赋值用户变量用户变量可以直接在查询中定义并赋值,不需要预先声明。赋值可以使用S…

springboot+mybatis+druid 配置单实例多数据源

第一步&#xff1a;pom中添加依赖 <!--mybatis多数据源--><dependency><groupId>com.baomidou</groupId><artifactId>dynamic-datasource-spring-boot-starter</artifactId><version>2.5.6</version></dependency> 第…

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

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

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

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

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

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