MLism

AWS Marketplace版YomiToku-Proの軽量版がGPUインスタンスで利用可能になりました

Tech/

AWS Marketplace版YomiToku-Pro DocumentAnalyzerの軽量版が、GPUインスタンス(g4dn/g5/g6)に対応しました。認識精度、処理時間、スループットの実測結果と費用の試算から、通常版との使い分けを解説します。

AWS MarketplaceOCR高速化YomiToku-Pro

MLism代表の木之下です。AWS Marketplaceで提供しているYomiToku-Pro DocumentAnalyzerの軽量版が、GPUインスタンス(g4dn/g5/g6)でも利用できるようになりました。(従来、軽量版を選択できるのはCPUインスタンスのみでした。)

今回の対応にあわせて、通常版と軽量版で認識精度や処理性能がどの程度変わるのかを検証しました。認識精度については、同じ手書きデータセット6,002行を使って文字認識モデル単体を比較しています。処理性能については、帳票、手書きメモ、新聞などを含む509ページを各構成で処理し、1ページあたりの処理時間と、複数のリクエストを同時に送った場合のスループットを測定しました。

今回の結果では、軽量版の文字認識精度は通常版より0.2ポイント低い一方、文字数の多いページほど処理時間の差が大きくなりました。1,000〜3,000字の文字数帯では、軽量版による高速化率(同じ画像を両モデルで処理した比の帯別中央値)が、インスタンスによって最大約2.3倍となりました。本記事では、測定条件と結果を示したうえで、用途に応じたモデルとインスタンスの選び方を解説します。

通常版と軽量版の違い

YomiToku-Pro DocumentAnalyzerは、文書画像の文字検出、文字認識、レイアウト解析を一括して行うSageMakerモデルパッケージです。文字認識モデルは、次の2種類から選択できます。

  • 通常版parseq-middle-v4。手書き文字を含む幅広い文書を対象とした標準モデル
  • 軽量版parseq-tiny-v4-dynw。動的可変長幅入力とバケットバッチングを採用した小型モデル

軽量版が採用する動的可変長幅入力(dynamic-width)とバケットバッチングについては、こちらの技術記事で詳しく解説しています。行画像の長さに応じて入力幅を変えることで不要な計算を減らし、小型モデルでありながら最大100文字の行を認識できるようにしています。

CPUインスタンス(c7i)では、処理時間を考慮して軽量版のみを提供しています。GPUインスタンスでは、今回の対応により通常版と軽量版を用途に応じて選択できるようになりました。

認識精度の比較

通常版と軽量版で異なるのは文字認識モデルだけであり、文字検出モデルとレイアウト解析モデルは共通です。そこで今回は、文字認識モデル単体(Recognizer-Only)の性能を比較しました。この評価は、文書解析パイプライン全体の精度を表すものではありません。

評価条件は次のとおりです。

  • 人手で付与された正解のテキスト行領域を切り出し、認識モデルへ直接入力しました。文字検出モデルを介さないため、検出位置のずれや行の分割・結合による影響は含まれません。
  • 両モデルに同じ6,002行を入力し、全角・半角や空白などを所定の規則で正規化したうえで、出力テキストを正解データと比較しました。
  • 指標には、文字単位の「文字認識精度(1 − CER)」と、行単位の「行完全一致率」を用いました。CERは編集距離に基づく文字誤り率です。行完全一致率は、1行の中に1文字でも誤りがあれば不一致とする、文字認識精度より厳しい指標です。

評価データには、公開データセットJaWildText(llm-jp、Apache-2.0)の手書きサブセットhandwriting_ocr(1,065枚、6,002行)を使用しました。カメラで撮影された実環境の画像に手書き文字が写っており、縦書きと横書きの両方を含みます。

評価指標(手書き6,002行)通常版(middle-v4)軽量版(tiny-v4-dynw)差(軽量版 − 通常版)
文字認識精度(1 − CER)95.9%95.7%−0.2ポイント
行完全一致率64.4%62.3%−2.1ポイント
行完全一致率(横書き4,213行)69.4%67.8%−1.6ポイント
行完全一致率(縦書き1,789行)52.6%49.3%−3.3ポイント

このデータセットでは、軽量版は通常版に対して、文字認識精度で0.2ポイント、行完全一致率で2.1ポイント低い結果となりました。横書きの行完全一致率の差は1.6ポイント、縦書きでは3.3ポイントです。行完全一致率は1文字の誤りでも不一致となるため、文字単位の精度よりモデル間の差が大きく表れます。

