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

news2024/11/14 22:42:52

目录

    • 前言
    • 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.coloradmin.cn/o/1924035.html

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

相关文章

【刷题汇总 -- 删除公共字符、两个链表的第一个公共结点、mari和shiny】

C日常刷题积累 今日刷题汇总 - day0121、删除公共字符1.1、题目1.2、思路1.3、程序实现 -- 蛮力法1.4、程序实现 -- 哈希 2、两个链表的第一个公共结点2.1、题目2.2、思路2.3、程序实现 -- 对齐比对法2.4、程序实现 -- 公共端点路程法 3、mari和shiny3.1、题目3.2、思路3.3、程…

Unity如何查找两个transform最近的公共parent

查找两个子对象最近的父对象 一、问题背景二、解决方案思路核心算法代码 三、总结 一、问题背景 最近看到个关于Unity的问题:在Hierarchy面板中的游戏对象,给定两个子物体transform对象,如何查找这两个transform最近的公共父级parent。感觉挺…

Java中常用线程安全的集合

文章目录 常用线程安全的集合CopyWriteArrayListCopyOnWriteArraySetHashTableConcurrentHashMapJDK1.7JDK1.8 常用线程安全的集合 在多线程环境中,数据的一致性和线程的安全性是至关重要的。传统的集合类,如ArrayList、HashMap和HashSet,在…

手撕Vue中的RouterLink和RouterView,深入理解其底层原理(一)

RouterLink和RouterView的作用 我们可以通过RouterLink绑定好指向的路径 点击就能够实现在RouterView中将页面显示出来 我们首先使用官方的vue-router展示一下效果 App.vue <template><div><router-link to"/">Home</router-link><ro…

Real User ID 和 Effective User ID 的区别

在 Unix 和 Linux 系统中&#xff0c;每个进程都有多个用户标识符&#xff08;UID&#xff09;&#xff0c;其中最重要的是“真实用户 ID”&#xff08;real UID&#xff09;和“有效用户 ID”&#xff08;effective UID&#xff09;。 它们的区别和用途如下&#xff1a; 真实…

STM32入门开发操作记录(一)——新建工程

目录 一、课程准备1. 课程资料2. 配件清单3. 根目录 二、环境搭建三、新建工程1. 载入器件支持包2. 添加模块3. ST配置4. 外观设置5. 主函数文件 一、课程准备 1. 课程资料 本记录操作流程参考自b站视频BV1th411z7snSTM32入门教程-2023版 细致讲解 中文字幕&#xff0c;课程资…

五. TensorRT API的基本使用-MNIST-model-build-infer

目录 前言0. 简述1. 案例运行2. 代码分析2.1 main函数2.2 build接口2.3 infer接口2.4 其他 总结参考 前言 自动驾驶之心推出的 《CUDA与TensorRT部署实战课程》&#xff0c;链接。记录下个人学习笔记&#xff0c;仅供自己参考 本次课程我们来学习课程第五章—TensorRT API 的基…

7.13实训日志

上午 学习网络安全的过程中&#xff0c;我们深入了解了网络的不同层面和技术&#xff0c;从表层网络到深网再到暗网&#xff0c;以及涉及的产业分类和技术工具。这些知识不仅帮助我们理解网络的复杂性&#xff0c;还揭示了如何应对和防范各种网络威胁。 首先&#xff0c;我们…

滞后序列分析案例详解

一个半小时 超出30分钟 日期&#xff1a;2024-07-13 19:14:33 回放 摘要 Python在行为分析中的应用 主要讲述了如何使用Python处理序列数据&#xff0c;以及如何结合定性分析和定量分析来全面分析课程内容。讲者提到了一种叫做分层法的分类方法&#xff0c;该方法使用了布鲁…

记录vite项目中Cornerstone的兼容问题(持续更新)

&#x1f50e; 在vite项目中打包提示错误 ESM integration proposal for Wasm" is not supported currently. ⛳️ 问题描述 Error: Could not load /home/xxx/xxx/node_modules/icr/polyseg-wasm/dist/ICRPolySeg.wasm (imported by node_modules/icr/polyseg-wasm/di…

