1. TensorRT量化的定义及意义

前言

手写AI推出的全新TensorRT模型量化课程,链接:TensorRT下的模型量化。

课程大纲如下:

在这里插入图片描述

1. 量化的定义及意义

1.1 什么是量化?

定义

量化(Quantization)是指将高精度浮点数(如float32)表示为低精度整数(如int8)的过程,从而提高神经网络的效率和性能。具体而言,量化就是将我们训练好的模型,不论是权重、还是计算op,都转换为低精度去计算。实际中我们谈论的量化更多的是INT8量化。

常用的量化方法

常用的量化方法包括对称量化和非对称量化:

  • 对称量化是将权重范围均匀地分布在正负两个方向,将浮点数映射到一个正负整数范围中;
  • 非对称量化是指使用不同的比例因子(scale factor)和零点(zero point)对每个通道进行量化。

需要注意的是,模型量化会对模型的精度和准确度产生一定的影响,因为量化后的模型可能无法完全保留原始模型中的所有信息和特征。因此,在进行模型量化时需要进行适当的权衡和优化。

我们平时训练出的模型如YOLOv5正常导出,默认都是FP32的精度。在未量化前,网络模型的权重和偏差参数使用FP32高精度浮点数来表示,而浮点数的计算会占用大量的存储空间和计算资源。

现在我们来看下ResNet18导出的ONNX模型的输入、权重、偏置以及输出的数据类型ResNet18导出至ONNX的代码如下:

import torch
import torchvision.models as models

model = models.resnet18(pretrained = False) # 懒得下载预训练权重,这里只是用于测试一下而已

input = torch.randn(1,3,224,224)

torch.onnx.export(model,input,"resnet18.onnx")

使用netron来查看onnx的模型,在查看网络层中,输入、权重和偏置发现都是FP32的数据类型,如下图显示第一个conv卷积核中,输入和权重的类型:
在这里插入图片描述

1.2 为什么要量化

未量化存在的问题

我们平时训练出的模型如YOLOv5正常导出,默认都是FP32的精度,在深度学习训练和推理的过程中,最常用的精度就是FP32。在未量化前,网络模型的权重和偏差参数使用FP32高精度浮点数来表示,而浮点数的计算会占用大量的存储空间和计算资源。

量化后的优势:

  • 减少内存占用,模型容量变小,如FP32权重变成INT8,大小直接缩小了4倍数;
  • 加速计算,实际卷积计算的op是INT8类型,在特定硬件下可以利用INT8的指令集去实现高吞吐,不论是GPU还是INTEL、ARM等平台都有INT8的指令集优化;
  • 减少功耗和延迟,有利于嵌入式侧设备的应用;
  • 量化是模型部署中的一种重要的优化方法,可以在部分精度损失的前提下,大幅提高神经网络的效率和性能

不同类型的区别:

  • FP32是单精度浮点数,采用32位二进制数表示,其中1位为符号位,8位为指数位,23位为尾数位;
  • FP16是半精度浮点数,采用16位二进制数表示,其中1位为符号位,5位为指数位,10位为尾数位;
  • INT8是8位整数,采用8位二进制数表示,其中1位为符号位,7位为数值位。

对于浮点数来说,指数位表示该精度可达到的动态范围,而尾数位表示精度。
从FP32=>FP16是一种量化,只不过因为FP32=>FP16几乎是无损的(CUDA中使用__float2half直接进行转换),不需要calibrator去校正、更不需要retrain。并且FP16的精度下降对于大部分任务影响不是很大,甚至有些任务会提升。

1.3 如何量化?

案例

如何将一个浮点数组[-0.61,-0.52,1.62]用int的方式进行描述?以对称量化为例

  1. 计算数组中共同的scale
​Scale = (float_max - float_min) / (quant_max - quant_min)
​	  = (1.62-(-0.61)) / (127 - (-128)) = 0.0087109
  1. 量化操作
0.61 / 0.0087109 = -70.0272072

-0.52 / 0.0087109 = -59.6953242	==> [-70,-59,185] 取整

1.62 / 0.0087109 = 185.9738947
  1. 截断操作
[-70,-59,185] ==> [-70,-59,127]
# 因为对称量化的范围在-127到127,185已经超过范围了,所以要进行截断操作
  1. 反量化操作
