Skip to content

Accelerate large structural tag compilation - #758

Closed
Ubospica wants to merge 4 commits into
mlc-ai:mainfrom
Ubospica:perf/structural-tag-compile-speed
Closed

Ubospica wants to merge 4 commits into
mlc-ai:mainfrom
Ubospica:perf/structural-tag-compile-speed

Conversation

@Ubospica

@Ubospica Ubospica commented Jul 28, 2026

Copy link
Copy Markdown
Collaborator

改动内容

这个请求优化大型结构标签语法的编译。结构标签语法是把“可调用函数名”和“函数参数的 JSON 数据结构规则”组合成生成约束的语法。

  • 用共享前缀树构造大量函数分支,复用相同的文本前缀和后缀。
  • 并行构造彼此独立的语法状态图。
  • 并行转换各函数的 JSON Schema,再按原顺序合并。JSON Schema 是描述 JSON 数据结构及字段约束的规则。
  • 避免重复生成结构标签指纹及重复解析 JSON Schema。
  • 用连续数组保存语法状态,减少散列表分配。
  • 复用编译线程,减少反复创建线程的开销。
  • 每个工作线程直接构建自己的词元掩码结果表,最后移动合并。词元掩码是生成每个词元时用于排除不合法候选的布尔结果。
  • 增加 64 个前缀相互重叠的函数分支测试。

性能结果

测试对象是固定的 400 函数结构标签语法,使用 Qwen3 词元表、发布构建和 8 个固定处理器核心。

本请求原有结果

以下两项只统计语法转换和状态图构造,不包含同一次调用中的词元掩码预计算,因此不能与完整编译时间混用:

  • 首次编译中位数:XGrammar 为 92.170 ms,llguidance 为 120.977 ms,快 23.8%。llguidance 是另一个生成约束实现,这里作为对照。
  • 跨语法复用规则缓存后的中位数:XGrammar 为 90.472 ms,llguidance 为 121.391 ms,快 25.5%

新增的工作线程局部结果表

单独移除这项优化后再比较,它在大型结构标签的完整编译中将 213.632 ms 降至 194.677 ms,降低 8.9%。另外三种较小或不同类型输入没有稳定收益,最差为小型结构标签增加 8.2%;因此这项优化主要针对大型结构标签。

这项优化与单独请求 #783 的“跳过重复结构标签规范化”组合后,旧实验记录中的完整编译中位数为:

实现 完整编译时间
XGrammar:本请求加 #783 143.810 ms
llguidance 151.295 ms

组合后的 XGrammar 快 4.95%。该结果使用 15 个稳定样本;它是两个请求的组合结果,不是这个请求单独达到的结果。

正确性验证

  • 大型结构标签相关测试:39 项通过。
  • 结构标签转换测试:1024 项通过。
  • 离线编译器测试:11 项通过,9 项跳过。
  • 离线结构标签匹配测试:9 项通过,12 项跳过。
  • 新增工作线程局部结果表后,针对编译器和结构标签匹配器再次运行:20 项通过,21 项跳过。
  • 提交前格式与静态检查全部通过。

跳过的测试需要额外下载受访问限制的模型词表;本次改动不涉及这些模型。

@Ubospica Ubospica changed the title perf: accelerate large structural tag compilation Accelerate large structural tag compilation Jul 30, 2026
@Ubospica
Ubospica marked this pull request as ready for review July 30, 2026 15:38
Copilot AI review requested due to automatic review settings July 30, 2026 15:38
@Ubospica

Copy link
Copy Markdown
Collaborator Author

这个历史组合请求已拆分为独立请求:#781#783#784#785#790#791#792#793。143.810 毫秒完整组合的构成与限制记录在 #793,后续请评审拆分后的请求。

@Ubospica Ubospica closed this Jul 30, 2026
@Ubospica
Ubospica removed the request for review from Copilot July 30, 2026 16:08
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant