AWS Marketplace版YomiToku-ProをAmazon SageMaker AIのBatch Transformで実行し、S3上のPDFを一括解析してMarkdownなどへ変換するまでの手順を解説します。
MLism代表の木之下です。OCRのユースケースでは、文書検索用に大量の文書を一括解析したり、日中に収集した文書を深夜バッチで定期的に処理したりするケースがあります。こうした用途に適しているのが、Amazon SageMaker AIのBatch Transformです。
Batch Transformでは、Amazon S3に保存した文書をジョブ単位で一括処理できます。Batch Transform自体にスケジュール機能やS3イベント連携機能はありませんが、EventBridge SchedulerやAmazon S3のイベント通知などと組み合わせることで、定期実行やファイルのアップロードを契機としたジョブ作成を自動化できます。また、ジョブの開始時に推論用インスタンスが起動し、完了後に終了するため、常時稼働するエンドポイントと比べて、処理頻度の低い用途ではコストを抑えやすいという特長があります。
本記事では、AWS Marketplaceで提供しているYomiToku-Proの軽量版をサブスクライブし、Amazon SageMaker AIのBatch TransformでPDFを解析する手順を紹介します。最後に、出力されたJSONをYomiToku-ClientでMarkdown、CSV、HTMLへ変換します。
AWS Marketplaceとは
AWS Marketplaceは、AWS上で提供されるサードパーティ製品を検索・購入できるサービスです。製品をサブスクライブすると、自分のAWSアカウントで利用でき、料金もAWSの請求に集約できます。YomiToku-Proは、Amazon SageMaker AI向けのモデルパッケージとして提供しています。
YomiToku-Pro - Document Analyzer Liteとは
YomiToku-Pro Document Analyzerは、日本語OCRと文書レイアウト解析をAmazon SageMaker AI上で利用できる製品です。サブスクライブすると、YomiTokuのWeb APIを内包したコンテナをAmazon SageMaker AIのモデルとして実行できます。入力文書と解析結果は、お客様が管理するS3バケットに保存されます。
Amazon SageMaker AIにおける推論方式
Amazon SageMaker AIには、代表的な推論方式としてリアルタイム推論、非同期推論、Batch Transformがあります。それぞれの一般的な違いは次のとおりです。
| 推論方式 | 実行方法 | 計算リソース | 適した用途 |
|---|---|---|---|
| リアルタイム推論 | デプロイしたエンドポイントをAPIとして呼び出す | エンドポイントとして継続稼働 | Webサービスや業務アプリから即時に解析する |
| 非同期推論(本製品では利用不可) | S3上の入力データを非同期エンドポイントへ連携する | エンドポイントとして稼働。構成によりゼロ台までスケール可能 | 大きな入力や処理時間の長いリクエストを処理する |
| Batch Transform | S3上の複数ファイルをジョブ単位で処理する | ジョブ開始時に起動し、完了後に終了 | 夜間バッチ、定期処理、大量文書を一括解析する |
AWS Marketplaceのモデルは非同期推論をサポートしていないため、AWS Marketplace版YomiToku-Proではリアルタイム推論またはBatch Transformを利用します。Batch Transformはジョブ作成後にインスタンスが起動するため、即時応答ではなく一括処理に適しています。
Batch Transformを選ぶメリット
Batch Transformは、処理対象があらかじめS3へ集約されており、即時応答を必要としない業務に向いています。例えば、次のような用途です。
- 日中に受け付けた文書を、深夜バッチでまとめて解析する
- 過去のPDFを一括でOCRし、全文検索やRAGに投入するデータを作成する
- S3へ追加された帳票を、日次または週次で処理する
ジョブが終了すると推論用インスタンスも終了します。常時稼働するリアルタイムエンドポイントと比べて、処理頻度が低い用途では費用を抑えやすくなります。
今回作成する構成
今回は東京リージョン(ap-northeast-1)で、YomiToku-Proの軽量版をml.g4dn.xlargeインスタンス1台で実行します。
| 項目 | 設定値 |
|---|---|
| Amazon SageMaker AIのモデル名 | yomitoku-pro-document-analyzer-lite |
| Batch Transformジョブ名 | yomitoku-pro-document-analyzer-lite-batch-0000 |
| 入力先 | s3://yomitoku-batch/input/ |
| 出力先 | s3://yomitoku-batch/output/ |
| 入力形式 | PDF(application/pdf) |
| インスタンスタイプ | ml.g4dn.xlarge |
| インスタンス数 | 1 |
実際に利用するときは、S3バケット名、モデル名、ジョブ名を自身の環境に合わせて変更してください。
コストの目安
本記事で使用するml.g4dn.xlarge1台は、2026年8月時点の試算で合計1,759円/時です。内訳はAmazon SageMaker AIのインスタンス料金159円/時と、AWS Marketplaceのソフトウェア利用料10米ドル/時(1米ドル160円換算)です。
| 稼働時間 | 概算費用 |
|---|---|
| 10分 | 約293円 |
| 30分 | 約880円 |
| 1時間 | 約1,759円 |
時間料金は分単位で按分されます。軽量版の性能検証記事では、約0.60円/ページと試算しました。ただし、実際の費用はジョブの起動時間、文書の内容、処理量によって変わります。S3などの料金は含んでいません。最新の価格は、AWS Marketplace製品ページとAmazon SageMaker AI料金ページで確認してください。
事前に用意するもの
次のリソースまたは実行環境を用意します。
- AWS MarketplaceでYomiToku-Pro - Document Analyzer LiteをサブスクライブしたAWSアカウント
- 入出力に使用するS3バケット
- S3へのアクセス権限を持つAmazon SageMaker AIの実行ロール
- AWS CLIを使用する場合は、認証情報とリージョンの設定
- Python 3.10〜3.12を利用できる環境
- YomiToku-Client(パッケージ名:
yomitoku-client)
Batch
TransformがS3へアクセスするときに使うのは、AWSコンソールへサインインしているAdminロールではなく、Amazon
SageMaker AIのモデル作成時に選択したIAMロールです。コンソールやAWS
CLIからS3ファイルを開けても、モデルの実行ロールに権限がなければジョブは403 Forbiddenで失敗します。
1. AWS Marketplaceでサブスクライブする
AWS Marketplaceで利用する製品を開き、料金と利用条件を確認してサブスクライブします。YomiToku-Proの通常版と軽量版は別のAWS Marketplace製品です。軽量版を利用する場合は、必ず軽量版の製品をサブスクライブしてください。
製品ページで「Continue to Subscribe」を選択し、続いて「Continue to Configuration」へ進みます。Software Versionは原則として最新版、RegionはBatch Transformジョブを実行するリージョンを選択します。本記事ではap-northeast-1を使用します。
2. Amazon SageMaker AIのモデルを作成する
Amazon SageMaker AIコンソールを開き、左側のメニューから Deployments & inference > Deployable modelsへ進み、モデルの作成画面を開きます。

