想象你在搬家。家里有衣物、书本、被褥,而搬家车的货箱就那么大。工程师们发明了三种“打包方案”:FP16是标准纸箱,衣服直接叠好放进去,箱子大但保险;INT8是压缩收纳袋,抽掉空气把蓬松的被子压成薄片,装得多也不怎么损伤;INT4则是真空压缩袋,把羽绒服压到巴掌大,空间省到了极致,但衣服拿出来难免皱巴巴。 AI模型的世界里,“搬家”就是部署模型,“物品”就是神经网络的参数,“搬家车的容量”就是设备的内存与显存。模型每个参数原本是32位浮点数(FP32),直接搬太占地方,于是工程师们用三种位宽不同的“打包工具”来压缩——这就是量化(Quantization)。FP16、INT8、INT4到底怎么选?不是越省钱越好,也不是越保真越好,而是要看“搬去哪里”(硬件平台)、“搬多少东西”(模型规模)、“东西怕不怕皱”(任务对精度的敏感度)。这篇文章,我们就用这套“打包哲学”,把三种精度格式的取舍讲透。

岗位关联

掌握量化精度的对比与选型逻辑,是资源受限环境下部署大模型的必备技能,直接决定推理成本、延迟表现与产品体验。

目录
  1. 可视化演示
  2. 量化原理
  3. FP16高保真
  4. INT8均衡点
  5. INT4极限压缩
  6. 对比权衡
  7. 场景选型
  8. AI 应用场景
  9. Python 演示
  10. 常见误区
  11. 面试题

可视化演示

展示INT4/INT8/FP16量化在精度、显存和速度三个维度的权衡:精度损失折线图、显存压缩对比(4x压缩比)、推理速度提升(3.8x加速),通过模式切换理解量化选型策略。

本节配有交互动效(进入视口后自动加载,约 3KB)。

精度损失:FP16→INT8→INT4 FP16:精度损失 INT8:损失2-5%,多数场景可接受 精度 = 1 - |Q(x) - x| / |x| INT4在大模型上精度下降显著,需配合GPTQ/AWQ校准

量化原理

搬家前,你得先学会“把大件变小件”。量化就是干这件事:把模型里密密麻麻的浮点数,用更少位数重新编码。就好比把家里形状不规则的贵重物品,统一改造成纸箱能装下的标准形状——有改造,就有损耗,但这个损耗是可控的。

技术上,量化要做的是把浮点数映射到有限的整数集合。比如把 -1 到 1 之间的连续数字,均匀切分成 256 个格子(INT8)或 16 个格子(INT4), 每个原始值落到哪个格子,就用格子的编号表示。这个过程叫“数值映射”, 而落在两个格子之间的值只能就近取整,这就是“精度截断”。

回到搬家的比喻:量化就像量好每件家具的尺寸,统一改造成标准纸箱。纸箱越小,能装的件数就越多,但每件被“改造”的程度也越大。接下来我们看看三款纸箱——FP16、INT8、INT4——各自的性格。

q=round(rs)+z\displaystyle q = \text{round}\left(\frac{r}{s}\right) + z
这个公式把浮点数 \( r \) 变成整数 \( q \), 其中 \( s \) 是缩放因子,\( z \) 是零点偏移。理解它,就理解了所有量化的本质。
  1. 原始浮点值 \( r \)模型中的权重或激活值,是一个连续小数,比如 0.532。它是待压缩的“原始物品”。
    r∈Rr \in \mathbb{R}
  2. 缩放因子 \( s \)用于把浮点范围缩放到整数范围的比例尺。计算公式为 \( s = \frac{\max(|r|)}{2^{b-1}-1} \), 其中 \( b \) 是量化位宽。
    s=max⁡(∣r∣)2b−1−1s = \frac{\max(|r|)}{2^{b-1} - 1}
  3. 四舍五入 \( \text{round}(\cdot) \)将连续值变成离它最近的整数,这一步正式引入精度损失——就像把 1.7 米的家具记成 2 米,搬起来没问题,但不再精确。
    round(rs)\text{round}\left(\frac{r}{s}\right)
  4. 零点偏移 \( z \)当数据分布不对称时(比如某层权重全是正数), 用 \( z \) 让量化后的整数中心对准真实零点,避免浪费表示范围。
    q=round(rs)+zq = \text{round}\left(\frac{r}{s}\right) + z

