1
Confidential - Do Not Share
メルカリの写真検索を支えるバックエンド
大規模画像検索システムの裏側
Slide 2
Slide 2 text
2
Confidential - Do Not Share
● 2017年7月入社
● 所属はSRE→今QからAI/MLチーム
● デバイスドライバ開発からフロントエン
ド開発までやる何でも屋
● Twitter: hnakagawa14
GitHub: hnakagawa
中河 宏文(hnakagawa)
Slide 3
Slide 3 text
3
Confidential - Do Not Share
写真検索とは
所謂、画像検索機能
商品名を知らなくても画像から商
品を検索できる機能の事です
動画リンク: https://youtu.be/kTni8EvOCgI
Slide 4
Slide 4 text
4
Confidential - Do Not Share
基本的な写真検索の仕組み
1. Deep Neural Networks (DNN)を使用して商品画像から特徴ベクトルを取
得
2. 取得した特徴ベクトルをApproximate Nearest Neighbor Index(ANN
Index)に追加して画像indexを構築
3. 検索時には同じく商品画像からDNNを介して特徴量ベクトルを取得し、ANN
Indexから検索
○ ANN Indexはオンメモリの物を使用しており、そのた
めコンテナ化する為にシステム上の工夫が色々ある(後
述
Slide 5
Slide 5 text
5
Confidential - Do Not Share
Architecture概要図
Slide 6
Slide 6 text
6
Confidential - Do Not Share
ML Platform Lykeion
写真検索はLykeionと呼ばれる内製の
MLPlatform上に構築されており、以下の機
能はPlatform側の機能を使用している
● Training/Serving custom
resource definition controller
● Container based pipeline
● Serving/Training Image builder
● Model repository
Slide 7
Slide 7 text
7
Confidential - Do Not Share
Indexing architecture
Slide 8
Slide 8 text
8
Confidential - Do Not Share
Creating training custom resource
Slide 9
Slide 9 text
9
Confidential - Do Not Share
Creating training custom resource
● Training custom
resourceをCronJobが作成
● CRD controllerがcustom
resourceで設定された
(YAMLベース)pipelineを実
行
● Batch単位としては
Hourly,Daily,Montlyが存
在
Slide 10
Slide 10 text
10
Confidential - Do Not Share
Download image
Slide 11
Slide 11 text
11
Confidential - Do Not Share
Download image
● Image store(S3)上に存在する商品画像をダウンロード
● 実はPipeline上もっとも時間がかかる工程
○ そのため商品画像をk8sのPersistent Volume(PV)
に保存し一定期間キャッシュする事によって、再インデッ
クスが必要な時には素早くPipelineを回せるようにして
いる
Slide 12
Slide 12 text
12
Confidential - Do Not Share
Upload assets
Slide 13
Slide 13 text
13
Confidential - Do Not Share
Upload assets
● ETL Pipelineの成果物、写真検索では特徴ベクトルとANN indexを、
Model Repositoryと呼ばれるモデルストアにバージョン管理された状態で保
存します
● Model RepositoryはGCS上に構築
Slide 14
Slide 14 text
14
Confidential - Do Not Share
Batch Execution as Custom Resource
● 全てのbatch実行情報が
CRD resourceとして
k8s上に残る
● batchの再実行を伴う障
害復旧作業が容易
Slide 15
Slide 15 text
15
Confidential - Do Not Share
Serving アーキテクチャ
Slide 16
Slide 16 text
16
Confidential - Do Not Share
Building container image
Slide 17
Slide 17 text
17
Confidential - Do Not Share
Building container image
● Model RepositoryをImage Builderと呼ばれるdaemonが監視
● 新しいindexが追加されると自動でServingコンテナ・イメージをビルドし
Container Registry(GCR)にプッシュ
Slide 18
Slide 18 text
18
Confidential - Do Not Share
Create serving custom resource
Slide 19
Slide 19 text
19
Confidential - Do Not Share
Create serving custom resource
● Image Builderはコンテ
ナ・イメージをビルドしたあ
と、Serving custom
resourceを作成
● CRD controllerは
custom resourceを元
にDeployment、
Service等のk8sリソース
を作成しIndex Service
をdeploy
Slide 20
Slide 20 text
20
Confidential - Do Not Share
Service discovery
Slide 21
Slide 21 text
21
Confidential - Do Not Share
Service discovery
● 異なる期間・粒度のIndex
Service(Hourly, Daily,
Monthly) を自動的に組
み合わせる
● REST <-> Index
Service間のプロトコルは
gRPCを使用
Slide 22
Slide 22 text
22
Confidential - Do Not Share
まとめ
● メルカリの写真検索はAWSとGCPのマルチクラウドで構築されている
○ Image storeにS3を使っているため
○ k8sでインフラを抽象化する事によって、AWSとGCPの
差異を埋め各クラウド・プロバイダの良いとこ取りができ
る
● k8sの機能を活用し、ロバストなシステムを構築
○ Training/Serving CRD controller
○ Batch Execution as Custom Resource
○ Service discovery