四. TensorRT模型部署优化-pruning(sparse-tensor-core)

目录

    • 前言
    • 0. 简述
    • 1. 自动驾驶中需要关注的电力消耗
    • 2. Ampere架构中的3rd Generation Tensor core
    • 3. Sparse tensor core做矩阵乘法
    • 总结
    • 参考

前言

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

本次课程我们来学习课程第四章—TensorRT 模型部署优化,一起来学习 sparse tensor core

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

在这里插入图片描述

0. 简述

本小节目标:理解 NVIDIA 是如何使用 sparse tensor core 来处理带有稀疏性的矩阵乘法

这节课我们来学习剪枝的第三个小部分—sparse tensor core,这个小节我们主要是来理解 NVIDIA 的 sparse tensor core 是如何处理稀疏性的矩阵乘法的,这里做一个科普稍微给大家扩展一下

下面我们开始本次课程的学习🤗

1. 自动驾驶中需要关注的电力消耗

下面是 Jetson AGX Orin 的电力消耗图,它的 Peak performance 和对应的电力消耗是:

  • GPU:170 TOPSSparse INT8),85 TOPS(DENSE INT8)
  • DLA0:52.5 TOPSSparse INT8),26.25 TOPS(DENSE INT8)
  • DLA1:52.5 TOPSSparse INT8),26.25 TOPS(DENSE INT8)
  • Power consumption ~60W

在这里插入图片描述

Jetson AGX Orin

我们可以看到 Orin 中的 Sparse INT8 的 TOPS 比 Dense INT8 高两倍,那我们自然而然回去想 Sparse 和 Dense 分别代表着什么呢?其实 Sparse 就是 NVIDIA Ampere 架构中所支持的一个东西,下面我们一起来看看

2. Ampere架构中的3rd Generation Tensor core

在 Ampere 架构(A100/Jetson AGX Orin)中的第三代 Tensor core 支持带有 sparsity 的 matrix 计算,更准确来说:

  • 支持 fine-grained structured sparsity
  • fine-grained 细粒度,主要是对权重的某个元素本身进行分析剪枝,是否归零
  • structured 表现在 sparsity 的 pattern 是以 1x4 vector 的大小进行 2:4 的归零(vector-wise pruning),具体如下图所示,每一个 1x4 vector 只保留其中的两个元素即图中绿色部分,另外两个归零即图中白色部分
  • 50% 粒度的 sparse pruning,理论上可以实现 2x 的吞吐量的提升

在这里插入图片描述

结构化稀疏矩阵

在这里插入图片描述

tensor core计算示意图

我们下面来看看 sparse 在 tensor core 中是如何做支持的,假设我们有一个 Dense matrix W 0 W_0 W0,通过 Fine-grained structured pruning 之后变成了一个 structured-sparse matrix W W W,如下图所示:

在这里插入图片描述

也就是说一个 dense 的 matrix 会以 2:4 sparsity 的方式进行剪枝(每 4 个连续的权重中最小的两个归零),下图展示了 pruning 的过程:

在这里插入图片描述

在这里插入图片描述

下面我们以具体的数据来更加形象的说明整个 Fine-grained structured pruning 过程,Original 代表原始的 Dense Matrix,通过剪枝将其中的每四个中的两个进行 pruning 剪枝,得到 2:4 Sparse Matrix:

在这里插入图片描述

剪枝完成之后,对于已经 sparse pruning 过的 matrix 可以进一步进行压缩,在 memory 中只保存非零的 weight,至于哪些 weight 是零,哪些 weight 非零,我们可以用一个 2-bits indices 来保存(可以把它理解为一种索引),如下图所示:

在这里插入图片描述

这样一来 weight 的大小减半,同时对于 activation values 可以通过 2-bits indices 来决定 activation values 中哪些值是参与计算的,哪些是 skip 掉的(这个过程需要特殊的硬件 unit 来实现),从而实现 2x 的计算吞吐量的提升,整个过程如下图所示:

在这里插入图片描述

上图还对比了 Dense Matrix 计算和 Sparse Matrix 计算,可以看到 Sparse Matrix 的计算省去了 Dense Matrix 中很多没必要的计算,它将一个 1x8 与 8x1 的计算通过 indices 变成了一个 1x4 与 4x1 的计算

3. Sparse tensor core做矩阵乘法

我们再来看一个具体的例子,Dence Tensor core(FP16)的计算 A(M,K) * B(K,N) = C(M,N) 的过程可以用下图来表示:

在这里插入图片描述

我们知道 A100 中的 tensor core 可以用 1 cycle 完成一个 16x16 * 16x8 = 16 * 8 的矩阵乘法,需要用 2 cycle 完成一个 16x32 * 32x8 = 16 * 8 的矩阵乘法,如下图所示:

在这里插入图片描述

上面展示的是 Dense Tensor core(FP16)的计算过程,下面我们来看看 Sparse Tensor core(FP16)的计算 A(M, k) * B(K, N) = C(M, N) 的过程,如下图所示:

在这里插入图片描述