FP16高保真

FP16是搬家时最“稳妥”的选择。它像一只标准纸箱,把你的物品原样摆放,只做了最轻的整理。相比FP32的32位浮点,FP16用16位表示一个数,把存储减半,但数值的“长相”基本没变。

FP16的内部结构很有讲究:1位符号决定正负,5位指数决定数量级,10位尾数决定精确数字。这种“科学计数法”式的设计,让FP16既能表示很大很大的数,也能表示很小很小的数,动态范围非常广。尾数10位能提供约3位十进制有效数字,对大多数推理任务来说已经是“以假乱真”的精度。

但FP16有个短板:压缩能力有限。相比FP32它只省了一半空间,相比INT8/INT4, 它的“省空间”能力就相形见绌了。标准纸箱虽好,但装不了太多东西——当你想把整个衣柜塞进一辆小车时,它就力不从心了。

ϵFP16=2−10≈0.1%\displaystyle \epsilon_{FP16} = 2^{-10} \approx 0.1\%
这个公式表示FP16的相对精度约为千分之一。也就是说,一个原本是 1.0000 的数,存成FP16后最大偏差约 0.001。
  1. 尾数位 10FP16的尾数部分有10个二进制位,最小可以分辨 \( 2^{-10} \) 的差值。
    尾数位数=10\text{尾数位数} = 10
  2. 相对精度 \( \epsilon \)精度由尾数位数决定,\( 2^{-10} = 0.0009766 \), 约等于 0.1%。
    ϵ=2−10≈0.001\epsilon = 2^{-10} \approx 0.001

INT8均衡点

既然标准纸箱不够用,我们试试压缩收纳袋——这就是INT8。它用8位表示一个数,把连续的浮点空间切成256个格子。听起来丢了很多信息,但配合良好的校准策略,大多数模型的精度损失能被控制在1%以内。

INT8之所以成为“均衡点”, 是因为它在三个维度上都表现优秀:精度上,256个级别足以表达大部分权重分布的主要形态;存储上,每个数只占1字节,比FP16又少一半;速度上,几乎所有的GPU、CPU、NPU都内置了INT8加速指令,硬件“认识”这种格式,能飞快地计算。

在工程实践中,INT8是云端推理的“默认选择”: 显存减半、速度加倍、精度几乎无损。就像压缩收纳袋,把被子抽成薄片,蓬松感稍减,但保暖性几乎不变——性价比极高,人人都爱用。

SINT8=1−816=50%\displaystyle S_{INT8} = 1 - \frac{8}{16} = 50\%
这个公式算的是INT8相对FP16的显存节省比例:每个参数从2字节降到1字节,直接省下50%。
  1. 位宽比 \( \frac{8}{16} \)INT8每个数8位=1字节,FP16每个数16位=2字节,所以存储比是8/16=1/2。
    816=12\frac{8}{16} = \frac{1}{2}
  2. 节省比例 \( S \)\( 1 - \frac{8}{16} = 50\% \), 即显存占用直接砍半。
    S=1−12=50%S = 1 - \frac{1}{2} = 50\%

INT4极限压缩

当搬家车特别小,或者东西特别多,你就得请出终极武器——真空压缩袋,也就是INT4。它每个数只占4位,只有16个离散取值。这个压缩力度,相当于把羽绒服压成一张硬纸板,空间省到极致,但衣服的蓬松感和柔软度必然大打折扣。

INT4量化的精度损失明显增大,平均相对误差可能达到6%~12%, 尤其当模型权重中存在一些“离群大值”时,这些极端值最容易在压缩中被截断或扭曲。为了缓解这个问题,工程师们发明了分组量化:把挨在一起的多个权重当作一组,每组共享一个缩放因子,这样至少组内还能保持相对的“秩序”。

INT4的定位很明确:它不是用来讨好所有任务的,而是为资源极度受限的端侧设备(手机、耳机、摄像头)准备的。当你需要在算力和内存都紧张的地方塞进一个能用的模型,真空压缩袋就是唯一的选择——皱点的衣服总比没衣服穿强。

