GigaToken:让分词速度提升1000倍
GigaToken: ~1000x faster Language model tokenization
GigaToken 是一款全新的语言模型分词工具,声称比 HuggingFace 的 tokenizer 快约 1000 倍,处理速度可达 GB/s 级别。它支持广泛的 CPU 硬件和主流分词器,既提供与 HuggingFace Tokenizers 及 Tiktoken 兼容的模式,也提供性能极致的原生 API。通过深度优化 SIMD 指令、缓存策略并最小化 Python 交互开销,GigaToken 在 AMD EPYC 和 Apple M4 Max 等平台上均展现出惊人的吞吐量。这意味着像 Common Crawl 这样包含 130 万亿 token 的巨型数据集,在高性能服务器上仅需不到 6.5 小时即可完成分词,为大规模语言模型训练带来了革命性的效率提升。
在 EPYC CPU 的测试速率下,你可以在不到 6.5 小时内完成整个 Common Crawl 数据集的分词工作!
HN 评论区
118- maxdo
有意思:
问:你是不是针对特定的 CPU 和分词器过度优化了?为什么这么快?
答:不,我针对这些组合的每一种情况都过度优化了!结果在不同 CPU(现代 x86 和 ARM)以及不同分词器上都非常一致。
主要的改进在于:利用 SIMD 对通常外包给正则引擎实现的预处理(pretokenization)进行重度优化,减少分支判断并使用其他技巧,同时对预处理映射缓存进行重度优化(如果一个词之前见过,就高效地查找其编码后的 token)。在这个领域,缓存是个非常棘手的问题,因为缓存增长极快,且预处理分布呈现极长的长尾特性。
最后,与 Python 的交互被降至最低,线程之间的交互也微乎其微。
- cschmidt
不得不说,这工作太棒了。我今天早些时候在 tokenization 的 Discord 上看到这个项目后就克隆了你的仓库。我知道分词社区里的每个人都想汲取你是如何实现如此巨大速度提升的经验。缓存机制以及用其他方案替代正则表达式进行预处理,这些思路看起来都很有普适价值。
至于这里那些吹毛求疵的 0.1% 的杠精,去他们的吧,这真是好东西。
- onlyrealcuzzo
太赞了,但分词通常只占总推理时间的不到 0.1%。
不过,想必确实有很多应用场景只需要做分词,对它们来说这简直完美!
- ubedan
太惊人了……让我想起了 SimdJson 算法,那种通过创造性编程实现的、令人下巴掉地、几乎难以置信的速度。希望这段代码能流行起来,因为它将节省大量的电力、金钱、CO2 等等。
你有没有考虑过也发布一个 Rust crate?(如果没有,我自愿效劳。)
- XCSme
恭喜,我太爱性能优化了!
现在的硬件如此强大,但我们的代码却如此低效……我认为如果我们真的去优化,大多数库和应用都能轻松提升 10 到 100 倍的速度。
好消息是,有了 AI,我们大概能很快实现这些优化。
- apollopower
很酷。据我理解,这在推理阶段价值不大,但在运行离线预训练数据准备时更有用。
当为你的训练语料分词 TB 级文本时,这里的加速确实能帮你节省时间(和钱?)。在摸索和调整数据集时,你能获得更快的迭代周期。
- zX41ZdbW
这正是我们需要的!准备试试:https://github.com/ClickHouse/ClickHouse/issues/108247
如果 README 能更侧重于单核性能会更好。
关于实际算法——使用类似完美哈希表(perfect hash table)的匹配会有帮助吗?
- fwip
大家都有什么样的环境是受限于分词器速度的?