將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的線上服務提供了一條顯著更快的路徑,尤其在高字首快取命中率的長上下文代理工作負載中,每次分詞時間的節省會在多個回合中累積,從而提升使用者體驗。