株式会社MIXIで
今回は、これまで本連載でご紹介してきたみてねの1秒動画や自動作成フォトブック、人物ごとのアルバムといった、みてねのコンテンツ自動作成・
写真・動画解析パイプラインのビジネス的な意義と要件
意義
前述のような各種コンテンツ自動作成・
たとえば1秒動画には、全家族に3ヵ月ごとにお届けする
このようなコンテンツ自動作成・
要件
この写真・
- みてねにアップロードされる写真・
動画すべて (1日あたり1000万件のオーダー) に対し、AI/ MLモデルを含む一連の解析処理を実行すること (スケーラビリティ) - 解析結果を保存し、前述のような各種コンテンツ自動作成・
自動分類機能に幅広く安定的に活用できること (汎用性と可用性) - 解析にかかるインフラコスト・
インフラ負荷・ 解析処理のレイテンシをできるだけ抑えつつ、解析精度をできるだけ高めること (コスト効率・ パフォーマンス効率の高さ)
以下では上記3つの観点、とくにスケーラビリティ面に重点をおき、解析パイプラインについてご紹介します。
写真・動画解析パイプラインの概要
はじめに写真・
設計方針
写真・
- 非同期処理:SidekiqおよびAmazon SQSを採用し、パイプライン全体を非同期処理で構成する。
- 用途に適した言語・
フレームワークの採用 :パイプラインのうち通常のバックエンド処理部分は、みてねの他のバックエンドシステムに合わせてRuby on RailsおよびSidekiqを採用する。一方AI/ML処理においては、一般に広く用いられているTensorFlowなどのPython向けフレームワークを採用する独立したサブシステムまたはリポジトリとして切り出し、SQSで連携する。 - オーケストレータの自前実装:解析パイプライン全体を管理するワークフローエンジン、またはオーケストレータ的な役割を自前実装する。
解析項目
ひとくちに
- 写真・
動画データ本体に関する解析 (人物や場面といった被写体の認識など) - 写真・
動画ファイルのメタデータに関する解析 (EXIF/ XMLメタデータの取得や分析など) - 他の写真・
動画との比較 (同一場面におけるベストショットの判定など)
以下ではとくに1.および2.の観点による解析についてご紹介します。
写真・動画解析パイプラインの構成と実装
写真・
みてねのバックエンドサーバ mitene
miteneは、みてねのバックエンドサーバ本体であり、Railsで実装され、iOS/
写真・
- 写真・
動画の管理 :クライアントからアップロードされた写真・動画を保存し管理する - 解析ジョブの開始:アップロードされた全ての写真・
動画に対し、後述のAI/ ML解析パイプラインmedium-analyzerに解析ジョブを投げる - 解析ジョブの状態管理とリトライ:写真・
動画解析ジョブの状態を管理し、失敗した、または行方不明になったまま放置されているジョブをリトライする - 一部の解析処理の直接実行:解析項目のうち、写真・
動画ファイルのメタデータに関する解析と、他の写真・ 動画との比較とを内部で実行する - 解析結果の保存と活用:解析結果をDBに保存し、また1秒動画などのコンテンツ自動作成・
自動分類機能で活用する
AI/ML解析パイプライン medium-analyzer
medium-analyzerは、AI/
- AI/
MLモデルに関する解析パイプラインの定義と実行 :miteneから受け取った解析ジョブに対し、必要なAI/MLモデルの実行ジョブを投げ、結果をmiteneに返す - 複数モデルバージョンやパイプラインバージョンへの対応:AI/
MLモデルの評価・ 更新時など、必要に応じて特定のモデルのバージョンや、パイプライン自体のバージョンを出し分ける
AI/MLモデル推論器
AI/
- AI/
MLモデルを用いた推論の実行 :実際にAI/MLモデルを用いて、写真・ 動画データに対する推論処理を行い、結果をmedium-analyzerへと返す
なお、AI/
- オンライン推論:モデルを同期APIの形でデプロイし、個別の入力データをWeb APIなどから渡して推論する設計。たとえばAmazon SageMakerのエンドポイントを用いたリアルタイム推論や、Google CloudのVertex AIによるオンライン予測など。
- バッチ推論:モデルを非同期APIの形でデプロイし、複数の入力データをバッチ化して、Amazon S3やGoogle Cloud Storageなどのストレージを経由して渡す設計。たとえばAmazon SageMakerのバッチ変換や、Vertex AIのバッチ予測など。
一方みてねの写真・
- オンライン推論と比較したスケーリングの容易さとリソース・
コスト効率の高さ :オンライン推論を採用した場合、同期APIを受けつけるインフラ(たとえばEC2インスタンスなど) のスケーリングを、CPU使用率やリクエスト数に応じて、 「リクエストが詰まらないよう、かつコスト効率が良くなるよう」 調整することに難易度があります。一方で本方式では、推論器側が自身のタイミングでジョブを受け付けることができ、またスケーリング条件やリソースサイズの設定 (CPUコア数やメモリ量など) を任意に変更することで、リソースの使用効率、つまりコスト効率を高めることができます。 - バッチ推論と比較したパイプライン設計の単純さ:推論ジョブ
(みてねでは写真・ 動画) をあらかじめ利用者がバッチ化することには、一定の複雑さが伴います。一方で本方式では、解析パイプラインとしてはあくまで写真・ 動画を個別のジョブとして扱います。またリソース使用効率を高めるために必要に応じて、各AI/ MLモデル推論器の内部で推論ジョブのバッチ化を行うものとしています。これにより、解析パイプライン全体としては単純な設計で、扱いやすい粒度のジョブを基本単位としつつ、必要に応じたリソース・ コスト効率の改善を可能としています。
Redisによる解析ジョブの状態管理
medium-analyzerでは、前述のとおり、解析パイプラインのワークフローエンジンを自前で実装しています。その概要をご紹介します。
解析ジョブの実行状態は、Redisを用いたステートマシンとして管理しており、そのスキーマのイメージを以下に示します。
# key
"#{写真・動画のUUID}:#{解析ジョブのバージョン}"
# value
{
"job_uuid": miteneの発行したジョブのUUID,
"next_step": 次に処理する解析項目
}
# keyの例
0E5072A8-863C-4B60-A7C5-AE1378F3EE84:1
# valueの例
{
"job_uuid": "C9F9E066-65E9-4178-8DF5-F56B6FFFC953",
"next_step": "face_detection"
}
実際の解析パイプラインにおいては、たとえば
この設計により、SidekiqやSQSなどに起因するジョブの重複を検出・
また、keyに含まれる解析ジョブのバージョンを参照し、ステートマシン自体を切り替えることで、解析ジョブごとに、特定の推論処理のみ異なるモデルバージョンを適用したり、新たなモデルを処理するステップを追加したり、といったカスタマイズを実現しています。
なお、ここではmedium-analyzerのジョブ管理についてご紹介しましたが、解析ジョブのリトライに活用するため、実際にはmiteneにも類似のジョブ管理の仕組みを導入しています。
運用と監視
以前ご紹介したとおり、2024年12月現在、みてねのバックエンドサービスはほぼすべてがAmazon EKS上にデプロイされており、解析パイプラインの各コンポーネントもEKS上で運用しています。一部にはGPUを用いるAI/
また監視について、個別のSQS/
- パイプライン全体でのメトリクス:パイプライン全体で多数のキューが存在し、個別のキューのレイテンシや長さを確認するだけでは不足するため、パイプライン全体
(解析ジョブの開始から完了まで) のレイテンシやエラーレートを監視しています。 - 解析結果の精度に関する統計データ:AI/
MLモデルの追加・ 更新時や、徐々にデータの傾向が変化するなどしてモデルの精度が低下するドリフトの検知・ 対応のため、解析結果全体の統計データを監視しています。 - 単一障害点のメトリクス:ジョブ管理に用いるRedisや、解析結果を保存するDBは、それぞれ単一障害点であり、そのシステム負荷を監視しています。
- 解析パイプライン全体のコスト:写真・
動画の解析にかかるインフラコストを明らかにするため、 「写真・ 動画100万件あたり、または1ヵ月あたりのパイプライン全体にかかるインフラコストがいくら」 という切り口で定期的に確認しています。
まとめと今後に向けて
本記事では、みてねのコンテンツ自動作成・
このパイプラインでは、AI/
以前の1秒動画の記事でもご紹介したように、当時よりみてねではSidekiq/
このパイプラインの設計は、前述のとおりにAI/
一方、本記事を執筆している2024年12月現在では、KubeflowやGoogle CloudのVertex AI Pipelines、Amazon SageMaker Pipelines、Apache AirflowといったAI/
みてねでもすでに、研究開発ワークロードにおいてはこうしたフレームワークを採用しており、本番ワークロードについても必要に応じて導入を検討していきたいと考えています。