Hugging Face tokenizers v1 发布说明
Hugging Face 已推出 tokenizers v1 的发布候选版本,重点在于极致的性能优化,确保在模型速度和工作负载扩展时,分词不会成为瓶颈。在 Apple M4 Max 上,v1 在十个测量的模型家族中,文本编码速度比 v0.23 快 3 到 30 倍,其中 GPT-2 的提升最为显著。
核心技术优化
v1 的性能提升源于对分词流水线的全面重构,特别针对模型阶段中大部分计算发生的位置。该库与 v0.23 完全兼容,生成相同的 token ID、API 和词汇表。
基于 SIMD 的分割(Bitcannon)
BPE 模型通常使用正则表达式将输入文本分割为预分词。v1 用名为 "bitcannon" 的手写分割函数取代了通用的正则引擎,该函数使用 SIMD(单指令多数据)指令。通过将输入字节视为并行的比特流,它在整寄存器上执行布尔运算以识别边界,每次寄存器操作可处理 64 字节。该方法适用于大多数字节级 BPE 模型,包括 GPT-2、cl100k、o200k、Tekken 和 DeepSeek。
词缓存
为避免重复计算,v1 实现了线程本地的词缓存。由于 BPE 对于任意给定的预分词会生成确定的 token ID,该库现在将预分词字节映射到最终的 ID。当文本中重复出现某个词时,分词器会完全跳过合并过程,直接从缓存中获取结果。
无内存分配的合并循环
BPE 合并循环已被重写,以消除重复的内存分配。主要改动包括:
- 临时缓冲区: 合并工作集现在位于调用者拥有的临时缓冲区中,避免在循环中接触分配器。
- 侵入式双向链表: 符号存储在扁平数组中,并通过位置链接,使得合并可通过更新两个索引完成,而无需移动数据。
- 整数比较: 候选对被打包为 64 位值,合并优先级位于高位,使循环可通过简单的整数比较找到下一个合并,无需分支。
性能与扩展性
通过 tokbench 仓库进行的基准测试显示,v1 在八个工作线程下可实现 76% 的线性扩展。该库还被重构为工作区,以减少二进制大小和依赖开销:
tk-encode:编码所需的运行时。tk-serialize、tk-convert和tk-train:仅在需要特定功能时才链接的可选 crate。
实现路线图
发布候选版本功能
除了核心编码加速外,当前发布候选版本还包含:
- 并行解码,直接将字节写入可重用缓冲区,避免中间字符串。
- Node.js 绑定。
- 对
role_to_token的支持。 - 批量模型调用,可在单次调用中处理多个预分词跨度。
v1.0.0 及以后的路径
即将推出的稳定版 1.0.0 更新将包括:
- 统一编码: 在训练验证期间使用
tk-encode,以确保训练与推理之间的一致性。 - 绑定改进: 更简单的 Python 绑定,减少锁定并支持自由线程的 CPython,以及为
llama.cpp和 ExecuTorch 提供仅推理的 C/C++ 绑定。 - 优化的元数据: 可选计算偏移量和掩码,以保持仅 token-ID 路径的轻量性。
在 1.0.0 版本发布后,Hugging Face 计划探索 tok-devices,这是一个可选组件,用于基于 GPU 的编码和批量解码,以便在处理大批量数据时将文本和 token ID 保留在设备上。