大语言模型部署实战:FP16、INT8、4bit 量化怎么选?吞吐、精度与显存的真实权衡

大语言模型部署实战:FP16、INT8、4bit 量化怎么选?吞吐、精度与显存的真实权衡

前面几篇,我们已经把这条主线推进到了微调阶段:

  • Transformer 为什么能成为大模型基础架构
  • 预训练到底在学什么
  • SFT、RLHF、DPO 这类对齐训练怎么串起来
  • 长上下文是怎么做出来的
  • temperature、top-k、top-p、repeat penalty 这类推理参数怎么调
  • LoRA、QLoRA、全参微调分别适合什么场景

接下来,就该进入真正决定"能不能跑起来"的部署问题了。

因为很多团队第一次把大模型从论文、Demo、Notebook 搬到真实环境时,最先撞上的通常不是 prompt,也不是算法,而是一个非常现实的问题:

显存不够。

你会发现很多事情都绕不过它:

  • 7B 模型到底能不能在单卡上跑?
  • 13B、32B、70B 模型分别大概要多少显存?
  • 为什么有些模型 FP16 跑不动,换成 4bit 却能跑?
  • INT8、4bit、GPTQ、AWQ、GGUF、bitsandbytes 到底该怎么选?
  • 量化以后为什么有时省了显存,却不一定更快?
  • 真实服务里到底该优先保吞吐、保精度,还是先保能上线?

这篇文章,我想把大模型部署里最关键的一条线讲透:

量化不是"压缩一下模型"这么简单,而是在显存、精度、延迟、吞吐、兼容性之间做工程取舍。

我们重点讲 7 件事:

  1. 为什么量化是大模型部署的核心杠杆
  2. FP16、BF16、INT8、4bit 分别意味着什么
  3. GPTQ、AWQ、GGUF、bitsandbytes 这些路线到底差在哪
  4. 为什么"更低 bit"不一定代表"更快"
  5. KV Cache、batch、上下文长度为什么会把显存再次吃爆
  6. 单机、本地、API 服务三类场景下怎么选量化方案
  7. 如何做吞吐、延迟、精度的真实评估,而不是只看参数表

如果你正准备把模型放到:

  • 本地开发机
  • 消费级 GPU 服务器
  • 推理服务集群
  • Ollama / vLLM / SGLang / llama.cpp 这类框架

这篇会比"背几个量化名词"更有用。


一、先说结论:量化首先解决的是"能不能部署",其次才是"跑得有多漂亮"

很多人第一次接触量化时,会天然把它理解成:

  • 模型压小一点
  • 显存省一点
  • 速度快一点

这当然没错,但还不够准确。

更实用的理解应该是:

量化是把原本无法部署的模型,拉回到可部署区间的第一把工程杠杆。

因为真实环境里,部署约束通常不是"理论最优",而是下面这些:

  • 你手里只有 24GB、48GB 或 80GB 显卡
  • 你还得留出 KV Cache、batch、并发和框架开销
  • 你不能只让它跑一次,而是要稳定处理请求
  • 你不只是要出结果,还要控制 TTFT、tokens/s、吞吐和成本

所以工程上第一问通常不是:

哪种精度最先进?

而是:

在我的硬件和目标 SLA 下,模型到底以什么格式最合适。

如果一个 14B 模型用 FP16 根本装不下,那你讨论它 FP16 精度有多好,其实没有意义。


二、先把几个核心概念踩稳:权重、激活、KV Cache 不是一回事

很多人刚学部署时,会把"模型显存"理解成一个静态数字。

这很容易误判。

因为推理时显存通常至少分成三块:

1)模型权重(Weights)

也就是参数本身。

这是量化最直接作用的部分。

比如:

  • FP16:每个参数约 2 字节
  • INT8:每个参数约 1 字节
  • 4bit:每个参数约 0.5 字节

粗略估算:

  • 7B 模型,FP16 权重大约 14GB
  • 7B 模型,INT8 权重大约 7GB
  • 7B 模型,4bit 权重大约 3.5GB

但这只是非常粗糙的理论值,真实还要加上:

  • scale / zero-point 等量化元数据
  • 框架开销
  • 内存碎片
  • tensor parallel / runtime buffer

