菜单

分词系统

相关源文件

目的与范围

本文档详细介绍了 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

  1. InferenceRunner.run() 方法接收带有提示的请求
  2. 提示使用 self.tokenizer.encode(request.prompt) 进行编码
  3. 生成的 token ID 存储为 NumPy 数组
  4. 如果需要,token 序列会被填充或截断以满足模型的要求

来源:runners.py513 runners.py521

填充与截断

分词系统通过填充和截断来处理不同长度的输入

  1. pad_to_size() 函数管理 token 序列的长度

    • 如果输入太长(x.shape[0] > size),它会从左侧截断:x = x[-size:]
    • 然后用零填充到所需大小:np.pad(x, [0, size - x.shape[0]], mode="constant", constant_values=0)
  2. 适当的填充大小由 get_pad_bucket() 方法确定

    • 它使用 bisect.bisect_leftpad_sizes 元组中查找合适的 bucket
    • 这确保了 token 被填充到预定义的 bucket 大小,以实现高效的批处理

来源:runners.py77-81 runners.py271-273

解码过程

生成 token 后,系统将生成的 token ID 转换回文本

  1. 生成的 token 累积在 all_tokens 列表中
  2. 当生成完成或达到最大长度时,使用 self.tokenizer.decode(all_tokens) 解码 token
  3. 生成的文本作为输出被 yield

来源:runners.py568

与推理流水线集成

分词系统与推理流程紧密集成,如下图所示

来源:runners.py501-577

技术规格

参数描述
分词器类型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))。

为了在推理期间提高效率

  1. 通过 get_pad_bucket() 以预定义的 bucket 大小处理 token
  2. 比最大长度短的 token 序列会被填充,以避免因序列长度变化而重新编译
  3. 比最大上下文窗口(8,192 个 token)长的序列会被从左侧截断以适应

来源:README.md31-35 runners.py271-273 runners.py77-81

使用示例

运行推理时,分词过程如下

  1. 创建一个带有文本提示的请求
  2. 分词器将此提示编码为 token ID
  3. 模型处理这些 token 并生成新 token
  4. 分词器将生成的 token 解码回文本
  5. 返回结果文本

此过程由 sample_from_model() 函数自动处理,该函数接受 prompt、最大长度和 temperature 作为参数。

来源:runners.py596-605