如果说 A 中的 matrix 拥有 sparsity,是按照 2:4 的 pattern 进行 pruning,我们可以重构 A,如下图所示,重构后的 A 的 memory 占用空间直接减半达到压缩的效果,我们可以把这里的 A 理解为 conv 或 FC 中的 weight

在这里插入图片描述

那么对于 B,可以通过索引对 B 中参与计算的值进行筛选(也可以理解为对 B 的重构),如下图所示,我们可以把这里的 B 理解为 conv 或 FC 中的 activation values。另外这个筛选的过程其实是需要硬件支持的,也就是只能是第三代 tensor core 才能做,其他硬件可能就不行,这也就是为什么 Fine-grained pruning 细粒度剪枝可能会需要特定硬件的支持

在这里插入图片描述

这样我们可以得到一个结论:

  • 使用 dence tensor core 需要用 2 cycle 完成一个 16x32 * 32x8 = 16 * 8 的矩阵乘法
  • 使用 sparse tensor core 只需要 1 cycle 就可以完成一个 16x32 * 32x8 = 16 * 8 的矩阵乘法

在这里插入图片描述

然而这里面很容易忽视的一点就是,为了实现 sparse 的计算而添加的额外操作的 overhead

  • compress weight 的 overhead
  • reconstruct activation values 的 overhead

虽然这些是在硬件上可以完成,从而自动的将 0 参与的计算全部 skip 掉,然而这些多余的操作有时会比较凸显,尤其是当模型并不是很大,参与 sparse 的计算的激活值不是很大时,使用 sparsity 的特性做计算效果不是那么好。目前认为 sparse tensor core 在 NLP 领域的加速可能会比较可观。

在这里插入图片描述

上图展示了参与计算的参数量的不同 sparse tensor core 体现出来的加速比也不同,如果参与计算的参数量比较少时,此时 sparse 带来的加速比不是很明显,随着参数量的增加,sparse 带来的加速比也随之增加

总结

本次课程我们主要学习了 NVIDIA 的第三代 tensor core 是如何处理稀疏的矩阵乘法计算的,它主要是通过 Fine-grained pruning 将 Dense Matrix 变成 Sparse Matrix,随后进行 compressed 压缩得到压缩后的 weights 和对应的 indices,通过 indices 可以 skip 掉 weights 和 activation values 之间的一个 0 参与的计算。不过需要注意的是 sparse 的计算会有一些额外的 overhead 导致在参与计算的参数量比较小时加速并不是很可观

OK,以上就是剪枝的第三个小部分 sparse tensor core 的全部内容了,下节我们进入第五章—实战:TensorRT API的基本使用的学习,敬请期待😄

参考

  • Delivering Server-Class Performance at the Edge with NVIDIA Jetson Orin
  • Accelerating Sparse Deep Neural Networks

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

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

相关文章

[激光原理与应用-110]:南京科耐激光-激光焊接-焊中检测-智能制程监测系统IPM介绍 - 13 - 德擎激光焊接在线缺陷检测系统 WDD详解解析

目录 一、产品简介 1.1 概述 1.2 多光学信号传感器 (1)外观 (2)消费电子行业应用 1.3 IO信号处理模块/可编程控制模块 1.4 操作系统分析软件 1.5 检测原理分析 二、硬件原理 2.1 系统架构与电路接口 2.2 多光学信号传感…

SSRF漏洞深入利用与防御方案绕过技巧

文章目录 前言SSRF基础利用1.1 http://内网资源访问1.2 file:///读取内网文件1.3 dict://探测内网端口 SSRF进阶利用2.1 Gopher协议Post请求2.2 Gopher协议文件上传2.3 GopherRedis->RCE2.4 JavaWeb中的适用性? SSRF防御绕过3.1 Url黑名单检测的绕过3.2 Url白名单…

政安晨【零基础玩转各类开源AI项目】基于Ubuntu系统部署MuseV (踩完了所有的坑):基于视觉条件并行去噪的无限长度和高保真虚拟人视频生成

目录 下载项目 创建虚拟环境 启动虚拟环境&执行项目依赖 基于DOCKER的尝试 A. 安装引擎 B. 下载桌面安装包 C. 安装桌面包 用Docker运行MuseV 1. 拉取镜像 ​编辑 2. 运行Docker镜像 政安晨的个人主页:政安晨 欢迎 👍点赞✍评论⭐收藏 收…

HSP_15章 Python_模板设计模式和oop进阶总结

P136 模板设计模式 1. 设计模式简介 设计模式是在大量的实践中总结和理论化之后优选的代码结构、编程风格、以及解决问题的思考方式 设计模式就像是经典的棋谱,不同的棋局,我们用不同的棋谱,免去我们自己再思考和摸索 2. 模板设计模式 基本…

Profibus_DP转ModbusTCP网关模块连马保与上位机通讯