2)激活(Activations)

推理时激活开销通常比训练小很多,但在大 batch 或某些框架实现里也不能完全忽略。

3)KV Cache

这才是很多人上线后真正被打懵的地方。

因为生成式推理不是只把模型加载进来就完了,模型还要给每个请求保存注意力历史,也就是 KV Cache。

KV Cache 的占用和这些因素强相关:

  • 层数
  • hidden size
  • attention heads
  • context length
  • batch size / 并发数
  • 精度格式

所以经常会出现一种情况:

模型本体放得下,但一旦 batch 稍微变大、上下文拉长、并发一上来,显存还是爆。

这也是为什么部署讨论不能只盯着"模型多大",还要盯着"运行时多重"。


三、FP16、BF16、INT8、4bit 到底分别是什么?

先把这些常见格式讲清楚。

1)FP16

FP16 是半精度浮点,部署里最经典的一种格式。

它的特点是:

  • 精度高于低 bit 量化
  • 框架兼容性普遍较好
  • 很多 GPU 对 FP16 推理有成熟加速
  • 显存占用大约是参数量 × 2 字节

它适合:

  • 你显存足够
  • 你优先保守稳定
  • 你不想引入太多量化误差
  • 你要做 benchmark 或高保真基线

2)BF16

BF16 本质上也是 16 bit,但指数位更多,数值稳定性通常比 FP16 更好。

在现代训练和推理框架里,BF16 很常见,尤其在支持良好的 GPU 上。

部署视角下,它和 FP16 的核心共同点是:

都属于"高精度、显存开销相对大"的方案。

3)INT8

INT8 就是 8 位整数表示。

它的直觉很简单:

  • 参数占用大约减半
  • 往往比 16bit 更省显存
  • 精度损失通常比 4bit 更温和

它常常是一个很好的中间地带:

  • 既想省资源
  • 又不想承受太激进的精度下降
  • 希望保留较强兼容性和稳定性

4)4bit

4bit 是现在开源部署里非常热门的一档。

因为它经常能把原本"根本跑不动"的模型,拉进消费级显卡可运行区间。

它的价值非常现实:

  • 同样显存下能装更大的模型
  • 本地部署门槛大幅下降
  • 对 7B、14B、32B 这类模型特别有用

但要记住:

4bit 的收益首先是"装得下",不是自动保证"更快、更稳、更准"。


四、为什么更低 bit 不一定更快?

这是很多人最容易误解的地方。

直觉上你会觉得:

  • 模型更小了
  • 数据搬运更少了
  • 所以速度一定更快

但真实情况没有这么简单。

因为推理速度不仅取决于权重大小,还取决于:

  • 量化/反量化开销
  • Kernel 是否优化成熟
  • GPU 对该精度格式支持得好不好
  • 框架是否为该格式做了高效实现
  • 当前瓶颈是算力、带宽还是调度开销

所以工程上常见三种情况:

1)低 bit 同时更省显存,也更快

这通常发生在:

  • 模型原本受限于显存带宽
  • 量化 kernel 做得不错
  • 硬件支持较好
  • 请求规模比较适合当前框架

2)低 bit 更省显存,但速度提升有限

这其实很常见。

因为你只是把"能不能跑"问题解决了,但吞吐仍然受:

  • KV Cache
  • 调度开销
  • decode 阶段串行性
  • 框架实现效率

限制。

3)低 bit 省了显存,反而未必更快

尤其在某些 CPU、本地推理或不成熟实现里,过多的反量化和格式转换会吃掉收益。

所以别把量化简单理解成"bit 越低越快"。

更准确的理解是:

低 bit 提供的是更高的部署弹性,而速度收益取决于具体硬件和推理栈。


五、GPTQ、AWQ、GGUF、bitsandbytes 这些路线到底差在哪?

这里不追求把每个论文细节都展开,而是从工程角度讲你最需要知道的区别。

1)bitsandbytes

这是很多人接触 8bit / 4bit 量化的第一站。

它的特点是:

  • 和 Hugging Face 生态结合紧
  • 加载方便
  • 适合快速实验和开发验证
  • 常用于 QLoRA、低门槛本地部署

