[Rust] 为 TableProcessor 实现 ONNX 会话池,以提高并行性

作者: lfgranja创建于 2026年2月19日更新于 2026年2月19日

□ 问题

Rust引擎中目前的“表处理器”执行使用“std::sync::Mutex<Session}”来序列化所有ONNX推断操作:

酒吧结构表处理器{
届会: 选项<std:::同步:Mutex<Session},
型号 类型: 表格模版,
{\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你觉得呢?

这种设计意味着所有的取表操作都是被序列化的,即使在并行处理多页时也是如此. 这造成了一个瓶颈:

  1. 处理多页多表格的PDF
  2. 利用平行主义的多核心系统
  3. 使用Rayon的`par iter ()'处理页面

□ 建议的解决办法

执行一个会话池模式,允许多个并行推断操作:

备选1:固定会话池

酒吧结构表处理器{
会话: Vec<Arc<Mutex<Session},
池大小:使用,
下个 idx:原子大小,
{\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你觉得呢?

备选2:线程-本地会话(执行器) 使用“ 线程 本地! ” 给每个线程自己的会话, 完全避免锁定争论 。

备选 3: 意识会话池 如果我们开始完全合成处理,则使用“tokio::sync:Semaphore”和多会话。

□ 福利

  • 增加表重文件的吞吐量
  • 更好地利用多核心系统
  • 减少分批处理的延迟性

□ 考虑

  • ONNX 运行时会话不安全, 所以每个会话仍然需要保护
  • 内存使用量随池大小而增加(每个会话都有自己的分配器状态)
  • 需要制定基准,以找到最佳池子规模

□ 当前的工作

现有的执行工作是正确的,但由于序列化,许多表格的文件可能较慢。

□ 相关

  • 第205期(表TransformerONNX产出合同)
  • PR #9(实现统一)

内容来源: HKUDS/RAG-Anything