![]()
vLLM 0.19.1 正式版發(fā)布了,這次是一個(gè)補(bǔ)丁版本,11 個(gè) cherry-pick,主題非常集中:把 Transformers v5 正式拉進(jìn)來(lái),然后把 Gemma 4 的一堆坑填上。
v0.19.0 對(duì) Gemma 4 做到了"發(fā)布當(dāng)天可用",但"可用"和"好用"之間差著不少 bug
這次 v0.19.1 就是來(lái)還債的,可以說(shuō)這是一個(gè) Gemma 4 專(zhuān)項(xiàng)修復(fù)版本
變更
類(lèi)型
一句話
Transformers v5 正式升級(jí)
生態(tài)
從兼容升級(jí)到正式依賴(lài)
Gemma 4 流式工具調(diào)用 JSON 損壞
修復(fù)
流式輸出時(shí)部分分隔符導(dǎo)致無(wú)效 JSON
Gemma 4 流式 HTML 重復(fù)
修復(fù)
工具調(diào)用后 HTML 內(nèi)容被重復(fù)輸出
Gemma 4 流式布爾/數(shù)字值損壞
修復(fù)
跨 chunk 的布爾和數(shù)字值被截?cái)?/p>
Gemma 4 推理解析 + 多輪工具調(diào)用
修復(fù)
推理解析器支持 adjust_request,修復(fù)多輪對(duì)話
Gemma 4 量化 MoE 支持
? 新功能
FP8 和 NVFP4 量化的 MoE 模型可以跑了
Gemma 4 Eagle3 推測(cè)解碼
? 新功能
支持隱藏狀態(tài)提取,可訓(xùn)練專(zhuān)屬草稿模型
Gemma 4 LoRA 適配器加載
修復(fù)
LoRA 加載路徑修正
Gemma 4 null 值轉(zhuǎn)字符串
修復(fù)
裸 null 被錯(cuò)誤轉(zhuǎn)為 "null" 字符串
Gemma 4 PT 模型 token 重復(fù)
修復(fù)
預(yù)訓(xùn)練模型缺失 BOS token 導(dǎo)致輸出重復(fù)
Kimi-K2.5 媒體占位符 token
修復(fù)
上游 config 和 tokenizer 的 ID 不一致
一、Transformers v5:從兼容到正式依賴(lài) ![]()
這個(gè) PR(#30566)從 2025 年 12 月就開(kāi)始做了,歷時(shí)四個(gè)多月終于合入。
HuggingFace Transformers v5 是一次大版本升級(jí),改了不少底層 API。
vLLM 作為最依賴(lài) Transformers 生態(tài)的推理引擎,這次升級(jí)涉及面很廣:
模型加載方式變了 :配置注冊(cè)、tokenizer 獲取路徑都有調(diào)整
部分模型暫不兼容 :比如 XVERSE 的 tokenizer 在 v5 下會(huì)報(bào)錯(cuò),暫時(shí)鎖定了
transformers<=4.57LoRA 加載路徑修復(fù) :適配器目錄下沒(méi)有
config.json時(shí)不再報(bào)錯(cuò)
v0.19.0 已經(jīng)做了大面積適配,但還是"兼容"狀態(tài)
v0.19.1 把 Transformers v5.5.4 正式拉進(jìn)依賴(lài)——如果你之前一直卡在 v4 不敢升,現(xiàn)在可以放心了
二、Gemma 4 工具調(diào)用:流式輸出的六連修
Gemma 4 的工具調(diào)用在 v0.19.0 發(fā)布時(shí)就能用,但流式場(chǎng)景下問(wèn)題一大堆:
Bug 1:部分分隔符導(dǎo)致無(wú)效 JSON(#38992)
Gemma 4 的工具調(diào)用格式用特殊分隔符標(biāo)記參數(shù)
流式輸出時(shí),一個(gè)分隔符可能被拆成兩個(gè) chunk 發(fā)出去
前半截分隔符被當(dāng)成普通文本輸出,后半截又被正確識(shí)別,導(dǎo)致最終拼出來(lái)的 JSON 是壞的
修復(fù)方式:在流式輸出中檢測(cè)并剝離不完整的分隔符字符。
Bug 2:工具調(diào)用后 HTML 內(nèi)容重復(fù)(#38909)
Gemma 4 在執(zhí)行工具調(diào)用后繼續(xù)生成 HTML 內(nèi)容時(shí),parser 內(nèi)部會(huì)從緩沖的 delta 重建 current_text,導(dǎo)致已經(jīng)發(fā)過(guò)的內(nèi)容被重復(fù)發(fā)送。
修復(fù)方式:停止從緩沖 delta 重建文本,直接使用原始流。
Bug 3:跨 chunk 的布爾/數(shù)字值被截?cái)啵?39114)
工具調(diào)用參數(shù)如果是 true、false 或數(shù)字,這些值可能跨兩個(gè) chunk 被拆開(kāi)。比如 tru 在第一個(gè) chunk,e 在第二個(gè) chunk,parser 把 tru 當(dāng)成了字符串。
修復(fù)方式:在流式模式下扣留冒號(hào)和后續(xù)空白字符,等值完整后再發(fā)送。
Bug 4:裸 null 被轉(zhuǎn)成字符串 "null"(#39679)
_parse_gemma4_value 函數(shù)處理了 true/false 的裸值,但漏了 null。結(jié)果 param:null 被解析成 {"param": "null"} 而不是 {"param": null}。
這會(huì)導(dǎo)致 tool_choice="auto" 和 tool_choice="
"
產(chǎn)生不一致的輸出——后者走了 guided decoding 能正確處理 JSON schema,前者不行。
修復(fù)方式:在值解析中補(bǔ)上 null 的處理。
Bug 5:多輪工具調(diào)用 + 推理模式修復(fù)(#39027)
這是最大的一個(gè)修復(fù),解決了多個(gè)問(wèn)題:
新增了 Gemma 4 專(zhuān)用 chat template,正確編碼工具結(jié)果,處理多輪對(duì)話中交替出現(xiàn)的工具調(diào)用和推理內(nèi)容
給 ReasoningParser 基類(lèi)添加了
adjust_request()方法——Gemma 4 用它來(lái)強(qiáng)制設(shè)置skip_special_tokens=False,保留邊界 token修復(fù)了流式推理中
thought\n前綴的剝離邏輯清理了 Anthropic Messages API 轉(zhuǎn)換中產(chǎn)生的空 user 消息
Gemma4ForCausalLM 加載 LoRA 適配器時(shí)路徑有誤,現(xiàn)已修正。想在 Gemma 4 上微調(diào)+部署的同學(xué),這個(gè)必須有。
? 老章說(shuō):這六個(gè) bug 放一起看,就能理解為什么 Gemma 4 的工具調(diào)用在 v0.19.0 發(fā)布時(shí)被那么多人吐槽。流式 + 工具調(diào)用 + 特殊分隔符,這三個(gè)東西疊在一起,邊界條件多到爆炸。如果你在用 Gemma 4 做 function calling,v0.19.1 是必升版本。三、Gemma 4 量化 MoE:顯存殺手終于被馴服了
Gemma 4 的 26B MoE 模型(實(shí)際激活 4B)跑起來(lái)并不重,但完整加載仍然需要不少顯存。v0.19.1 正式支持了量化 MoE:
FP8 動(dòng)態(tài)量化 (W8A8):RedHat 團(tuán)隊(duì)已經(jīng)發(fā)布了現(xiàn)成的量化模型 gemma-4-26B-A4B-it-FP8-Dynamic
NVFP4 量化 (W4A4):更激進(jìn)的壓縮,gemma-4-26B-A4B-it-NVFP4
對(duì)應(yīng)的 llm-compressor 也同步更新了,支持 Gemma 4 MoE 的專(zhuān)家級(jí)校準(zhǔn)和量化流程。
四、Gemma 4 Eagle3 推測(cè)解碼支持
上篇文章我詳細(xì)講了 vLLM v0.19.0 新增的隱藏狀態(tài)提取功能
v0.19.1 把這個(gè)能力擴(kuò)展到了 Gemma 4:
Gemma4Model繼承了EagleModelMixin,支持輔助隱藏狀態(tài)的逐層收集Gemma4ForCausalLM和Gemma4ForConditionalGeneration(多模態(tài)包裝器)都實(shí)現(xiàn)了SupportsEagle3接口在推測(cè)解碼配置驗(yàn)證的模型白名單中加入了
gemma4
這意味著你現(xiàn)在可以用上篇介紹的那套流程,為 Gemma 4 訓(xùn)練專(zhuān)屬的 Eagle3 草稿模型,實(shí)現(xiàn)定制化的推測(cè)解碼加速。
五、Gemma 4 PT 模型的 token 重復(fù)問(wèn)題
這個(gè) bug 專(zhuān)門(mén)針對(duì) Gemma 4 的預(yù)訓(xùn)練模型(不帶 -it 后綴的那些)
問(wèn)題根源:預(yù)訓(xùn)練模型沒(méi)有 chat template,走的是原始 completions 接口。但 Gemma 4 的 ProcessingInfo 默認(rèn)設(shè)置了 add_special_tokens=False——這個(gè)設(shè)置對(duì) IT(指令微調(diào))模型是對(duì)的,因?yàn)?chat template 渲染時(shí)已經(jīng)加了 BOS token。可 PT 模型沒(méi)有 template,BOS token 就丟了。
缺少 BOS token 的后果:模型輸出開(kāi)始瘋狂重復(fù)。
修復(fù)方式:動(dòng)態(tài)檢測(cè)模型是否有 chat_template,沒(méi)有的話自動(dòng)設(shè) add_special_tokens=True,確保 BOS token 被正確注入。
六、Kimi-K2.5 媒體占位符修復(fù)
這個(gè)跟 Gemma 4 無(wú)關(guān),但也值得提一嘴
月之暗面的 Kimi-K2.5 模型的 config.json 里,media_placeholder_token_id 寫(xiě)的是 163605,但 tokenizer 實(shí)際映射的 <|media_pad|> ID 是 163602
為什么不一致?因?yàn)?Kimi-K2.5 沒(méi)有附帶 tokenizer.json,Transformers 從 tiktoken 自動(dòng)轉(zhuǎn)換時(shí),特殊 token 的 ID 被悄悄壓縮了。
修復(fù)方式:在初始化時(shí)從 tokenizer 重新解析 token ID,如果和 config 不一致就自動(dòng)修正。
升級(jí)建議
如果你不用 Gemma 4,v0.19.0 到 v0.19.1 的變化對(duì)你幾乎沒(méi)有影響,可以按需升級(jí)
制作不易,如果這篇文章覺(jué)得對(duì)你有用,可否點(diǎn)個(gè)關(guān)注。給我個(gè)三連擊:點(diǎn)贊、轉(zhuǎn)發(fā)和在看。若可以再給我加個(gè),謝謝你看我的文章,我們下篇再見(jiàn)!
特別聲明:以上內(nèi)容(如有圖片或視頻亦包括在內(nèi))為自媒體平臺(tái)“網(wǎng)易號(hào)”用戶上傳并發(fā)布,本平臺(tái)僅提供信息存儲(chǔ)服務(wù)。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.