SINT4=1−416=75%\displaystyle S_{INT4} = 1 - \frac{4}{16} = 75\%
公式的含义是:INT4相对FP16能省75%显存。一个70亿参数的模型,FP16要14GB, INT4只要3.5GB——这正好是手机上能放得下的尺寸。
  1. 位宽比 \( \frac{4}{16} \)INT4每个数4位=0.5字节,只有FP16的四分之一。
    416=14\frac{4}{16} = \frac{1}{4}
  2. 节省比例 \( S \)\( 1 - \frac{4}{16} = 75\% \), 显存从14GB降到3.5GB。
    S=1−14=75%S = 1 - \frac{1}{4} = 75\%
  3. 代价4位只有16种取值,能表示的数值阶梯非常稀疏,很多细节被强制“就近取整”。
    级别数=24=16\text{级别数} = 2^4 = 16

对比权衡

现在我们有三款打包工具了:标准纸箱FP16、压缩收纳袋INT8、真空压缩袋INT4。该用哪个?先看看三者放在桌上的对比。

从精度看,FP16最接近原始值,相对误差约0.1%; INT8误差约1%, 肉眼几乎看不出区别; INT4误差约6%~12%, 仔细端详还是能发现“变形”。从存储看,FP16每个数2字节,INT8是1字节,INT4是0.5字节;同样装下70亿参数的模型,FP16要14GB, INT8只要7GB, INT4只要3.5GB。

速度维度则要加上“硬件”这位裁判。INT8在多数GPU/CPU上都有专门的加速单元,实际吞吐可能比FP16快2~4倍; INT4的加速效果则完全取决于平台——有些端侧NPU为INT4做了优化,而很多云端GPU对INT4支持不友好,甚至需要反量化回FP16再算,反而变慢。这就好比真空压缩袋虽然省空间,但如果没有大功率抽气泵,用手动气筒抽气反而更累。

Rb=b16,b∈{4,8,16}\displaystyle R_b = \frac{b}{16}, \quad b \in \{4, 8, 16\}
\( R_b \) 表示位宽为 \( b \) 的精度相对FP16的存储占用比例。INT4是25%, INT8是50%, FP16是100%。
  1. 位宽集合 \( b \)三种精度分别对应位宽16、8、4。
    b∈{4,8,16}b \in \{4, 8, 16\}
  2. 存储比 \( R_b \)用位宽除以16, 得到相对FP16的占用比例。INT8为0.5, INT4为0.25。
    RINT8=0.5,RINT4=0.25R_{INT8} = 0.5, \quad R_{INT4} = 0.25

场景选型

知道了三款工具的优缺点,最后一步就是“看菜下饭,按需装箱”。选型没有标准答案,只有权衡结果。三个关键问题是:模型有多大?任务对精度多敏感?跑在什么硬件上?

第一,模型规模。 如果你的模型只有1亿参数,FP16才200MB, 大部分设备都无压力,何必冒险用INT4? 但如果模型有70亿甚至上千亿参数,那就必须精打细算——FP16的14GB只有高端显卡才扛得住,INT8的7GB能覆盖主流推理卡,INT4的3.5GB才有机会上手机。

第二,精度需求。 医疗诊断、金融风控、法律文书这类应用,一字之差就是重大事故,宁可多花存储也要保精度,选FP16或INT8; 而闲聊机器人、内容分类、语音识别等容错率高的任务,INT4完全可以接受。

第三,硬件支持。 查清楚目标平台的指令集:英伟达GPU对FP16和INT8支持极佳,移动端骁龙/天玑的NPU则对INT8/INT4都做了专门优化。硬件不支持,再好的精度选择也白搭。

把所有“行李”装进正确的箱子,这场“模型搬家”就算大功告成。记住:没有最好的精度,只有最合适的精度。选对了,模型在手机里也能跑得飞快;选错了,再贵的GPU也救不了内存爆炸的尴尬。

