1. TensorRT量化的定义及意义

news2025/1/12 1:04:49

前言

手写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.coloradmin.cn/o/602084.html

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

相关文章

jmeter性能测试步骤实战教程

1. Jmeter是什么? 2. Jmeter安装 2.1 JDK安装 由于Jmeter是基于java开发,首先需要下载安装JDK (目前JMeter只支持到Java 8,尚不支持 Java 9) 1. 官网下载地址: http://www.oracle.com/technetwork/java/…

Map、Set和哈希表的应用练习(数据结构系列15)

目录 前言: 练习题: 结束语: 前言: 在上一节博客中小编给大家介绍了Map、Set和哈希表的一些简单的知识点,同时也给大家简单的演示了一下如何使用他们里面的一些基础方法,那么接下来让小编带着你们一起来…

当心!经济学家分析:未来三年内做好随时失业的准备

AI人工智能又来抢饭碗了,这次竟然通过了公认难考的会计行业考试! 近期,OpenAI的大语言模型最新版GPT-4已经完成美国注册会计师(简称CPA)考试,四大主要会计考试所有科目的平均得分为85.1。 而在CPA考试中&…

落地页设计的营销心理学(三)

本文是「落地页设计的营销心理学」这个主题系列文章的收官篇,要给大家分享关于用户行动号召、提高用户参与度和整个营销落地页结构的设计。 回顾系列文章: 《落地页设计的营销心理学(一)》 《落地页设计的营销心理学&#xff08…

C++进阶 —— 线程库(C++11新特性)

十,线程库 thread类的简单介绍 在C11之前涉及多线程问题,都是和平台相关的,如windows和Linux下各有自己的接口,这使代码的可移植性较差;C11中最重要的特性就是对线程进行支持,使得C在并行编程时不需要依赖…

【社区图书馆】《写作脑科学》

文章目录 前言语言和思维写作技巧创造性思维总结 前言 杨滢著的《写作脑科学》是一本关于写作的科学读物,它深入探讨了人类大脑是如何进行创造性思维和表达的。这本书让我对写作有了全新的认识,也为我提供了一些实用的技巧和策略来提高自己的写作能力。…

整理 钢琴教材 约翰·汤普森现代钢琴教程(大汤)

邮箱不能及时回复,现放到网盘里了,文末按需自取 约翰-汤普森钢琴教程1 文件名:(大汤1)约翰汤普森现代钢琴教程 1 超清PDF 文件大小:9.9 MB 下载地址:https://download.csdn.net/download/qq_36040764/85051148 约翰-汤普森钢琴教程2 文件名:(大汤2)约翰汤普森现…

Python3中goto的用法

Python3代码指定跳转可以使用goto这个库: 安装: pip install goto-statement 一般安装的版本是1.2 需要做以下修改才能正常使用: python 使用goto,遇到的问题解决_奶嘴偷走初吻的博客-CSDN博客python goto 出现报错:Attribut…

Python difflib的使用

今天做了一个从list的内容取出一个与指定内容尽可能相似的内容,做完之后抽个几分钟记录下 difflib的作用 比对2个文件的差异. 使用的时候直接 import difflib 即可 get_close_matches 作用 匹配最大相似的内容返回结果 list1 ["abc", "acd", "…

NIO编程

目录 1、什么是NIO编程? 为什么说Java NIO是非阻塞的? 2、Java NIO 通道(Channel)详解 如何获取Channel对象? 3、Java NIO 缓冲区(Buffer)详解 (1)获取缓冲区对象 (2)将数据写入Buffer以…

没学过编程,本科学历,Java学到什么程度才能找工作?

好程序员之前写过多篇Java找工作方面的文章,今天说说零Java基础找工作的事情。首先请大家明确如下的要点。 1、在没有真实Java工作项目经验的前提下,靠自学,哪怕到培训班学,一定是无法真正掌握到能干Java项目的地步,原…

SpringData 基础篇

Spring Data 故事背景一:基础概念1.1 什么是SpringData1.2 为什么要用SpringData 二:JPA与Hibernate、MyBatis关系2.1 JPA与JDBC2.1.1 特点2.1.2 JPA规范提供2.1.3 JDBC的不足 2.2 Hibernate与JPA2.2.1 关系 2.3 mybatis 和Hibernate 三:Hibe…

裁剪与复原

目录 模型假设 模型建立 模型求解 通过建立匹配模型实现对破碎文件的拼接复原。 模型假设 模型建立 首先对每个图片按像素值进行二值化量化,可以得到19个1980*72的矩阵,再提取每个举证最左和最右的像素值采用绝对距离法建立像素匹配模型。 二值化是图…

大数据时代——生活、工作与思维的重大变革

最近读了维克托迈尔 – 舍恩伯格的《大数据时代》,觉得有不少收获,让我这个大数据的小白第一次理解了大数据。 作者是大数据的元老级先驱。 放一张帅照,膜拜下。 不过这本书我本人不推荐从头读一遍,因为书中的核心理念并不是特…

Django实现接口自动化平台(二)认证授权登录【持续更新中】

上一章: Django实现接口自动化平台(一)日志功能【持续更新中】_做测试的喵酱的博客-CSDN博客 下一章: Django实现接口自动化平台(三)实现注册功能【持续更新中】_做测试的喵酱的博客-CSDN博客 一、认证与…

FineBI6.0基础学习第二课 集团毛利率下滑的原因

【案例背景】 在本期分析案例中,您将扮演一个大型商品零售集团的数据分析师,应对经理交给你的任务——发现集团毛利率下滑的原因,并给出建议; 随着您一步一步的探索分析,您将通过对商品和订单的相关历史数据的分析,逐步找出影响毛利率的关键要素,并给出相应的分析结论,…

静态误差分析

分类 随机误差、系统误差、粗大误差。 随机误差: 大部分随机误差满足正态分布,具有对称性、单峰性、有界性、抵偿性。 对称性:绝对值相等的正负误差出现的次数相等。 单峰性:绝对值越小的误差出现次数越多。 有界性&#xff1…

GIS在地质灾害危险性评估与灾后重建中的实践

第一章 基本概念与平台介绍 1、基本概念 地质灾害类型 地质灾害发育特征与分布规律 地质灾害危害特征 地质灾害孕灾地质条件分析 地质灾害诱发因素与形成机理 ​ 2、GIS原理与ArcGIS平台介绍 GIS简介 ArcGIS基础 空间数据采集与组织 空间参考 空间数据的转换与处理 …

ReID专栏(三) 注意力的应用

前言 本文中提出了一种用于行人重识别的注意感知特征学习方法。该方法由一个部分注意分支(PAB)和一个整体注意分支(HAB)组成,并与基础再识别特征提取器进行了联合优化。由于这两个分支建立在主干网络上,因此…

NumPy 数值计算基础

NumPy 数值计算基础 Numpy简介Numpy创建数组对象第一种:利用array函数创建ndarray数组第二种:利用arange函数:创建等差一维数组第三种:利用linspace函数:创建等差一维数组,接收元素数量作为参数。第三种:利用linspace函数:创建等差━维数组,接收元素数量…