OpenRouter 实测 fp8 与 fp4 量化对模型质量和价格的影响
LLM Quantization: What fp8 and fp4 Do to Quality and Price
OpenRouter 发布量化解析文章,讲解 LLM 量化原理,并报告 2026 年 10 月 20 日对 1455 个 provider 端点和 Qwen3.8 27B 六个端点的实测。
作者基于自家 280 个任务的实测数据讨论量化精度与价格的关系,并给出 provider.quantizations 的可操作用法,结论边界交代得清楚。
通过 API 调用开放权重模型时,可能有多家服务商以不同精度提供同一个模型,比如 16 位 bf16、8 位 fp8 或 4 位 fp4。精度既会影响回答质量,也会影响价格。LLM 量化就是用更少的位数存储模型权重,从而造出这些不同版本,让模型占用更少内存和硬件,代价是损失一些准确度。
本文介绍这些格式,并汇报我们于 2026 年 10 月 20 日在 OpenRouter 上的实测结果,覆盖 1,455 个服务商端点和 6 个提供 Qwen3.8 27B 的端点。在我们的测试中,fp8、fp4 与 fp16 之间没有检测到准确度差异,因此单看精度标签并不能预测准确度。精度越低通常越便宜,但并非每个模型都如此。
要点速览
-
在 240 个计分任务上,fp8、fp4 与 fp16 之间没有检测到准确度差异。六个端点的得分都在 98.3% 到 99.2% 之间。
-
在另外 40 个乘法任务上,一个 fp4 端点得分最低,但差距太小,无法排除偶然因素。
-
在同时提供 8 位和 16 位的 24 个模型中,有 14 个的 8 位比 16 位便宜,7 个更贵。在同时提供 4 位和 8 位的 33 个模型中,有 26 个的 4 位更便宜。
-
provider.quantizations 可以锁定你得到的精度。把你愿意接受的每种精度都列出来,这样路由器就有不止一个端点可以回退。
什么是 LLM 量化?
LLM 量化是指用比训练时更少的位数来存储大语言模型中的数值。如今大多数 LLM 使用 FP16 或 BF16,都是 16 位格式。fp8 把每个权重占用的内存减半,fp4 或 int4 则降到四分之一,这样同一块 GPU 就能装下更大的模型,或服务更多请求。代价是准确度,因为每个权重都会被舍入到更小格式能存储的最近值。
| 格式 | 每个权重的位数 | 27B 模型的权重占用 | 常见出现场景 |
|---|---|---|---|
| bf16 / fp16 | 16 | 54 GB | 大多数模型发布时采用的精度 |
| fp8 | 8 | 27 GB | OpenRouter 上最常见的标注精度 |
| fp4、nvfp4、mxfp4、int4 | 4 | 13.5 GB | 更便宜的端点、本地运行、部分实验室发布的版本 |
以上数字只算权重。模型运行时还需要内存存放 KV 缓存,也就是上下文中每个 token 对应的注意力状态。
量化主要有两类。训练后量化转换的是已训练完成的模型权重,可以是动态的,在运行时计算每个激活值的范围;也可以是静态的,提前用样本数据跑一遍模型算出这些范围。量化感知训练则在训练过程中模拟舍入,让权重学会适应这种误差。Hugging Face Optimum 概念指南对两者都有讲解,Transformers 量化概览则介绍了你可以自己运行的量化方法。
fp8 与 bf16:有什么区别?
浮点格式把位数分配给符号、指数和尾数三部分。指数决定数值范围,尾数决定该范围内数值的分辨精细程度。