Profibus转ModbusTCP网关模块(XD-ETHPB20)广泛应用于工业自动化领域。例如,可以将Profibus网络中的传感器数据转换为ModbusTCP协议,实现数据的实时监控和远程控制。本文介绍了如何利用Profibus转ModbusTCP网关(XD-ETHP…

windows单机版mongodb安装

1、先从官网下载安装包官网下载地址 2.本地解压并创建目录 2.1创建data和log目录 2.2创建mongodb.cfg # mongod.conf# for documentation of all options, see: # http://docs.mongodb.org/manual/reference/configuration-options/# Where and how to store data. storag…

RISC-V 指令系统

指令系统 指令集 指令集从本质上可以分为复杂指令集(Complex Instruction Set Computing,CISC)和精简指令集(Reduced Instruction Set Computing,RISC)两种。复杂指令集的特点是能够在一条指令内完成很多…

Perl语言简介

1.简介 Perl 是 Practical Extraction and Report Language 的缩写,可翻译为"实用报表提取语言"。   Perl 是高级、通用、直译式、动态的程序语言。   Perl 最初的设计者为拉里沃尔(Larry Wall),于1987年12月18日发…

【UE5.1 角色练习】15-枪械射击——子弹发射物

目录 效果 步骤 一、创建并发射子弹 二、优化子弹 效果 步骤 一、创建并发射子弹 1. 在前面的文章中(【UE5.1 角色练习】06-角色发射火球-part1)我们创建了蓝图“BP_Skill_FireBall” 这里我们复制一份命名为“BP_Ammo_5mm”,用于表示…

敏捷开发笔记(第10章节)--Liskov原则(LSP)

目录 1:PDF上传链接 10.1 Liskov替换原则(LSP) 10.2 一个违反LSP的简单例子 10.6 启发式规则和习惯用法 10.7 结论 1:PDF上传链接 【免费】敏捷软件开发(原则模式与实践)资源-CSDN文库 OCP背后的主要机制是抽象(abstraction…

Python游戏开发:数字华容道(内附完整代码)

数字华容道是一种经典的智力游戏,源自中国古代的华容道游戏。它的目标是通过滑动数字块,将空格移动到指定位置,从而完成拼图。这款游戏不仅考验玩家的逻辑思维能力,还能锻炼空间想象力和策略规划能力。在数字华容道中,…

基于TCP的在线词典系统(分阶段实现)(阻塞io和多路io复用(select)实现)

1.功能说明 一共四个功能: 注册 登录 查询单词 查询历史记录 单词和解释保存在文件中,单词和解释只占一行, 一行最多300个字节,单词和解释之间至少有一个空格。 2.功能演示 3、分阶段完成各个功能 3.1 完成服务器和客户端的连接 servic…

PTX入门教程与实战

PTX入门教程 官方文档的目录结构 1 PTX指令 官方文档链接 1.1 指令形式 指令的操作数个数从0-4不等,其中d代表的是目的操作数,a,b,c是源操作数 p opcode;p opcode a;p opcode d, a;p opcode d, a, b;p opcode d, a, b, c;2 编程模型 2.…

FullCalendar的使用,react日历组件

1.下载 yarn add fullcalendar/core fullcalendar/react fullcalendar/daygrid 2.运行 import React from react; import FullCalendar from "fullcalendar/react"; import dayGridPlugin from "fullcalendar/daygrid";const ExperimentalSchedule () …

13--memcache与redis

前言:数据库读取速度较慢一直是无法解决的问题,大型网站应对的方式主要是使用缓存服务器来缓解这种情况,减少数据库访问次数,以提高动态Web等应用的速度、提高可扩展性。 1、简介 Memcached/redis是高性能的分布式内存缓存服务器…

paddlepaddle2.6,paddleorc2.8,cuda12,cudnn,nccl,python10环境

1.安装英伟达显卡驱动 首先需要到NAVIDIA官网去查自己的电脑是不是支持GPU运算。 网址是:CUDA GPUs | NVIDIA Developer。打开后的界面大致如下,只要里边有对应的型号就可以用GPU运算,并且每一款设备都列出来相关的计算能力(Compu…

C语言 | Leetcode C语言题解之第230题二叉搜索树中第K小的元素

题目: 题解: /*** Definition for a binary tree node.* struct TreeNode {* int val;* struct TreeNode *left;* struct TreeNode *right;* };*/int search_num(struct TreeNode* root, int k, int *result, int num) {if(num k 1){retu…

计算机的错误计算(二十九)

摘要 (1)讨论近似值的错误数字个数。有时,遇到数字9或0, 不太好确认近似值的错误数字个数。(2)并进一步解释确认计算机的错误计算(二十八)中一个函数值的错误数字个数。 理论上,我…

Java数据结构-二叉树

树型结构 概念 树是一种非线性的数据结构,它是由n(n>0)个有限结点组成的一个具有层次关系的集合。把它叫做树是因为它看起来像一棵倒挂的树,也就是说它是根朝上叶朝下的。 树具有以下特点: 有一个特殊结点&…

javaweb个人主页设计(html+css+js)

目录 1 前言和要求 1.1 前言 1.2 设计要求 2 预览 2.1 主页页面 2.2 个人简介 2.3 个人爱好 2.4 个人成绩有代码,但是图片已省略,可以根据自己情况添加 2.5 收藏夹 3 代码实现 3.1 主页 3.2 个人简介 3.3 个人爱好 3.4 个人成绩&#xff…