Tiny BPE Trainer 介绍
如今,从 GPT 到 RoBERTa,大多数现代 NLP 模型都依赖于使用字节对编码 (BPE) 的子词标记化。但是,如果您想用纯 C++ 训练自己的词汇表,该怎么办?
认识一下Tiny BPE Trainer——一款速度超快、仅包含头文件的 BPE 训练器,采用现代 C++ 17/20 编写,零依赖,完全支持UTF-8 编码,并兼容 HuggingFace 的输出(vocab.txt
、merges.txt
)。
为什么要添加另一个 BPE Trainer?
因为现有的方案通常:
- 仅支持 Python,运行时依赖性很强(Rust、Protobuf 等)
- 不易嵌入到 C++ 应用程序
- 不注重速度、简洁性或跨平台使用
Tiny BPE Trainer 具备以下特点:
- 仅支持头文件
- 跨平台(Linux、Windows、macOS)
- 兼容 HuggingFace
- 而且它与我的另一个项目完美匹配:Modern Text Tokenizer
核心功能
- 支持纯文本或 JSONL 数据集的完整 BPE 训练**
- 支持 CLI 和 C++ API – 非常适合工具化或嵌入
- 兼容 HuggingFace 的输出(
vocab.txt
、merges.txt
) - UTF-8安全 – 可处理表情符号、多语言脚本和特殊字符
- 可配置 – 小写字母、标点符号拆分、最小频率等。
- 演示模式 – 一行命令即可测试所有内容
演示
1./Tiny-BPE-Trainer --demo
该模式可生成合成语料库、训练词汇表、打印统计数据并运行分词——所有操作仅需数秒。非常适合持续集成 (CI) 和冒烟测试。
如何训练 BPE 分词器
构建它
1g++ -std=c++17 -O3 -o Tiny-BPE-Trainer Tiny-BPE-Trainer.cpp
在语料库上训练
1./Tiny-BPE-Trainer -i corpus.txt -v 16000 -o my_tokenizer
或者使用 JSONL 格式:
1./Tiny-BPE-Trainer -i dataset.jsonl --jsonl -v 32000
对文本进行分词
1./Tiny-BPE-Trainer --test "Hello, world! This is a test."
与现代文本分词器无缝协作
训练完成后,您可以直接在我的 现代文本分词器 中使用您的自定义词汇:
1TextTokenizer tokenizer;
2tokenizer.load_vocab("my_tokenizer_vocab.txt");
3auto ids = tokenizer.encode("Hello world!");
这为您提供了一个完全由 C++ 编写的分词器流水线,并且没有任何运行时依赖。
使用真实数据集
您可以使用 HuggingFace 数据集轻松生成语料库:
1from datasets import load_dataset
2
3dataset = load_dataset("imdb", split="train")
4with open("corpus.txt", "w", encoding="utf-8") as f:
5 for x in dataset:
6 f.write(x["text"].strip().replace("\n", " ") + "\n")
然后训练:
1./Tiny-BPE-Trainer -i corpus.txt -v 16000 -o imdb_tokenizer
基准测试
1已处理:3300 万个字符
2唯一词:106000 个
3词汇量:32000
4训练时间:约 30 分钟(Ryzen 9,-O3 处理器)
即使在处理大型语料库文件(IMDB、WikiText)时,Tiny BPE Trainer 也能高效且可预测地运行,并生成与 HuggingFace、SentencePiece 以及您自己的 C++ 分词器兼容的词汇表。
用例
- 为 LLM 和 Transformer 训练自定义分词器
- 在 Python 不可用的情况下进行设备端自然语言处理
- 构建高性能预处理器
- 训练特定领域词汇表(法律、医疗、代码)
立即试用
1git clone https://github.com/Mecanik/Tiny-BPE-Trainer
2cd Tiny-BPE-Trainer
3g++ -std=c++17 -O3 -o Tiny-BPE-Trainer Tiny-BPE-Trainer.cpp
4./Tiny-BPE-Trainer --demo
欲了解高级选项、CLI 参数和集成技巧,请查看 GitHub 上的完整 README 文件:
用心打造,面向 NLP 和 C++ 社区。
如果您喜欢它,请在 GitHub 上加星标 ,将其用于您的项目,或贡献力量!
评论