flash-tokenizer
C++实现的BERT分词器,比HuggingFace快10倍,支持pip一键安装
加载项目详情…
本应用为开源项目,仅供学习研究,请遵守其开源协议。
C++实现的BERT分词器,比HuggingFace快10倍,支持pip一键安装
加载项目详情…
本应用为开源项目,仅供学习研究,请遵守其开源协议。

图1:FlashTokenizer 官方 Logo
在大模型推理服务中,分词(Tokenization)是数据预处理的第一道关卡。每一次模型调用,都需要先将输入文本切成 token,再映射为 ID 送入模型。这个过程看似简单,却在高频调用场景下成为不可忽视的性能瓶颈。
一个典型的场景是:当你的 LLM API 服务需要每秒处理上万条请求时,每个请求都要经过 Hugging Face 的 BertTokenizerFast 进行分词。问题来了——根据 StackOverflow 和 GitHub Issues 上的大量用户反馈,BertTokenizerFast 在处理大批量数据时,速度远低于预期。有用户反映,在某些极端场景下,分词甚至比模型推理本身还要慢。
已有的替代方案各有硬伤:
正是在这个背景下,FlashTokenizer 应运而生。
FlashTokenizer 的技术核心是论文 Fast WordPiece Tokenization 提出的 LinMax Tokenizer 算法。相比传统 WordPiece 的二分查找或哈希方法,LinMax 实现了线性时间复杂度的分词。
具体来说,FlashTokenizer 的实现有以下关键优化:
CMakeLists.txt 中开启 OpenMP 支持,批量编码时自动并行处理多线程FlashBertTokenizer 类在 C++ 层支持批量输入的并行编码-Ofast -funroll-loops -floop-nest-optimize,Clang 使用 -O3 -flto -march=native -mtune=native,MSVC 使用 /O2 /GL /fp:fast /arch:AVX2robin_hood.h 和 unordered_dense.h 实现高效字符串查表实测性能:比 BertTokenizerFast 快 10 倍,比 BlingFire 更快且精度更高。

图2:各分词器速度对比(来源:官方仓库)

图3:FlashTokenizer 与 HuggingFace BertTokenizer 精度完全对齐

图4:性能测试柱状图

图5:不同数据量下的性能扩展曲线
FlashTokenizer 采用了清晰的模块化架构,核心代码位于 prj/src/ 和 prj/include/ 目录:
| 模块 | 文件 | 说明 |
|---|---|---|
| BERT 分词器 | bert_tokenizer.cpp + bert_tokenizer.h | 主分词器实现,FlashBertTokenizer 类 |
| BPE 分词器 | bpe_tokenizer.h | 支持 BPE 算法 |
| WordPiece | wordpiece_tokenizer.h | WordPiece 子词分词核心 |
| 反向 WordPiece | wordpiecebackward_tokenizer.h | 逆向匹配优化 |
| 词典加载 | vocab.h | 词表数据结构 |
| Trie 树 | trie.h | 前缀树加速匹配 |
| 线程池 | thread_pool.h | C++ 线程池实现 |
| JSON 解析 | json.hpp | nlohmann/json 单头文件库 |
通过 pybind11 封装为 Python 包(flash_tokenizer),对外暴露 BertTokenizerFlash 类,与 Hugging Face 的 BertTokenizer 接口高度兼容,迁移成本极低。
FlashTokenizer 提供了极为简洁的安装和使用方式:
# 一键安装
pip install flash-tokenizer
从源码构建也只需几行命令:
git clone https://github.com/NLPOptimize/flash-tokenizer
cd flash-tokenizer/prj
pip install .
构建依赖:
支持的平台:Windows (AMD64)、macOS (ARM64)、Linux (x86-64),Python 3.9~3.14。

图6:FlashTokenizer 批量测试界面

图7:FlashTokenizer 支持的预训练模型(多语言 BERT 系列)
FlashTokenizer 的 Python API 与 Hugging Face 高度兼容:
from flash_tokenizer import BertTokenizerFlash
# 方式1:从预训练模型加载
tokenizer = BertTokenizerFlash.from_pretrained('bert-base-multilingual-cased')
# 方式2:从 vocab.txt 加载
tokenizer = BertTokenizerFlash('vocab.txt', do_lower_case=False, model_max_length=512)
# 分词
tokens = tokenizer.tokenize("Hello, world!")
token_ids = tokenizer("Hello, world!", max_length=512).input_ids[0]
支持预训练模型列表:bert-base-cased、bert-base-uncased、bert-base-chinese、bert-base-multilingual-cased、bert-base-multilingual-uncased、kcbert-base、llmlingua-2-bert-base-multilingual-cased-meetingbank。
FlashTokenizer 也有其局限性:
FlashTokenizer 的出现填补了 LLM 推理服务中 CPU 端分词加速 的空白。它代表了 AI 基础设施优化中一个重要方向——不是每次都要靠 GPU 加速,在 CPU 层面通过算法优化和系统编程也能取得数量级的性能提升。
结合 FlashAttention、FlashInfer 等同类"Flash"系列优化工具,FlashTokenizer 让 LLM 推理服务可以在不增加硬件成本的前提下显著提升吞吐量,对于需要高并发、低延迟推理服务的团队具有直接价值。
该项目于 2025 年在 Hugging Face 论坛正式发布,获得了 NLP 社区的广泛关注。开发者在 README 中引用了 StackOverflow、PaddleNLP Issues、GitHub Issues 等多个来源的数据来证明需求真实性,体现了务实的产品思维。