适合场景:

  • 你想快速试一个模型能不能跑
  • 你主要在 Python / Transformers 生态工作
  • 你更看重开发便利,而不是极限推理性能

2)GPTQ

GPTQ 是一类典型的后训练量化(PTQ)路线。

它的目标是:

在不重新训练模型的情况下,把权重量化到更低 bit,同时尽量减少精度损失。

适合场景:

  • 你已经有训练好的模型
  • 想把它变成适合推理部署的低 bit 版本
  • 更关注离线量化后的部署产物

3)AWQ

AWQ 也是目前非常主流的后训练量化路线之一。

它强调对重要权重进行更有针对性的保护,因此在不少模型和任务上有不错的精度保持表现。

工程上很多人喜欢它,是因为它在"精度---速度---部署性"之间比较平衡。

适合场景:

  • 你要上线 GPU 推理服务
  • 你希望 4bit 量化后尽量少掉点
  • 你希望配合 vLLM / SGLang / TensorRT-LLM 等更成熟服务栈

4)GGUF

GGUF 更多是 llama.cpp 体系下非常常见的模型分发格式。

它的价值不只是量化,而是:

  • 方便本地推理
  • CPU / Apple Silicon / 小型设备支持好
  • 各种量化档位丰富
  • 对桌面端、自托管、轻量本地使用特别友好

适合场景:

  • Mac 本地跑模型
  • CPU 推理
  • 不追求大规模服务化,而是追求便捷部署

所以你可以先这样理解:

  • bitsandbytes:开发验证友好
  • GPTQ:经典离线后训练量化路线
  • AWQ:部署实战里很常见的高性价比 4bit 方案
  • GGUF:本地化、跨硬件、轻量部署很强

六、量化选型不能只看权重,还要把 KV Cache 一起算进去

这是部署里特别容易踩坑的一点。

很多人估算显存时,只会算:

模型参数量 × bit 数

然后发现理论上够,实际一跑还是 OOM。

为什么?

因为真实推理里,尤其长上下文和高并发场景下,KV Cache 经常会成为第二大显存消耗源。

一个实用判断

如果你的场景是:

  • 长文档问答
  • RAG 回答时塞很多上下文
  • 高并发 API 服务
  • 多轮会话长期保留上下文

那你要优先关注的,不只是模型量化档位,还包括:

  • max model len
  • max num seqs / batch size
  • prefill 长度
  • decode 阶段并发
  • KV Cache 精度与分页管理

也就是说:

量化解决的是静态模型占用,而 KV Cache 决定的是动态服务容量。

如果你忽略第二件事,部署就很容易在上线后翻车。


七、单机、本地和服务化三类场景,到底怎么选?

我给你一个更接近真实工程的选择框架。

1)本地个人使用 / 开发验证

目标通常是:

  • 先跑起来
  • 成本低
  • 不追求极限吞吐

推荐思路:

  • Mac / CPU / 轻量设备:优先看 GGUF
  • 单卡实验:可以优先试 bitsandbytes 4bit / 8bit
  • 如果只是 prompt 调试和功能验证,先别追求最复杂的服务栈

这时最重要的是:

让模型进可用区,而不是一次性把架构做满。

2)团队内网服务 / 小规模 API

目标通常是:

  • 可被多人调用
  • 有一定并发
  • 稳定比极限参数更重要

推荐思路:

  • 7B / 14B 模型:INT8 或 4bit 都值得评估
  • 如果对精度敏感,先拿 FP16/BF16 做基线,再比较 AWQ / GPTQ
  • 使用 vLLM / SGLang 这类更适合服务化的推理框架
  • 重点监控 TTFT、tokens/s、OOM、上下文长度和并发退化

3)生产级高并发服务

目标通常是:

  • 尽可能高吞吐
  • 可预测延迟
  • 稳定 SLA
  • 成本可控

这时量化选择不能只看"能不能跑",而要看:

  • 特定框架对该量化格式支持是否成熟
  • continuous batching 能否吃满吞吐
  • tensor parallel / pipeline parallel 如何协同
  • 精度下降是否影响真实业务指标
  • 故障恢复、热加载、灰度切换是否方便

换句话说,上线服务看的是整条推理链,而不是单个量化标签。


