フリーランスを経てZOZO研究所へ

渡辺慎二郎氏:「大規模データをAIに活かすワークフローツールの紹介 約300万画像を画像検索システムで検索可能にした事例紹介」ということで、ZOZO研究所 福岡・渡辺慎二郎が登壇いたします。よろしくお願いします。

最初に簡単に自己紹介します。株式会社ZOZOテクノロジーズ ZOZO研究所 福岡、研究開発エンジニアの渡辺慎二郎です。Twitterでは「@shikajiro」でやっています。

すごく簡単に経歴も紹介しますと、2010年から8年ぐらいフリーランスとしてAndroidアプリを専門にしていました。2018年からZOZO研究所 福岡に入りまして、バックエンドを担当しています。その担当している内容を今日お話ししたいと思います。

あと、もうすごく犬が好き。Twitterをフォローしてもらえると犬が定期的に流れてきますので、オススメです。ぜひフォローしてください(笑)。

「#zozotech_gcp」というハッシュタグがありますので、shikajiroの話がおもしろい・おもしろくない、どっちでも「shikajiroの話おもしろいなー」とツイートしてください。あと、質問は「#zozotech_gcp」をつけてツイートしてください。お待ちしています。

今日は、まず僕の役割である研究開発エンジニアについて軽く紹介いたします。次に事例を紹介しながら、その事例のインフラやAPIの仕組み、ワークフローの構成をお話しします。このワークフローの構成というのが今日のメインのものになります。最後はまとめと質疑応答というかたちでいきたいと思います。

研究所とはなんぞや?

最初に会社の組織の中でも「研究所とはなんぞや?」というところを紹介します。

まず、親会社としてZOZOがあります。子会社としてZOZOテクノロジーズがありまして、ここがITの部門。開発、デザイン、あと運用、研究ですね。先ほどお話ししてくれた児玉さん(@dama_yuさん)の発表も、こちら、テクノロジーズの話ですね。

僕が所属しているのは、さらにその内部組織で1つの部署である「ZOZO Research(ZOZO研究所)」と呼ばれているところになります。ここは主に研究開発を行なっています。どんなことをしているかといいますと、「ファッションを数値化する」というテーマで研究をしています。

似合う服というのは何なのか? 例えば僕は今日ピンクの服を着ていますが、その下に着るのは何がいいのか。この僕の服は今から出かける場所に合っているのか、季節的にどうなのかとか、そういったところを数値化できないだろうかということをやっています。すてきなファッションになるための組み合わせだとか、そういうことですね。

ファッションの数理モデルを獲得し実用化をやっていくというのを長期プラン、短期プランでいろいろやっています。ほかにも繊維的な、服の繊維の研究とかいろいろやっていまして、そのうちの1つですね。ファッションの数値化を行なっています。

MLエンジニアがMLしやすくするために

僕はMLエンジニアではなく「研究開発エンジニア」という名前でやっています。主にバックエンドをやっているんですが、どういうことをやっているかというと、「MLエンジニアがMLしやすくする」というのがテーマです。もっと言うと、ML以外全部やるという気概でやっています。

もうちょっと具体的に紹介しますと、MLエンジニアとの協働です。MLエンジニア、要は機械学習だとかAI、ML・DLあたりを使ってモデルを作っていくいろいろ研究していく人たちなんですが、そのエンジニアが学習しやすい環境づくりをします。

「Kubernetesを使いたいです」とか「画像がたくさんあるのでいっぱい欲しいです」とか、「並列でいっぱい処理したいです」だとかですね。そういう環境づくりをしたりしています。

彼らが作ったモデルを基にプロトタイプ開発もしています。「すごいのできたんですが、ちょっとプレゼンではわかりにくいです」「じゃあプロトタイプを作ってしまいましょう」みたいな感じで、プロトタイプの開発をやっていきます。

フロントエンドからサーバーからパッと作ってしまって、社内にいるみんなに見せて「おお、いいね、これ。やっちゃいなよ」という流れを作っていきます。そのモデルをプロダクションの中でAPIとして動かすような仕組みを作っていっています。

先ほどちょうどお話してくださった@dama_yuさんが所属しているMLOpsチームと一緒に作ったモデルのサービスを、きちんとプロダクションのサービスに足るような性能に引き上げる仕組みをやっています。

「一緒にこういうモデルを作っていこうと思います。こういうサービスにしようと思います」と言って、インフラから「じゃあ、こういうインフラにしていきましょう」という設計をしていって、どんどん性能を引き上げていきます。

もうちょっと言いますと、研究開発エンジニアが普通のインフラやバックエンドをやっている人と何が違うかというと、ビッグデータを使って学習するところ。もう1つはビッグデータに対して予測するところです。

