A White Paper on Neural Network Deployment
  • ❤️‍🔥A White Paper on Neural Network Deployment
    • ❤️‍🔥A White Paper on Neural Network Deployment
    • 🤠CUDA
      • 🤑CPU|GPU程序执行流程
      • 🤗QiuckLearnFromPicture
      • 🤒GPU编程模型
      • 🫣线程束和线程束分化|Warp
      • 🤭Reduction|并行规约
      • 🤔全局内存(Global Memory)访问模式
      • 🫢Share Memory|共享内存|Bank Conflicts
      • 😷CUDA流和事件
      • 🫡Nsight system和Nsight compute
      • 🤫Grid-Stride Loops
    • 😄ONNX
      • 😉ONNX中的各类Proto
      • 🤔onnx->torch
      • 🥳0x00自定义算子
      • 😕0x01自定义算子
      • 🥴ONNX 模型的修改与调试
      • 😆ONNX中的一些概念
      • 😍用python操作ONNX
      • 🥹ONNX中的广播机制
      • 🤣外部数据
      • 🥰ONNX Model hub
      • 😘ONNX IR(Intermediate Representation)
      • 🥳ONNX后端
      • 🥸概述
    • 🐶TensorRT
      • 🐱TensorRT快速入门指南
      • 🐭文档简介
      • 🐹TensorRT的功能
      • 🐰TensorRT的C++接口解析
      • 🦊TensorRT的Python接口解析
      • 🐻TensorRT如何工作
      • 🐼trtexec的使用
      • 🐻‍❄️实战:解析onnx模型保存为engine文件|from scratch
      • 🐨实战:加载engine文件并执行推理|from scratch
      • 🐯手撕TensoRT源码|0x00
    • 🫶模型量化和剪枝
      • 🖕IEEE754标准
      • 🫰浮点运算产生的误差
      • 🤲映射和偏移
      • 🫴quantization from scratch|python
      • 👏动态量化范围
      • 🤝量化粒度
      • 👍校准
      • 👊Post-Training Quantization
      • ✊Quantization-Aware Training
      • 🤞pytorch-quantization使用文档
      • ✌️Polygraphy-Cheatsheet
    • 🤺杂文不杂
      • 😾Roofline_model
      • 🤖模型部署的几大误区
      • 😽手算Ampere架构各个精度的Throughout
      • 😻Tensor Core VS CUDA Core
      • 😺PNNX计算图结构剖析
      • 🎃融合BN和Conv层
      • 👾深度神经网络编译器原理简介
      • 👽在WSL2上安装CUDA_cuDNN_TensorRT
    • 🍀CPP
      • 🪵lamda表达式|C++11
      • 🌴智能指针|C++11
      • 🌲右值引用|移动语义|完美转发|C++11
      • 🫑emplace_back 减少内存拷贝和移动|C++11
      • 🥬多线程|互斥锁|条件变量|C++11
      • 🥒异步操作|C++11
      • 🍆原子变量|CAS操作|内存顺序|C++11
      • 🍏对象生存期和资源管理|RAII设计思想
      • 🍎Pimpl设计模式|编译防火墙
      • 🌶️std::variant|C++17
      • 🫛std::any|C++17
    • 🩷部署实战
      • ❤️yolov8Multitask
      • 💚yolov5
      • 🧡pointpillars
      • 💛centerpoint
      • 🩵deepstream
      • 💜BEVfusion
      • 💙BEVLane
      • 🖤Occupancy
    • ☯️重点参考书籍
Powered by GitBook
On this page

Was this helpful?

Edit on GitHub
  1. A White Paper on Neural Network Deployment
  2. 模型量化和剪枝

IEEE754标准

source from https://www.hello-algo.com/🚀

Previous模型量化和剪枝Next浮点运算产生的误差

Last updated 1 year ago

Was this helpful?

浮点数编码

记一个 32 比特长度的二进制数为:

b31b30b29…b2b1b0b_{31} b_{30} b_{29} \ldots b_2 b_1 b_0b31​b30​b29​…b2​b1​b0​

