将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的在线服务提供了一条显著更快的路径,尤其在高前缀缓存命中率的长上下文代理工作负载中,每次分词时间的节省会在多个回合中累积,从而提升用户体验。