ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

HuggingFace Transformers 中使用 [特殊字符] Tokenizers 快速分词器:从训练、加载到序列化全解析

HuggingFace Transformers 中使用 [特殊字符] Tokenizers 快速分词器:从训练、加载到序列化全解析 HuggingFace Transformers 中使用 Tokenizers 快速分词器从训练、加载到序列化全解析【免费下载链接】transformers Transformers: the model-definition framework for state-of-the-art machine learning models in text, vision, audio, and multimodal models, for both inference and training.项目地址: https://gitcode.com/GitHub_Trending/tra/transformers本文基于 Transformers 文档docs/source/ar/fast_tokenizers.md讲解 Transformers 如何与 Tokenizers 库深度集成如何用几行代码训练一个 BPE 分词器如何通过tokenizer_object参数直接挂载训练好的分词器对象以及如何通过tokenizer_file参数从 JSON 文件加载。读完你将掌握分词器从训练到复用的完整链路并结合当前仓库源码理解参数解析的底层实现含 v5 版本中PreTrainedTokenizerFast已演进为TokenizersBackend的说明。背景PreTrainedTokenizerFast 与 Tokenizers 的关系 Transformers 的快速分词器fast tokenizer构建在 TokenizersRust 实现的分词库之上。文档原文指出[PreTrainedTokenizerFast] 类依赖于 Tokenizers 库凡是该库产出的分词器对象都可以非常便捷地加载进 Transformers 中使用。需要说明版本背景在当前仓库源码中PreTrainedTokenizerFast已作为向后兼容别名指向新的基类TokenizersBackend# Backward-compatible alias: allow referring to TokenizersBackend as PreTrainedTokenizerFast PreTrainedTokenizerFast TokenizersBackend见 src/transformers/tokenization_utils_tokenizers.py。因此本文所述的PreTrainedTokenizerFast(tokenizer_object...)/PreTrainedTokenizerFast(tokenizer_file...)用法在 v5 中依然可用而新代码推荐使用TokenizersBackend迁移说明见 MIGRATION_GUIDE_V5.md。第一步用 Tokenizers 训练一个分词器按文档的示例先创建并训练一个实验性分词器 from tokenizers import Tokenizer from tokenizers.models import BPE from tokenizers.trainers import BpeTrainer from tokenizers.pre_tokenizers import Whitespace tokenizer Tokenizer(BPE(unk_token[UNK])) trainer BpeTrainer(special_tokens[[UNK], [CLS], [SEP], [PAD], [MASK]]) tokenizer.pre_tokenizer Whitespace() files [...] # 指向训练语料文件列表 tokenizer.train(files, trainer)关键点说明Tokenizer(BPE(unk_token[UNK]))以 BPEByte-Pair Encoding模型为核心创建分词器unk_token指定未知词元BpeTrainer(special_tokens[...])训练器负责统计合并规则special_tokens列出必须完整保留、不参与合并的保留词元示例中是 BERT 风格的[UNK]、[CLS]、[SEP]、[PAD]、[MASK]tokenizer.pre_tokenizer Whitespace()预分词器按空格切分文本这是 BPE 训练前最常见的前置切分策略tokenizer.train(files, trainer)对语料文件执行实际训练训练完成后即得到一个可直接使用的分词器。训练完成后有两个去向继续在运行时直接使用或保存为 JSON 文件以便后续复用——这正是下两节的主题。直接加载通过 tokenizer_object 挂载内存中的分词器文档中PreTrainedTokenizerFast允许直接把一个已配置好的 Tokenizers 分词器对象作为构造参数传入 from transformers import PreTrainedTokenizerFast fast_tokenizer PreTrainedTokenizerFast(tokenizer_objecttokenizer)这样得到的对象即可使用 Transformers 分词器的全部通用方法__call__、encode、decode、padding、truncation 等。关于这些通用 API 的完整说明可参考仓库内的分词器文档docs/source/ar/ 下的 main_classes/tokenizer 对应页面 以及英文主文档 docs/source/en/fast_tokenizers.md。源码实现tokenizer_object 如何处理在 src/transformers/tokenization_utils_tokenizers.py 中TokenizersBackend.__init__即PreTrainedTokenizerFast对tokenizer_object的处理逻辑为tokenizer_object kwargs.pop(tokenizer_object, None) ... fast_tokenizer None if tokenizer_object is not None: fast_tokenizer copy.deepcopy(tokenizer_object) elif fast_tokenizer_file is not None and os.path.isfile(fast_tokenizer_file): # We have a serialization from tokenizers which let us directly build the backend fast_tokenizer TokenizerFast.from_file(fast_tokenizer_file)可以确认两个实现细节传入的tokenizer_object会被copy.deepcopy深拷贝后再赋值给内部的self._tokenizer因此 Transformers 对分词器的后续修改如添加特殊词元不会污染你原始的tokenizers.Tokenizer对象tokenizer_object的优先级高于tokenizer_file——两者同时给出时以对象为准。若两者都未提供且无法从vocab/merges等参数构建后端源码会抛出ValueError提示必须从「tokenizers 库序列化文件」「慢速分词器实例」「等价慢速分词器类」三者之一构建后端见 src/transformers/tokenization_utils_tokenizers.py。从 JSON 文件加载tokenizer_file 参数若分词器需要跨进程、跨环境复用文档给出的方案是先序列化再加载 tokenizer.save(tokenizer.json)然后把保存路径通过tokenizer_file参数传给构造函数 from transformers import PreTrainedTokenizerFast fast_tokenizer PreTrainedTokenizerFast(tokenizer_filetokenizer.json)加载后同样可以使用 Transformers 分词器的全部通用方法。源码实现tokenizer_file 如何被解析tokenizer_file路径被解析为 Rust 侧的TokenizerFast对象核心调用即上文__init__中的TokenizerFast.from_file(fast_tokenizer_file)。文件名约定也定义在同一文件顶部TOKENIZER_FILE tokenizer.json SPECIAL_TOKENS_MAP_FILE special_tokens_map.json TOKENIZER_CONFIG_FILE tokenizer_config.json见 src/transformers/tokenization_utils_tokenizers.py。在通过 [AutoTokenizer] / 模型专属类加载预训练分词器时还存在一条更完整的解析链路convert_to_native_formatsrc/transformers/tokenization_utils_tokenizers.py当检测到本地存在tokenizer_file且类未自定义__init__时直接执行TokenizerFast.from_file并注入tokenizer_object优先信任 JSON 序列化内容本身。对于自定义了__init__的类则会解析 JSON 提取post_processor、padding、truncation以及 SentencePiece 预编译字符映射等配置以保证重建的分词器与tokenizer.json完全一致。保存回 JSONsave_pretrained 的对称操作文档展示了加载方向对应的保存方向由save_pretrained完成。从源码结构看TokenizersBackend._save_pretrained会将整个后端分词器写回单个tokenizer.json文件可加filename_prefix前缀同时与special_tokens_map.json、tokenizer_config.json等文件共同构成完整分词器检查点tokenizer_file os.path.join( save_directory, (filename_prefix - if filename_prefix else ) TOKENIZER_FILE ) self.backend_tokenizer.save(tokenizer_file)见 src/transformers/tokenization_utils_tokenizers.py。此外save_pretrained还支持save_format参数hf为默认格式mistral可保存为原生tekken.json见 src/transformers/tokenization_utils_tokenizers.py。这形成了一个闭环tokenizers.Tokenizer.save()产出的 JSON 可被tokenizer_file加载Transformers 侧的save_pretrained产出的 JSON 又可被TokenizerFast.from_file加载。参数速查与适用前提参数类型作用源码位置tokenizer_objecttokenizers.Tokenizer从内存中的分词器对象直接实例化内部会深拷贝src/transformers/tokenization_utils_tokenizers.pytokenizer_filestr本地tokenizer.json路径经TokenizerFast.from_file构建后端src/transformers/tokenization_utils_tokenizers.pysave_pretrained(save_directory)方法将后端分词器序列化为tokenizer.jsonsrc/transformers/tokenization_utils_tokenizers.py适用前提与限制需要安装tokenizers库缺失时仓库通过 src/transformers/utils/dummy_tokenizers_objects.py 提供降级占位类导入即给出安装提示文档中files [...]需替换为真实语料文件路径train会全量读取这些文件语料量决定训练耗时从源码结构看tokenizer.json完全描述分词流水线normalizer、pre-tokenizer、model、decoder因此它也是 Hub 上大多数模型的标准分词器文件——英文主文档 中说明的TokenizersBackend回退机制正是基于这一约定。小结围绕 docs/source/ar/fast_tokenizers.md 的三大主线——训练tokenizers库的Tokenizer/BPE/BpeTrainer/Whitespace组合、对象直载tokenizer_object、文件加载tokenizer_file——在当前仓库中分别对应TokenizersBackend.__init__的深拷贝挂载、TokenizerFast.from_file的 JSON 解析以及_save_pretrained的对称序列化。掌握这条链路后无论是自训领域分词器还是复用 Hub 上的tokenizer.json都能在与 Transformers 完全兼容的通用 API 上工作。【免费下载链接】transformers Transformers: the model-definition framework for state-of-the-art machine learning models in text, vision, audio, and multimodal models, for both inference and training.项目地址: https://gitcode.com/GitHub_Trending/tra/transformers创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表