コンテンツにスキップ

PaddleOCR on SageMaker

OCRモデルの特性に応じて2つのバックエンドにルーティングする処理パイプラインです。

バックエンドモデル理由
Lambda (CPU)PP-OCRv5, PP-StructureV3軽量モデル、GPU不要、高速起動
SageMaker (GPU)PaddleOCR-VLVision-Languageモデル、GPU必須

PP-OCRv5/PP-StructureV3はCPUのみで十分高速に動作するため、SageMakerのコールドスタートなしでLambdaから直接処理します。PaddleOCR-VLはテキスト領域ごとのVLM推論にGPUが必須のため、SageMakerで実行します。


SQS (OCR Queue)
→ Lambda (OCR Invoker) ─── モデルに応じてルーティング
├─ [PP-OCRv5 / PP-StructureV3] ── CPUモデル
│ → Lambda (OCR Processor) ── コンテナイメージLambda
│ ├─ S3 (result.json保存)
│ └─ DynamoDB (前処理ステータス更新)
└─ [PaddleOCR-VL] ── GPUモデル
├─ Scale-out: DesiredInstanceCount → 1
└─ InvokeEndpointAsync → SageMaker Endpoint
→ PaddleOCR-VL推論
├─ 成功 → SNS (Success) → OCR Complete Handler → DynamoDB + S3
└─ 失敗 → SNS (Error) → OCR Complete Handler → DynamoDB
SageMaker Scale-in:
CloudWatch Alarm(10分アイドル)
→ SNS (Scale-in) → Scale-in Handler Lambda
→ DesiredInstanceCount → 0

コンテナイメージLambdaでCPUベースのOCRを実行します。SageMakerを経由せず、直接結果をS3に保存しDynamoDBステータスを更新します。

項目
関数名idp-v2-ocr-lambda-processor
ランタイムPython 3.12 (Container Image)
メモリ4096 MB
タイムアウト15分
ベースイメージpublic.ecr.aws/lambda/python:3.12
依存関係paddleocr>=3.3.0, paddlepaddle>=3.2.2, boto3
モデルキャッシュS3にモデルアーカイブをキャッシュ(初回ダウンロード後再利用)

処理フロー:

OCR Invoker (Invoke async, Eventタイプ)
→ OCR Lambda Processor
├─ S3からファイルダウンロード → /tmp
├─ モデルロード (S3キャッシュ → HuggingFaceフォールバック)
├─ OCR推論実行
├─ result.json S3保存
└─ DynamoDBステータス更新 (COMPLETED/FAILED)

SNSコールバック不要: SageMaker非同期推論と異なり、Lambdaが直接結果を処理するためSNSトピックを経由しません。

PaddleOCR-VLはVision-Languageモデルで、検出されたテキスト領域ごとにVLM推論を実行するためGPUが必須です。Auto-scaling 0→1構成でコストを最適化します。

項目
インスタンスタイプml.g5.xlarge (NVIDIA A10G 24GB)
最小インスタンス0 (Scale-to-zero)
最大インスタンス1
最大同時呼び出し4 / インスタンス
呼び出しタイムアウト3,600秒(1時間)
最大レスポンスサイズ100MB
ベースイメージPyTorch 2.2.0 GPU (CUDA 11.8, Ubuntu 20.04)

VLモデルは内部的に以下のように動作します:

画像入力
→ [ステップ1] レイアウト検出 (CPU/GPU) ── テキスト領域N個検出
→ [ステップ2] 領域ごとのVLM推論 (GPU) ── N回順次呼び出し
→ 結果マージ

テキスト領域がN個検出されると、VLMをN回順次呼び出しします。この構造的特性により:

  • ページあたり約14秒(画像サイズに依存せず、領域数に比例)
  • GPU使用率約25%(VLM推論間のCPU前後処理待ち)
  • 単一GPUでマルチプロセス不可(VLMモデル~12GB、2つロードでOOM)

これらの制約により、軽量モデルはLambdaで処理してSageMakerコールドスタートを回避し、VLのみSageMakerで実行します。


SageMaker (PaddleOCR-VL) 専用ポリシーです。LambdaバックエンドはAWS Lambdaの自動スケーリングに従います。

項目
トリガーOCR Invoker Lambda
タイミングSageMaker非同期推論呼び出し直前
方式update_endpoint_weights_and_capacities API直接呼び出し
動作DesiredInstanceCount: 0 → 1
応答時間即時(API呼び出し)
冪等性既に1の場合は無視

OCR Invoker LambdaがVLモデルで処理する必要がある時、SageMaker推論呼び出し前にエンドポイントをアクティベートします。インスタンスが0の状態から実際に推論可能になるまでコールドスタート時間が必要です。

項目
トリガーCloudWatch Alarm → SNS → Scale-in Handler Lambda
メトリクスApproximateBacklogSizePerInstance
条件< 0.1(実質的にゼロ)
評価期間10分連続(1分間隔、10回)
欠落データBREACHINGとして処理(アラーム発動)
動作DesiredInstanceCount: 1 → 0