b∗={16精度优先场景8综合平衡场景4内存受限场景\displaystyle b^{*} = \begin{cases} 16 & \text{精度优先场景} \\ 8 & \text{综合平衡场景} \\ 4 & \text{内存受限场景} \end{cases}
这个分段函数总结了选型口诀:精度优先用FP16, 追求平衡用INT8, 内存吃紧用INT4。
  1. 精度优先场景 \( b=16 \)医疗、金融等对输出质量极敏感的任务,选FP16守住精度底线。
    b=16b = 16
  2. 综合平衡场景 \( b=8 \)大多数云端在线服务,INT8在精度、速度、成本上综合最优。
    b=8b = 8
  3. 内存受限场景 \( b=4 \)端侧设备、离线批处理,内存是硬约束时选择INT4。
    b=4b = 4

AI 应用场景

手机端大模型部署

阶段:模型部署与推理优化

解决的问题:旗舰手机的运行内存约12~16GB, 一个70亿参数的FP16模型占14GB, 系统完全没有空间留给模型运行。传统做法只能用云端API, 但延迟高且有隐私风险。用INT4量化后模型压缩到3.5GB, 手机本地就能放下。

具体案例:某端侧AI助手团队将7B对话模型用INT4分组量化后部署到骁龙8 Gen3手机,首字延迟从云端的800ms降到本地的350ms, 同时用户语音数据不出设备,隐私安全性大幅提升。

云端推理成本优化

阶段:推理服务性能优化

解决的问题:GPU实例价格昂贵,如果所有模型都用FP16跑,显存只能同时容纳几十路请求,导致单位请求成本居高不下。改用INT8后,显存占用减半,同一张卡能塞进两倍的并发请求。

具体案例:某互联网公司的在线客服机器人采用INT8量化,将BERT模型的响应准确率变化控制在0.8%以内,而GPU服务器数量从40台降到22台,季度推理成本下降约45%。

Python 演示

python40 行
def quantize(values, bits):    """Map float values to quantized integers."""    bound = 2 ** (bits - 1)    scale = (bound - 1) / max(abs(v) for v in values)    q_values = []    for v in values:        q = max(-bound, min(bound - 1, round(v * scale)))        q_values.append(q)    deq_values = [q / scale for q in q_values]    return q_values, deq_values  def evaluate(values, bits):    """Quantize then report avg error and storage bytes."""    q, deq = quantize(values, bits)    errors = [abs(a - b) / max(abs(a), 1e-6)              for a, b in zip(values, deq)]    avg_err = sum(errors) / len(errors)    storage = len(values) * bits / 8    return avg_err, storage, q  def main():    # simulate a row of neural weights, range about -1 to 1    weights = [0.532, -0.891, 0.124, -0.315, 0.771,               -0.208, 0.463, -0.667, 0.892, -0.148]    print("FP32 weight row:", ["%.4f" % w for w in weights])    print("FP32 storage: %d bytes" % (len(weights) * 4))    print("-" * 42)    for bits in (16, 8, 4):        avg_err, storage, q = evaluate(weights, bits)        print("INT%d quantization" % bits)        print("  q values:", q)        print("  storage: %.0f bytes" % storage)        print("  save vs FP16: %.1f%%" % ((1 - bits / 16) * 100))        print("  avg error: %.4f" % avg_err)  if __name__ == "__main__":    main()
目的:用10个模拟权重演示FP16/INT8/INT4三种精度的量化过程,直观对比存储占用和精度损失。
  1. scale = (bound - 1) / max(abs(v) for v in values)计算缩放因子,把最大绝对值映射到整数边界
  2. q = max(-bound, min(bound - 1, round(v * scale)))量化并截断到合法整数范围,防止溢出
  3. errors = [abs(a - b) / max(abs(a), 1e-6) ...]逐元素计算相对误差,即“物品在压缩中被改变了多少”
  4. storage = len(values) * bits / 8将位宽换算成字节数,得到实际存储占用
  5. save vs FP16: %.1f%%打印相对FP16的存储节省比例,直接引出“省空间”的量化动机

常见误区

误区

正解

误区

正解

误区

正解

误区

正解

面试题

Q1. 在FP16、INT8、INT4三种精度中,哪种占用显存最少?

单选题 · easy

  • A.FP16半精度格式
  • B.INT8整数格式
  • C.INT4整数格式← 正确答案
  • D.FP32浮点格式

答案:C。INT4每个数只占4位即0.5字节,是三种精度中最小的。FP16是2字节,INT8是1字节,FP32是4字节。类比搬家,INT4是压缩最狠的真空袋。

Q2. FP16相比INT8的核心优势是什么?

单选题 · easy

  • A.数值精度更高← 正确答案
  • B.存储占用更小
  • C.推理速度更快
  • D.硬件支持更好

答案:A。FP16用16位浮点表示数值,尾数10位,相对精度约0.1%, 远高于INT8。存储更小、速度更快、硬件支持更好通常是INT8的优势,而非FP16。

Q3. INT8相对FP16的显存节省比例是多少?

单选题 · mid

  • A.约25%
  • B.约50%← 正确答案
  • C.约75%
  • D.约90%

答案:B。INT8每个数1字节,FP16每个数2字节,存储比为1/2, 节省 \( 1 - 8/16 = 50\% \)。这就是“压缩收纳袋”相比“标准纸箱”的省空间幅度。

Q4. 选择量化精度时需要综合考虑哪些因素?

多选题 · mid

  • A.模型参数规模← 正确答案
  • B.目标硬件支持← 正确答案
  • C.任务精度需求← 正确答案
  • D.训练数据大小

答案:ABC。选型看“搬多少东西”(模型规模)、“搬到什么车上”(硬件平台)、“东西怕不怕皱”(精度需求)。训练数据大小本身不直接决定量化精度选择,影响的是训练阶段。

Q5. INT4量化最典型的代价是什么?

单选题 · mid

  • A.显存占用过高
  • B.精度损失明显← 正确答案
  • C.推理速度变慢
  • D.模型文件太大

答案:B。INT4只有16个离散取值,平均相对误差可达6%~12%, 是三种精度中精度让步最大的。显存占用低、模型文件小正是它的优点,速度则取决于硬件。

Q6. 下列哪种场景最适合使用INT4量化?

单选题 · easy

  • A.云端高精度推理
  • B.手机端小模型部署← 正确答案
  • C.金融风控场景推理
  • D.医疗影像诊断场景

答案:B。手机端资源受限且对精度容错度较高,是INT4的理想战场。云端高精度、金融风控、医疗影像都优先保精度,应选FP16或INT8。

Q7. 关于量化,下列说法哪些是正确的?

多选题 · hard

  • A.量化能减少显存占用← 正确答案
  • B.量化会降低推理速度
  • C.量化完全没有精度损失
  • D.量化需结合硬件特性← 正确答案

答案:AD。量化通过低比特表示显著减少存储;速度提升依赖硬件支持,不能想当然;量化必然有精度损失,只是可控;选型必须结合硬件指令集,否则可能适得其反。

Q8. 某70亿参数模型用FP16部署需要14GB显存,同样模型用INT4大约需要多少?

单选题 · hard

  • A.约1.8GB左右
  • B.约3.5GB左右← 正确答案
  • C.约7GB左右
  • D.约14GB左右

答案:B。INT4每参数0.5字节,FP16每参数2字节,存储比为4/16=1/4, 14GB × 0.25 = 3.5GB。这就相当于从标准纸箱换成真空压缩袋,体积骤降到四分之一。

Q9. FP16在部署中的缺点有哪些?

多选题 · mid

  • A.压缩倍数有限← 正确答案
  • B.显存占用仍偏高← 正确答案
  • C.数值完全无损
  • D.无法使用GPU

答案:AB。FP16只比FP32省一半,比INT8/INT4省得少得多,大模型14GB的体量在端侧很难放下。FP16并非完全无损,且有广泛的GPU支持。

Q10. 关于量化精度与推理速度的关系,哪项描述最准确?

单选题 · extreme

  • A.精度越低速度必然越快
  • B.速度受硬件支持制约← 正确答案
  • C.量化与速度完全无关
  • D.低精度一定更加省电

答案:B。量化带来的加速本质上来自硬件对低精度格式的原生支持。INT8在多数GPU上有加速指令,INT4在部分NPU上才是优势。A和D都过于绝对,C则完全错误。