Gigatoken:一个斯坦福博士生把 BPE 分词器写到了 24.53 GB/s

2026 年 7 月 22 日,Hacker News 首页挂了一个 Rust 分词器,615 points,119 条评论。标题数字让人怀疑浏览器渲染错了:比 HuggingFace tokenizers 快 989 倍。

评论区没怎么撕数字真假,撕的是”这数字有用吗”。

一个典型的反对声音来自 Amdahl 定律:标准 GPU 推理里,tokenization 占不到 0.1% 的 wall time。把字车加速 1000 倍,整趟高铁不会快一秒。这个逻辑没错。但当你把视野从”单次推理请求”拉宽到”预训练数据管线”和”长上下文 Agent 推理”,计算就完全不一样了。在双路 AMD EPYC 9565 上,Gigatoken 能把 Common Crawl 的 130 万亿 token 在 7 小时内处理完。HuggingFace tokenizers 需要几个月。

Gigatoken:一个斯坦福博士生把 BPE 分词器写到了 24.53 GB/s

Stanford 博士生 Marcel Rød 花了多少时间在这上面,我不确定。但从他的优化日志来看,从 SIMD 指令到 CPU 缓存层级到 Python 交互边界清理,每一步都是一线系统工程师的思路。他的 FAQ 里有一句话很说明态度:别人问他是不是过度优化了某个特定 CPU 和 tokenizer 的组合才调出了漂亮数字,他说不是——他对每种组合都做了过度优化。说白了这篇文章就想讲清楚一件事:Gigatoken 到底把什么做对了,以及你到底什么时候应该换掉现在的分词器。

它到底快在哪里

989 倍这个数字容易让人以为 Gigatoken 只是拿一个纯 Python 实现去比。不是。它的对标对象——HuggingFace tokenizers 和 tiktoken——本身就是 Rust 写的,已经比纯 Python 快了几十倍。在已经编译优化过的基线上再榨出两个数量级,靠的不是换语言,是换架构。

第一个突破口在预分词。传统的 BPE 分词器用正则引擎把文本切分成词块,这一步看似简单,但在 GB 级数据上,正则匹配本身就拖后腿。Gigatoken 直接丢掉正则,上了 SIMD 指令:AVX-512 在 x86、NEON 在 ARM,一次处理多个字节而不是逐字符扫描。代码层面,作者用了无分支的 SWAR 风格字节扫描和双指针指令级并行,把预分词从 O(n) 字符逐一处理降到了 O(n/k),k 是向量宽度。在 512 位宽的 AVX-512 上,这相当于一次处理 64 个字节。

第二个突破口在缓存。预分词的结果映射到 token ID 这一步,传统做法每次都要跑一遍 BPE 合并算法。但真实文本的分词分布是严重长尾的——少数高频词块覆盖了绝大多数 token。Gigatoken 维护了一个预分词到 token 的缓存映射,命中后直接 O(1) 查表,跳过 O(k log k) 的合并计算。作者在 FAQ 里直言缓存设计是整个项目最难的部分:词表增长太快,长尾又太长,缓存没设计好反而会成为新瓶颈。最终方案是用多层缓存结构对不同频率的词块分级处理,高频词块常驻低延迟缓存,低频词块走更慢但容量更大的层级。

第三个是 Python 边界的清理。HuggingFace tokenizers 和 tiktoken 每次 encode 都要穿越 Python-Rust 边界传递数据,在 GB/s 吞吐下这是严重的序列化开销。Gigatoken 的 native API 直接让 Rust 端读取文件、分配内存、并行编码。内部用 Rayon 做数据并行,大文档自动分片后多核同时编码,线程间零通信。Python 只负责发指令和收结果,避免了数千次跨语言调用的累积延迟。

这三个优化叠在一起,在双路 AMD EPYC 9565(144 核)上跑出了 GPT-2 分词 24.53 GB/s 的成绩。作为对比,HuggingFace tokenizers 在同一数据集上是 24.8 MB/s。24.53 GB/s 意味着 Common Crawl 的 130 万亿 token 能在 7 小时内处理完。

额外提一句,Gigatoken 支持 23 个主流模型家族的 tokenizer,覆盖了 GPT-2、Llama 3/4、Qwen 2/3、DeepSeek V3/V4/R1、Phi-4、GLM 4/5、Kimi K2、ModernBERT、Gemma 等。兼容模式可以直接作为 HuggingFace tokenizers 或 tiktoken 的 drop-in 替换,输出 token ID 在已验证的配置下与原始库完全一致。