bf16 有 1 个符号位、8 个指数位和 7 个尾数位,因此它的数值范围与 32 位 fp32 相同,但精度更低。fp16 把 16 位拆成 5 个指数位和 10 个尾数位。OCP 8 位浮点规范定义了两种 fp8 编码:E4M3(4 个指数位、3 个尾数位)和 E5M2(5 个指数位、2 个尾数位)。fp8 同时牺牲了范围和精度,所以量化模型会为每个张量或每组权重存一个缩放因子。MXFP4 每 32 个值共用一个缩放因子,NVFP4 则每 16 个值用一个 fp8 缩放因子。
对 API 用户来说,fp8 和 bf16 的区别只体现在同一个模型的不同标签和价格上。在我们的测试中,三个 fp8 端点和 fp16 端点之间没有测出差异。
fp8 和 fp4 会损失多少质量?
在我们的测试中,fp8 和 fp4 都没有测出质量损失。六个端点的得分都在 98.3% 到 99.2% 之间,而这样规模的测试无法排除一两个百分点的差距。
我们把 280 个有精确答案的任务跑过 qwen/qwen3.8-27b,固定到六个端点。Cerebras 以 fp16 提供该模型,Parasail、CoreWeave 和 AkashML 以 fp8 提供,Darkbloom 和 ModelRun 以 fp4 提供。每个请求都设置 provider.only、quantizations 和 allow_fallbacks: false,因此只能到达我们指定的端点,温度为 0,关闭推理。任务包括带演算过程的多步算术、需要追踪的 Python 程序、对 20 到 30 个数字排序、在 240 或 1,200 个条目中查找一个键(约 4,000 和 20,000 个 token),以及一条穿过约 9,000 个 token 的四步查找链。所有任务都由我们生成,因此每个都有精确答案,不需要评审模型。另外 40 个任务要求直接给出两个四位数的乘积、不写演算过程,单独计分。
| 任务类别 | 任务数 | fp16 Cerebras | fp8 Parasail | fp8 CoreWeave | fp8 AkashML | fp4 Darkbloom | fp4 ModelRun |
|---|---|---|---|---|---|---|---|
| 带演算过程的算术 | 50 | 48 | 49 | 48 | 49 | 49 | 50 |
| 短代码追踪 | 50 | 50 | 50 | 50 | 50 | 50 | 50 |
| 长代码追踪 | 30 | 30 | 29 | 29 | 29 | 29 | 28 |
| 20 到 30 个数字排序 | 30 | 30 | 29 | 29 | 29 | 29 | 30 |
| 4,000 token 召回 | 20 | 20 | 20 | 20 | 20 | 20 | 20 |
| 20,000 token 召回 | 20 | 20 | 20 | 20 | 20 | 20 | 20 |
| 四跳召回 | 40 | 39 | 40 | 40 | 40 | 39 | 40 |
| 总计 | 240 | 98.8% | 98.8% | 98.3% | 98.8% | 98.3% | 99.2% |
| 乘法,无演算过程 | 40 | 30 | 33 | 31 | 32 | 26 | 30 |
来源:OpenRouter,Qwen3.8 27B,2026 年 10 月 20 日。总计的 95% 置信区间为 95.8% 到 99.8%,六个端点全部重叠。
没有任何任务类别能区分出不同精度。每个端点在任一类别中最多错两个任务,而且都是普通的失误,比如排序列表里漏掉一个数字。三个 fp8 端点彼此在 240 个任务中有 2 到 5 个不一致,两个 fp4 端点有 4 个不一致。Darkbloom 与 fp16、fp8 端点不一致的次数最多,有 7 或 8 个任务,但它的总分与 fp16 相差不到半个百分点。
唯一出现差距的地方是不写演算过程的乘法。fp4 的 Darkbloom 在 40 个乘积中答对 26 个,而其他五个端点为 30 到 33 个,其中 fp4 的 ModelRun 是 30 个。针对最佳端点(33 个)做两比例 z 检验——这个比较是我们看到结果之后才选的——结果显示,在没有真实差异的情况下出现这么大差距的概率约为 7.5%,因此我们不能把它称为精度效应。各精度下答错的乘积都很接近,误差中位数不到 0.01%。
我们在 Cerebras 上把全部 280 个任务跑了两遍,两遍在每个任务上返回的文本完全一致。不同端点之间的细微差异可能来自精度,也可能来自各家提供商的硬件和推理软件,或者其他端点的运行间波动;在这个规模上,我们无法把它们区分开。Cerebras 是唯一的 fp16 端点,所以 fp16 没有第二个端点可供对比。
这项测试只覆盖一个模型、280 个任务和一天之内的六个端点。它并不能说明 4-bit 对每个模型或每种负载都安全,所以在把流量切到 4-bit 端点之前,请先测试你自己的提示词。
API 提供商提供的是哪种精度?
fp8 是最常见的标注精度,而大多数端点根本不报告精度。我们从端点 API 拉取了每个模型的端点,共返回 470 个模型下的 1,455 个端点。
| 报告的精度 | 端点数 | 占全部比例 | 占已标注比例 |
|---|---|---|---|
| 未知 | 865 | 59.5% | |
| fp8 | 343 | 23.6% | 58.1% |
| fp4 | 123 | 8.5% | 20.8% |
| bf16 | 70 | 4.8% | 11.9% |
| int4 | 20 | 1.4% | 3.4% |
| nvfp4 | 13 | 0.9% | 2.2% |
| mxfp4 | 12 | 0.8% | 2.0% |
| fp16 | 8 | 0.5% | 1.4% |
| fp32 | 1 | 0.1% | 0.2% |
来源:OpenRouter(openrouter.ai/api/v1/models/{author}/{slug}/endpoints),截至 2026 年 10 月 20 日。
865 个未知端点中有 610 个属于闭源权重模型,这些模型完全没有标注端点,包括所有 Claude 和 Gemini 模型,以及除 gpt-oss 之外的所有 OpenAI 模型。其余 255 个中,有 253 个属于提供商未标注精度的开源权重模型。163 个有标注端点的模型中,只有 54 个拥有 16-bit 端点,因此对大多数开源权重模型来说,8-bit 或 4-bit 是唯一有标注的选项。
量化端点更便宜吗?
通常如此,但并非总是。对每个模型,我们按输入 token 与输出 token 三比一的混合价格,比较了各精度下最便宜的端点。
| 对比 | 模型数 | 低精度更便宜 | 相差 2% 以内 | 低精度更贵 | 价格比中位数 |
|---|---|---|---|---|---|
| 8-bit 对 16-bit | 24 | 14 | 3 | 7 | 0.94 |
| 4-bit 对 8-bit | 33 | 26 | 3 | 4 | 0.76 |
| 4-bit 对 16-bit | 11 | 9 | 0 | 2 | 0.73 |
来源:OpenRouter 端点 API,含提供商折扣的标价,截至 2026 年 10 月 20 日。
以下是五个模型在各精度下最便宜的端点,单位为每百万混合 token 的美元价格。有两个例外:gpt-oss-120b 的 8-bit 比 16-bit 更贵,MiniMax M3 的 4-bit 比 8-bit 更贵。
| 模型 | 16-bit | 8-bit | 4-bit |
|---|---|---|---|
| Qwen3.8 27B | $0.581 | $0.342 | $0.140 |
| Kimi K2.6 | $1.400 | $1.079 | $0.825 |
| Gemma 4 31B | $0.205 | $0.200 | $0.160 |
| gpt-oss-120b | $0.067 | $0.100 | $0.060 |
| MiniMax M3 | 无 | $0.388 | $0.412 |
来源:OpenRouter 端点 API,截至 2026 年 10 月 20 日。
提供商对价格的影响比精度更大。当同一个模型在同一精度下有多个端点时,最贵的端点价格中位数是最便宜的 1.72 倍。以 Qwen3.8 27B 为例,十个 fp8 端点的价格从每百万混合 token 0.342 美元到 1.137 美元不等。要把请求发到通过你精度筛选的最便宜端点,可以在模型 slug 后加上 :floor,具体做法见我们的最低成本推理指南。加上 quantizations: [“fp8”] 后,qwen/qwen3.8-27b:floor 在我们两次尝试中都指向了 Chutes,也就是最便宜的 fp8 端点。
在我们的测试中,最便宜的完整 280 任务运行是 fp4,最贵的是 fp16,但中间的顺序并不遵循精度。一次运行在 Darkbloom(fp4)上花费 $0.58,在 AkashML(fp8)上 $0.72,在 ModelRun(fp4)上 $0.77,在 Parasail(fp8)上 $0.81,在 CoreWeave(fp8)上 $1.19,在 Cerebras(fp16)上 $1.24。速度也不遵循精度。Cerebras(fp16)和 ModelRun(fp4)的中位响应时间分别为 1.3 秒和 2.4 秒,而其他四个为 8.4 到 15.0 秒。在所有端点中,除 fp32(只有一个端点)外,每个标注精度的中位 24 小时正常运行时间均为 99.8% 或更高。
如何选择获得的精度?
查看模型的端点提供什么,然后在请求中设置 provider.quantizations。对 https://openrouter.ai/api/v1/models/qwen/qwen3.8-27b/endpoints 发起 GET 请求,会为每个端点返回一条记录,包含其量化、价格、上下文长度和正常运行时间。我们调用时无需 API 密钥即可响应,模型的 providers 标签页 显示相同的列表。对于 Qwen3.8 27B,它列出了 21 个端点,其中 1 个 bf16、1 个 fp16、10 个 fp8、3 个 fp4 和 6 个未知。在固定精度之前,请检查你想要精度的数量,因为该数量决定了当一个端点失败时有多少端点可以接管。
要将请求保持在 8 位或更高,请列出你接受的精度。
import os
import requests
response = requests.post(
"https://openrouter.ai/api/v1/chat/completions",
headers={"Authorization": f"Bearer {os.environ['OPENROUTER_API_KEY']}"},
json={
"model": "qwen/qwen3.8-27b",
"messages": [{"role": "user", "content": "What is the capital of Australia? One word."}],
"reasoning": {"enabled": False},
"provider": {"quantizations": ["fp8", "bf16", "fp16"]},
},
timeout=120,
)
data = response.json()
if "error" in data:
raise RuntimeError(data["error"])
print(data["provider"], data["choices"][0]["message"]["content"], f'${data["usage"]["cost"]:.6f}')我们运行了三次,每次运行都打印了相同的行。
Reka Canberra $0.000007
提供商路由量化文档 列出了所有接受的值,并解释了量化如何与 only、order 和 sort 结合使用。
quantizations 过滤端点列表。我们丢弃精度不在列表中的每个端点,然后 在其余端点之间进行负载均衡,权重偏向最低价格,如果提供商失败则回退到下一个端点。过滤器不保证每次都是同一个提供商,因此如果你跟踪质量,请记录响应的 provider 字段。文档还指出,fp4 包括 mxfp4 和 nvfp4,fp8 包括 mxfp8。