10分間キューに処理すべき作業がない場合、CloudWatchアラームが発動し、SNSを通じてScale-in Handler Lambdaをトリガーしてインスタンスをゼロに縮小します。

文書到着 ─→ OCR Invokerがモデル確認
├─ [PP-OCRv5/V3] → Lambda即時処理(コールドスタートなし)
└─ [VL] → SageMaker Scale-out (0 → 1)
推論処理(コールドスタート含む)
処理完了 → SNS → OCR Complete Handler
10分間追加リクエストなし
CloudWatch Alarm発動 → Scale-in (1 → 0)
課金停止(インスタンス0)

項目
名前idp-v2-ocr-invoker
ランタイムPython 3.14
メモリ256MB
タイムアウト1分
トリガーSQS(バッチサイズ: 1)
役割モデル別ルーティング: Lambda非同期呼び出しまたはSageMaker Scale-out + 非同期推論呼び出し
項目
名前idp-v2-ocr-lambda-processor
ランタイムPython 3.12 (Container Image)
メモリ4096 MB
タイムアウト15分
トリガーLambda非同期呼び出し(OCR Invokerから)
役割OCR推論、S3結果保存、DynamoDBステータス更新
対象モデルPP-OCRv5, PP-StructureV3
項目
名前idp-v2-ocr-complete-handler
ランタイムPython 3.14
メモリ256MB
タイムアウト5分
トリガーSNS(Success + Errorトピック)
役割SageMaker推論結果処理、S3保存、DynamoDBステータス更新
対象モデルPaddleOCR-VL(SageMaker経由)
項目
名前idp-v2-ocr-scale-in
ランタイムPython 3.14
メモリ128MB
タイムアウト30秒
トリガーSNS(CloudWatch Alarm)
役割DesiredInstanceCount → 0

SageMaker (PaddleOCR-VL) パスでのみ使用されます。LambdaパスはSNSを使用しません。

トピック用途サブスクライバー
idp-v2-ocr-success推論成功通知OCR Complete Handler
idp-v2-ocr-error推論失敗通知OCR Complete Handler
idp-v2-ocr-scale-inScale-inアラーム通知Scale-in Handler

モデルバックエンド説明ユースケース
PP-OCRv5Lambda (CPU)高精度汎用テキスト抽出OCR一般文書、多言語テキスト
PP-StructureV3Lambda (CPU)テーブル・レイアウト検出を含む文書構造分析表、フォーム、複雑なレイアウト
PaddleOCR-VLSageMaker (GPU)ビジョン言語モデルベースの文書理解複雑な文書、コンテキスト理解

PaddleOCRは80以上の言語をサポートしています。

言語コード言語コード
中国語・英語ch韓国語korean
英語en日本語japan
繁体字中国語chinese_chtフランス語fr
ドイツ語deスペイン語es
イタリア語itポルトガル語pt
ロシア語ruアラビア語ar
ヒンディー語hiタイ語th
ベトナム語viトルコ語tr
言語コード言語コード
アフリカーンス語afアルバニア語sq
バスク語euボスニア語bs
カタルーニャ語caクロアチア語hr
チェコ語csデンマーク語da
オランダ語nlエストニア語et
フィンランド語fiガリシア語gl
ハンガリー語huアイスランド語is
インドネシア語idアイルランド語ga
ラトビア語lvリトアニア語lt
ルクセンブルク語lbマレー語ms
マルタ語mtマオリ語mi
ノルウェー語noオック語oc
ポーランド語plルーマニア語ro
ロマンシュ語rmセルビア語(ラテン)rs_latin
スロバキア語skスロベニア語sl
スウェーデン語svタガログ語tl
ウェールズ語cyラテン語la
言語コード言語コード
ロシア語ruウクライナ語uk
ベラルーシ語beブルガリア語bg
セルビア語(キリル)srマケドニア語mk
モンゴル語mnカザフ語kk
キルギス語kyタジク語tg
タタール語ttウズベク語uz
アゼルバイジャン語azモルドバ語mo
バシキール語baチュヴァシ語cv
マリ語mhrウドムルト語udm
コミ語kvオセット語os
ブリヤート語buaカルムイク語xal
トゥバ語tyvサハ語sah
カラカルパク語kaaアブハズ語ab
アディゲ語adyカバルド語kbd
アヴァル語avダルグワ語dar
イングーシ語inhチェチェン語ce
ラク語lkiレズギン語lez
タバサラン語tab
言語コード言語コード
アラビア語arペルシア語fa
ウイグル語ugウルドゥー語ur
パシュトー語psクルド語ku
シンド語sdバローチー語bal
言語コード言語コード
ヒンディー語hiマラーティー語mr
ネパール語neタミル語ta
テルグ語teビハール語bh
マイティリー語maiボージュプリー語bho
マガヒー語mahサドリー語sck
ネワール語newコンカニ語gom
サンスクリット語saハリヤーンヴィー語bgc
パーリ語pi
言語コード言語コード
ギリシャ語elスワヒリ語sw
ケチュア語qu古英語ang

形式拡張子
PDF.pdf
画像.png, .jpg, .jpeg, .tiff, .bmp, .webp