2024-11-18

分析和概要

Pasted image 20241118150329.webp
大模型在学习过程中,参数大的情况下容易出现异常特征,在量化的过程里出现极端值,导致量化后丢失非异常值的信息。

观察:矩阵计算可以分解

Pasted image 20241118150559.webp

于是,int8() 将输入的异常列和对应权重的一异常行提出来单独进行运算,将非异常的值进行量化后反量化,将异常值不进行量化计算,而是在 fp16 的精度下进行计算;

Pasted image 20241118150744.webp

这里的量化是,对于激活输入,per-token 量化,对于权重,per-weight 量化

一些 int8() 算法的观察结果:

  • Emergent Feature 仅占所有特征的 0.1%(极端值得占比不高)
  • Weight 在加载模型时量化,显存占用比 float16 减半
  • 使用 LLM.int8() 对精度几乎没有影响
  • 模型推理速度会变慢 20% 左右(模型的计算复杂度变高了)

在 huggingface 的 Transformer 库有对应的 int8 优化方法,直接调用即可