この記事は MLOps Advent Calendar 2023 の22日目の記事になります。
こんにちは、バクラクの機械学習チームでソフトウェアエンジニアをしているTomoakiです。
あらゆる点でコスパが最強すぎて最近毎日鍋を食べています。今日はちゃんこ鍋ぽい何かをグツグツさせてます。
さて、今回はAI-OCRパイプラインのレイテンシーモニタリングを爆速で構築した話をしたいと思います。
バクラクのAI-OCRについて
バクラクでは、請求書や領収書をはじめとする国税関係の書類にOCRを実行し、入力のサジェストを行うことで、お客様が書類の内容を手入力する手間を省略しています。
例えばこちらの領収書では、日付、金額、支払先、登録番号を自動で読み取ってお客様にサジェストをしています。
AI-OCRのパイプライン
私たちが開発しているAI-OCRは、主に文字認識と項目推定の処理で構成されますが、実際はより複雑な動作をしています。
文字認識の前には、ファイルの欠損等を補うような前処理がいくつかあり、項目推定後もいくつか後処理が存在します。
ファイルによっては特定の処理がスキップされたりするので毎回同じではないですが、大体7つほどのタスクで構成されています。
課題
これまでのOCRのパフォーマンスは安定して早かったので、計測やモニタリングは厳密には行っていませんでした。
各処理にはタイムアウトを設け著しい悪化には気づける状態ではありましたし、ボトルネックになりやすい推論部分のレイテンシーはリリースする際などは負荷試験を実施していたため、ある程度のパフォーマンスの把握はできていました。
しかし、お客様が増え、アップロードされるファイルの傾向が変化したこと、またOCRの内部の前処理や後処理が複雑化したことで、パイプラインの各所で時間がかかってしまうファイルが発生し始めました。
AI-OCRの性能をモニタリングするうえで機械学習モデルの精度だけではなく、パフォーマンスも重要です。どんなに精度がいいモデルが作れたとしても、レスポンスが遅いとユーザーの作業効率が下がってしまいます。
リアルタイムでお客様の体験を把握すること、そして改善策を打っていくためにどこの処理でどれくらい時間がかかっているかを把握するためにレイテンシーの計測・モニタリングを詳細に行うことにしました。
レイテンシーの可視化
Datadogを用いて、ログに対してクエリを作り、これを可視化すると簡単にタスクごとにどれくらいの時間がかかっているか可視化ができそうだったので試してみることにしました。
以下その手順を紹介します。
1. クエリの書きやすいログを吐く
パイプラインの各タスクのlogに各々の処理のタスク名と経過時間を吐き出します。
各taskは非同期のジョブとして実行され、ジョブの開始時に新しくcontextが作られ、タスク名とタスク開始時刻を保持しています。
タスク完了のタイミングでdurationを計測しログとして吐き出します。下記のようなイメージです。
{ message: completed preProcessA caller: task/logger.go:33 service: ocr duration: 1665627 task_name: preProcessA }
2. Datadogでクエリを書いて可視化する
Datadogではlogに対してクエリを書くと簡単にビジュアライズまでしてくれます。
今回はdurationをlogで吐いているのでそれをタスクごとに時系列で集計しました。
クエリはこのように書きました。
特定の非常に重いファイルに全体の数字が影響を受けやすいので中央値に着目すると同時に、より多くのお客様の体験を向上させるということで99%tileの数値にも着目しています。
ポイントはtask_nameごとに集計してあげることでクエリ一つで全てのタスクの可視化が可能になることです。さらに新規でタスクが追加された場合も何の追加設定なしに、ビジュアライズがされるのも非常に便利です。
今回はパイプラインの各タスクごとのレイテンシーの可視化に焦点を当てましたが、パイプライン全体のレイテンシーや、パイプラインの各タスクのさらに内部の処理のレイテンシー計測も同じ方法で実現できます。
さいごに
無事APIのパイプライン全体を細分化してレイテンシーを常時計測できる仕組みができました。
正直実際手を動かした時間は1日にも満たないと思います。Datadogを活用するとこんなに楽だとは思っていなかったので正直もっと早く気づきたかったです。
計測の今後の課題としては、同じrequestの処理をパイプラインで一気通貫してレイテンシーを可視化する仕組みを整えることでより素早く遅い処理の原因究明ができる体制を整えていきたく、DatadogのAPMなどの導入を検討したいです。
可視化した結果から機械学習の推論以外の部分でも時間がかかっていることが分かり、パイプラインの改善などエンジニアリング的な部分での問題解消にも現在取り組んでいます。
この辺りの話はきっとまたブログに...!
また、パフォーマンス以外の観点でのAI-OCRの性能モニタリングについても以前記事を書いているので是非見てみてください!
バクラクでは圧倒的に使いやすいプロダクトを作りワクワクする体験を届けることビジョンに日々開発しています。
少しでも興味がある方はぜひカジュアル面談させてください!