本地部署的大模型常常比官方在线版本表现差——即便权重、显卡一模一样,推理栈的细微差别也能把输出彻底打乱。这个问题的根源在于,模型最终选token靠的是logits——一系列经过矩阵乘法、注意力计算和激活函数得出的浮点数。理论上相同权重和输入应产生相同logits,但浮点运算精度、累加顺序和底层指令差异会造成微小漂移;当漂移足以改变最高概率的那个token时,行为就出现分歧,甚至导致工具调用失败。
在一次系统性实验中,论坛用户 thr3e 用 Qwen3.6-27B 在 RTX PRO 6000 Blackwell 上对超过十万 token 的真实 Agent 工作流做了全量 logits 捕获。实验强调这一输入并非公开基准或训练集中数据,无法被预先针对性优化。研究中每隔 32 token 采样一次全词表 logits,并用 FP64 计算 KL 散度与 Top-1 一致性,结果揭示了“Top-1 翻转”现象:仅切换注意力后端,就会选出不同的贪心解码 token。
注意力后端的差异是一个关键因素。vLLM 为 Qwen3.6-27B 提供 FlashAttention 2、Flash Inference 和 Triton 三种全注意力后端。实验在保持硬件、操作系统、驱动、权重与 KV 缓存精度不变的情况下,仅改变后端配置。前几千 token 三个后端输出完全一致,但随着上下文变长,分歧开始出现且分布不均匀。比如某次工具调用中,模型本应操作接口 GigabitEthernet0/0/1.201,但因为后端不同产生了错误的接口标识,随后的多次调用连锁出错。重复性对照显示,同一后端多次运行内部是逐位相同的,这表明差异来自不同 CUDA 核函数在 prefill 阶段执行矩阵运算与累加时产生的数值偏差。
KV 缓存的量化也会造成“智商断崖式”下跌。当把权重保持为 BF16、注意力后端固定为 Triton,仅切换 KV 缓存精度为 BF16、INT8、INT4 时,结果显示 INT4 的 Top-1 翻转率在长上下文里急剧上升,导致工具调用不可恢复性失败;INT8 虽有翻转,但最终能挣扎回正轨;只有 BF16 全程稳定。换言之,为了省显存把 KV 缓存压到 INT4 的本地部署在长对话或复杂 agent 工作流中极易累积数值漂移并触发致命错误。
在权重量化对比中(KV 缓存统一 BF16),实验比较了五种权重量化方案:Qwen 官方 BF16 基线、Qwen 的 FP8(W8A8)、TheHouseOfTheDude 的一次性 INT8(W8A16、无校准)、英伟达的 NVFP4,以及 cyankiwi 的 AWQ INT4(W4A16、有校准数据集)。这些方案分别调用不同的 CUDA 核函数:BF16 走常规 torch 线性层,FP8 用 CUTLASS 的 FP8 缩放核,INT8 与 AWQ 多走 Marlin 核,而 NVFP4 则是混合路径(部分用 FlashInfer 的 FP8 缩放核、部分用 Marlin 的 NvFp4 核)。在这组对比中,英伟达的 NVFP4 表现最差,整体鲁棒性落后于其他方案。总体结论是,不同的后端实现和量化策略会通过微小的数值差异在长上下文中被放大,成为本地部署表现不如官方版本的主要原因。
发表评论