Prhub

#53056 [Rust Frontend] Migrate to new tekken crate

原始 PR 作者 jorge-menjivar 合并时间 2026-09-01 10:35 文件变更 2 提交数 5 评论 9 代码增减 +10 / -62

执行摘要

Rust 分词依赖迁移至 tekken 0.2.0,剔除音频图像依赖并去重 tiktoken

PR body 明确了动机:作者 jorge-menjivar 是 tekken-rs 的维护者,因 crates.io 没有 crate 重命名机制,选择发布新 crate 以 "make it easier to import, find, and align with its library name"(让导入、检索更简单,并与库名保持一致);旧名 tekken-rs 0.1.2 是最后版本,之后不再更新。0.2.0 顺带引入 v15 版 tokenizer 支持、图像 tokenization,以及被 feature flag 包裹的音频/图像依赖。对 vLLM 而言,本次迁移是依赖治理收尾:把 workspace 依赖指向新 crate,避免依赖一个已停止更新的旧包,并借 default-features 语义变化(0.1.1 无 feature flags,该配置纯属空操作)清理依赖树;同时消除了依赖图中重复的 tiktoken-rs 版本。

值得快速精读(约 5 分钟):这是一次教科书式的 Rust crate 重命名迁移。可借鉴的两点:其一,重命名 crate 时保持 library name 不变,让下游 use 语句零改动;其二,利用 default-features 语义变化(从空操作到真正生效)顺手裁剪依赖树并完成版本去重。对 Rust 前端或依赖治理的维护者,Cargo.lock 的 diff 是理解依赖图变化的最直观入口。

讨论亮点

review 讨论非常克制:没有 inline 评论、没有未解决疑虑。核心交锋来自维护者 BugenZhao 的批准评论 "It's good to see there's no duplicated tiktoken versions in the dep graph"——这句话点出本 PR 最实质的工程收益(依赖图去重)。Codex 自动评审(chatgpt-codex-connector[bot])对提交 9ea00977e5 给出 "Didn't find any major issues" 的结论。其余 comment 基本是 bot 的 CI 授权与触发消息(两次 /ci run),PR 在 CI 通过后直接合入。