モデル名へyomitoku-pro-document-analyzer-liteを入力し、Amazon SageMaker AIのIAMロールを選択します。

モデル作成時のIAMロールに注意する
ここで選択するIAMロールは、モデルを登録するためだけのものではありません。Batch Transformジョブが入力ファイルをS3から読み取り、結果をS3へ保存するときにも、このロールが使われます。
次は、既存のAmazon SageMaker AIの実行ロールへ追加する、Batch TransformのS3入出力に必要なIAMポリシー例です。YOUR_BUCKETは利用するバケット名に置き換えてください。入力と出力のプレフィックスを分け、必要な範囲だけを許可しています。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "ListBatchBucket",
"Effect": "Allow",
"Action": "s3:ListBucket",
"Resource": "arn:aws:s3:::YOUR_BUCKET",
"Condition": {
"StringLike": {
"s3:prefix": ["input/*", "output/*"]
}
}
},
{
"Sid": "ReadBatchInput",
"Effect": "Allow",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::YOUR_BUCKET/input/*"
},
{
"Sid": "WriteBatchOutput",
"Effect": "Allow",
"Action": "s3:PutObject",
"Resource": "arn:aws:s3:::YOUR_BUCKET/output/*"
}
]
}
作成済みモデルの実行ロールは、Amazon SageMaker AIコンソールの Deployments & inference > Deployable models > 対象モデルに表示されるExecution role ARNで確認できます。AWS CLIでは次のように確認できます。
aws sagemaker describe-model \
--model-name yomitoku-pro-document-analyzer-lite \
--query ExecutionRoleArn \
--output text \
--region ap-northeast-1
コンテナ入力オプションでは「AWS Marketplaceからのモデルパッケージサブスクリプションを使用する」を選択します。モデルパッケージサブスクリプションの一覧から「YomiToku-Pro - Document Analyzer Lite」を選びます。

必要に応じてVPCやタグを設定し、モデルを作成します。Batch Transformでは、リアルタイムエンドポイントを作成する必要はありません。
3. 入力文書をS3へアップロードする
解析するPDFをs3://yomitoku-batch/input/へ配置します。AWS CLIからまとめてアップロードする場合は、次のように実行します。
aws s3 cp ./input/ s3://yomitoku-batch/input/ \
--recursive \
--exclude "*" \
--include "*.pdf"
本記事ではPDFを扱うため、Batch TransformのContent-Typeにはapplication/pdfを指定します。入力プレフィックスには処理対象のPDFだけを置き、出力先は入力プレフィックスの外に設定してください。
4. Batch Transformジョブを作成する
Amazon SageMaker AIコンソールの左側のメニューから、Deployments & inference > バッチ変換ジョブを開き、「バッチ変換ジョブの作成」を選択します。

ジョブの基本情報を次のように設定します。
| 項目 | 設定値 |
|---|---|
| ジョブ名 | yomitoku-pro-document-analyzer-lite-batch-0000 |
| モデル名 | yomitoku-pro-document-analyzer-lite |
| インスタンスタイプ | ml.g4dn.xlarge |
| インスタンス数 | 1 |
| 最大同時変換数 | 1 |
| 最大ペイロードサイズ | 100 MB |
| 暗号化キー | カスタム暗号化なし |
このジョブ名は初回実行の例です。Batch Transformのジョブ名はAWSアカウントとリージョンの中で一意である必要があるため、再実行するときは別の名前へ変更してください。

入力データと出力データは次のように設定します。
| 区分 | 項目 | 設定値 |
|---|---|---|
| 入力 | S3データタイプ | S3Prefix |
| 入力 | S3の場所 | s3://yomitoku-batch/input/ |
| 入力 | Content-Type | application/pdf |
| 入力 | 圧縮 | None |
| 入力 | 分割タイプ | None |
| 出力 | S3出力パス | s3://yomitoku-batch/output/ |
| 出力 | 組み合わせ | None |
SplitTypeにはNoneを指定します。Lineを選択するとPDFや画像のバイナリが行単位で分割されるため、YomiToku-Proの入力として利用できません。
SplitType=Noneでは、1つのPDF全体が1回の推論リクエストとして処理されます。そのため、1つの大きなPDFを複数のインスタンスへ分散して処理することはできません。インスタンスを複数台にした場合に並列化されるのは、主に複数ファイルを投入したときです。1ファイルのサイズや処理時間が大きすぎる場合は、PDFを事前に分割してください。詳しくは、Batch Transformによる推論のAWS公式ドキュメントを参照してください。

設定内容を確認してジョブを作成します。作成直後のステータスはInProgressとなり、処理が完了するとCompletedへ変わります。

AWS CLIから作成する場合
同じジョブをAWS CLIから作成する場合は、次のコマンドを実行します。--transform-job-nameは実行ごとに変更してください。
aws sagemaker create-transform-job \
--transform-job-name yomitoku-pro-document-analyzer-lite-batch-0000 \
--model-name yomitoku-pro-document-analyzer-lite \
--transform-input 'DataSource={S3DataSource={S3DataType=S3Prefix,S3Uri=s3://yomitoku-batch/input/}},ContentType=application/pdf,CompressionType=None,SplitType=None' \
--transform-output 'S3OutputPath=s3://yomitoku-batch/output/,Accept=application/json,AssembleWith=None' \
--transform-resources 'InstanceType=ml.g4dn.xlarge,InstanceCount=1' \
--max-concurrent-transforms 1 \
--max-payload-in-mb 100 \
--region ap-northeast-1
ジョブの状態は次のコマンドで確認できます。
aws sagemaker describe-transform-job \
--transform-job-name yomitoku-pro-document-analyzer-lite-batch-0000 \
--query '{Status:TransformJobStatus,FailureReason:FailureReason}' \
--region ap-northeast-1
TransformJobStatusがCompletedになれば処理完了です。Failedの場合は、FailureReasonとCloudWatch Logsの/aws/sagemaker/TransformJobsを確認してください。
MaxPayloadInMBの既定値は6 MBです。6 MBを超えるPDFも処理できるよう、本記事では最大値の100 MBを指定しています。
5. 解析結果をダウンロードする
ジョブが完了すると、指定したS3出力先へYomiToku-Proの解析結果がJSON形式で保存されます。入力が次のオブジェクトの場合、
s3://yomitoku-batch/input/20260217.pdf
出力ファイルには、元のファイル名に.outが付加されます。
s3://yomitoku-batch/output/20260217.pdf.out
出力先を確認し、ローカルへダウンロードします。
aws s3 ls s3://yomitoku-batch/output/ --recursive
aws s3 cp s3://yomitoku-batch/output/20260217.pdf.out ./20260217.pdf.out
6. YomiToku-ClientでMarkdownへ変換する
Batch Transformの.outファイルは、YomiToku-Proの解析結果を格納したJSONです。YomiToku-Clientを使うと、再推論せずにMarkdown、CSV、HTMLへ変換できます。
まず、yomitoku-clientパッケージをインストールします。
pip install yomitoku-client
Markdown、CSV、HTMLをまとめて出力します。
yomitoku-client convert 20260217.pdf.out \
--format md,csv,html \
--output-dir ./converted
出力先には次のファイルが作成されます。
converted/
├── 20260217.md
├── 20260217.csv
└── 20260217.html
ここでは動作確認のためローカルで実行していますが、実運用ではAWS LambdaなどでYomiToku-Clientを動かし、S3へ出力されたJSONをMarkdownやCSVへ変換する構成を想定しています。この変換では推論を再実行しないため、追加の推論料金は発生しません。
定期バッチとして運用する
ここまでの手順を自動化する場合は、Amazon EventBridge SchedulerからAWS Step Functionsのステートマシンを定期実行し、Step FunctionsからBatch Transformジョブを作成する構成を推奨します。
業務システム
│ 日中にPDFをアップロード
▼
入力用S3プレフィックス
│
│ 指定時刻に起動
▼
EventBridge Scheduler
│ StartExecution
▼
Step Functions
│ Amazon SageMaker AI CreateTransformJob(.sync)
▼
Amazon SageMaker AI Batch Transform
│ ジョブ完了後にJSONを保存
▼
出力用S3プレフィックス
│
▼
AWS Lambda(YomiToku-Client)
│ Markdown・CSVへ変換
▼
文書検索、データベース、RAGへ連携
同じS3プレフィックスを繰り返し指定すると、処理済みのファイルも再処理されます。日付別のプレフィックスなどで処理対象を分け、ジョブ名にも日時やUUIDを含めて実行ごとに一意にしてください。
おわりに
AWS Marketplace版YomiToku-ProとBatch Transformを組み合わせることで、夜間バッチや過去文書の一括OCRなど、即時応答を必要としない処理を効率よく実行できます。
さらに、S3へ保存された解析結果を契機にAWS Lambdaを起動し、YomiToku-ClientでMarkdownやCSVへ変換することで、文書検索やRAGへつながる一連の処理をAWS上で自動化できます。