关于 sentencepiece
sentencepiece 是一种无需语言专属预处理、可直接处理原始文本的分词器,适用于多语言及 CJK 语言模型开发。它支持训练子词词表、编码与解码,并提供 BPE 和 Unigram 算法。
主要功能
- 01直接处理原始 Unicode 文本
- 02训练 BPE 与 Unigram 模型
- 03文本编码与解码
- 04子词正则化采样
- 05支持 Python 与 C++
适用场景
- 01训练多语言模型的分词器
- 02为 CJK 文本生成词元
- 03对输入文本进行编码和解码
- 04通过多种切分增强训练数据
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ kalarislabs/ research-agent-skills --skill sentencepiece安装后在 Claude Code 中输入/sentencepiece确认已加载。
附带文件references/algorithms.mdreferences/training.md
详细介绍
SentencePiece - 与语言无关的分词
无需针对特定语言进行预处理,直接处理原始文本的无监督分词器。
何时使用 SentencePiece
适合使用 SentencePiece 的场景:
- 构建多语言模型(无需针对特定语言制定规则)
- 处理 CJK 语言(中文、日文、韩文)
- 需要可复现的分词结果(确定性词汇表)
- 希望使用原始文本进行训练(无需预分词)
- 需要轻量级部署(占用 6MB 内存,每秒处理 50k 个句子)
性能:
- 速度:每秒 50,000 个句子
- 内存:加载模型约占用 6MB
- 语言:所有语言(与语言无关)
其他场景可选用以下替代方案:
- HuggingFace Tokenizers:训练速度更快,灵活性更高
- tiktoken:适用于 OpenAI 模型(GPT-3.5/4)
- BERT WordPiece:以英语为中心的任务
快速入门
安装
# Python
pip install sentencepiece
# C++ (requires CMake)
git clone https://github.com/google/sentencepiece.git
cd sentencepiece
mkdir build && cd build
cmake .. && make -j $(nproc)
sudo make install
训练模型
# Command-line (BPE with 8000 vocab)
spm_train --input=data.txt --model_prefix=m --vocab_size=8000 --model_type=bpe
# Python API
import sentencepiece as spm
spm.SentencePieceTrainer.train(
input='data.txt',
model_prefix='m',
vocab_size=8000,
model_type='bpe'
)
训练时间:训练 100MB 语料约需 1-2 分钟
编码和解码
import sentencepiece as spm
# Load model
sp = spm.SentencePieceProcessor(model_file='m.model')
# Encode to pieces
pieces = sp.encode('This is a test', out_type=str)
print(pieces) # ['▁This', '▁is', '▁a', '▁test']
# Encode to IDs
ids = sp.encode('This is a test', out_type=int)
print(ids) # [284, 47, 11, 1243]
# Decode
text = sp.decode(ids)
print(text) # "This is a test"
与语言无关的设计
将空格作为符号(▁)
text = "Hello world"
pieces = sp.encode(text, out_type=str)
print(pieces) # ['▁Hello', '▁world']
# Decode preserves spaces
decoded = sp.decode_pieces(pieces)
print(decoded) # "Hello world"
核心原则:将文本视为原始 Unicode,空格 = ▁(元符号)
分词算法
BPE(字节对编码)
spm.SentencePieceTrainer.train(
input='data.txt',
model_prefix='bpe_model',
vocab_size=16000,
model_type='bpe'
)
使用该算法的模型:mBART
Unigram(默认)
spm.SentencePieceTrainer.train(
input='data.txt',
model_prefix='unigram_model',
vocab_size=8000,
model_type='unigram'
)
使用该算法的模型:T5、ALBERT、XLNet
训练配置
必要参数
spm.SentencePieceTrainer.train(
input='corpus.txt',
model_prefix='m',
vocab_size=32000,
model_type='unigram',
character_coverage=0.9995, # 1.0 for CJK
user_defined_symbols=['[SEP]', '[CLS]'],
unk_piece='<unk>',
num_threads=16
)
字符覆盖率
| 语言类型 | 覆盖率 | 理由 |
|---|---|---|
| 英语 | 0.9995 | 覆盖最常见的字符 |
| CJK(中文) | 1.0 | 需要包含所有字符 |
| 多语言 | 0.9995 | 取得平衡 |
编码选项
子词正则化
# Sample different tokenizations
for _ in range(3):
pieces = sp.encode('tokenization', out_type=str, enable_sampling=True, alpha=0.1)
print(pieces)
# Output (different each time):
# ['▁token', 'ization']
# ['▁tok', 'en', 'ization']
适用场景:通过数据增强提高鲁棒性。
常见模式
T5 风格的训练
spm.SentencePieceTrainer.train(
input='c4_corpus.txt',
model_prefix='t5',
vocab_size=32000,
model_type='unigram',
user_defined_symbols=[f'<extra_id_{i}>' for i in range(100)],
unk_id=2,
eos_id=1,
pad_id=0
)
与 transformers 集成
from transformers import T5Tokenizer
# T5 uses SentencePiece internally
tokenizer = T5Tokenizer.from_pretrained('t5-base')
inputs = tokenizer('translate English to French: Hello', return_tensors='pt')
性能基准
训练速度
| 语料 | BPE (16k) | Unigram (8k) |
|---|---|---|
| 100 MB | 1-2 分钟 | 3-4 分钟 |
| 1 GB | 10-15 分钟 | 30-40 分钟 |
分词速度
- SentencePiece:每秒 50,000 个句子
- HF Tokenizers:每秒 200,000 个句子(快 4 倍)
支持的模型
T5 系列:t5-base、t5-large(32k 词汇表,Unigram)
ALBERT:albert-base-v2(30k 词汇表,Unigram)
XLNet:xlnet-base-cased(32k 词汇表,Unigram)
mBART:facebook/mbart-large-50(250k 词汇表,BPE)
参考资料
资源
- GitHub:https://github.com/google/sentencepiece ⭐ 10,000+
- 论文:https://arxiv.org/abs/1808.06226(EMNLP 2018)
- 版本:0.2.0+
Agent 操作流程
- 检查环境。 检查 GPU 类型、内存和驱动/CUDA 版本(
nvidia-smi)、框架版本,以及数据集的位置和大小。 - 明确输入。 根据数据或用户提供的信息确认格式、标识符和参数。任何会影响结果的值都应询问确认,不要猜测。
- 先运行小规模版本。 进行冒烟测试:使用小型模型或子集、较少的步骤,并确认损失下降且检查点已保存。
- 按照上述说明和参考资料执行完整任务。
- 验证结果。 在留出数据上跟踪指标,与基线进行比较,并记录随机种子、配置和硬件。
- 报告。 说明运行了什么(版本、命令、参数)、检查了什么,以及还有哪些不确定之处。
| 如果发生这种情况 | 请执行以下操作 |
|---|---|
| CUDA 显存不足 | 减小批次大小,启用梯度累积/检查点或混合精度,或者对模型进行分片。 |
| 损失为 NaN 或发散 | 降低学习率,检查数据是否包含无效值,并启用梯度裁剪。 |
| 这些说明中的某个函数、标志或端点在已安装版本中不存在 | 查阅已安装版本自身的文档(help()、--help、官方文档),进行调整并告知用户。切勿编造 API。 |
| 必需的输入、标识符或参数不明确 | 询问用户,或在运行前明确说明所采用的假设。 |
诚信规则
- 切勿伪造结果、参数、标识符、引用或统计数据。如果无法运行或验证某项内容,请如实说明。
- 没有日志时,切勿声称取得了训练结果;启动大型任务前应估算计算成本。
- 此处与特定版本相关的细节可能已过时:请根据已安装版本的官方文档进行确认。
- 对于会产生费用、占用共享 GPU 或云配额、涉及个人或患者数据,或无法撤销的操作,须先征得同意。
相关技能
huggingface-tokenizers:提供 HuggingFace Tokenizers 库(基于 Rust 核心,并提供 Python 和 Node.js 绑定),用于训练和使用 BPE、WordPiece 和 Unigram…
评论
支持 Markdown