Skip to content

Reduce grammar compilation and allowed-token generation work - #722

Closed
Ubospica wants to merge 2 commits into
mlc-ai:mainfrom
Ubospica:codex/earley-mask-p99-10ms
Closed

Ubospica wants to merge 2 commits into
mlc-ai:mainfrom
Ubospica:codex/earley-mask-p99-10ms

Conversation

@Ubospica

@Ubospica Ubospica commented Jul 23, 2026

Copy link
Copy Markdown
Collaborator

改动摘要

  • 每份已编译语法只预计算一次 Earley 解析器的语法属性,并在编译任务与运行时匹配器之间共享。Earley 解析器是一种通用语法解析方法。
  • 合并结果相同的自适应词元允许集合任务与结果,同时保持原有序列化格式。
  • 根据局部语法后续一次性证明整棵词元前缀子树,避免逐字节重复模拟解析器。
  • 新增容量受限的自适应后续状态缓存;当实际复用无法抵消缓存成本时,缓存会自动关闭。
  • 在规则间复用词元首字节和可选字符类别摘要,减少大型索引和位集合复制,并不再写入后续不可能命中的局部缓存。
  • 新增精确结果、低与中等复用回退、跨边界长词元和大重复范围的回归测试。

词元是模型词表中的基本单位,词元允许集合是某个语法状态允许生成的词元表。LLGuidance 是另一个语法约束生成实现,本请求将它作为外部参考。

原因

慢输入会重复执行三类工作:

  1. 针对多个相关语法状态独立遍历相同的词元前缀。
  2. 当局部后续状态已能证明整棵词元子树时,仍逐字节推进完整解析器。
  3. 为数千个短生命周期编译任务重建只由语法决定的状态属性,并复制大型中间表。

新路径共享只由语法决定的结果,复用结构相同的任务,并在局部证明或缓存接纳条件不成立时保留精确的原有路径。

性能

XGrammar 是本仓库的语法约束生成库。使用两个实现都能完成的 15 个大型 JSON Schema(用于描述 JSON 数据结构的规格),每个输入运行三次并取中位数:

阶段 XGrammar LLGuidance
语法准备 995.273 ms 157.550 ms
词元允许集合生成 972.695 ms 1003.338 ms
解析器状态更新 59.151 ms 52.301 ms
生成阶段总计 1031.845 ms 1055.639 ms
全流程总计 2027.118 ms 1213.189 ms

XGrammar 的生成阶段在这组输入上快 2.3%。全流程耗时是参考实现的 1.67 倍,相比优化前的 2299.331 毫秒降低 11.8%。

慢输入的附加工作量统计:

  • 逐字节解析器推进次数:26,616,963 降到 2,165,783,减少 91.9%。
  • 逐词元分类工作:约 1,700 万次操作降到 303,328 次词元扫描,减少 98.2%。
  • 摘要过滤后保留的相关候选:150,775 个。
  • 关闭跨语法缓存时的局部缓存内存:约 12.06 MB 降到 1.32 MB。

正确性

  • 最慢 20 个输入:19,827 个生成步骤的词元允许集合完全相同。
  • 92 个对照输入:14,107 个生成步骤的词元允许集合完全相同。
  • 当前发布构建在“将警告视为错误”的设置下完成,代码库的提交前检查全部通过。
  • 两个受影响的 Python 语言测试模块通过 122 项,14 项未选中,产生 4 条警告。14 项测试需要远程下载词表,当时因远程服务限流而排除。

@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

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot was unable to review this pull request because the user who requested the review has reached their quota limit.

@Ubospica Ubospica changed the title perf: reduce grammar compilation and token mask work Reduce grammar compilation and allowed-token generation work Jul 30, 2026
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.

3 participants