TensorRT量化第一课:量化的定义及意义

目录

  • 模型量化原理
    • 前言
    • 1. What、Why and How
      • 1.1 What
      • 1.2 Why
      • 1.3 How
    • 2. 拓展-export参数详解
    • 3.总结
    • 参考

模型量化原理

前言

手写AI推出的全新TensorRT模型量化课程,链接。记录下个人学习笔记,仅供自己参考。

本次课程为第一课,主要讲解量化的定义及意义。

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

在这里插入图片描述

1. What、Why and How

问题:什么是模型量化?为什么需要量化?如何去量化?

1.1 What

什么是模型量化?

定义:量化(Quantization)是指将高精度浮点数(如float32)表示为低精度整数(如int8)的过程,从而提高神经网络的效率和性能

常见的模型量化技术包括权重量化激活量化(from chatGPT)

  • 权重量化是将浮点参数转换为整型参数,常用的量化方法包括对称量化和非对称量化
    • 对称量化是将权重范围均匀地分配在正负两个方向,将浮点数映射到一个整数范围中。
    • 非对称量化则将权重范围分配在一个方向,即只使用非负整数表示
  • 激活量化是将输入和输出数据转换为低比特宽度地数据类型,同样可以采用对称量化和非对称量化两种方法

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

我们平时训练出的模型如YOLOv5、ResNet50正常导出默认都是FP32的精度,现在我们来看下ResNet50导出的ONNX模型的输入、权重、偏置以及输出的数据类型,ResNet50导出至ONNX的代码如下:

import torch
import torchvision.models as modelsmodel = models.resnet50(pretrained=True)input = torch.randn(1, 3, 224, 224)
torch.onnx.export(model, input, "resnet50.onnx")

运行后可在当前文件夹下生成resnet50.onnx模型,可以Netron可视化工具查看,如下图所示,可以看到其输入、输出、权重以及偏置的类型均为float32。

在这里插入图片描述

1.2 Why

为什么要学习模型量化?Copy自神经网络量化教程

我们都知道,训练好的模型模型权重一般来说是FP32即单精度浮点型,在深度学习训练和推理的过程中,最常用的精度就是FP32。如下图所示

在这里插入图片描述

其中FP32是单精度浮点数,采用32位二进制数表示,其中1位为符号位,8位为指数位,23位为尾数位。FP16是半精度浮点数,采用16位二进制数表示,其中1位为符号位,5位为指数位,10位为尾数位。对于浮点数来说,指数位表示该精度可达到的动态范围,而尾数位表示精度INT8是8位整数,采用8位二进制数表示,其中1位为符号位,7位为数值位。

从FP32=>FP16是一种量化(如下图所示),只不过因为FP32=>FP16几乎是无损的(CUDA中使用__float2half直接进行转换),不需要calibrator去校正、更不需要retrain。并且FP16的精度下降对于大部分任务影响不是很大,甚至有些任务会提升。NVIDIA对于FP16有专门的Tensor Cores可以进行矩阵运算,相比于FP32来说吞吐量直接提升一倍,提速效果明显

在这里插入图片描述

实际来说,量化就是将我们训练好的模型,不论是权重、还是计算op,都转换为低精度去计算。实际中我们谈论的量化更多的是INT8量化

意义:在深度学习中,量化有以下优势:

  • 减少内存占用,模型容量变小,如FP32权重变成INT8,大小直接缩小了4倍数

  • 加速计算,实际卷积计算的op是INT8类型,在特定硬件下可以利用INT8的指令集去实现高吞吐,不论是GPU还是INTEL、ARM等平台都有INT8的指令集优化

  • 减少功耗和延迟,有利于嵌入式侧设备的应用

  • 量化是模型部署中的一种重要的优化方法,可以在部分精度损失的前提下,大幅提高神经网络的效率和性能

1.3 How

如何去量化?

即解决方案:先来看两个例子

如何将一个浮点数(5.214)用int的方式进行描述?

  1. 计算线性映射的缩放值Scale
Scale=5.214 / 127 = 0.0410551
  1. 量化操作
5.214 / 0.0412126 ==> Round(127.000056) ==> 127 ==> 01111111
  1. 反量化操作
01111111 ==> 127 X 0.0410551 ==> 5.213997

