ZOZO 画像検索におけるChainerの本番運用
株式会社ZOZOテクノロジーズ
MLOps リーダー
瀬尾 直利 そのっつ
Copyright © ZOZO Technologies, Inc.
ML@Loft #9. Deep Learning フレームワークと推論 2019/11/26
2
瀬尾 直利
株式会社ZOZOテクノロジーズ
SRE スペシャリスト
開発部 MLOps リーダー
CSIRT兼任
Twitter/GitHub: @sonots そのっつ
CRuby、Fluentd、Chainer コミッタ
© ZOZO Technologies, Inc.
3
Chainer
1年半ほど週4で開発にJOIN
主に CuPy と ChainerX (C++) を担当
© ZOZO Technologies, Inc.
4
Chainer
。゚(゚´Д`゚)゜。ウァァァン
© ZOZO Technologies, Inc.
5
https://zozo.jp/
© ZOZO Technologies, Inc.
6
https://wear.jp/
© ZOZO Technologies, Inc.
7
https://zozo.jp/multisize/
【参加企業】
株式会社アーバンリサーチ、株式会社ストライプインターナショナル、
株式会社デイトナ・インターナショナル、株式会社パル、株式会社ビームス、
株式会社ベイクルーズ、MARK STYLER株式会社、リーバイ・ストラウス ジャパン株式会社 など
© ZOZO Technologies, Inc.
ZOZO 画像検索とは
ZOZO 画像検索とは
ZOZO 画像検索 アーキテクチャ
(一般的な)画像検索の基本
深層学習を利用してアイテム画像の特徴ベクトルを取得
深層学習を利用して画像からアイテムを検出
取得した特徴ベクトルを予め構築しておいた Approximate Nearest Neighbor(ANN)Index から類似検索
CNN
Feature
(一般的な)画像検索の基本
深層学習を利用してアイテム画像の特徴ベクトルを取得
深層学習を利用して画像からアイテムを検出
取得した特徴ベクトルを予め構築しておいた Approximate Nearest Neighbor(ANN)Index から類似検索
CNN
Feature
Chainer
Chainer
annoy
ZOZO 画像検索ソフトウェアスタック
サーバアプリケーション
インフラ
Cloud Composer
Kubernetes Engine
Cloud Memorystore
Cloud Filestore
Cloud Load Balancing
Cloud Armor
Cloud Storage
Container Registry
Stackdriver
ZOZO 画像検索アーキテクチャ全体
Cloud Load Balancing
Cloud Armor
Kubernetes Engine
Cloud Storage
Container Registry
Cloud Memorystore
Developer
画像ストレージ
モデルストレージ
コンテナイメージ
キャッシュ
Cloud Composer
学習
Kubernetes Engine
ANN index
モデル
User
学習
推論
GPU
Cloud Filestore
ZOZO 画像検索推論 API k8s アーキテクチャ
api
8080
api-pool
nns
50051
nns-pool
detect
50051
metric
50051
gpu-pool
gRPC
Cloud Load Balancing
https
http
ZOZO 画像検索推論 API k8s アーキテクチャ
api
8080
api-pool
nns
50051
nns-pool
detect
50051
metric
50051
gpu-pool
gRPC
Cloud Load Balancing
https
http
Chainer
Chainer
annoy
Chainer どうですか
18
Chainer どうですか
驚くことに(?)安定している
© ZOZO Technologies, Inc.
以上
嘘
なぜ Chainer は安定しているのか?
本番運用における工夫 (Chainer)
Chainer (CuPy) 初回のリクエストが遅い問題
CuPy (cuDNN) autotune を有効化していた
対処
Chainer ideep を利用した CPU での推論
推論に GPU は要らないのではないかという仮説
物体検出にかかる時間を比較
| | 秒 / リクエスト | 値段 |
CuPy | n1-standard-2 + k80 | 0.40 | $0.549 |
ideep | n1-highcpu-32 | 0.43 | $1.3136 |
コンテナにモデルを入れるか入れないか
コンテナイメージのビルド
対処
initContainers:
- name: gcloud
image: google/cloud-sdk:latest
env:
- name: METRIC_BUCKET_URL
value: <YOUR_BUCKET_URL>
- name: METRIC_MODEL
value: <YOUR_METRIC_MODEL>
- name: MODEL_DIR
value: "/tmp/models/"
volumeMounts:
- name: models
mountPath: "/tmp/models/"
command:
- gsutil
- cp
- $ (METRIC_BUCKET_URL)/$ (METRIC_MODEL).pickle
- "$ (MODEL_DIR)/metric.pickle"
本番運用における工夫 (Annoy)
annoy がたまに異常に遅い問題
annoy はindexファイルを Linux の disk cache に載せて検索を高速化する設計
対処
k8sとtmpfs
ちょっと不便な k8s からの tmpfs 利用
対処
まとめ
29
© ZOZO Technologies, Inc.
まとめ
30
© ZOZO Technologies, Inc.