打开网易新闻 查看精彩图片

vLLM 0.19.1 正式版发布了,这次是一个补丁版本,11 个 cherry-pick,主题非常集中:把 Transformers v5 正式拉进来,然后把 Gemma 4 的一堆坑填上。

v0.19.0 对 Gemma 4 做到了"发布当天可用",但"可用"和"好用"之间差着不少 bug

这次 v0.19.1 就是来还债的,可以说这是一个 Gemma 4 专项修复版本

变更

类型

一句话

Transformers v5 正式升级

生态

从兼容升级到正式依赖

Gemma 4 流式工具调用 JSON 损坏

修复

流式输出时部分分隔符导致无效 JSON

Gemma 4 流式 HTML 重复

修复

工具调用后 HTML 内容被重复输出

Gemma 4 流式布尔/数字值损坏

修复

跨 chunk 的布尔和数字值被截断

Gemma 4 推理解析 + 多轮工具调用

修复

推理解析器支持 adjust_request,修复多轮对话

Gemma 4 量化 MoE 支持

✨ 新功能

FP8 和 NVFP4 量化的 MoE 模型可以跑了

Gemma 4 Eagle3 推测解码

✨ 新功能

支持隐藏状态提取,可训练专属草稿模型

Gemma 4 LoRA 适配器加载

修复

LoRA 加载路径修正

Gemma 4 null 值转字符串

修复

裸 null 被错误转为 "null" 字符串

Gemma 4 PT 模型 token 重复

修复

预训练模型缺失 BOS token 导致输出重复

Kimi-K2.5 媒体占位符 token

修复

上游 config 和 tokenizer 的 ID 不一致

打开网易新闻 查看精彩图片