实现拆解

  1. 更新 workspace 依赖声明(rust/Cargo.toml):依赖行从 tekken = { package = "tekken-rs", version = "0.1.1", default-features = false } 调整为 tekken = { version = "0.2.0", default-features = false }。package 别名随 crate 正式改名而删除;保留的 default-features = false 是本次迁移的关键杠杆——它在 0.1.1 上是空操作(旧 crate 无 feature flags,音频依赖无条件引入),在 0.2.0 上才真正排除音频与图像相关依赖。
  2. 重生成依赖锁文件(rust/Cargo.lock,+9/-61):tekken-rs 0.1.1 包条目替换为 tekken 0.2.0,同时清理出 hound 3.5.1、rubato 0.16.2、ndarray 0.16.1、rustfft、tiktoken-rs 0.7.0 等 5 个不再被引用的包条目。最大隐含收益是 tiktoken-rs 版本去重:tekken 0.2.0 不再锁定 0.7.0,而是与 workspace 中 vllm-tokenizer 等 crate 共用 0.9.1,这一点被维护者 BugenZhao 在批准评论中特意肯定。
  3. 确认源码零改动:tekken-rs 的 lib target 名称一直就是 tekken,所以 rust/src/tokenizer/ 下所有 use tekken::... 导入在新 crate 上继续有效;Rust 前端只用它做纯文本分词,不会启用 0.2.0 新增的 image feature,因此无需触碰任何 tokenizer 逻辑。提交历史印证了这一点:5 个提交中 4 个是 main 分支合入,无返工痕迹。
  4. 测试与 CI 配套:作者本地验证 cargo test -p vllm-tokenizer(62 个通过)与 cargo test --workspace(1555 个通过);合入前由维护者执行 /ci run 触发上游 Buildkite CI(#86464)验证。PR 未新增 v15 tokenizer 或图像能力的回归用例——这些能力在本次迁移中本就不启用。
文件 模块 状态 重要度
rust/Cargo.toml 依赖配置 modified 3.07
rust/Cargo.lock 依赖锁文件 modified 4.21

关键源码片段

rust/Cargo.toml configuration

迁移的入口:workspace 依赖声明从 tekken-rs 0.1.1 改为 tekken 0.2.0,删除 package 别名;default-features = false 在 0.2.0 上真正生效,是剔除音频 / 图像依赖的关键配置。

# rust/Cargo.toml — workspace 依赖声明(变更后)
# 迁移前:tekken = { package = "tekken-rs", version = "0.1.1", default-features = false }。
# 关键点一:tekken-rs 的 library name 本就是 tekken,因此源码中所有 use tekken::... 无需改动。
# 关键点二:0.1.1 没有任何 feature flags,default-features = false 是空操作;
# 0.2.0 把音频 / 图像依赖收进 feature 后该配置真正生效,
# 文本分词场景下 hound、rubato、rustfft、ndarray 四个包全部退出依赖树。
tekken = { version = "0.2.0", default-features = false }
​
# 下方为相邻的、未受本次迁移影响的依赖,用于提供上下文
tempfile = "3.23.0"
thiserror = "2.0.16"
rust/Cargo.lock dependency-upgrade

体现迁移的实际影响面(+9/-61):tekken-rs 0.1.1 包条目替换为 tekken 0.2.0,移除 hound、rubato、ndarray 0.16.1、rustfft、tiktoken-rs 0.7.0 等不再被引用的包,是依赖裁剪与版本去重的最终结果。

# rust/Cargo.lock — tekken 0.2.0 包条目(整理自 lock 文件)
# 与 tekken-rs 0.1.1 对比:依赖列表删除了 hound、rubato、rustfft、ndarray 0.16.1;
# tiktoken-rs 不再固定为 0.7.0(带版本后缀),改为无后缀形式,
# 表示与 workspace 内 vllm-tokenizer 等 crate 共用同一个 tiktoken-rs 0.9.1,
# 从而消除依赖图中的重复版本。
[[package]]
name = "tekken"
version = "0.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1d1481e6bbb98c7e1b04124420b6e7c367c87fc897aae340edcdeb4e91b639d2"
dependencies = [
    "anyhow",
    "base64 0.22.1",
    "env_logger",
    "log",
    "regex",
    "rustc-hash 1.1.0",
    "serde",
    "serde_json",
    "thiserror 2.0.18",
    "tiktoken-rs",
]

评论区精华

tiktoken-rs 双版本去重 设计

BugenZhao 在批准评论中指出升级后依赖图中不再有重复的 tiktoken 版本。背景是 tekken-rs 0.1.1 依赖 tiktoken-rs 0.7.0,而 workspace 其余 crate(如 vllm-tokenizer)使用 0.9.1,导致双版本并存;tekken 0.2.0 与 workspace 对齐到 0.9.1。

结论:确认依赖图去重,维护者直接批准合入,无需修改。 · 已解决

Codex 自动评审结论 other

BugenZhao 通过 @codex review 触发自动评审,chatgpt-codex-connector[bot] 对提交 9ea00977e5 给出结论:未发现重大问题。

结论:无需处理项,随后进入 CI 验证与合入流程。 · 已解决

风险与影响

  1. 分词行为回归风险:0.1.x → 0.2.0 是主版本跳升,虽然 1555 个 workspace 测试全过,但 PR 未新增分词 golden 输出或 v15 边界输入(特殊符号、超长文本等)的回归用例,现有测试难以发现语义级差异。若后续 Mistral 系模型出现 tokenizer 行为偏差,需回溯本次升级。
  2. 上游依赖治理风险:tekken 由 PR 作者单人维护,且旧 crate 名已停更;vLLM 对 tekken 的 bugfix 与功能跟进完全绑定该作者的发版节奏,若上游失联或行为变化,vLLM 需要 fork 或替换后端。
  3. 构建影响(正向):default-features = false 生效后,ndarray、hound 等重依赖退出编译单元,Rust 前端构建时间与产物体积下降。
  4. 兼容性:改动局限于 rust/ 目录,Python 侧与 CUDA/C++ 内核无关联;Cargo.lock 去重消除了双版本 tiktoken-rs 的潜在行为分歧。

对最终用户:无功能变化,文本分词结果保持一致(全量测试通过)。对构建系统:Rust 依赖树移除 5 个包、消除 tiktoken-rs 双版本,编译缓存会因 lock 变化失效一次,但长期构建更快、产物更小。对团队:本 PR 是 Rust 前端基建建设的一环,为后续引入 Mistral v15 分词或图像 tokenization 能力提供干净的依赖基础;同时也确立了一个"第三方 crate 由贡献者本人维护"的依赖治理先例,值得纳入依赖评审流程的关注点。

第三方依赖升级 上游单作者维护 无新增回归测试 主版本跳升 0.1→0.2

关联 Issue

未识别关联 Issue

当前没有检测到明确关联的 Issue 链接,后续同步到相关引用后会出现在这里。

完整报告

参与讨论