【软件建模与设计】-02-UML图

目录 摘要 1、用例图&#xff08;use case diagram&#xff09; 2、类与对象 3、类图 3.1、四种关系 3.2、可见性 4、交互图 4.1、通信图 4.2、顺序图 5、状态机图 6、包图 7、并发通信图 8、部署图 9、UML扩展机制 9.1、构造型 9.2、标记值 9.3、约束 摘要 用…

log4j2的日志框架(详细,springboot和异步日志的实现)

目录 log4j2的介绍 Log4j2的性能 SpringBoot中的使用Log4j2 log4j2的进阶--异步日志 AsyncAppender方式 AsyncLogger方式 log4j2的介绍 Apache Log4j 2是对Log4j的升级版&#xff0c;参考了logback的一些优秀的设计&#xff0c;并且修复了一些问题&#xff0c;因此带 来…

韦东山嵌入式linux系列-驱动进化之路:总线设备驱动模型

1 驱动编写的 3 种方法 以 LED 驱动为例 1.1 传统写法 使用哪个引脚&#xff0c;怎么操作引脚&#xff0c;都写死在代码中。 最简单&#xff0c;不考虑扩展性&#xff0c;可以快速实现功能。 修改引脚时&#xff0c;需要重新编译。 应用程序调用open等函数最简单的方法是驱动…

ISO 45001:提升职业健康与安全管理水平的关键

在现代企业管理中&#xff0c;员工的职业健康与安全&#xff08;OH&S&#xff09;已经成为不可忽视的重要议题。ISO 45001作为国际标准化组织&#xff08;ISO&#xff09;制定的职业健康与安全管理体系标准&#xff0c;为企业提供了科学有效的管理规范和指南。实施这一标准…

C#中的反射

dll和exe文件的区别 用途&#xff1a; .exe&#xff08;可执行文件&#xff09;&#xff1a;是可以直接运行的程序文件。当你双击一个 .exe 文件或在命令行中输入它的名字&#xff0c;操作系统会加载并执行这个程序。 .dll&#xff08;动态链接库&#xff09;&#xff1a;包含…

如何在SpringCloud中使用Kafka Streams实现实时数据处理

使用Kafka Streams在Spring Cloud中实现实时数据处理可以帮助我们构建可扩展、高性能的实时数据处理应用。Kafka Streams是一个基于Kafka的流处理库&#xff0c;它可以用来处理流式数据&#xff0c;进行流式计算和转换操作。 下面将介绍如何在Spring Cloud中使用Kafka Streams实…

从零开学C++:类和对象(中)

引言&#xff1a;在我们学习了类和对象&#xff08;上&#xff09;的基础知识后&#xff0c;我们就需要进入类和对象&#xff08;中&#xff09;的学习。本篇博客将会介绍C的几个默认成员函数&#xff0c;它们的存在虽然难以理解&#xff0c;但也是C如此简单实用的原因之一。相…

C++学习指南(一)——C++入门基础

欢迎来到繁星的CSDN&#xff0c;本期内容主要包括C第一个程序&#xff0c;命名空间&#xff0c;缺省参数&#xff0c;函数重载&#xff0c;引用、inline以及nullptr这些基础概念。 在进入正题之前&#xff0c;我需要先阐述一下。本系列涉及的内容为C部分&#xff0c;可以理解为…

The Open Group 爱丁堡大会高光集锦——企业架构、人工智能和可持续发展的创新交叉点

4月底&#xff0c;The Open Group峰会在英国爱丁堡顺利举办。活动邀请到数十位领域专家、技术、论坛成员、工作组和联合组织等相聚在一起&#xff0c;围绕生态系统架构和人工智能标准、可持续性、企业架构、数字转型等话题进行了对话与探讨。大会吸引了来自30个国家的400位观众…

bi项目笔记

1.bi是什么 bi项目就是商业智能系统&#xff0c;也就是数据可视画、报表可视化系统&#xff0c;如下图的就是bi项目了 2.技术栈