🔮

VertexAI Online Predictionを運用してみての話

2024/07/10に公開

WED株式会社でデータエンジニアをしているthimi0412です。
レシート買取アプリONEでは、撮影されたレシート画像からOCRを行い、レシート情報(購入店舗、商品名、価格等)を抽出して構造化し、DBに保存しています。

課題としてレシートにはさまざまなフォーマットや記載があり、全てを網羅し取得するのは過酷を極めます。今回の取り組みとしてレシート画像からOCRをして得られたテキストをLLMのモデルを使用して、そこからレシート情報を抽出するサービスをVertexAI Online Predectionを使用して作成しました。

VertexAI OnlinePredection(オンライン予測)と導入理由

VertexAI OnlinePredection(オンライン予測)はVertexAIや自分たちでトレーニングを行ったモデルをservingするサービスです。

導入理由としては

  • コンテナベースで作成することができる
  • GPUの設定が容易
  • オートスケーリングに対応

実際に作成したモデルについては別途記事を書きます。
https://cloud.google.com/vertex-ai/docs/tabular-data/classification-regression/get-online-predictions?hl=ja

構成

  1. レシート画像アップロード
  2. AzureのComputerVisionやGCPのCloudVisionAPIを使用してOCR & 加工
  3. GCPのVertexAI Online PredectionにOCRしたテキストデータを送り推論されたデータを取得

このようなフローでレシート画像からレシート情報を抽出しDBに保存しています。

運用していて思ったこと & Tips

手動スケーリングは実はできる

VertexAI Online Predictionはエンドポイントを作成してそこにモデルをデプロイするのですがコンソールのUI上だとレプリカ(ノード)のminとmaxの台数作成後を変更できませんがAPIを使うことで手動でこの値を変更することができます。
(ここは今後の対応に期待したいです)

APIの詳細
https://cloud.google.com/vertex-ai/docs/general/deployment?hl=ja#update_the_scaling_configuration
https://cloud.google.com/vertex-ai/docs/reference/rest/v1/projects.locations.endpoints/mutateDeployedModel

なぜ手動でのスケーリングが必要かというとONEのアプリではなんでもレシートという全てのレシートを買取対象としたキャンペーンがあり、それぞれ時間帯に応じてスタートします。
そこで問題なのがこのキャンペーン開始時間が一番レシートのアップロード数が多くなるのでOCRからレシート情報の抽出までの負荷が高くなります

オートスケーリングの設定はしてはいますが。GPUを使用しているとスケールするまで10分程度かかり負荷に耐えられず5XX系のエラーを返してしまいます。
なのでこのなんでもレシートの開始時間前に事前にレプリカの台数を変更させてスパイクに耐えられるようにしています。

仕組みとしてはシンプルでCloudRunでレプリカ台数を変更するAPIのエンドポイントを作成して、CloudSchedulerを使用してhttpsのリクエストを送りレプリカの台数のスケールアップ&ダウンを行っています。
コンソールから実際のスケーリングを見るとこのようになっています。

レプリカの台数が増えるとコンソールが見づらくなる

レプリカの台数を増やしていくとレプリカ全てのCPUやGPUの使用率が描画されているので全体的、平均的にどうのような推移をしているのか若干見づらくなってしまっているので、GKEにあるオブザーバビリティのように上位5件のCPU使用率、レプリカの平均のCPU使用率の推移が見れるとうれしなと思っています。

5XX系のエラーに対して

負荷が高まってくると以下のような5XX系のエラーを返すことがあり、レシート情報の抽出が失敗してしまう時があります。なのでサーバー側でVertexAI側にリクエストを送る際にはリトライの設定をして、決められた回数リトライをするように作成しています。

Model server connection error.
Please retry. endpoint_id: XXXXXXXXXX, deployed_model_id: YYYYYYYYYY

GPUの割り当て確保

今回作成したエンドポイントにデプロイしたモデルではNvidia T4のGPUを使用しています。
1レプリカに1GPUをつけているのでレプリカの数だけGPUの枚数も必要になります。
ここで注意しておきたいのがGCPの割り当てから確認できますがCustom model serving Nvidia T4 GPUs per regionの値を事前に申請を増やしておかないとそれ以上GPUを使えないということです。(最初の値は14でした)

仮にレプリカ数をmin: 5, max: 15という設定にするとデフォルトのリージョンに対するGPUの台数が14なのでデプロイで失敗します。なので申請する台数はレプリカのmaxの値以上にする必要があります。

当初はasia-northeast1でエンドポイントを作成しGPUの割り当て上限の申請を50で申請したのですがリジェクトされてしましました。Googleの担当者様とやり取りをさせていただいて世界的にGPUの需要が上がっているのでus-central1でエンドポイントを作成し直して再度申請をしたところ申請は通りました。

終わりに

VertexAI Online Predectionは思ったよりもモデルのデプロイは簡単に行えるという印象でした。APIはあるのにコンソールのUIが追いついていない等の使いずらい点もあるので、今後のアップデートに期待しています。

WED Engineering Blog

Discussion