根据 IEEE 754 标准,32-bit 长度的 float 由以下三个部分构成。

  • 符号位 S\mathrm{S}S :占 1 位 ,对应 b31b_{31}b31​。

  • 指数位 E\mathrm{E}E :占 8 位 ,对应 b30b29…b23b_{30} b_{29} \ldots b_{23}b30​b29​…b23​。

  • 分数位 N\mathrm{N}N :占 23 位 ,对应 b22b21…b0b_{22} b_{21} \ldots b_0b22​b21​…b0​。

二进制数 float 对应值的计算方法为:

val=(−1)b31×2(b30b29…b23)2−127×(1.b22b21…b0)2\text {val} = (-1)^{b_{31}} \times 2^{\left(b_{30} b_{29} \ldots b_{23}\right)_2-127} \times\left(1 . b_{22} b_{21} \ldots b_0\right)_2val=(−1)b31​×2(b30​b29​…b23​)2​−127×(1.b22​b21​…b0​)2​

转化到十进制下的计算公式为:

val=(−1)S×2E−127×(1+N)\text {val}=(-1)^{\mathrm{S}} \times 2^{\mathrm{E} -127} \times (1 + \mathrm{N})val=(−1)S×2E−127×(1+N)

其中各项的取值范围为:

尽管浮点数 float 扩展了取值范围,但其副作用是牺牲了精度。整数类型 int 将全部 32 比特用于表示数字,数字是均匀分布的;而由于指数位的存在,浮点数 float 的数值越大,相邻两个数字之间的差值就会趋向越大。

指数位 E
分数位 N = 0
分数位 N != 0
计算公式

次正规数

正规数

正规数

S∈{0,1},E∈{1,2,…,254}(1+N)=(1+∑i=123b23−i2−i)⊂[1,2−2−23]\begin{aligned} \mathrm{S} \in & \{ 0, 1\}, \quad \mathrm{E} \in \{ 1, 2, \dots, 254 \} \newline (1 + \mathrm{N}) = & (1 + \sum_{i=1}^{23} b_{23-i} 2^{-i}) \subset [1, 2 - 2^{-23}] \end{aligned}S∈(1+N)=​{0,1},E∈{1,2,…,254}(1+i=1∑23​b23−i​2−i)⊂[1,2−2−23]​

观察上图,给定一个示例数据 S=0\mathrm{S} = 0S=0 , E=124\mathrm{E} = 124E=124 ,N=2−2+2−3=0.375\mathrm{N} = 2^{-2} + 2^{-3} = 0.375N=2−2+2−3=0.375 ,则有:

 val =(−1)0×2124−127×(1+0.375)=0.171875\text { val } = (-1)^0 \times 2^{124 - 127} \times (1 + 0.375) = 0.171875 val =(−1)0×2124−127×(1+0.375)=0.171875

现在我们可以回答最初的问题:float 的表示方式包含指数位,导致其取值范围远大于 int 。根据以上计算,float 可表示的最大正数为 2254−127×(2−2−23)≈3.4×10382^{254 - 127} \times (2 - 2^{-23}) \approx 3.4 \times 10^{38}2254−127×(2−2−23)≈3.4×1038 ,(2e−1−1=1272^{e-1}-1=1272e−1−1=127)切换符号位便可得到最小负数。

如下表所示,指数位 E=0\mathrm{E} = 0E=0 和 E=255\mathrm{E} = 255E=255 具有特殊含义,用于表示零、无穷大、NaN\mathrm{NaN}NaN 等。

值得说明的是,次正规数显著提升了浮点数的精度。最小正正规数为 2−1262^{-126}2−126 ,最小正次正规数为 2−126×2−232^{-126} \times 2^{-23}2−126×2−23。双精度 double 也采用类似于 float 的表示方法,在此不做赘述。

❤️‍🔥
🫶
🖕
000
±0\pm 0±0
(−1)S×2−126×(0.N)(-1)^{\mathrm{S}} \times 2^{-126} \times (0.\mathrm{N})(−1)S×2−126×(0.N)
1,2,…,2541, 2, \dots, 2541,2,…,254
(−1)S×2(E−127)×(1.N)(-1)^{\mathrm{S}} \times 2^{(\mathrm{E} -127)} \times (1.\mathrm{N})(−1)S×2(E−127)×(1.N)
255255255
±∞\pm \infty±∞
NaN\mathrm{NaN}NaN