將Kimi K3分詞速度提升18倍,用於百萬令牌的代理工作負載
Baseten推出了新的分詞器(Basetenkenizer),將Kimi K3的分詞速度提升多達18倍,適用於百萬令牌的代理工作負載。它結合了基於Rust的優化技術,包括專用預分詞、BPE合併、多核分塊和零拷貝NumPy傳輸,同時保持與tiktoken完全一致的令牌ID。這一改進顯著降低了長輸入序列的首令牌時間,尤其是在前綴緩存命中率高的情況下。
多年來,推理工程師一直可以忽略分詞時間,因為它通常只佔幾毫秒,遠小於預填充和解碼所需的時間。然而,隨着Kimi K3等開放前沿模型出現,情況發生了根本性變化。這些模型支持多達一百萬個令牌的輸入序列,這在代理工作負載中越來越常見——代理循環會反覆將工具結果、觀察結果、檢索文檔、中間狀態、推理軌跡和更新指令追加到下一個請求中。當輸入序列長度和前綴緩存命中率迅速增加時,分詞時間不再可以忽略。
為了解決這個問題,Baseten構建了Baseten Tokenizer(Basetenkenizer),首先針對Kimi K3進行了優化。在Baseten推理棧中,我們從自定義的Python tiktoken實現遷移到了基於Rust的Basetenkenizer。在最需要分詞時間的長輸入序列上,完整的服務路徑比tiktoken快了多達18倍,同時保持了精確的令牌ID一致性。
Kimi K3的分詞並非易事。它使用byte-pair encoding(BPE)詞彙表和用於結構令牌的正則表達式預分詞。在結構化部分,字符串如</s>應編碼為控制令牌;而在用户或工具文本中,相同字符串必須作為普通文本處理。舊的令牌處理器通過將聊天渲染成分段來實現區分:每個分段有allow_special標誌。Basetenkenizer接受有序的(text, allow_special)分段,一次原生調用返回令牌數組,避免了Python/原生邊界的大量開銷。
性能提升來自多項優化:專用預分詞掃描器可以提前識別Kimi的分割正則表達式模式並派發到手寫函數,避免了通用正則引擎的開銷;棧駐留BPE合併層對短預令牌使用棧分配鏈表,避免堆和優先級隊列開銷;多核語義將相同預令牌路由到同一CPU核心,實現緩存複用;還有原生類型分段和安全分塊、零拷貝NumPy所有權轉移以及智能指針PyO3綁定等。
基準測試結果顯示了顯著進展。在54個類型分段的Kimi K3聊天提示上,我們比較了Baseten Tokenizer與tiktoken、fastokens和gigatoken。對於長輸入序列,Baseten Tokenizer在端到端編碼中領先,百萬令牌序列上比tiktoken快18倍,比gigatoken快1.41倍。值得注意的是,gigatoken在離線文件處理方面表現出色,但Baseten Tokenizer專為在線服務從已渲染分段進行分詞而優化。
總之,Baseten Tokenizer為Kimi K3的在線服務提供了一條顯著更快的路徑,尤其在高前綴緩存命中率的長上下文代理工作負載中,每次分詞時間的節省會在多個回合中累積,從而提升用户體驗。