但 SentencePiece 模型就没这么好看。Llama 1/2、T5、Gemma 用的 unigram tokenization 而不是 BPE,Gigatoken 的优化策略不兼容。Mistral 7B v0.3 只快了 10 倍,Gemma 3 只有 9.6 倍。换句话说,Gigatoken 的快是精确瞄准 BPE 来的,不是万能加速器。如果你的模型栈全是 SentencePiece 系的,迁移回报道常不值得。

写了这么多理论上的快,实际跑起来是什么感觉?

上手什么感觉

安装就一行,pip 直接拉最新版:

pip install gigatoken

兼容模式是三行代码的事,.as_hf() 返回一个接口完全兼容 HuggingFace tokenizers 的对象:

import gigatoken as gt

tokenizer = gt.Tokenizer("Qwen/Qwen3-8B").as_hf()
tokens = tokenizer.encode_batch(["Hello world""Another text"])

如果你想直接测它的真实吞吐量,Gigatoken 内置了 bench 子命令,不需要写任何 Python:

wget https://huggingface.co/datasets/stanford-cs336/owt-sample/resolve/main/owt_train.txt.gz
gunzip owt_train.txt.gz
uvx --with tokenizers gigatoken bench 'openai-community/gpt2' owt_train.txt --validate --doc-separator "<|endoftext|>"

--validate 是关键:它不仅计时,还会让 HuggingFace tokenizers 对同一批文档编码,逐项比对 token ID。在已测试的配置下,输出是完全一致的。

不过有几个地方需要心里有数。Windows 测试不足,官方建议用 WSL。文件输出还没实现,native API 只能输出到内存。WordPiece 不支持。如果项目用的是 Gemma 或 Mistral 这类 SentencePiece 系模型,加速幅度只有十几倍而不是几百倍,投入产出的账要重新算。

另外兼容模式(.as_hf() 和 .as_tiktoken())有额外开销,性能比 native API 低不少。如果你只是想 import 一行替换看看效果,先别拿兼容模式的数字去比 README 的 benchmark——那是对 native API 测的。

Gigatoken:一个斯坦福博士生把 BPE 分词器写到了 24.53 GB/s

运行 gigatoken bench 的典型输出。--validate 模式下会自动对比 HuggingFace tokenizers 的结果。

上手感觉说清楚了,但换不换这个工具,最终取决于你的具体场景。

什么时候用,什么时候别用

场景 典型用户 优势 局限
预训练数据管线 ML 团队、研究机构 多日预处理变几小时,迭代速度质变 依赖 native API,不能用 .as_hf()
大规模文档批量编码 搜索引擎、语料库 24.53 GB/s 吞吐,饱和利用 CPU 核 需 x86/ARM 现代 CPU
长上下文 Agent 推理 Agent 框架开发者 TTFT 降低 5-18%,大上下文显著 标准短文本推理无感,SentencePiece 模型无效
Token 计数和路由 API 网关、路由系统 高吞吐 token 计数,零延迟预算 还缺文件输出功能
标准 GPU 推理服务 SaaS 公司、推理平台 近乎没有可见收益 token 化占比太低,换了白换

不适用的情况:你的推理服务主要是短文本对话,tokenization 在总耗时里占比不到 0.1%,换不换不影响 P99 延迟。你的模型全部基于 SentencePiece(如 Google 系模型),Gigatoken 只给 10-15 倍加速,迁移成本会放大。你在 Windows 裸机跑生产,需要自己踩兼容性的坑。

场景定了,接下来得看项目本身的健康状况——一个单人维护、上线不到一个月的项目,能不能放心用?

社区怎么样了

指标 数据 说明
Stars 约 3,300(截至 2026 年 8 月) 7 月 21 日发布,首日冲上 HN 首页,三天破千
核心维护者 1 人 Bus Factor 高风险。Marcel Rød 是唯一维护者,Stanford PhD 在读
协议 MIT 商业友好,无使用限制

这个项目的社区健康度得分开看。代码质量和工程决策上,Marcel Rød 的优化日志和设计文档质量相当高——从他公开的 pretokenizer_optimization_log.md 和 design_doc.md 来看,每个优化决策都有 benchmark 数据支撑,不是拍脑袋改的。368 次 commit、11 次 release(从 0.4.0 到 0.10.0 只用了 10 天),迭代节奏可以用”密集”形容。

但 Bus Factor 是 1。一个博士生维护的高性能基础库,如果他毕业进了大厂或者兴趣转向,这个项目的后续就悬了。好消息是 Swift、Ruby、llama.cpp 三个语言在发布 72 小时内就有了社区移植,说明核心思路的吸引力是成立的。

