模型精度与质量:FP16 vs INT4 实际差异有多大

INT4 量化把每个参数从 16 位压到 4 位,体积缩小 4 倍——但质量会下降多少?本文用 Benchmark 数据、任务对比和 Colab 实测回答这个问题。


一、量化到底压缩了什么?

FP16/BF16(16-bit):每个参数用 16 位浮点数存储 → 精度高
INT4(4-bit):每个参数用 4 位整数存储 → 精度低 4 倍

类比:就像把一张高清照片压缩成 JPEG——文件小了 4 倍,但细节会有损失。关键问题是:损失到什么程度?


二、Benchmark 数据:精度损失 1-3%

以 Qwen2.5-7B 为例,学术基准测试对比:

基准测试 任务类型 FP16 INT4 差距
MMLU 知识问答 78.2 ~76-77 -1~2 分
HumanEval 代码生成 68.3 ~65-67 -1~3 分
GSM8K 数学推理 82.5 ~78-80 -2~5 分
HellaSwag 常识推理 83.1 ~82 -1 分

结论:INT4 在大多数任务上只掉 1-3 分,性价比极高。数学推理类任务损失稍大(2-5 分)。


三、按任务类型的质量差异

任务类型 FP16 vs INT4 差异 说明
日常对话 几乎无差异 简单问答、闲聊,看不出来
知识问答 极小差异 事实性回答基本一致
创意写作 微小差异 长文、诗歌可能有细微差别
短代码生成 极小差异 简单函数、片段几乎一致
数学推理 有差异 复杂计算 INT4 可能出错
长代码生成 有差异 长逻辑链、复杂架构 INT4 略差
长文本理解 有差异 上下文 > 4K tokens 时 INT4 退化
学术论文写作 有差异 高精度措辞、引用格式 INT4 不稳定

直观感受

场景 FP16 表现 INT4 表现
"介绍一下海洋大数据" 7 个要点,详细展开 ✅ 简洁 100 字总结 ✅
"写一首关于大海的诗" 优美流畅 ✅ 基本通顺 ✅
"解一道微积分题" 正确 ✅ 可能算错 ⚠️
"分析这篇 8000 字论文" 完整理解 ✅ 后半段可能遗忘 ⚠️

四、Colab 实测对比(2026-10-07)

实验条件

结果对比

指标 T4 FP16 + CPU offload T4 INT4 量化 差异倍数
显存占用 13.1 GB 5.56 GB INT4 省 58%
生成速度 1.49 tokens/s 12.71 tokens/s INT4 快 8.5 倍
64 token 耗时 40.92 s 5.06 s INT4 快 8 倍
TTFT(首 token 延迟) 3.2 ms⚠️ 106 ms -
生成质量 7 个要点 ✅ 简洁总结 ✅ 几乎一致

⚠️ TTFT 3.2ms 为 TextStreamer 测量 bug,不可采信。

关键发现

  1. INT4 量化是 T4 的"甜点配置":速度提升 8.5 倍,显存省 60%,质量仅损失 1-3%
  2. FP16 在 T4 上不可用:触发 CPU offload(部分层卸载到 CPU),速度慢到不可接受
  3. model.dtype 会骗人:INT4 加载后仍显示 torch.bfloat16,正确判据是显存占用(5.56 GB = INT4 生效)

五、model.dtype 的误导性

# INT4 量化加载
model = AutoModelForCausalLM.from_pretrained(
    "Qwen/Qwen2.5-7B-Instruct",
    load_in_4bit=True,
    device_map="auto"
)

print(model.dtype)  # 输出:torch.bfloat16 ← 这不是实际存储精度!

为什么显示 BF16? - model.dtype 报告的是原始模型的精度或计算精度,不是量化后的存储精度 - BitsAndBytes 在加载时将权重从 BF16 转换为 INT4,但 model.dtype 属性不更新

正确判据:

import torch
print(f"显存已用: {torch.cuda.memory_allocated() / 1e9:.2f} GB")
# ~5 GB → INT4 生效 ✅
# ~15 GB → 还是 FP16 ❌

六、什么时候必须用 FP16?

场景 推荐精度 理由
日常对话、知识问答 INT4 足够 质量差异可忽略
代码生成(短代码) INT4 足够 简单逻辑几乎无损
复杂数学推理 FP16 更稳 INT4 可能算错
长文本分析(> 8K tokens) FP16 更稳 INT4 长上下文退化
学术论文写作 FP16 更稳 高精度措辞要求
端侧/手机部署 INT4 必须 显存/内存限制

七、总结

INT4 量化 = 7B 模型的"甜点配置"

✅ 速度提升 8.5 倍(1.49 → 12.71 tokens/s)
✅ 显存省 60%(13.1 GB → 5.56 GB)
✅ 质量仅损失 1-3%(Benchmark 数据)
❌ 不适合:复杂数学、长文本、学术写作

选择原则:
- 日常使用、端侧部署 → INT4
- 高精度任务、学术研究 → FP16
- 显存不够 → INT4 或换更小的模型

相关链接

相关笔记