尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

Transformers 中的 tiktoken 集成:加载与转换 PreTrainedTokenizerFast 的完整指南

Transformers 中的 tiktoken 集成:加载与转换 PreTrainedTokenizerFast 的完整指南 Transformers 中的 tiktoken 集成加载与转换 PreTrainedTokenizerFast 的完整指南【免费下载链接】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 对tiktoken分词器的原生支持如何在from_pretrained阶段自动识别并转换 Hub 上的 tiktokentokenizer.model文件以及如何用convert_tiktoken_to_fast把任意 tiktoken 编码落地为标准tokenizer.json。读完后你将掌握 tiktoken 分词器在 Transformers 中的加载链路、TikTokenConverter的底层转换原理以及从 tiktoken 生成 fast 分词器并可被PreTrainedTokenizerFast直接复用的实操方案。一、集成机制tiktoken 文件如何被自动识别Transformers 与 tiktoken 的集成核心在于当使用from_pretrained加载带有 tiktokentokenizer.model文件的模型时该文件会被自动转换为 fast 分词器即PreTrainedTokenizerFast无需用户手动干预。这一机制在仓库中已有两处关键支撑。其一文件名常量的统一。在 tokenization_utils_tokenizers.py 中tiktoken 的默认词表文件名被固定为TOKENIZER_FILE tokenizer.json TIKTOKEN_VOCAB_FILE tokenizer.model VOCAB_FILES_NAMES {tokenizer_file: TOKENIZER_FILE, vocab_file: TIKTOKEN_VOCAB_FILE}也就是说Transformers 把tokenizer.model视为 tiktoken 词表vocab_file而把tokenizer.json视为 fast 分词器的单文件序列化结果tokenizer_file。其二在解析远程/本地词表文件时的回退匹配。在 tokenization_utils_base.py 中当仓库里找不到tokenizer_file时加载逻辑会用一段正则去匹配仓库文件列表中是否存在可转换的词表other_pattern rtekken\.json|tokenizer\.model\.*|tiktoken\.model |.join( getattr(cls, VOCAB_FILES_NAMES, {}).keys() ) if match : re.search(other_pattern, \n.join(remote_files)): if spm_file in vocab_files: vocab_files[spm_file] match.group() else: vocab_files[vocab_file] match.group()从源码结构看这段逻辑意味着只要仓库里存在tokenizer.model、tiktoken.model或tekken.json等文件且没有现成的 fast 分词器文件Transformers 就会将其登记为vocab_file或 SentencePiece 的spm_file从而触发后续的 tiktoken / tekken 转换路径。这也解释了为什么「把tokenizer.model放到模型仓库里」就足够让from_pretrained自动接管。文档同时明确列出了已随 tiktoken 词表发布、且已被验证可加载的知名模型gpt2llama3适用前提自动转换依赖安装了tiktoken部分路径还依赖blobfile。若未安装加载相关词表会抛出带安装提示的异常后文会给出具体报错信息。二、加载 tiktoken 分词器的实操示例要把tiktoken文件加载进 Transformers关键前提是确保tokenizer.model确实是 tiktoken 格式的文件之后在from_pretrained时它会被自动加载并转换。官方示例以meta-llama/Meta-Llama-3-8B-Instruct为例使用subfolder定位到原始子目录from transformers import AutoTokenizer model_id meta-llama/Meta-Llama-3-8B-Instruct tokenizer AutoTokenizer.from_pretrained(model_id, subfolderoriginal)这里的subfolderoriginal指定了在模型仓库中存放原始 tiktoken 词表的子目录。AutoTokenizer会根据模型配置自动解析出对应的 fast 分词器类型并走上面第一节的词表回退匹配逻辑最终返回一个可直接encode/decode的PreTrainedTokenizerFast实例。从仓库的转换脚本可以看到llama3、llama4、mllama、gpt_oss等模型的官方转换脚本都继承或复用了TikTokenConverter例如 llama/convert_llama_weights_to_hf.py 中的Llama3Converter、gpt_oss/convert_gpt_oss_weights_to_hf.py 中的GptOssConverter印证了 tiktoken 是这批 LLaMA 系模型词表的标准格式。三、从 tiktoken 生成 fast 分词器convert_tiktoken_to_fast需要特别注意的一点是原始tokenizer.model文件本身并不包含关于特殊符号special tokens或额外正则 pattern 的信息。如果这些信息对你的场景很重要就应该把分词器转换成tokenizer.json——这才是PreTrainedTokenizerFast所适配的标准格式。推荐流程是先用 tiktoken 拿到一个 encoding再用 Transformers 提供的convert_tiktoken_to_fast把它转成tokenizer.json并落盘from transformers.integrations.tiktoken import convert_tiktoken_to_fast from tiktoken import get_encoding # 可以加载你自定义的编码也可以是 OpenAI 提供的编码 encoding get_encoding(gpt2) convert_tiktoken_to_fast(encoding, config/save/dir)生成的tokenizer.json会被保存在指定目录随后即可用PreTrainedTokenizerFast直接加载tokenizer PreTrainedTokenizerFast.from_pretrained(config/save/dir)源码级解析convert_tiktoken_to_fast 做了什么该函数位于 integrations/tiktoken.py其签名与行为如下def convert_tiktoken_to_fast(encoding, output_dir: str): Args: encoding (str or tiktoken.Encoding): Tokenizer from tiktoken library. If encoding is str, the tokenizer will be loaded with tiktoken.get_encoding(encoding). output_dir (str): Save path for converted tokenizer configuration file. 它执行的核心步骤结合 integrations/tiktoken.py 的实现准备目录结构output_dir不存在则创建tiktoken 词表文件被写入output_dir/tiktoken/tokenizer.model由TIKTOKEN_VOCAB_FILE常量决定fast 分词器输出到output_dir/tokenizer.jsonTOKENIZER_FILE。dump 词表若encoding是字符串先tiktoken.get_encoding(encoding)加载随后dump_tiktoken_bpe(encoding._mergeable_ranks, save_file_absolute)把可合并词元mergeable ranks写成标准 tiktoken 文件。转换并保存调用TikTokenConverter(vocab_file..., patternencoding._pat_str, extra_special_tokensencoding._special_tokens).converted()最后tokenizer.save(output_file_absolute)输出tokenizer.json。这里有个容易被忽略的细节它会把 tiktoken 编码自带的正则 patternencoding._pat_str和特殊符号encoding._special_tokens一并带入转换从而弥补了裸tokenizer.model缺少 pattern / special tokens 信息的短板。关于依赖与报错源码显式区分了两类缺失if blobfile in error_msg.lower(): raise ValueError( blobfile is required to save a tiktoken file. Install it with pip install blobfile. ) from e raise ValueError( tiktoken is required to save a tiktoken file. Install it with pip install tiktoken. ) from e因此运行该函数前需要确保tiktoken与blobfile均可用tiktoken已列入 Transformers 的可选依赖表见 dependency_versions_table.py。四、底层转换原理TikTokenConverter真正完成「tiktoken 词表 → fast 分词器」转换的是 convert_slow_tokenizer.py 中的TikTokenConverter类它把 tiktoken 的 BPE 表示映射到 HuggingFacetokenizers库的Tokenizer对象。1词表与 merges 的提取。extract_vocab_merges_from_model(tiktoken_url)L1923-L1952先用load_tiktoken_bpe读入 BPE 排名再用bytes_to_unicode把字节串转成字符串构造vocab对长度大于 1 的词元枚举其所有合法左右切分组合生成按 rank 排序的merges。这一过程解释了 tiktoken 的「可合并排名」如何被拆解成 fast 分词器所需的(vocab_scores, merges)。2构造 BPE 模型。tokenizer()L1954-L1959用Tokenizer(BPE(vocab_scores, merges, fuse_unkFalse))建立模型并开启ignore_merges True保证解码行为与 tiktoken 原始语义一致。3预/后处理与解码器。converted()L1961-L1978为模型装配pre_tokenizerSequence[ Split(Regex(pattern), behaviorisolated), ByteLevel(add_prefix_space...) ]其中pattern默认是 GPT-2 风格的字节级正则decoderByteLevel解码器若提供了extra_special_tokens逐个以AddedToken(normalizedFalse, specialTrue)加入特殊符号post_processorByteLevel(trim_offsetsFalse)。默认的预分词正则在构造函数里被显式定义L1911与 GPT-2 系分词器一致这也是gpt2能开箱即用的原因。五、加载链路中的 tiktoken 回退除了主动调用convert_tiktoken_to_fastTransformers 在「慢分词器 → 快分词器」的统一入口里也内置了 tiktoken 回退。入口函数convert_slow_tokenizer(transformer_tokenizer, from_tiktokenFalse)convert_slow_tokenizer.py的判定顺序为若分词器类名命中SLOW_TO_FAST_CONVERTERS且未指定from_tiktoken走对应的专用转换器否则若vocab_file是 tekken 文件名走 Mistral 的MistralConverter否则记录Converting from Tiktoken回退到TikTokenConverter(vocab_file..., extra_special_tokens...)若以上都失败抛出带可用转换器列表的ValueError。从源码结构看这意味着当一个分词器没有专用转换器、但其vocab_file指向 tiktoken 词表时Transformers 会自动尝试用TikTokenConverter完成转换与第二节from_pretrained的自动加载行为形成呼应。六、测试验证如何确认可复现仓库在 tests/models/gpt2/test_tokenization_gpt2.py 提供了test_tokenization_tiktoken测试可作为功能是否生效的直接验证依据require_tiktoken def test_tokenization_tiktoken(self): from tiktoken import encoding_name_for_model from transformers.integrations.tiktoken import convert_tiktoken_to_fast encoding encoding_name_for_model(gpt2) convert_tiktoken_to_fast(encoding, self.tmpdirname) tiktoken_fast_tokenizer GPT2Tokenizer.from_pretrained(self.tmpdirname) rust_tokenizer GPT2Tokenizer.from_pretrained(openai-community/gpt2) sequence lower newer self.assertEqual( rust_tokenizer.decode(rust_tokenizer.encode(sequence)), tiktoken_fast_tokenizer.decode(rust_tokenizer.encode(sequence)), )该测试用convert_tiktoken_to_fast生成 fast 分词器后对比其decode结果与官方gpt2fast 分词器是否一致从而证明转换后的分词器在行为上与原实现等价。require_tiktoken装饰器确保在未安装 tiktoken 的环境自动跳过该用例。七、小结Transformers 的 tiktoken 支持可以归纳为两条互补路径加载侧通过词表文件名回退匹配让from_pretrained自动把 Hub 上的tokenizer.model转成PreTrainedTokenizerFastgpt2、llama3等模型已验证可用生成侧通过convert_tiktoken_to_fast与TikTokenConverter把任意 tiktoken 编码含 pattern 与特殊符号落盘为标准tokenizer.json供 fast 分词器直接复用。理解TIKTOKEN_VOCAB_FILE tokenizer.model、VOCAB_FILES_NAMES的映射关系以及TikTokenConverter对 vocab / merges / pre·post-processor 的装配方式是掌握这一集成、并在自定义场景中正确落地 tiktoken 分词器的关键。【免费下载链接】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),仅供参考
返回列表