Gigatoken:一款 Rust BPE 分词器,编码速度高达 24.53 GB/s,比 HuggingFace Tokenizers 快 989 倍
Gigatoken 是斯坦福博士生 Marcel Rød 开发的一款 MIT 许可的 Rust BPE 分词器,在 144 核 AMD EPYC 9565 上以 24.53 GB/s 的速度对 GPT-2 进行分词,比 HuggingFace tokenizers 快 989 倍,比 tiktoken 快 681 倍。其速度提升并非来自更快的 BPE 合并循环,而是来自手写的 SWAR 预分词器和预分词缓存。支持 23 种分词器家族,但 SentencePiece 词汇表的速度提升仅为 7–22 倍。兼容模式可保持精确输出一致,但速度约为 200–300 倍。
分词是语言模型堆栈中几乎无人关注性能的部分。斯坦福博士生 Marcel Rød 以 MIT 许可发布了 Gigatoken,旨在纠正这一疏忽。该库在单台机器上以每秒数 GB 的速度编码文本,而对比的基线已经是用多线程 Rust 编写的。
在 GPT-2 分词器基准测试中,Gigatoken 在 144 核 AMD EPYC 9565 双路系统上处理 11.9 GB 的 owt_train.txt 语料库,速度高达 24.53 GB/s。相比之下,OpenAI 的 tiktoken 速度为 36.0 MB/s,HuggingFace tokenizers 为 24.8 MB/s,分别慢 681 倍和 989 倍。在 Apple M4 Max 上,速度达到 8.79 GB/s,是 HuggingFace tokenizers 的 1268 倍,tiktoken 的 140 倍。在消费级 AMD Ryzen 7 9800X3D 上,速度为 6.27 GB/s,分别是 106 倍和 68 倍。
Gigatoken 是一种用 Rust 编写、支持 Python 绑定的字节对编码(BPE)分词器,可以通过 pip install gigatoken 安装。其基准测试涵盖 23 种不同的分词器家族,包括 GPT-2、Llama 3 到 4、Qwen 2 到 3.6、DeepSeek V3/R1/V4 等。提供两种使用模式:兼容模式包装现有的 HuggingFace 或 tiktoken 分词器,保持精确输出一致,但由于 Python 开销,速度仅约为 200–300 倍;原生 Gigatoken API 让 Rust 直接读取文件,达到公布的最高速度。
速度提升并非来自更快的 BPE 合并循环,而是来自两个方面。第一,预分词化:大多数实现依赖正则引擎,而 Gigatoken 手工编写了预分词器。通过优化,单线程吞吐从 47 MiB/s 提升到 1049 MiB/s。第二,预分词缓存:重复出现的单词直接查找编码结果,避免了重复计算。作者坦诚记录了失败的优化尝试,如热/冷代码分裂和两次遍历分类缓冲区,这些尝试因额外开销而被还原。
基准测试并非完全公平:Gigatoken 编码整个未分割的文件,自动寻找文档边界并并行化;而 HuggingFace 和 tiktoken 在预分割的数据上测速,且未使用缓存。SentencePiece 词汇表的速度提升仅为 7–22 倍,不如 BPE 显著。独立验证(KrabArena)在 4 vCPU 虚拟机上确认了结果:Gigatoken 中位数 277.8 MB/s,是 tiktoken 的 26.2 倍。
Gigatoken 验证了 35,356 个文档,其性能趋势随核心数增加而扩展。该库已发布在 PyPI,版本 0.9.0。更多信息请见 GitHub 仓库。