精度过滤器的常见问题及修复方法
过滤器在联系任何提供商之前运行,因此空候选列表会快速失败。向 Qwen3.8 27B 请求 int8(没有端点提供),在 0.4 秒内返回 404。
{"error":{"message":"No endpoints found for the request with quantization: int8. To learn more about provider routing, visit: https://openrouter.ai/docs/guides/routing/provider-selection","code":404,"metadata":{"routing_funnel":[{"step":"Initial Endpoints","endpoint_count":21}],"failed_routing_step":"Filter by Quantization"}}}routing_funnel 字段显示每个步骤后有多少端点存活,failed_routing_step 指出导致没有端点剩余的步骤。{“quantizations”: [“fp8”], “only”: [“cerebras”]} 返回相同的 404,并带有 quantization: fp8,因为 Cerebras 提供 fp16,所以漏斗从 21 个端点变为 1 个,再变为无。
较慢的失败发生在只有一个端点匹配时。Cerebras 是 Qwen3.8 27B 唯一的 fp16 端点。在我们的测试中,使用 allow_fallbacks: false 固定 Cerebras,前 280 个请求中有 93 个连续三次失败,并出现此错误(节选)。
{"message":"Provider returned error","code":429,"metadata":{"raw":"qwen/qwen3.8-27b is temporarily rate-limited upstream. Please retry shortly, or add your own key to accumulate your rate limits: https://openrouter.ai/settings/integrations","provider_name":"Cerebras","limit_source":"upstream_provider_shared_pool","retry_after_seconds":59}}我们重试它们,直到所有 280 个完成。单独使用 quantizations: [“fp16”] 会留下相同的单一候选,因此那里的速率限制无处可去。将列表扩大到 [“fp16”, “bf16”] 为路由器提供了第二个候选,相同的请求发往了 DeepInfra。
提供商失败也可能以 HTTP 200 状态 到达,因为我们在提供商接受请求后立即发送状态。检查响应体中的 error,而不仅仅是状态码。
使用 Exacto 按质量信号对端点排序
量化后的质量“取决于所用的方法”,而且每家提供商都运行自己的推理软件,所以两个标注相同的端点并不保证表现一致。对于带工具的请求,Auto Exacto 已经把吞吐量、工具调用成功率和基准分数较低的端点排到列表后面。要把这种排序应用到不带工具的请求上,只需在模型 slug 后加上 :exacto。Exacto 依据工具调用信号给端点排序,而不是依据它们在你任务上的准确率,所以请用你自己的提示词去测试你正在考虑的端点。如何评估 LLM 提供商的性能介绍了如何比较它们的延迟、吞吐量和正常运行时间。
常见问题
量化位数越高越好还是越低越好?
位数越多,保留的原始模型精度就越多,占用的内存也越多。在 2026 年 10 月 20 日对 Qwen3.8 27B 的测试中,我们在 240 个有确切答案的任务上,没有发现 fp8、fp4 和 fp16 端点之间存在准确率差异。但这只覆盖了一个模型、一天的情况,所以在正式采用 4-bit 之前,请先在自己的工作负载上测试。
为什么量化不会破坏 LLM 的准确率?
并非所有权重都同等重要。AWQ 发现,保护约 1% 最重要的权重就能大幅降低量化误差;LLM.int8() 则采用混合精度,把离群值保持在 16-bit,而超过 99.9% 的数值以 8-bit 相乘。我们对 Qwen3.8 27B 的测试无法显示各家提供商用的是哪种方法,但 fp16 端点漏掉了 240 个任务中的 3 个,fp8 和 fp4 端点则漏掉了 2 到 4 个。
什么时候应该对模型做量化?
当模型在 16-bit 下放不进你的硬件,或者你需要从同样的 GPU 获得更高吞吐量时,就该量化。在我们的测试中,没有发现 fp8 有精度损失,而且 fp8 对每个权重的舍入幅度比 4-bit 更小,所以它是更小的一步。请先在你自己的任务上测试其中任意一种。通过 API 使用时,你不需要自己量化模型,只需在 OpenRouter 上通过 provider.quantizations 选择一个提供你所需精度的端点。
提供商上的“unknown”量化是什么意思?
意思是该提供商没有报告这个端点的精度。在 OpenRouter 上,2026 年 10 月 20 日有 1,455 个端点中的 865 个为 unknown,其中 610 个属于 Claude、Gemini 等闭源权重模型。unknown 也是 provider.quantizations 中可接受的值,因此你可以选择包含或排除这些端点。
来源:OpenRouter:Announcements · openrouter.ai