HackerNews 上最尖锐的质疑来自一位用户,大意是”你在跟一个不公正的 baseline 比”:Gigatoken 把整个 11.9 GB 文件当做一个文档给 native API 编码,HuggingFace 只测了前 100 MB 且预先切分。作者随后在 FAQ 里确认对比方法有差异,但也强调验证了两种 tokenizer 在同一批文档上的输出一致性。一位 cnblogs 博主独立复现后总结得比较直白:数字本身是真实的,但”1000 倍,只有用它完全不同的接口设计时才能达到”。

社区的状况摊开看了,接下来聊点更实际的:我的判断到底是什么。

我的真实看法

Gigatoken 做的不是”又比别人快一点”,是把 BPE 分词这个大家以为已经优化到头的问题,重新从 CPU 架构层面做了一遍。

表面上看这只是一个分词器加速。但往下挖一层,你会发现它验证了一个更根本的假设:现代 CPU 的 SIMD 指令和缓存体系在很多”已被 Rust 优化过”的基础库上仍然有惊人的性能洼地。作者在优化日志里提到,最后一轮 profiling 帮他榨出了大约 4 倍的额外性能——从消除 CPU 分支预测失败和优化缓存命中率来的。说实话,这种级别的优化在开源项目里不常见,尤其是单人做的。大多数分词器项目的性能优化停在了”换 Rust 重写”这一步,Gigatoken 是从”Rust 已经很快了”继续往前推了三大步。

但我对它的长期判断有两个很重要的保留。

一个是维护风险。一个人维护、没有主要贡献者、release 不到一个月。用它可以,但用在生产管线上的话,你最好准备好自己 fork 和维护的能力。作者在 Issue 区的回应速度目前不错,但这不是可持续承诺,是一个博士生的业余精力。

另一个是生态定位的尴尬。HuggingFace tokenizers 慢不是因为别人写不好,而是因为它承载了太多兼容性包袱:支持几十种分词算法、各种 corner case、全平台的 Python 版本适配。Gigatoken 现在砍掉了所有这些包袱,所以快。但如果它的用户群涨上去,兼容性需求压过来,它会不会变成下一个 HuggingFace tokenizers——又大又慢?

不过话说回来,如果你现在在做预训练数据处理,直接上 native API。这部分的 ROI 不存在争议。如果你在观望,关注两个信号:作者能否吸引第二个核心维护者解决 Bus Factor 问题,以及 SentencePiece 和 WordPiece 支持的进展。

Gigatoken:一个斯坦福博士生把 BPE 分词器写到了 24.53 GB/s

Gigatoken 在各主流模型上的吞吐量对比。BPE 模型族的加速比在 280-989 倍区间,SentencePiece 族降到 10 倍左右。

资源地址

资源 地址
GitHub https://github.com/marcelroed/gigatoken
PyPI https://pypi.org/project/gigatoken/
设计文档 https://github.com/marcelroed/gigatoken/blob/main/design_doc.md
优化日志 https://github.com/marcelroed/gigatoken/blob/main/pretokenizer_optimization_log.md

分析到此为止,下面聊行动:你该做什么。

先用 benchmark 验证你自己的场景

如果你在做预训练数据管线,Gigatoken 的 native API 是当前最快的 BPE 分词方案,没有之一。从 gigatoken bench --validate 开始,用你的真实数据和模型跑一遍,确认两个数字:吞吐量和 token ID 一致性。兼容模式只是为了快速集成,真正的性能收益必须走 native API。

如果你在做推理服务,先别急着换。拿 sglang 或 vLLM 测一下你的真实 prompt 长度下的 TTFT 变化。Marcel Rød 自己的测试显示 GPT-OSS-120B 上 TTFT 降低了约 40%,但那是超大上下文场景。如果你的平均 prompt 不到 4k token,感知不到差异是正常的。真正的改观出现在文档批处理、语料预处理和 token 计数这类全 CPU 工作流上。

如果你只是对”1000 倍”感兴趣,看完这篇你应该已经清楚了:数字是真的,前提是你的使用方式跟 benchmark 一样激进。Gigatoken 把 tokenization 从”管线里最慢的一环”变成了”你可以忘记它在跑的那一环”。在 CPU 密集型预处理管线里,这不是百分之几十的效率提升,是迭代周期从几天变成几小时。如果你在训练场待过,你知道这意味着什么。

Gigatoken:一个斯坦福博士生把 BPE 分词器写到了 24.53 GB/s

Gigatoken 的优化层次:从底层 SIMD 预分词到顶层的批处理 API,每一层都砍掉了传统分词器的一个瓶颈。

开源项目

Self-driving-agents :一个 CLI 就能组建 13 个部门的 AI 团队

2026-8-11 12:11:53

行业动态

红杉美国:10 万亿美元 AI 机会正在开启,认知革命速度远超工业革命

2025-8-31 10:39:55

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