跳到主要内容

量化基础(数据类型与 QLoRA / GPTQ / AWQ)

更完整的推理期量化实践见 llms/05-inference-deployment/03-quantization/。

量化​

E:指数位(整数位), M:尾数位。 采用 两种表达方式:

  • E4M3: 更精准
  • E5M2:表达范围更广 int8 的数值表达范围是均匀的,可是 FP 有更宽的表达范围,更精准的捕获 LLM 中参数的表达分布。 虽然 Int8 和 FP8 都只使用8 位的存储空间,可是FP8使用指数来表示更小、更大的数字,但空间内相邻值之间的间隙更大、更不均匀。

数据类型​

E:指数位(整数位), M:尾数位。 采用 两种表达方式:

  • E4M3: 更精准
  • E5M2:表达范围更广 int8 的数值表达范围是均匀的,可是 FP 有更宽的表达范围,更精准的捕获 LLM 中参数的表达分布。 虽然 Int8 和 FP8 都只使用8 位的存储空间,可是FP8使用指数来表示更小、更大的数字,但空间内相邻值之间的间隙更大、更不均匀。

数据类型

数据类型

NF8​

NF4​

4-bit NormalFloat,一种用于量化的特殊格式,于23年5月由华盛顿大学在QLoRA量化论文中提出,论文地址:https://arxiv.org/abs/2305.14314​

Int8​

数值表达范围:2^8​

FP8​

E:指数位(整数位), M:尾数位。 采用 两种表达方式:

  • E4M3: 更精准
  • E5M2:表达范围更广 int8 的数值表达范围是均匀的,可是 FP 有更宽的表达范围,更精准的捕获 LLM 中参数的表达分布。 虽然 Int8 和 FP8 都只使用8 位的存储空间,可是FP8使用指数来表示更小、更大的数字,但空间内相邻值之间的间隙更大、更不均匀。

原理介绍​

E:指数位(整数位), M:尾数位。 采用 两种表达方式:

  • E4M3: 更精准
  • E5M2:表达范围更广 int8 的数值表达范围是均匀的,可是 FP 有更宽的表达范围,更精准的捕获 LLM 中参数的表达分布。 虽然 Int8 和 FP8 都只使用8 位的存储空间,可是FP8使用指数来表示更小、更大的数字,但空间内相邻值之间的间隙更大、更不均匀。
  • E4M3 的表达范围是:2^18
  • E5M2 的表达范围是:2^32

参考文章​

FP4​

BF16​

Brain Float 16,由Google Brain提出​

量化方法​

QLora​

创新点​

  • 新的数据类型:NF4
  • 双重量化以减少平均内存占用

分页优化起来管理内存峰值​

Paged optimizer​

  • Nvidia 的统一内存特性:当 GPU 内存不足时,可以将部分数据放在 cpu,等需要使用到时可再次将其 load 到GPU RAM 当中来
  • Optimizer 就使用了此特性,从而保证optimizer 的显存峰值不会太大

原理介绍​

原理介绍

公式​

公式

transformer 主体结构被量化成 4bit,lora 的权重还是 fp16​

  • [TODO]量化成 NF4,精度确定没问题吗?

weight only int8​

主观感受​

  • weight 是 int8,可是输入都是 fp16,bf16,scale/bias 这些都是 fp32、fp16 等数据类型

matmul 的权重是 int8,可是在实际计算的时候会 dequant 成 fp16​

smooth quant​

原理介绍​

  • linear 的权重是 int8,在实际计算的时候,会将输入量化成int8,从而进行 int8 矩阵乘,然后存储到 int32 的数据里面去

GPTQ​

原理介绍:通过调整参数来让模型更容易量化​

llm int8​

AWQ​

参考资料​

https://huggingface.co/blog/Isayoften/optimization-rush#2-quantization