四. 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.pswp.cn/bicheng/16195.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/16195.shtml
英文地址,請注明出處:http://en.pswp.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、瀏覽器訪問 在現代軟件…