如何保存预编译AutoTokenizer以避免加载时正则编译耗时?
解决扩展后预训练分词器加载过慢的问题
你提到的加载耗时(34分钟以上)确实和新增token触发的正则重新编译有关,相关问题在Hugging Face Tokenizers项目的议题中也有讨论。完全可以通过将分词器保存为二进制序列化格式,来规避下次加载时的完整正则编译流程,具体操作如下:
1. 扩展分词器后,额外保存二进制核心分词器
在完成token扩展并调用save_pretrained之后,直接导出底层的二进制分词器文件(tokenizer.json),这个文件已经包含预编译好的正则和所有分词逻辑:
from transformers import AutoTokenizer from datasets import load_dataset # 1. 加载原始预训练分词器 tokenizer = AutoTokenizer.from_pretrained('moussaKam/frugalscore_tiny_bert-base_bert-score') # 2. 训练德语、法语专属分词器并提取新增token ds_de = load_dataset("mc4", 'de') ds_fr = load_dataset("mc4", 'fr') de_tokenizer = tokenizer.train_new_from_iterator(ds_de['text'], vocab_size=50_000) fr_tokenizer = tokenizer.train_new_from_iterator(ds_fr['text'], vocab_size=50_000) new_tokens_de = set(de_tokenizer.vocab).difference(tokenizer.vocab) new_tokens_fr = set(fr_tokenizer.vocab).difference(tokenizer.vocab) new_tokens = set(new_tokens_de).union(new_tokens_fr) # 3. 扩展原始分词器 tokenizer.add_tokens(list(new_tokens)) # 4. 保存transformers标准格式 + 二进制核心分词器 tokenizer.save_pretrained('frugalscore_tiny_bert-de-fr') # 关键:保存预编译好的二进制分词器 tokenizer._tokenizer.save("frugalscore_tiny_bert-de-fr/tokenizer.json")
2. 加载时自动复用二进制文件
后续加载分词器时,AutoTokenizer会自动优先读取目录下的tokenizer.json,直接反序列化预编译好的逻辑,跳过正则编译步骤:
tokenizer = AutoTokenizer.from_pretrained( 'frugalscore_tiny_bert-de-fr', local_files_only=True )
额外优化点
如果无法重新生成分词器,也可以通过设置环境变量开启正则缓存,减少重复编译开销:
export TOKENIZERS_CACHE=/path/to/persistent/cache
但最彻底的方案还是保存tokenizer.json二进制文件,它能直接避免加载时的正则编译流程,大幅缩短加载时间。
内容的提问来源于stack exchange,提问作者alvas
相关产品推荐
相关产品推荐

