ML System Design Pattern#
Serving patterns#
推論サーバを稼働させ運用するパターン。
Synchronous pattern#
概要:
REST APIなどで同期的に提供するパターン
Usecase:
アプリのワークフローが推論結果に依存するとき
Asynchronous pattern#
概要:
Pub-subモデルなどで非同期的に提供するパターン
Usecase:
アプリのワークフローが推論結果に依存しないとき
推論に時間がかかるモデルで、Synchronousだとユーザーを長時間待たせてしまうとき
Batch pattern#
概要:
定期的に推論しておき、DBなどに保存しておく方法
Usecase:
リアルタイムで推論する必要がないとき
推論に時間がかかるモデルのとき
例:note.comのレコメンド
読者の行動データを用いたnote記事レコメンドのMLパイプラインツアー|むっそ
モデルロードパターン:機械学習モデルはS3に保存してあり、SageMakerのBatch Transformで起動するDockerコンテナにロードして推論する
バッチ推論パターン:EventBridgeの定期実行により、対象のデータ群に対してバッチ推論を実行する。
モデル学習/作成プロセス
EventBridgeにより定期的に起動 → Glueで情報抽出 → SageMaker training jobで学習
モデルのバッチ推論プロセス
SageMaker BatchTransformでユーザーごとのレコメンド内容をまとめて推論
バッチ推論結果のDynamoDB登録プロセス
推論結果はSQSに送信され、LambdaからDynamoDBに投入
Data cache pattern#
概要:
前処理済みの入力結果や推論結果をキャッシュしておく
推論時、キャッシュ済みのinputに対してはRedisなどからキャッシュを取り出し、モデルの推論を回避する
Usecase:
同一データの入力が多く発生するとき
前処理や推論に時間がかかるとき
例:
Bernardi et al. (2019). 150 successful machine learning models: 6 lessons learned at booking.com
A/Bテストで新旧モデルを比較したところ、推薦においてOffline evaluationによる予測精度の改善はビジネスのKPIに対し無相関だった
しかしA/Bテストでユーザーの待ち時間(latency)を比較したところ、待ち時間が長いほどCVRが悪化する負の相関がはっきり出た
そこですべての推論結果をkey-value-storeに保存しておくcache patternを使いlatencyを縮めた(他にもインフラ的な冗長性確保やアルゴリズムの計算量削減なども行っている)
Prediction circuit break pattern#
概要:
急増したリクエストに対し、サービス全体が停止しないようにするため、リソースの増加が完了するまでの間だけ一部のリクエストを遮断する
Usecase:
推論へのアクセスが急激に増減し、増減に推論サーバやインフラが対応できない場合
全リクエストへレスポンスを返す必要がない場合
QA patterns#
機械学習のモデルおよび推論器を評価するためのパターン。
参考文献#
https://mercari.github.io/ml-system-design-pattern/README_ja.html
Mercariが公開している資料
佐藤ほか(2021)『AIソフトウェアのテスト』