Skip to content

パフォーマンス改善提案: PARSeq動的バッチ対応 + モデル再読み込み修正 + マルチスレッド並列認識 #2

@ooki1jp

Description

@ooki1jp

概要

NDLOCR-Liteの公開日(2026/2/24)にM3 MacBook Air上でパフォーマンス検証を行い、以下の3つの改善ポイントを特定しました。

コード変更は最小限で、認識速度を 現状の約3倍以上 に改善できる見込みです。

1. PARSeq ONNXモデルの動的バッチ未対応(最大の改善余地)

問題

train/parseqcode/convert2onnx.py の35行目で dynamic_axes が指定されておらず、PARSeqモデルのバッチ次元が1に固定されています。

# 現在(L35)
model.to_onnx(onnx_path, dummyimg, do_constant_folding=True, opset_version=17)

一方、同リポジトリのDEIMv2側train/deimv2code/part2/tools/deployment/export_onnx.py L64-81)では正しく dynamic_axes が指定されています。

# DEIMv2のエクスポート(正しい例)
dynamic_axes = {
    'images': {0: 'N', },
    'orig_target_sizes': {0: 'N'}
}
torch.onnx.export(model, ..., dynamic_axes=dynamic_axes, ...)

影響

1ページあたり約20行を認識する際、PARSeqの推論を20回個別に実行する必要があります。動的バッチに対応すれば1回の推論でまとめて処理でき、認識ステップが 5〜10倍高速化 する見込みです。

修正案

# convert2onnx.py L35を以下に変更
model.to_onnx(onnx_path, dummyimg, do_constant_folding=True, opset_version=17,
              dynamic_axes={'images': {0: 'batch'}})

3つのモデル(30文字/50文字/100文字)すべてで同様の修正が必要です。

2. ocr.py のモデル毎回再読み込み

問題

ocr.pyinference_on_detector() 関数(L108)が呼ばれるたびに get_detector(args) でDEIMモデルを再作成しています。

def inference_on_detector(args, inputname, npimage, outputpath, issaveimg=True):
    detector = get_detector(args)  # ← 毎ページで1.5秒のモデル読み込み

--sourcedir で複数画像を処理する場合、ページ毎に不要なモデル再読み込みが発生します。

影響

モデル読み込みに約1.5秒かかるため、バッチ処理時に1ページあたり1.5秒の無駄が発生します。

修正案

process() 関数内で recognizer と同様にdetectorも事前に1回だけ作成し、process_detector() を使用する。

3. マルチスレッド並列認識の提案

問題

ONNX RuntimeはCPU推論時にGILを解放するため、同一セッションに対してマルチスレッドで並列推論が可能です。現在は process_cascade() 内で ThreadPoolExecutor を使用していますが、executor.map() の結果を即座に list() で取得しているため、実質的に逐次実行になっています。

実測結果(M3 MacBook Air、22行/ページ)

スレッド数 PARSeq推論時間 高速化率
1(現状) 698ms 1.00x
2 491ms 1.42x
4 326ms 2.14x
8 276ms 2.53x

修正案

process_cascade() を修正し、各モデルの推論を ThreadPoolExecutor(max_workers=4) で並列実行する。

総合的な改善効果(実測値)

設定 1ページ平均
現状(未修正) 2,300ms
#2 モデル再利用のみ 1,140ms
#2 + #3 マルチスレッド 715ms
#2 + #3 + #1 動的バッチ(推定) 450〜500ms

検証環境

  • MacBook Air M3 16GB
  • macOS Sequoia
  • Python 3.12 / ONNX Runtime 1.24.2
  • テスト素材: 九鬼周造「いきの構造」(角川文庫、縦書き300dpi)5ページ

素晴らしいツールの公開ありがとうございます。ご検討いただけますと幸いです。

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions