本文档详细介绍了 Grok-1 中使用的分词系统,该系统负责在自然语言文本和模型处理的数字 token ID 之间进行转换。分词系统是人类可读文本与 Transformer 模型所需的数字表示之间的关键接口。有关模型架构如何处理这些 token 的信息,请参阅 Transformer Architecture,有关完整处理流程的详细信息,请参阅 Inference Pipeline。
Grok-1 使用 SentencePiece 分词器,词汇量大小为 131,072 个 token。这种相对较大的词汇量使模型能够有效地表示各种语言模式,从而减少了表示典型文本所需的 token 数量。
来源:runners.py29-30 runners.py288 runners.py513 runners.py568 README.md31
分词器在 InferenceRunner.initialize() 方法中初始化。它从磁盘加载一个预训练的 SentencePiece 模型,路径由 tokenizer_path 指定(默认:/tmp/xai_data/tokenizer.model)。
来源:runners.py288 runners.py292
在推理过程中,处理请求时,系统会将输入的文本提示转换为 token ID
InferenceRunner.run() 方法接收带有提示的请求self.tokenizer.encode(request.prompt) 进行编码来源:runners.py513 runners.py521
分词系统通过填充和截断来处理不同长度的输入
pad_to_size() 函数管理 token 序列的长度
x.shape[0] > size),它会从左侧截断:x = x[-size:]np.pad(x, [0, size - x.shape[0]], mode="constant", constant_values=0)适当的填充大小由 get_pad_bucket() 方法确定
bisect.bisect_left 在 pad_sizes 元组中查找合适的 bucket来源:runners.py77-81 runners.py271-273
生成 token 后,系统将生成的 token ID 转换回文本
all_tokens 列表中self.tokenizer.decode(all_tokens) 解码 token分词系统与推理流程紧密集成,如下图所示
| 参数 | 值 | 描述 |
|---|---|---|
| 分词器类型 | SentencePiece | 基于字符的子词分词器 |
| 词汇量大小 | 131,072 | 词汇表中唯一 token 的数量 |
| 最大序列长度 | 8,192 | 最大 token 上下文窗口 |
| 默认分词器路径 | /tmp/xai_data/tokenizer.model | 分词器模型文件的位置 |
来源:README.md31-35 runners.py267
巨大的词汇量(131,072 个 token)意味着连接到这些 token 的嵌入层非常重要。Grok-1 的嵌入维度为 6,144,仅嵌入矩阵就需要大约 3.05 GB 的存储空间(131,072 × 6,144 × 4 字节(float32))。
为了在推理期间提高效率
get_pad_bucket() 以预定义的 bucket 大小处理 token来源:README.md31-35 runners.py271-273 runners.py77-81
运行推理时,分词过程如下
此过程由 sample_from_model() 函数自动处理,该函数接受 prompt、最大长度和 temperature 作为参数。