ただし、この結果は手書きサブセットに対する認識モデル単体の評価であり、活字文書を含むあらゆる入力で同じ差になることを保証するものではありません。また、軽量版では、文字数が非常に多い行の末尾が途中で打ち切られる例を少数確認しています。金額や日付など、一文字の誤りや欠落が業務上の問題につながる項目を扱う場合は、通常版を選ぶか、項目単位の照合・検証処理を併用してください。

以上から、大量の文書を速度と費用を重視して処理する場合は軽量版、認識精度を優先する場合は通常版が基本的な選択肢となります。

1ページずつ処理した場合の所要時間

同じ509ページを各構成のSageMakerエンドポイントへ1ページずつ順番に送信し、リクエストごとの処理時間を測定しました。後述する同時実行時のスループットとは測定方法が異なります。

509ページの内訳は、帳票・申請書233ページ、手書きメモ82ページ、レシート50ページ、技術文書・仕様書44ページ、縦書き文書40ページ、看板・屋外シーン25ページ、新聞20ページ、スクリーンショット15ページです。1ページあたりの認識文字数は中央値503字で、1万字を超えるページも含まれています。

処理時間は、認識する文字数だけでなく、画像の解像度や文書のレイアウトにも左右されます。したがって、以下の結果はこの509ページに対する実測値であり、別の文書群で同じ性能が得られることを示すものではありません。導入時には、実際に処理する文書で検証してください。

文書の種類ごとの結果を以下に示します。処理時間はml.g6.xlargeで測定した中央値、文字数は認識結果に含まれる総文字数の中央値です。

文書タイプページ数文字数(中央値)ファイルサイズ(中央値)通常版軽量版
帳票・申請書(PDF・スキャン)233723字0.3MB1.19秒0.70秒
技術文書・仕様書44546字0.2MB1.42秒0.65秒
レシート(カメラ撮影)50403字0.4MB0.93秒0.52秒
スクリーンショット15399字0.1MB0.88秒0.52秒
縦書き文書(クリーンPDF)40331字0.1MB0.50秒0.44秒
看板・屋外シーン(カメラ撮影)25529字2.7MB1.23秒0.80秒
手書きメモ(カメラ撮影)82117字2.1MB0.73秒0.68秒
新聞(スキャン・縦書き段組み)208,774字2.7MB11.40秒5.19秒

この文書セットでは、帳票やレシートの処理時間はおおむね1秒前後でした。一方、新聞のように文字数が多いページでは、数秒から十数秒を要しています。手書きメモや看板などの写真は、認識文字数が少なくても、高解像度画像に対する文字検出に時間がかかります。軽量版で置き換わるのは文字認識モデルだけなので、文字検出の占める割合が大きいページでは、短縮できる時間も限られます。

全509ページの集計結果は次のとおりです。

インスタンスモデル中央値90パーセンタイル
ml.g4dn.xlarge(T4)通常版1.62秒4.75秒
ml.g4dn.xlarge(T4)軽量版1.03秒1.76秒
ml.g5.xlarge(A10G)通常版0.88秒2.22秒
ml.g5.xlarge(A10G)軽量版0.72秒1.25秒
ml.g6.xlarge(L4)通常版1.01秒3.02秒
ml.g6.xlarge(L4)軽量版0.67秒1.15秒
ml.c7i.2xlarge(CPU)軽量版4.30秒7.20秒

認識文字数と処理時間の関係を見ると、軽量版は通常版よりも回帰直線の傾きが小さく、文字数が増えるほど両者の差が広がりました。

インスタンス別(g4dn/g5/g6/c7i)の1ページ総文字数と処理時間の散布図。通常版と軽量版の回帰直線を比較すると、軽量版は文字量に対する処理時間の増加が緩やか
文字量と1ページあたり処理時間。軽量版(青)は文字量に対する増加が緩やか

画像解像度の影響

処理時間には、認識文字数だけでなく画像解像度も影響します。今回のデータでは、画像の画素数が増えたときの処理時間の増加傾向は、通常版と軽量版で大きくは変わりませんでした。これは、画像解像度の影響を受けやすい前処理と文字検出モデルが両者で共通しているためと考えられます。

