四. 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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

东软医疗 踩在中国医疗科技跃迁的风口上

恐怕没有哪一家本土医疗装备企业能像东软医疗一样,每一段成长的升维都发生在中国医疗科技跃迁史最重要的节点上。 在工业制造领域,医疗装备产业由于涉及数十个学科领域,其技术复合程度毫不逊于今天公众所熟知的EUV光刻机,是一门技…

【系统架构设计】操作系统(一)

操作系统(一) 操作系统的类型和结构操作系统基本原理进程管理进程三态模型挂起状态进程互斥 / 进程同步前趋图进程调度死锁 存储管理设备管理文件管理作业管理 操作系统原理的关键在于“一个观点、两条线索”:一个观点是以资源管理的观点来定…

MySQL-ubuntu环境下安装配置mysql

文章目录 什么是数据库?一、ubuntu环境下安装mysql二、配置mysql配置文件1.先登上root账号2.配置文件的修改show engines \G; mysql和mysqld数据库的基础操作登录mysql创建数据库显示当前数据库使用数据库创建表插入students表数据打印students表数据select * from …

Python应用爬虫下载QQ音乐歌曲!

目录: 1.简介怎样实现下载QQ音乐的过程; 2.代码 1.下载QQ音乐的过程 首先我们先来到QQ音乐的官网: https://y.qq.com/,在搜索栏上输入一首歌曲的名称; 如我在上输入最美的期待,按回车来到这个画面 我们首…

在家上网IP地址是固定的吗?

在数字化时代,互联网已成为我们日常生活中不可或缺的一部分。无论是工作、学习还是娱乐,我们都离不开网络的支持。然而,当我们在家中接入互联网时,可能会产生这样一个疑问:在家上网IP地址是固定的吗?下面一…

[python]基于yolov10+gradio目标检测演示系统设计

【设计介绍】 YOLOv10结合Gradio实现目标检测系统设计是一个结合了最新目标检测技术和快速部署框架的项目。下面将详细介绍这一系统的设计和实现过程。 一、YOLOv10介绍 YOLOv10是YOLO(You Only Look Once)系列的最新版本,由清华大学的研究…

2024年上半年信息系统项目管理师——综合知识真题题目及答案(第1批次)(3)

2024年上半年信息系统项目管理师 ——综合知识真题题目及答案(第1批次)(3) 第41题:在应用集成中,有多个组件帮助协调连接各种应用。其中()利用特定的数据结构,帮助开发人…

案例研究|风电载荷测试通信方案

客户介绍 北京鉴衡认证中心有限公司(China General Certification Center,简称“鉴衡”或“CGC”)是国内领先的第三方技术服务机构,专注于标准研制、检测、检验、认证、技术咨询以及行业研究等服务领域。 目前,鉴衡的…

Linux内核编译安装 - Deepin,Debian系

为什么要自己编译内核 优点 定制化:你可以根据自己的硬件和需求配置内核,去掉不必要的模块,优化性能。性能优化:移除不需要的驱动程序和特性,减小内核体积,提高系统性能。最新特性和修复:获取…

单相整流-TI视频课笔记

目录 1、单相半波整流 1.1、单相半波----电容滤波---超轻负载 1.2、单相半波----电容滤波---轻负载 1.3、单相半波----电容滤波---重负载 2、全波整流 2.1、全波整流的仿真 2.2、半波与全波滤波的对比 3、全桥整流电路 3.1、全波和全桥整流对比 3.2、半波全波和全桥…

数学建模入门

目录 文章目录 前言 一、数学建模是什么? 1、官方概念: 2、具体过程 3、适合哪一类人参加? 4、需要有哪些学科基础呢? 二、怎样准备数学建模(必备‘硬件’) 1.组队 2.资料搜索 3.常用算法总结 4.论文撰写的…

jenkins系列-06.harbor

https://github.com/goharbor/harbor/releases?page2 https://github.com/goharbor/harbor/releases/download/v2.3.4/harbor-offline-installer-v2.3.4.tgz harbor官网:https://goharbor.io/ 点击 Download now 链接,会自动跳转到上述github页面&am…

底软驱动 | Linux字符设备驱动开发基础

文章目录 知识整理--Linux字符设备驱动开发基础字符设备基础1从一个最简单的模块源码说起字符设备驱动工作原理字符设备驱动代码实践--给空模块添加驱动壳子应用程序如何调用驱动 字符设备基础2添加读写接口(应用和驱动之间的数据交换)驱动中如何操控硬件…

基于微信小程序的音乐播放平台

基于微信小程序的音乐播放平台 音乐播放小程序项目简介技术栈功能模块项目流程系统E-R图项目页面 音乐播放小程序 项目简介 微信音乐小程序旨在提供一个简洁高效的音乐播放平台,用户可以方便地搜索、播放和收藏自己喜欢的音乐。整个项目采用前后端分离的架构&…

基于XC7VX690T FPGA+ZU15EG SOC的6U VPX总线实时信号处理平台(支持4路光纤)

6U VPX架构,符合VITA46规范板载高性能FPGA处理器:XC7VX690T-2FFG1927I板载1片高性能MPSOC:XCZU15EG-2FFVB1156I板载1片MCU,进行健康管理、时钟配置等V7 FPGA外挂2个FMC接口两片FPGA之间通过高速GTH进行互联 基于6U VPX总线架构的通…

模型剪枝中的预训练权重真的有用么?重新思考模型剪枝的价值二

在https://hpg123.blog.csdn.net/article/details/137705869中,根据论文提供的数据初步整理出了模型剪枝的信息,但不够精练,故而在此深入分析。 主要解决以下问题: 1、模型剪枝真的有用么? 2、什么样的方案模型剪枝效果…

Java中常用线程安全的集合

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

Wikijs 部署教程

以下是一个 Wikijs 部署的简单教程,涵盖了使用 Docker 和直接安装两种方式: 方法一: 使用 Docker (推荐) Docker 是一个方便快捷的方式来部署 Wikijs,它可以避免许多手动配置步骤。 安装 Docker: 按照 https://docs.docker.com/…

使用Gitee仓库镜像管理功能实现Gitee与Github 双向同步

进入你所需要同步的仓库,点击「管理」->「镜像仓库管理」,点击「添加镜像」选项; 如果你的Gitee账号还没有绑定过 GitHub 帐号,先根据弹窗的提示绑定 GitHub 帐号; 添加镜像时候,在「镜像方向」中选择…

拥抱UniHttp,规范Http接口对接之旅

前言 如果你项目里还在用传统的编程式Http客户端比如HttpClient、Okhttp去直接对接第三方Http接口, 那么你项目一定充斥着大量的对接逻辑和代码, 并且针对不同的对接渠道方需要每次封装一次调用的简化, 一旦封装不好系统将会变得难以维护&am…