量化前:[-0.61,-0.52,1.62]
量化后:[-0.609763,-0.5139431,1.1062843]

可以看到截断的数值最后反量化与原数值相差较大(1.62与1.1062843)

2. 展-export参数详解

torch.onnx.export()是将PyTorch模型导出为ONNX格式的函数。其参数如下:

  • model:需要导出为ONNX格式的PyTorch模型
  • args:模型的输入参数,可以是一个tensor或者一个包含多个tensor的元组
  • f:导出的ONNX模型的保存路径或文件对象
  • export_params:是否导出模型参数,默认为True
  • verbose:是否打印导出过程信息,默认为False
  • do_constant_folding:是否进行常量折叠优化,默认为True
  • input_names:模型输入节点的名称,默认为[“input”]
  • output_names:模型输出节点的名称,默认为[“output”]
  • dynamic_axes:动态维度
  • opset_version:导出的ONNX版本号,默认为9
  • keep_initializers_as_inputs:是否将初始化器保存为输入节点,默认为False
  • operator_export_type:导出的算子类型,默认为torch.onnx.OperatorExportTypes.ONNX

参考链接:

  1. 神经网络量化教程
  2. TensorRT量化第一课:量化的定义及意义

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

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

相关文章

如何运用R语言进行Meta分析在【文献计量分析、贝叶斯、机器学习等】多技术的融合

Meta分析是针对某一科研问题,根据明确的搜索策略、选择筛选文献标准、采用严格的评价方法,对来源不同的研究成果进行收集、合并及定量统计分析的方法,最早出现于“循证医学”,现已广泛应用于农林生态,资源环境等方面。…

华为OD机试真题 Java 实现【高矮个子排队】【2023Q2 100分】,附详细解题思路

一、题目描述 现在有一队小朋友,他们高矮不同,我们以正整数数组表示这一队小朋友的身高,如数组{5,3,1,2,3}。 我们现在希望小朋友排队,以“高”“矮”“高”“矮”顺序排列,每一个“高”位置的小朋友要比相邻的位置高…