上述例子描述了量化的两个重要过程:一个是量化(Quantize),另一个是反量化(Dequantize)

  • 量化就是将浮点数量化为整型数(FP32=>INT8)
  • 反量化就是将整型数转换为浮点数(INT8=>FP32)

如何将一个浮点数组[-0.61,-0.52,1.62]用int的方式进行描述?

当然你可以存储多个Scale值,然后按照上面的方式进行量化和反量化操作,但是这样一来存储空间增加,计算资源浪费,能不能用一个Scale搞定呢?

  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]
  1. 反量化
[-0.609763,-0.5139431,1.1062843]

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

如何解决这个问题:1、最大绝对值对称法 2、偏移

2. 拓展-export参数详解

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

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

3.总结

本次课程主要了解了量化的一些基础知识,期待后续课程😏

参考

  • 神经网络量化教程

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

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

相关文章

TensorRT量化第三课:动态范围的常用计算方法

目录 模型量化原理注意事项一、2023/4/11更新二、2023/4/13更新三、2023/4/16更新四、2023/4/24更新前言1.前情回顾2.动态范围的常用计算方法3.Histogram3.1 定义3.2 histogram实现3.3 思考3.4 拓展 4.Entropy4.1 定义4.2 示例代码4.3 流程实现4.4 思考4.5 实际应用4.6 TRT Ent…

当下流行的ChatGPT与百度的文心一言谁才是AI的霸主

ChatGPT和百度的文心一言是两种不同的自然语言处理(NLP)AI技术,它们具有相似的功能和特点,但有着很大的差异和各自的优势。ChatGPT是OpenAI团队开发的基于Transformer框架的大规模语言模型,是从大量自然语言数据中训练…

游戏本地化项目简介

节选自《翻译与本地化项目管理》,:凯瑞J.邓恩、埃琳娜S.邓恩 一个典型而完整的多平台游戏本地化项目涉及了文本的翻译、翻译与本地化项目管理音频的修改或再创作、完成本地化之后游戏内容的整合、质量保证、交付厂家和项目行政管理。 翻译是游戏本地化的中心任务。游…

游戏开发与本地化

游戏由内容和技术组成,技术将内容呈现给玩家,并控制游戏的顺序。内容由图形设计师、音频设计师、动画师以及游戏等级设计师创造,可能以游戏等级、角色、动画和影片等形式体现。技术就是游戏运行时计算机(或主机和其他设备)所读取的可执行代码…

国内头部游戏本地化服务商 安睿杰本地化翻译

安睿杰翻译深耕多年,具有丰富的游戏出海项目经验,凭借50语种、1000资深游戏母语译者的资源优势,已为500家游戏厂商提供千余款成功作品。 自2020年至今,ARJ为国内某头部手游厂商的一款热销手游提供了游戏本地化服务。 这是一款以…

Revit教程免费下载——Revit建筑施工图高级视频课程

Revit建筑施工图高级教程,包含施工图教程、多专业协同、案例文件三个分类。 【下载地址】 链接:https://pan.baidu.com/s/18KSIgfABHG8rNNd9sDHtDg 提取码:jwu8 【资源大小】14.14GB 【资源截图】 【目录】 一、施工图教程 0前言.mp4 …

建筑施工图纸

一、如何看懂施工图纸 在一个建筑工程项目中,看懂施工图纸是决定建筑工程项目施工成败的关键因素。 我们经常会看到老师傅手中拿着图纸,认真的观察。他们在查看施工图纸,很多新手不会看图纸,下面就来教你如何看懂。 二、学会使…

Revit软件中参照线在制作墙体上的使用及快速CAD图纸墙转化

Revit软件中参照线在制作墙体上的使用及快速CAD图纸墙转化 Revit中参考线(参照线)在墙上的妙用,如果你想做这样的墙,你会怎么想? 墙的顶部是倾斜的。对于这形状的墙,不可能通过传统墙的编辑轮廓来完成,因为我们知道编辑轮廓是墙的…

学习如何在AutoCad土木工程中绘制建筑设计图

