Vertexで3ヶ月で作る運用可能なML API基盤

概要

  • ちょっと昔の記事だが、SageMaker Endpointが使いにくかったり、訓練部分はVertexでやっているため、EndpointもVertexで立てたいなと思い始めてきたので、CADDiさんの事例を見てみた
  • APIサーバ(Vertex AI Endpoints)
    • 要件が少ない
      • HTTPサーバが実行されていること
      • ヘルスチェック用のエンドポイントが用意されていること
      • 予測用のエンドポイントが用意されていること
        • (ここはSageMakerと一緒でversionごとにpathを分けるとかはできなさそう)
      • リクエストサイズは最大1.5MB以下であること
      • 入出力のスキーマに一定の制約を設けること
    • あえてtorchserveで制約かけることでML以外の関心ごとを少なくするようにさせた
      • ロギングや動的なバッチ処理など多くの重要な機能を自動で提供
      • 注意点
        • CPU環境/GPU環境の両方で動かすために、それぞれの環境用にptファイル(モデルパラメータ)が必要である
        • APIに設定ファイルや他のPythonスクリプト等の追加ファイルが必要な場合、mar作成時に渡す必要があるが、1つのディレクトリにフラットに再配置されるためファイルパスを2種類記述して切り替えるなどで対応する必要がある
  • デプロイツール
    • CIからスクリプト実行でデプロイ
    • 本番環境にデプロイする際は最初新規モデルへのトラフィックを0%に設定
  • 追跡可能性
    • Artifact Registoryにpush時にgitのcommit hashをtagに追加。Vertex AI Model Registoryにも追加して、ソースコードまで辿れるように。
  • デプロイ戦略
    • mainブランチのみを持つモノレポ
    • mainへのマージでdevにdeploy
    • タグpushでデプロイ
    • GAのworkflow dispatchでできるように変更予定
  • ドキュメントツール
    • OpenAPIの記述を手で行い、HTMLに変換して社内のドキュメントサーバに公開した
    • APIの仕様にはVertex AI EndpointsのURL、入出力のスキーマ情報に加えて、入出力の各値の具体的な意味や実際の入出力例を記述するようにした
  • テストツール
    • 保証内容
      • ドキュメントに書かれたAPIの型定義と、リクエスト・レスポンスの例に矛盾がない
        • jsonschemaを使って矛盾がないか確認
      • ドキュメントに書かれたAPIのリクエスト例が、実際にリクエスト可能なものである
      • API基盤にデプロイしたモデルと、デプロイしようとした実験時のモデルの挙動が等しい
        • 数十〜数百枚程度の小規模なデータセットに対して、モデル作成時にそれらの推論値をGCSに保存しておき、APIサーバがほぼ同じ出力を返すことを確認する性能テストを追加
      • ある程度の高負荷時にも妥当なレスポンス時間で返ってくる
        • locustで実施
  • モニタリングツール
    • Cloud Monitoring
  • 辛みポイント
    • 問題発生時にできることはほとんどない
      • フルマネージドなので、API基盤として問題が起きたとしてもやれることはほとんどなく、Google Cloud全体の障害かどうかを判断するかくらい
      • 去年の段階ではあまり問題は発生したことないらしい
    • Vertex EndpointのHuman readableな識別子がない
      • Vertex Endpointは識別子として数値列を使用してて、一応displayNameは指定できるが、これをCloud Monitoringから確認することができない。