这个 PR(#30566)从 2025 年 12 月就开始做了,历时四个多月终于合入。

HuggingFace Transformers v5 是一次大版本升级,改了不少底层 API。

vLLM 作为最依赖 Transformers 生态的推理引擎,这次升级涉及面很广:

  • 模型加载方式变了 :配置注册、tokenizer 获取路径都有调整

  • 部分模型暂不兼容 :比如 XVERSE 的 tokenizer 在 v5 下会报错,暂时锁定了 transformers<=4.57

  • LoRA 加载路径修复 :适配器目录下没有 config.json 时不再报错

v0.19.0 已经做了大面积适配,但还是"兼容"状态

v0.19.1 把 Transformers v5.5.4 正式拉进依赖——如果你之前一直卡在 v4 不敢升,现在可以放心了

二、Gemma 4 工具调用:流式输出的六连修

Gemma 4 的工具调用在 v0.19.0 发布时就能用,但流式场景下问题一大堆:

Bug 1:部分分隔符导致无效 JSON(#38992)

Gemma 4 的工具调用格式用特殊分隔符标记参数

流式输出时,一个分隔符可能被拆成两个 chunk 发出去

前半截分隔符被当成普通文本输出,后半截又被正确识别,导致最终拼出来的 JSON 是坏的

修复方式:在流式输出中检测并剥离不完整的分隔符字符。

Bug 2:工具调用后 HTML 内容重复(#38909)

Gemma 4 在执行工具调用后继续生成 HTML 内容时,parser 内部会从缓冲的 delta 重建 current_text,导致已经发过的内容被重复发送。

修复方式:停止从缓冲 delta 重建文本,直接使用原始流。

Bug 3:跨 chunk 的布尔/数字值被截断(#39114)

工具调用参数如果是 truefalse 或数字,这些值可能跨两个 chunk 被拆开。比如 tru 在第一个 chunk,e 在第二个 chunk,parser 把 tru 当成了字符串。

修复方式:在流式模式下扣留冒号和后续空白字符,等值完整后再发送。

Bug 4:裸 null 被转成字符串 "null"(#39679)

_parse_gemma4_value 函数处理了 true/false 的裸值,但漏了 null。结果 param:null 被解析成 {"param": "null"} 而不是 {"param": null}

这会导致 tool_choice="auto"tool_choice=" " 产生不一致的输出——后者走了 guided decoding 能正确处理 JSON schema,前者不行。

修复方式:在值解析中补上 null 的处理。

Bug 5:多轮工具调用 + 推理模式修复(#39027)

这是最大的一个修复,解决了多个问题:

  • 新增了 Gemma 4 专用 chat template,正确编码工具结果,处理多轮对话中交替出现的工具调用和推理内容

  • 给 ReasoningParser 基类添加了 adjust_request() 方法——Gemma 4 用它来强制设置 skip_special_tokens=False ,保留边界 token

  • 修复了流式推理中 thought\n 前缀的剥离逻辑

  • 清理了 Anthropic Messages API 转换中产生的空 user 消息

Bug 6:LoRA 适配器加载失败(#38844)

Gemma4ForCausalLM 加载 LoRA 适配器时路径有误,现已修正。想在 Gemma 4 上微调+部署的同学,这个必须有。

❝ 老章说:这六个 bug 放一起看,就能理解为什么 Gemma 4 的工具调用在 v0.19.0 发布时被那么多人吐槽。流式 + 工具调用 + 特殊分隔符,这三个东西叠在一起,边界条件多到爆炸。如果你在用 Gemma 4 做 function calling,v0.19.1 是必升版本。
三、Gemma 4 量化 MoE:显存杀手终于被驯服了

Gemma 4 的 26B MoE 模型(实际激活 4B)跑起来并不重,但完整加载仍然需要不少显存。v0.19.1 正式支持了量化 MoE:

  • FP8 动态量化 (W8A8):RedHat 团队已经发布了现成的量化模型 gemma-4-26B-A4B-it-FP8-Dynamic

  • NVFP4 量化 (W4A4):更激进的压缩,gemma-4-26B-A4B-it-NVFP4

对应的 llm-compressor 也同步更新了,支持 Gemma 4 MoE 的专家级校准和量化流程。

四、Gemma 4 Eagle3 推测解码支持

上篇文章我详细讲了 vLLM v0.19.0 新增的隐藏状态提取功能

v0.19.1 把这个能力扩展到了 Gemma 4:

  • Gemma4Model 继承了 EagleModelMixin ,支持辅助隐藏状态的逐层收集

  • Gemma4ForCausalLMGemma4ForConditionalGeneration (多模态包装器)都实现了 SupportsEagle3 接口

  • 在推测解码配置验证的模型白名单中加入了 gemma4

这意味着你现在可以用上篇介绍的那套流程,为 Gemma 4 训练专属的 Eagle3 草稿模型,实现定制化的推测解码加速。

五、Gemma 4 PT 模型的 token 重复问题

这个 bug 专门针对 Gemma 4 的预训练模型(不带 -it 后缀的那些)

问题根源:预训练模型没有 chat template,走的是原始 completions 接口。但 Gemma 4 的 ProcessingInfo 默认设置了 add_special_tokens=False——这个设置对 IT(指令微调)模型是对的,因为 chat template 渲染时已经加了 BOS token。可 PT 模型没有 template,BOS token 就丢了。

缺少 BOS token 的后果:模型输出开始疯狂重复。

修复方式:动态检测模型是否有 chat_template,没有的话自动设 add_special_tokens=True,确保 BOS token 被正确注入。

六、Kimi-K2.5 媒体占位符修复

这个跟 Gemma 4 无关,但也值得提一嘴

月之暗面的 Kimi-K2.5 模型的 config.json 里,media_placeholder_token_id 写的是 163605,但 tokenizer 实际映射的 <|media_pad|> ID 是 163602

为什么不一致?因为 Kimi-K2.5 没有附带 tokenizer.json,Transformers 从 tiktoken 自动转换时,特殊 token 的 ID 被悄悄压缩了。

修复方式:在初始化时从 tokenizer 重新解析 token ID,如果和 config 不一致就自动修正。

升级建议

如果你不用 Gemma 4,v0.19.0 到 v0.19.1 的变化对你几乎没有影响,可以按需升级

制作不易,如果这篇文章觉得对你有用,可否点个关注。给我个三连击:点赞、转发和在看。若可以再给我加个,谢谢你看我的文章,我们下篇再见!