【配电网重构】基于改进二进制粒子群算法的配电网重构研究(Matlab代码实现

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

批量剪辑视频工具源码开发搭建分享

搭建步骤 1. 首先需要根据自身产品确定视频类型及需要实现的视频效果 2. 根据预期视频效果选择视频上传模式,并将视频素材进行上传 3. 添加音频、字幕,标题等与素材进行组合。 4. 设置投放计划,包括:视频标题、视频话题等 5.…

dom阶段实战内容

window定时器方法 ◼ 目前有两种方式可以实现:  setTimeout 允许我们将函数推迟到一段时间间隔之后再执行。  setInterval 允许我们重复运行一个函数,从一段时间间隔之后开始运行,之后以该时间间隔连续重复运行该函数。 ◼ 并且通常情况…

周赛347(模拟、思维题、动态规划+优化)

文章目录 周赛347[2710. 移除字符串中的尾随零](https://leetcode.cn/problems/remove-trailing-zeros-from-a-string/)模拟 [2711. 对角线上不同值的数量差](https://leetcode.cn/problems/difference-of-number-of-distinct-values-on-diagonals/)模拟 [2712. 使所有字符相等…

什么是分布式事务?

什么是分布式事务? 分布式对应的是单体架构,互联网早起单体架构是非常流行的,好像是一个家族企业,大家在一个家里劳作,单体架构如下图: 但是随着业务的复杂度提高,大家族人手不够,…

如何使用 Python Nornir 实现基于 CLI 的网络自动化?

在现代网络环境中,网络自动化已成为管理和配置网络设备的重要工具。Python Nornir 是一个强大的自动化框架,它提供了一个简单而灵活的方式来执行网络自动化任务。本文将详细介绍如何使用 Python Nornir 实现基于 CLI 的网络自动化。 1. Python Nornir 概…

view的常用属性和方法介绍(arcgis for javascript)

ArcGIS for JavaScript中的视图(view)是一个地图实例类,用于管理地图的显示区域、符号和标注等。通过视图类,可以实现以下功能: 显示地图:将地图显示在Web页面上。 缩放:缩放视图到指定的级别。…

SpringBoot 配置文件和日志文件

目录 一、SpringBoot配置文件 配置文件的格式 .properties配置文件格式 .yml配置文件格式 .properties 与 .yml的区别 配置文件的读取 .properties 与 .yml的区别 设置不同环境的配置⽂件 二、SpringBoot日志文件 日志打印的步骤 得到日志对象 方法一:使…

【网络】- 计算机网络体系结构 - OSI七层模型、TCP/IP四层(五层)协议

目录 一、概述 二、计算机网络体系结构的形成  👉2.1 分层的网络体系结构  👉2.2 OSI 参考模型  👉2.3 TCP/IP - 事实的国际标准 三、OSI 参考模型 四、TCP/IP 协议 一、概述 但凡学习计算机网络知识,肯定绕不过网络协议的&…

SpringMVC拦截器

SpringMVC拦截器 介绍 拦截器(interceptor)的作用 SpringMVC的拦截器类似于Servlet开发中的过滤器Filter,用于对处理器 进行预处理和后处理 将拦截器按一定的顺序连接成一条链,这条链称为拦截器链(Interception Ch…

hive中如何计算字符串中表达式

比如 select 1(2-3)(-4.1-3.1)-(4-3)-(-3.34.3)-1 col ,1(2-3)(-4.1-3.1)-(4-3)-(-3.34.3)-1 result \ 现在的需求式 给你一个字符串如上述col 你要算出result。 前提式 只有和-的运算,而且只有嵌套一次 -(4-3)没有 -(-4(3-(31)))嵌套多次。 第一步我们需要将运…

【学习笔记】Python核心技术与实战-基础篇-03列表和元组,到底用哪个?

目录 列表和元组基础概念区别列表和元组的基础操作和注意事项列表和元组存储方式的差异列表和元组的性能列表和元组的使用场景总结思考题 列表和元组基础 概念 列表和元组,都是一个可以放置任意数据类型的有序集合。 在绝大多数编程语言中,集合的数据类…

js数据类型和六种运算结果为false的情况

数据类型 number:数字(整数、小数、NaN(Not a Number)) string:字符串、单双引皆可 boolean:布尔。true、false null:对象为空 undefined:当声明的变量初始化时,该变量的默认值…

JPEG压缩基本原理

JPEG算法的第一步是将图像分割成8X8的小块。 在计算机中,彩色图像最常见的表示方法是RGB格式,通过R(Red)、G(Green)A和(Blue)组合出各种颜色。 除此以外,还有一种表示彩色图像的方法,称为YUV格式。Y表示亮度,U和V表示…

Spring第三方bean管理

文章目录 1.第三方bean管理1.1 Bean1.2 小结 2.第三方bean依赖注入2.1 简单类型:成员变量2.2 引用类型:方法形参2.3 小结 3.总结 1.第三方bean管理 1.1 Bean 首先看一下目录结构,APP里面就初始化了SpringConfig文件 SpringConifg中就一句话…

C++11中的智能指针unique_ptr、shared_ptr和weak_ptr详解

目录 1、引言 2、什么是智能指针? 3、在Visual Studio中查看智能指针的源码实现 4、独占式指针unique_ptr 4.1、查看unique_ptr的源码实现片段 4.2、为什么unique_ptr的拷贝构造函数和复制函数被delete了?(面试题) 4.3、使…

Java网络开发(Tomcat)—— Servlet学习 Web相关背景知识 JavaWeb项目初步

本文目录 引出〇、域名、IP、端口一、软件架构BS和CS二、实现Web服务的条件和步骤三、Tomcat搭建Web项目初步1.pom.xml文件配置2.web.xml文件更新3.Tomcat运行环境配置4.项目文件层级解析 四、JavaWeb项目文件分类(1)静态文件—存放位置(2&am…

今天面了个字节跳动拿30k出来的测试大佬,让我见识到了什么是天花板

2022年堪称大学生就业最难的一年,应届毕业生人数是1076万。失业率超50%! 但是我观察到一个数据,那就是已经就业的毕业生中,计算机通信等行业最受毕业生欢迎! 计算机IT行业薪资高,平均薪资是文科其他岗位的…