数值表示(numeric precision) 和 量化(quantization) 两个概念。
模型权重本质上是一堆数字,而 FP16 / INT8 / INT4 只是“数字如何存储” 的方式。
一、先理解:模型其实就是大量数字
神经网络里的权重本质上是:
0.183827
-0.993728
0.002134
如果用不同的数据类型存储,同一个数字会变成不同精度。
二、FP16 / FP32 是“浮点数”
浮点数可以表示小数和很大的范围。
常见类型:
| 类型 | 位数 | 特点 |
|---|---|---|
| FP32 | 32bit | 精度最高 |
| FP16 | 16bit | 精度较高 |
| BF16 | 16bit | AI训练常用 |
| FP8 | 8bit | 新GPU优化 |
例子:
FP32
0.18382721
变成
FP16
0.1838
精度降低一点,但基本不影响模型。
三、INT8 / INT4 是“整数”
整数格式不能直接表示小数。
INT8范围:
-128 到 127
INT4范围:
-8 到 7
所以必须做一步操作:
量化(Quantization)
四、量化在干什么
原始权重:
-0.92
-0.13
0.45
0.88
通过缩放映射到整数:
-92
-13
45
88
存储时:
INT8
计算时再恢复:
weight = int_value * scale
这就叫:
Quantization
五、为什么要 INT8 / INT4
核心原因只有一个:
省显存 + 提高速度
看一个例子。
假设模型:
100B 参数
不同精度占用:
| 类型 | 每参数字节 | 总大小 |
|---|---|---|
| FP32 | 4B | 400GB |
| FP16 | 2B | 200GB |
| INT8 | 1B | 100GB |
| INT4 | 0.5B | 50GB |
所以:
INT4 可以把模型缩小 8 倍。
六、为什么精度会下降
因为小数被压缩了。
例如:
真实值:
0.183827
INT4可能变成:
0.19
误差变大。
所以:
| 精度 | 模型质量 |
|---|---|
| FP16 | 最好 |
| INT8 | 基本不变 |
| INT4 | 可能下降 |
| INT2 | 下降明显 |
七、推理框架支持的精度
不同框架支持不同量化:
| 框架 | 常见精度 |
|---|---|
| vLLM | FP16 / BF16 / FP8 |
| TensorRT-LLM | FP8 / INT8 |
| AutoGPTQ | INT4 |
| llama.cpp | INT4 / INT5 / INT6 |
八、真实部署怎么选
工程上通常这样选:
高端 GPU(H100)
推荐
FP8
原因:
- 速度快
- 精度接近 FP16
- 显存减少一半
普通服务器 GPU
推荐
INT8
平衡:
- 精度
- 显存
消费级 GPU
只能
INT4
否则显存不够。
九、为什么会看到这么多格式
因为模型发布者通常会提供:
FP16 原版
FP8 推理版
INT8 企业版
INT4 轻量版
GGUF 本地版
本质只是:
同一个模型,不同压缩率。