八、如何评估"量化到底值不值"?别只看主观感觉

这部分特别关键。

很多团队测量化时,只问一句:

  • 好像没差太多?

这不够。

你至少应该从四个维度评估。

1)显存占用

记录:

  • 模型加载后显存
  • 首 token 前显存
  • 长上下文下显存
  • 高并发时峰值显存

2)延迟

重点看:

  • TTFT(Time To First Token)
  • 单请求总时延
  • 不同输入长度下的变化

3)吞吐

重点看:

  • tokens/s
  • batch 增长后的吞吐变化
  • 并发数上升后的退化曲线

4)精度 / 业务效果

不要只看一句"感觉回答还行"。

应该至少准备:

  • 通用 benchmark 的小样本回归测试
  • 你的真实业务样例集
  • 幻觉率、格式遵循、召回命中、代码可执行性等任务指标

因为很多量化方案在闲聊上看不出差异,但在:

  • 数学推理
  • 结构化抽取
  • 严格格式输出
  • OCR / 文档理解
  • 多轮工具调用

这些任务上会更容易暴露误差。


九、几个实用的参数与工程建议

最后给你一组更偏落地的经验判断。

1)先用高精度格式建立基线

如果硬件允许,先跑一版 FP16 / BF16 基线。

这样你后面评估 INT8、4bit 时,才知道掉点和收益来自哪里。

2)别只盯着模型权重,记得给 KV Cache 留预算

尤其是长上下文和多并发服务。

很多 OOM 不是发生在"加载模型那一刻",而是发生在"请求多起来之后"。

3)量化越激进,越要做真实业务回归

不要只拿通用问答测。

如果你的业务是:

  • RAG
  • 文档抽取
  • 代码生成
  • 表格理解
  • 多模态问答

那就用这些真实任务去回归。

4)如果目标是服务化,不要只看模型文件格式,要看整个推理框架的支持度

同样一个 4bit 模型,在不同框架上的:

  • 吞吐
  • 稳定性
  • 并发支持
  • 上下文能力

可能差别非常大。

5)"最优量化方案"通常不是固定的,而是和模型、硬件、任务三者绑定

没有一种格式能在所有情况下都赢。

工程上要避免问:

"4bit 是不是一定最好?"

更应该问:

"在我这个模型、硬件、任务组合下,哪种方案最合适?"


最后总结一下

今天这篇,你可以把核心记成下面几句。

1)量化首先解决的是部署可行性

很多时候不是"跑得更优",而是先让模型进入"能上线、能承载请求"的区间。

2)FP16 / BF16 更保守,INT8 是中间地带,4bit 最擅长压缩显存

但 bit 越低,不代表自动越快、越稳。

3)GPTQ、AWQ、GGUF、bitsandbytes 不是简单替代关系,而是针对不同推理栈和场景的路线选择

开发验证、GPU 服务、本地推理,各自最优解往往不同。

4)部署评估一定要同时看:显存、延迟、吞吐、业务效果

只看模型能不能加载,远远不够。

5)真正影响上线成败的,不只是权重量化,还有 KV Cache、上下文长度、batch 和框架实现

这几件事经常比"参数 bit 数"更决定真实容量。


相关推荐
米小虾8 分钟前
Loop Engineering —— 循环的设计与自主执行
人工智能·agent
米小虾21 分钟前
Harness Engineering —— 系统的安全护栏
人工智能·agent
火山引擎开发者社区36 分钟前
积分当钱花,火山引擎开发者激励计划首月消费双倍回馈
人工智能
aqi001 小时前
15天学会AI应用开发(十)把文本嵌入模型换成国产模型
人工智能·python·ai编程
MobotStone2 小时前
为什么在AI时代,“好奇心”成了最值钱的能力?
人工智能
武子康2 小时前
调查研究-200 llama.cpp b9754:一次很小但很关键的 Agent 工具调用修复
人工智能·agent·llama
Ralph_Salar3 小时前
从0到1搭建AI智能支付风控助手Stage1-RAG知识库升级 — 元数据让检索更精准
人工智能
武子康3 小时前
调查研究-199 MCP Zero-Touch OAuth:为什么它是 MCP 进入企业生产的关键门槛?
人工智能·agent·mcp