数メガピクセルから十数メガピクセルの写真を扱う場合は、画像の読み込み、前処理、文字検出に要する時間を無視できません。文字数の少ない写真が中心であれば、送信前の画像縮小が処理時間の短縮に有効な場合があります。ただし、小さな文字を含む画像は、縮小によって認識精度が低下する可能性があるため、実データで縮小率を調整してください。

同じ画像を通常版と軽量版で処理し、画像ごとの処理時間の比を比較しました。300字以下の文書では、前処理や文字検出など両モデルに共通する処理の割合が大きく、高速化率の中央値は約1.1倍でした。1,000〜3,000字の範囲では、インスタンスによって最大約2.3倍となりました。ここでいう「最大約2.3倍」は、個別ページの最大値ではなく、図に示す文字数帯ごとの中央値のうち最も大きい値です。軽量版に変更すれば、すべての文書が2倍以上速くなるという意味ではありません。

1ページの総文字数帯(〜300字、300〜1,000字、1,000〜3,000字、3,000字〜)ごとの軽量版高速化倍率。g4dn/g6では1,000〜3,000字帯で約2.3倍、300字以下では約1.1倍
文字量帯別の軽量版高速化倍率(同一画像ペア比較の中央値)

同時実行時のスループットと費用

次に、非同期推論を4件同時に実行して測定したスループットと、そこから試算した1ページあたりの費用を示します。前節の処理時間はリクエストを直列に送った結果であり、ここで示すスループットとは測定方法が異なります。

性能の測定と費用の試算には、東京リージョン(ap-northeast-1)を使用しました。費用は、エンドポイントを1時間連続稼働させ、記載のスループットで処理し続ける前提で計算しています。インスタンス費には測定時点の時間単価を使用しました。Public Offerのソフトウェア利用料は全構成で1時間あたり10米ドルとし、1米ドル160円で1,600円に換算しています。通信、ストレージ、周辺サービスなどの費用は含みません。為替やAWSの料金、Marketplaceの契約条件が変われば、試算結果も変わります。

インスタンスモデルインスタンス費実測スループット1ページ単価(インスタンス費のみ)1ページ単価(ライセンス込み)
ml.g4dn.xlarge通常版159円/時1,512ページ/時0.105円1.16円
ml.g4dn.xlarge軽量版159円/時2,952ページ/時0.054円0.60円
ml.g5.xlarge通常版327円/時3,276ページ/時0.100円0.59円
ml.g5.xlarge軽量版327円/時4,356ページ/時0.075円0.44円
ml.g6.xlarge通常版261円/時2,376ページ/時0.110円0.78円
ml.g6.xlarge軽量版261円/時4,788ページ/時0.055円0.39円
ml.c7i.2xlarge軽量版86円/時900ページ/時0.096円1.87円
スループット(ページ/時)と1ページあたりインスタンス費(円)の散布図。軽量版のg6.xlargeとg4dn.xlargeが右下(高スループット・低コスト)に位置する
スループットとコスト効率。右下ほど良い(インスタンス費のみ・ライセンス別)

今回の測定条件では、軽量版はすべてのGPUインスタンスで通常版より高いスループットとなり、試算上の1ページ単価も下がりました。なかでもml.g6.xlargeと軽量版の組み合わせは、実測スループットが4,788ページ/時、ライセンス込みの試算単価が0.39円/ページで、今回比較した構成の中ではスループットが最も高く、試算単価が最も低い結果でした。

この単価は、1時間を通じて測定時と同じ負荷で処理できる前提の値です。待機時間や負荷の変動がある運用では、実際の1ページ単価は表より高くなります。

常時稼働や大規模処理向けには、年額固定料金のPrivate Offerも用意しています。契約条件は個別に異なるため、費用の詳細はお問い合わせください。

用途別の選び方

