跳到正文
OpenRouter Announcements·· 10 小时前AI 评分58

OpenRouter 实测 fp8 与 fp4 量化对模型质量和价格的影响

LLM Quantization: What fp8 and fp4 Do to Quality and Price

AI 导读

OpenRouter 在 2026 年 10 月 20 日对 Qwen3.8 27B 的六个端点做了 240 道有确定答案的任务测试,未检测到 fp8、fp4 与 fp16 之间的准确率差异,各端点得分在 98.3% 到 99.2% 之间。

正文 · AI 翻译

当你通过 API 调用一个开放权重模型时,可能有多个提供商以不同的精度来提供它,例如 16 位 bf16、8 位 fp8 或 4 位 fp4。精度既会影响回答,也会影响价格。LLM 量化通过用更少的位数存储模型权重来生成这些版本,因此模型需要的内存和硬件更少,代价是精度有所损失。

本文解释这些格式,并报告我们于 2026 年 10 月 20 日在 OpenRouter 上对 1,455 个提供商端点以及服务 Qwen3.8 27B 的六个端点所做的测量结果。在我们的测试中,我们没有检测到 fp8、fp4 和 fp16 之间的精度差异,因此仅凭精度标签无法预测精度。更低的精度通常更便宜,但并非对每个模型都如此。

TL;DR

  • 在我们 240 个计分任务上,我们没有检测到 fp8、fp4 和 fp16 之间的精度差异。全部六个端点的得分在 98.3% 到 99.2% 之间。

  • 在另外 40 个乘法任务上,一个 fp4 端点得分最低,但差距太小,无法排除偶然因素。

  • 在同时提供两种精度的 24 个模型中,8 位对其中 14 个比 16 位更便宜,对 7 个更贵。在 33 个模型中,4 位对其中 26 个比 8 位更便宜。

  • provider.quantizations 会固定你获得的精度。列出你愿意接受的所有精度,这样路由器就有不止一个端点可以回退。

什么是 LLM 量化?

LLM 量化是指用比训练时更少的位数来存储大语言模型的数值。如今大多数 LLM 使用 FP16 或 BF16,它们是 16 位格式。fp8 将每个权重占用的内存减半,fp4 或 int4 将其降至四分之一,因此同一块 GPU 可以容纳更大的模型或服务更多请求。代价是精度,因为每个权重都会被舍入到更小格式所能存储的最近值。

格式每个权重的位数27B 模型的权重你会在哪里看到它
bf16 / fp161654 GB大多数模型发布时采用的精度
fp8827 GBOpenRouter 上最常见的标注精度
fp4、nvfp4、mxfp4、int4413.5 GB更便宜的端点、本地运行、部分实验室发布

这些数字仅涵盖权重。运行中的模型还需要为其 KV 缓存分配内存,即上下文中每个 token 所存储的注意力状态。

量化主要有两种类型。训练后量化转换已完成模型的权重。它可以是动态的,在运行时计算每个激活值的范围;也可以是静态的,通过将样本数据传入模型来预先计算这些范围。量化感知训练在训练期间模拟舍入,使权重学会容忍它。Hugging Face Optimum 概念指南对两者都有解释,而 Transformers 量化概览涵盖了你可以自行运行的量化方法。

fp8 与 bf16:有什么区别?

浮点格式将其位分配给符号、指数和尾数。指数决定值的范围,尾数决定该范围内值的分辨精细程度。

Bit layouts: bf16 has 1 sign, 8 exponent and 7 mantissa bits; fp16 has 1, 5 and 10; fp8 (E4M3) has 1, 4 and 3; fp4 (E2M1) has 1, 2 and 1.

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% 之间,而这一规模的测试无法排除一两个百分点的差距。

我们通过 qwen/qwen3.8-27b 运行了 280 个有精确答案的任务,固定到六个端点。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 Cerebrasfp8 Parasailfp8 CoreWeavefp8 AkashMLfp4 Darkbloomfp4 ModelRun
带解题过程的算术50484948494950
短代码追踪50505050505050
长代码追踪30302929292928
对 20 到 30 个数字排序30302929292930
4,000 token 召回20202020202020
20,000 token 召回20202020202020
四跳召回40394040403940
总计24098.8%98.8%98.3%98.8%98.3%99.2%
乘法,无解题过程40303331322630

来源: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 是最常见的已标注精度,而大多数端点根本不报告精度。我们从 endpoints API 拉取了每个模型的端点,共返回 470 个模型下的 1,455 个端点。

报告的精度端点数占全部比例占已标注比例
未知86559.5%
fp834323.6%58.1%
fp41238.5%20.8%
bf16704.8%11.9%
int4201.4%3.4%
nvfp4130.9%2.2%
mxfp4120.8%2.0%
fp1680.5%1.4%
fp3210.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-bit2414370.94
4-bit 对 8-bit3326340.76
4-bit 对 16-bit119020.73

来源:OpenRouter endpoints API,标价含提供商折扣,截至 2026 年 10 月 20 日。

以下是五个模型在各精度下最便宜的端点,单位为每百万混合 token 的美元价格。有两个例外。gpt-oss-120b 在 8-bit 下比 16-bit 下更贵,MiniMax M3 在 4-bit 下比 8-bit 下更贵。

模型16-bit8-bit4-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 endpoints 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

provider 路由量化文档 列出了所有接受的值,并解释了 quantizations 如何与 only、order 和 sort 结合使用。

quantizations 过滤端点列表。我们丢弃精度不在列表中的每个端点,然后在其余端点之间进行负载均衡,权重偏向最低价格,如果某个 provider 失败,则回退到下一个端点。过滤器中的任何内容都不保证每次都是同一个 provider,因此如果你跟踪质量,请记录响应的 provider 字段。文档还指出,fp4 包括 mxfp4 和 nvfp4,fp8 包括 mxfp8。

Routing flow: all endpoints for the model are filtered by allowed providers (only), then by quantization (quantizations), returning 404 No endpoints found if none are left. The remaining endpoints are load-balanced, and on an error OpenRouter tries the next endpoint (allow_fallbacks).

精度过滤器的常见问题及修复方法

过滤器在联系任何 provider 之前运行,因此空候选列表会快速失败。向 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。

provider 失败也可能以 HTTP 200 状态到达,因为我们在 provider 接受请求后立即发送状态。检查响应体中的 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