大量にすごいデータがあるとき、それに対するAPIを作ったり事前準備をするなどの部分が、僕たち研究開発エンジニアが必要とされているところになってきます。ビッグデータに対して予測するというのは、APIの部分だったり、そういったところになります。

ZOZOの類似アイテム検索のインフラとは

今からは事例を紹介しながら、その中で使っているGCPの紹介をしたいと思います。今日お話しする内容ではありませんが、ZOZOがやっている「WEAR」というファッションサービスのアプリがありまして、その中の「髪型別コーデ検索」というのをちょっと前にリリースしました。

これはロング、ミディアムなどの髪型、例えば「私は今ボブだけど、ほかの人はボブに似合うどんなファッションをしているんだろうか?」というのをすぐ探せる仕組みになります。これも「WEAR」にある大量の画像データから機械学習を使って髪型を識別・選別し、検索可能にするというのを行ないました。

次は一時期話題になったのでけっこう有名かと思うのですが、ZOZOTOWNの類似アイテム検索。

要は画像検索なんですが、この画像でいうと、左の女性が着ている花柄の服に似ているものを探したいときに、ボタンをポチッと押すと、それっぽいファッションの服が出てきます。その中から自分が気に入ったものを探す。「この花柄なんだけど、もうちょっと襟が広いのがいいなぁ」みたいなときに押してもらえると、いろいろな似たものから探すことができます。

今回はそのZOZOTOWNの画像検索、類似アイテム検索で、裏側で動いているGCPのワークフローの紹介をしたいと思います。これは最近ちょうどテックブログに載せた内容でして、それの補完みたいなかたちになるんですが、よければそちらも併せて見ていただけるとうれしいです。あと、はてブもしてくれるとうれしいです。

ZOZOTOWNの類似アイテム検索のインフラ紹介になります。GCP、もちろん使っています。今回お話しするメインはワークフローという仕組みなんですけれど、これはあとで紹介していきます。

MLエンジニアはGCPの、例えばCompute Engine、インスタンスを立てて、GPUや、今回ではTPUも、TensorFlowのTensor Processing Unitだとかそういったものを使って学習を行ない、すごいクールなモデルを作っていったりしています。

僕みたいな開発者はそれを動かすためのAPIを作り、GitHubでCI/CDを使ってデプロイして、Container Registryに乗せたりとかをしています。そうやってできた仕組みをユーザーはロードバランサーを経由してAPI叩いて、内部的にはKubernetes Engineが動いています。GKEですね。これを使って動かしています。

推論APIについて

その前に、簡単に中身を紹介します。この画像検索、今回「画像検索」という名称で呼んじゃいますが、画像検索は「物体検索」「特徴量抽出」「最近傍探索」という3つのステップを踏んで検索しています。それを、GKEを使って動かしています。

ユーザーが「この似ている服を探したい」と言っているAPIを総称して、推論するAPI、「推論API」と呼んでいます。今回はワークフローの話なんですが、いったんこの推論APIについて流れを紹介します。

この服がいいなと思ったら、まずこの服から物体検出を行ないます。この服には、どんな服があるか。物体、洋服だとか上着だとかズボンだとかトップスだとかといったところを、まず検出を行ないます。

具体的な画像検索の中身についての解説は次回のミートアップとかに委ねたいと思いますので、今回はちょっと端折ります。

まずtopsを取りまして、そこから特徴量を抽出して数字にします。ZOZOTOWNには、今回で言うと300万ぐらい対象となる画像がありまして、それに対してあらかじめ全部この特徴量に計算し、インデックス化をしておきます。

そのインデックスに入っている特徴量とこの花柄の服の特徴量と照らし合わせて計算することで、似たものを、最も似ているものをどんどん出していくというもの。この3つのステップを経て推論APIはできあがっています。というのが前提ですね。

GCPを選んだ理由なんですが、まずBigQueryがあること。ZOZOTOWNの300万画像という大量にある情報のデータがBigQueryですでにあるということ。

画像検索ではすごい計算量を使いまして、GPUとか使いたいなという要望がありました。その中でGPUがまず使えること。TPUも使おうと思えばできるということがあります。実際、GPUは推論APIで使っていますし、学習のときはGPUはもちろんTPUも使って、ものすごい計算を短時間でできるようにしています。

ですので、GPUを推論APIをするときに普通のGoogle App Engineだとかでは使いにくかった、できなかったので、k8sのマネージドサービスGKEを使いました。これがほかのクラウドサービスの中ではKubernetesのマネージドサービスが安定しているので、これを選択しました。という、このあたりが一番大きな理由ですね。

推論APIのおさらいになるのですが、物体検出と特徴量抽出と近似最近傍探索を行なうという流れなんですが、近似最近傍探索をするにあたって、あらかじめZOZOにある画像データの検索対象になるもののインデックスを作っておく必要があります。対象となる画像は具体的には300万ぐらいあります。