今回の測定結果に基づく選定の目安は、次のとおりです。

  • 1ページあたりの応答時間を重視する場合ml.g6.xlargeと軽量版の組み合わせ。今回比較した509ページでは、処理時間の中央値が0.67秒、90パーセンタイルが1.15秒で、いずれも最も短い結果でした。複数ページの文書では、ページ数と内容によってリクエスト全体の所要時間が長くなるため、必要に応じてページ単位に分割してください。
  • 低負荷時のGPUインスタンス費を抑えたい場合ml.g4dn.xlargeと軽量版の組み合わせ。今回比較したGPUインスタンスの中では、時間単価が159円/時と最も低い構成でした。ただし、Public Offerのソフトウェア利用料を含む総費用は、稼働時間と実際の処理量に左右されます。
  • 大量の文書を一括処理する場合ml.g6.xlargeと軽量版の組み合わせ。今回の同時実行テストでは、4,788ページ/時と最も高いスループットを記録し、ライセンス込みの試算単価も0.39円/ページで最も低い結果でした(インスタンス費のみの単価ではml.g4dn.xlargeと軽量版の0.054円/ページがわずかに下回ります)。複数台での測定では、1台比で2台が1.95倍、3台が2.86倍でした。ただし、文書の構成やリクエストの投入方法によって伸び率は変わります。
  • 認識精度を優先する場合:通常版を選択します。今回比較した通常版のGPU構成では、ml.g5.xlargeの処理時間が最も短く、4件同時実行時の試算単価も最も低い結果でした。
  • リアルタイム推論で常時稼働し、インスタンス稼働費を抑えたい場合ml.c7i.2xlarge(CPU)と軽量版の組み合わせ。時間単価が86円/時と全構成で最も低いため、処理量の少ないエンドポイントを待ち受けのために常時稼働させる用途に向きます。処理時間は中央値4.30秒とGPU構成より長いため、この応答時間を許容できるかを確認してください。処理量が増えて1ページあたりの費用が重要になる場合は、GPU構成のほうが有利です。

Public Offerのソフトウェア利用料は時間課金であり、長時間エンドポイントを待機させる用途よりも、必要な時間だけ起動してまとまった量の文書を処理する使い方を想定した価格設計としています。そのため、夜間処理や定期的な文書取り込みなど、即時に結果を返す必要がない用途では、リアルタイムエンドポイントに加えてバッチ変換(Batch Transform)の利用も適しています。

Batch Transformでは、処理対象をAmazon S3に配置してジョブを実行すると、処理中のみインスタンスが起動し、ジョブ完了後に終了します。今回のように軽量版で時間あたりの処理量を増やすことで、同じ量の文書をより短い稼働時間で処理できるため、Public Offerの時間課金とも相性のよい構成です。

一方、エンドポイントを24時間稼働させ続ける運用では、時間課金のソフトウェア利用料が費用の大半を占めるようになります。こうした常時稼働の用途はPublic Offerでは想定しておらず、年額固定料金のPrivate Offerを用意しています。価格や契約条件はお問い合わせください。

安定運用のため、1エンドポイントあたりの同時実行数は2を推奨します。8件を超えるリクエストを同時に送ると、HTTP 503エラーが発生する場合があります。負荷試験で確認しながら、同時実行数ではなくインスタンス数を増やして処理能力を調整してください。なお、上表のスループット測定では性能比較のため同時実行数を4に固定しています。

使い方

デプロイ手順はYomiToku-Proデプロイガイドにまとめています。yomitoku-client CLI、SageMakerコンソール、CloudFormationのいずれかを利用できます。yomitoku-client CLIからGPUインスタンスへ軽量版をデプロイする場合は、--liteオプションを指定します。

yomitoku-client CLIを使う場合は、次のようにデプロイします。

# 初期設定(AWS Marketplaceで取得したモデルパッケージARNを登録)
yomitoku-client sagemaker configure

# 軽量版をml.g6.xlargeへデプロイする例
yomitoku-client sagemaker deploy \
  --endpoint-name yomitoku-sagemaker \
  --instance-type ml.g6.xlarge \
  --lite

# 状態を確認
yomitoku-client sagemaker list

# 使用後に削除(エンドポイントの稼働中は課金が発生)
yomitoku-client sagemaker delete --endpoint-name yomitoku-sagemaker

SageMakerエンドポイントは、起動している間、インスタンス費とソフトウェア利用料が発生します。継続して利用しない場合は、不要になったエンドポイントを削除してください。

おわりに

今回の評価では、軽量版の文字認識精度は通常版より0.2ポイント低い一方、文字数の多いページでは処理時間を大きく短縮できました。また、ml.g6.xlargeを4件同時実行した条件では、比較した構成の中で最も高いスループットと最も低い試算単価を記録しました。

ただし、認識精度と処理性能は文書の種類、文字数、画像解像度などによって変わります。速度と費用を重視する場合は軽量版、認識精度を優先する場合は通常版を出発点として、実際の文書で比較することをおすすめします。導入のご相談やPrivate Offerのお見積もりは、お問い合わせページからご連絡ください。