学习如何在AutoCad中绘制建筑设计图从平面图到AutoCad土木工程中的整栋建筑 你会学到: 如何绘制房屋地图 如何绘制建筑设计 如何从AutoCad打印或出图 AutoCaD使用 AutoCaD命令使用 如何在2D Autocad中构建家庭或房屋地图(完整教程视频包括家庭地图、窗户、门、室内家具或物品、…

建筑设计中,如何快速获得场地的等高线图?

等高线指的是地形图上高程相等的相邻各点所连成的闭合曲线。把地面上海拔高度相同的点连成的闭合曲线,并垂直投影到一个水平面上,并按比例缩绘在图纸上,就得到等高线。(来自百度百科的定义) 图新地球软件,…

YOLOv7改进Transformer主干系列:最新结合BoTNet Transformer结构,一种简单却功能强大的backbone,自注意力提高模型性能

💡统一使用 YOLOv7 代码框架,结合不同模块来构建不同的YOLO目标检测模型。🌟本项目包含大量的改进方式,降低改进难度,改进点包含【Backbone特征主干】、【Neck特征融合】、【Head检测头】、【注意力机制】、【IoU损失函数】、【NMS】、【Loss…

yolov8模型训练结果分析以及如何评估yolov8模型训练的效果

运行结果目录 一、 confusion_matrix_normalized.png和confusion_matrix.png 混淆矩阵是对分类问题预测结果的总结。使用计数值汇总正确和不正确预测的数量,并按每个类进行细分,显示了分类模型进行预测时会对哪一部分产生混淆。通过这个矩阵可以方便地看…

安卓面试题 Android interview questions

安卓面试题 Android interview questions 作者:韩梦飞沙 ‎2017‎年‎7‎月‎3‎日,‏‎14:52:44 1. 要做一个尽可能流畅的ListView,你平时在工作中如何进行优化的? ①Item布局,层级越少越好,使用hie…

求职与面试(一):Android必备

2019年的冬天有点冷,一份基础面试题送给还在奋斗在Android领域的同学. Android基础问题 Activity&View系列 简述Android的布局分类? 早期Android官方提供以下五种布局: LinearLayoutRelativeLayoutFrameLayoutGridLayoutTableLayout 以上传统的布局,以LinearLayout和…

在Android面试前背八股和学面试技巧真的有用吗?

前言: 今年秋招以来,我集中面试了一些公司,想着至少能过一家吧,但后面发现面试安排十分紧凑,有种顾此失彼的感觉。 我刚开始的时候对Android面试的具体情况全然不知,也没有人告诉我应该注意些什么&#…

如何在Android面试中脱颖而出,高频Android面试题解析,帮你快速拿到Offer

Android面试就“小技巧” 了解自己的技能水平:在面试前,确保你对所面试的职位的技能要求有足够的了解,并检查自己的技能水平是否符合这些要求。熟悉面试流程:了解面试过程中可能会遇到的问题,并为每个问题准备好回答。…

Android面试攻略

文章背景 好记性不如烂笔头 Android层面 一、Android基础 1、四大组件的意义及使用,生命周期回调及意义 2、AsyncTask、Handler的使用 3、Android系统层次框架结构 4、AsyncTask的实现方式 5、AsyncTask使用的时候应该注意什么 6、Android常见的存储方式 7、Loop…

面试汇总:这是一份全面详细的Android面试指南

核心面试内容 对于Android技术专业面试,主要考察的内容包括:(已按优先级排序) 通用编程基础计算机基础特定编程语言智力题 需要特别注意的是: 编程基础、计算机基础是 所有技术开发都必备的基础知识,务必…

澜舟科技成立两周年|“孟子GPT”大模型开启邀测

2023年6月10日,澜舟科技迎来了成立两周年的纪念日。回首过去的两年,无惧诸多挑战和困难,我们始终坚持信念和目标,并取得了一系列瞩目的成绩。在此,我们要特别感谢一直支持和信赖我们的投资方们:创新工场、联…

GPT-4 开启 “软件工程3.0” 全新时代

文章最早发表于我自己个人公众号 软件质量报道 希望这篇文章 成为 “软件工程3.0” 开创性的宣言。 为了定义 “软件工程3.0”,让我们先定义 “软件工程1.0”、 “软件工程2.0” 。先简单说明一下,用软件版本号的方式 “1.0、2.0、3.0” 来分别定义第一代…