Prhub

#27235 refactor: replace oversized 1.3MB tiny_tokenizer.json fixture with a genuinely tiny byte-level BPE fixture

原始 PR 作者 mvanhorn 合并时间 2026-06-09 08:40 文件变更 2 提交数 1 评论 2 代码增减 +17 / -15

执行摘要

将 1.3MB 的 tokenizer 测试 fixture 缩小为几 KB

Issue #27219 指出 tiny_tokenizer.json 实际大小为 1.3MB,包含了完整的 GPT-2 BPE tokenizer(50256 词汇表 + 完整的 merges 表),与文件名中的 "tiny" 名不副实。该文件作为 fixture 被 11 个测试用例引用,不能直接删除,需要替换为真正小的 tokenizer 以减少仓库体积。

这个 PR 是测试基础设施的清理工作,值得所有关注仓库健康度的开发者了解。它展示了如何在不影响测试覆盖的前提下,通过细心分析测试依赖来安全地移除大型二进制/JSON 文件。

讨论亮点

该 PR 的 review 过程简洁高效,只有一位 reviewer(Kangyan-Zhou) 批准,无额外评论。合并者(同一个人)在合并后对 PR 作者表达了感谢。改动本身直接源于 issue #27219,没有引发设计层面的争议。

实现拆解

  1. 替换测试 fixture 文件:将 experimental/sgl-router/tests/fixtures/tiny_tokenizer.json 重新生成为真正小的 byte-level BPE tokenizer,仅包含 256 个 byte token(0-255)加上一个 <|endoftext|> token,merges 表为空。新文件从 1.3MB 缩减至几 KB,同时对 ASCII/bytes 无损,确保 encode/decode 的 round-trip 断言仍然成立。
  2. 更新 Rust 测试断言:在 experimental/sgl-router/src/tokenizer/mod.rsdecode_complete_returns_string_on_partial_utf8 测试中,之前使用了 GPT-2 特有的 token id [47249, 222] 来表示 😀 表情。由于新的 tokenizer 没有 merges,😀 会编码为原始 UTF-8 字节 [240, 159, 152, 128],因此更新了断言及其注释。同时观察到的细节:测试中传递给 decode_complete 的切片从 &full[..1](解码第一个 token)改为 &full[..3](解码前三个字节),因为新的 tokenizer 中每个字节都是单独 token,需要 3 个 token 才能触发部分 UTF-8 解码分支。
文件 模块 状态 重要度
experimental/sgl-router/tests/fixtures/tiny_tokenizer.json 测试 Fixture modified 3.86
experimental/sgl-router/src/tokenizer/mod.rs 路由模块 modified 6.31

关键源码片段

experimental/sgl-router/tests/fixtures/tiny_tokenizer.json test-coverage

被替换的核心测试 fixture,从 1.3MB 缩减至几 KB,同时保持了对 ASCII/bytes 无损的 tokenization 能力。

// 新的 tiny_tokenizer.json 核心结构:极小 byte-level BPE
{
  "version": "1.0",
  "added_tokens": [{"id": 256, "special": true, "content": "<|endoftext|>"}],
  "pre_tokenizer": {"type": "ByteLevel"},
  "post_processor": {"type": "ByteLevel"},
  "decoder": {"type": "ByteLevel"},
  "model": {
    "vocab": {
      "\u0100": 0, "\u0101": 1, ..., "\u00ff": 255, // 256 个 byte tokens
      "<|endoftext|>": 256
    },
    "merges": [] // 空 merges 表,仅依赖 byte-level 编码
  }
}
experimental/sgl-router/src/tokenizer/mod.rs entrypoint

唯一的源码改动文件,更新了 test `decode_complete_returns_string_on_partial_utf8` 中的断言,以适配新 tokenizer 的字节级特性。

// 片段来自 tiny_tokenizer.json 替换后,用于测试 partial UTF-8 decode 分支的代码调整
#[test]
fn decode_complete_returns_string_on_partial_utf8() {
    let r = TokenizerRegistry::load_from_config(&cfg()).unwrap();
    let t = r.get("tiny").unwrap();    // 新 tokenizer 是 no-merge byte-level BPE:emoji 😀 被编码为 4 个原始字节 token [240, 159, 152, 128]
    let full = adapter::encode(&t, "😀").unwrap();
    assert_eq!(
        full,
        vec![240, 159, 152, 128],
        "fixture tokenisation drift: '😀' no longer encodes to [240, 159, 152, 128]"
    );    // 只解码前 3 个字节(一个 4 字节 UTF-8 码点的前缀),触发 partial UTF-8 分支
    let s = adapter::decode_complete(&t, &full[..3], false).unwrap();
    assert_eq!(s, "\u{FFFD}"); // 预期替换字符
}

评论区精华

没有提炼出高价值讨论线程

当前评论区没有形成足够清晰的争议点或结论,后续有更多讨论时会体现在这里。

风险与影响

风险极低。该 PR 仅修改了测试 fixture 和单个测试断言,不涉及任何推理路径或生产代码。主要风险是测试覆盖的保持——但 11 个测试用例均通过,且测试逻辑已更新以适配新 tokenizer 的字节级特性。没有性能、安全或兼容性影响。

影响范围限于 sgl-router 测试套件。仓库体积减少约 1.3MB,对团队和用户透明。所有 11 个引用该 fixture 的测试用例继续正常运行,无需其他模块配合改动。

关联 Issue

#27219 Oversized test fixture: experimental/sgl-router/tests/fixtures/tiny_tokenizer.json (1.3 MB)

完整报告

参与讨论