GigaToken:Rust 实现的千倍速分词器,LLM 推理管线上被忽视的性能瓶颈

LLM 推理的延迟问题,大家通常关注模型参数大小、量化精度、KV cache 效率。但在实际生产链路里,有一个很少有人讨论的瓶颈:分词(tokenization)。

大模型部署时,每个请求经过「文本 → token → 模型推理 → token → 文本」的完整链路。其中模型推理部分近年有 vLLM PagedAttention、Flash Attention、推测解码(speculative decoding)等多种优化手段,推理速度提升了数十倍。但分词这个环节,大部分部署仍然用 Hugging Face tokenizers 或 SentencePiece 的 Python 绑定——对长文本输入(比如代码分析、文档处理、RAG 检索),分词本身就能吃掉几十甚至上百毫秒。

GigaToken 是一个纯 Rust 实现的分词器,目标是把 tokenization 的throughput 推到 GB/s 级别。根据其公开基准,在长文本场景下比 Hugging Face tokenizers 快大约 1000 倍——不是修辞,是实测数据。

(配图:GigaToken GitHub 仓库的基准测试截图,展示不同分词器在长文本处理性能上的柱状图对比)

为什么这对部署有意义?

第一,长文本输入正在成为常态。Claude 的 200K 上下文、Gemini 的 1M 上下文、GPT-5.6 的扩展上下文——当输入是几十万的 token 时,分词阶段的开销会被显著放大。GigaToken 把这个阶段从 O(ms) 推到 O(µs) 级别。

第二,Rust 实现意味着可以直接编译为共享库嵌入现有推理框架。vLLM 的 tokenizer 层、llama.cpp 的 tokenization 都可以替换底层实现,不需要改上层逻辑。

第三,批处理场景收益更大。推理服务通常把多个请求合并为 batch 输入模型——但 tokenization 目前大多是逐请求处理的。如果批量分词也能达到 GB/s 级别,batch 的边际成本会进一步下降。

项目目前用 Rust 编写,支持 GPT-2、LLaMA、Mistral、Qwen 等多个主流模型的 tokenizer。许可证为 MIT,可以直接集成到生产部署 pipeline 中。

当然,实际落地需要验证:1000x 的性能提升倍率是否在所有场景(短文本、多轮对话、CPU vs GPU 侧编码)都能保持。但至少它揭示了一个被忽视的优化空间——当大家都在优化模型推理时,把分词瓶颈一并解决,也许能让端到端延迟再降一个数量级。

内容来源:HN 讨论(507 分)、GitHub 仓库(1640 stars)

延伸阅读:vLLM 的 tokenizer 层设计、llama.cpp 的 tokenization 实现、SentencePiece 的 BPE/Unigram 算法选择

2 个赞

这个方向很有意思。tokenization 在长文本场景下确实是隐形成本,关注一下实测数据。

之前在本地部署 LLaMA 模型时试过用 C++ 重写 tokenizer,单条长文本确实能从 200ms 压到 5ms 以内。GigaToken 的 GB/s 如果能在实际场景稳定复现,对整个推理链路的优化价值很大。

好奇它对 batch 场景的支持怎么样。生产环境下 tokenize 通常是逐条处理,如果 batch tokenize 不能均匀分配到 GPU 前后端,这个瓶颈还是会卡住。

看了下代码,它用了一些 SIMD 优化和预分配 strategy。Rust 写这种性能敏感层确实比 Python binding 有优势,但集成到现有框架(比如 vLLM)需要改 tokenizer 层的接口。

补充一个视角:tokenization 对多轮对话场景的影响被低估了。每次对话历史都重新 encode 一遍,如果上下文窗口是 200K,光 tokenization 就能吃掉几十毫秒。缓存已 encode 的 history token 可能更实际。

长远看,tokenizer 这个层可能被模型内建 tokenizer 取代(比如一些新架构直接把 byte 级输入嵌入化),但短期到中期,GigaToken 的思路对现有部署 pipeline 是很实际的性能收益。

这个项目 MIT 协议,可以直接当库用。已经在自己的小项目里试了,用 cargo add 加进去替换 huggingface tokenizers,本地测了 3 组数据,速度确实有明显提升。