データの境界

なんちゃって理系がデータ分析業界に入ってからの汗と涙の記録。

メルカリに学ぶ深層学習基盤

f:id:kskbyt:20180217221117j:plain

tensorflow(keras)やchainerのおかげで深層学習モデルを実装できる人は増えてきたわけですが、そのモデルをシステムとして安定運用する基盤(機械学習基盤)は、作り方や運用の仕方を含めてまだ世の中的にもベストプラクティスを模索中のようです。

ちなみにこういった話は、機械学習 (MachineLearning) と運用 (Operations) ということで、DevOpsに倣って"MLOps"と呼ぶのが今風だそうです。

各事業会社がアプリやウェブコンテンツを作成すると、その機能には当然のようにユーザーセグメントやレコメンド、画像識別機能など、機械学習を常用する機能が必要となる昨今では、「今 システム基盤作るなら、将来的に深層学習も見据えて機械学習基盤を作りましょう」となるようで、事業会社ではホットなトピックのようです。

そんなホットなトピックを、ホットなメルカリさんがお話されるということで聞いてきました。 メルカリで実運用されている機械学習(深層学習)基盤のお話です。

スピーカーはメルカリのAI部2名で各30分。話題はそれぞれ

  • メルカリにおける深層学習を用いた商品画像識別(出品アイテムの約1000クラスの分類タスク)
  • AI部が構築している機械学習基盤(MLOps)について

※ 以下、突然の雑メモ。ビール片手に聞いていたのでちょこちょこ間違っているところがあると思われる

メルカリの商品画像識別

  • 山口 拓真さん
    • OCR/computer vision, super resolutionとかをずっとされていた方
    • 前職はゲーム会社の分析基盤エンジニア
    • 現在はメルカリサービスにおける画像認識タスク全般
  • やってること: メルカリに出店された商品に自動でカテゴリーやブランド名を付与する機能の構築
    • メルカリには1100商品カテゴリーがある
    • inception v3を使って220Mの出品商品画像をスクラッチで学習
      • 最初にやったときは29%エラー程度の精度
      • 識別が難しかったやつ
        • メンズとレディースのコンバースを分類(サイズが違うだけなのでムリ)
        • 膝丈ドレスと膝上ドレスの分類(着る人によって違うやん...ムリ)
        • アウトドアシューズか普段履きシューズか(人間でもわからんやん...むずい)
      • 意外に出来たやつ
        • 子供用スニーカー/大人用スニーカーの分類
      • カテゴリ認識だけでなくブランド認識もできてる
        • グッチ、トミーヒルフィガーなど分類できてる
        • 画像中の非常に小さなブランドロゴでも意外にきちんと見つけて識別している
      • ちなみに商品の正解ラベルはユーザーが出品時にラベル付けしたものを利用
      • 投稿画像は全て正方形になるので学習するときいろいろ楽
    • 深層学習アルゴリズムがどこに注目して識別しているかを可視化
      • ブランド物の場合、ちゃんとロゴに注目している。しかも小さなロゴまで注目できている
      • 人間は知らないブランドならスルーしてしまう。そういう意味で機械の方がブランド識別できている
    • 商品分類タスクにはimageだけではなく、ユーザーが入力するtitle,category,brand,price,color情報も使える(しかし今は主に画像のみを対象に取り組んでいる)
    • ユーザーが商品画像を投稿すると、リアルタイムで画像識別して、商品の属性情報をある程度自動で入力する(入力補助的な機能)
    • 出品画像を使ってtrainしているので、その画角と大きく外れる出品画像はpredictできない
    • 色認識
      • 「赤い服を検索」、のように色ベース検索もできる
      • 「赤い服」をどのように抽出しているか?
        • 画像の中心におおよそ商品が来るはずなのでその周辺のピクセル値を取り出す、という単純な方法ではない
        • 画像識別に掛けた時にCNNの注目箇所を可視化してその周辺のピクセル色を代表色として取り出している
    • この深層学習モデルのMLops的なこと
      • kubernetes利用(いまはどこもかしこもkubernetes)
      • 1日に100万品の商品が出品される。その全てに画像認識をしているが、このシステムの運用は1,2人でできている
      • 深層学習モデルが走るのと、メルカリの本サービスは疎結合なので識別システムが落ちてもメルカリのサービス本体には影響しない
    • 他にも、画像をクエリーにして検索する仕組みを作成中
      • 例えば、赤い服をクエリーにすると「似た赤い服」などを表示できる
      • しかし、mac book airとproの違いを識別して類似検索かけるとかは難しい
    • メルカリ技術ブログにも書いている-> 【Mercari Summer Internship】商品画像の色推定を行いました!
    • 質疑
      • inceptionV3の中間層から取り出した特徴デカすぎない?リアルタイムで計算できるの?
        • 特徴はPCAで次元潰して計算コスト下げてる
      • GPUの使用量すごない?
        • predictするときはGPU使ってない。CPUだけ。そもそもまだgoogleクラウドではGPUまだ使えない
        • ちなみにCPUインスタンスもそんなに使ってない
          • 100万商品の画像のリクエストは、秒間にすると大したことない
          • 画像1枚のpredictはCPU計算でも100m秒くらい
          • むしろ、GPU使うと画像処理のオーバーヘッドあるので工夫しないと意外と遅い

機械学習基盤(MLOps)の話

  • 工藤さん @Hmj_kd

    • MLエンジニア。物理畑の方。
  • 現在構築中の基盤

    • 2~4個の深層学習モデルが自動稼働中
    • インサンプルでモデルの精度をウォッチして、閾値以下の精度になると自動でtrainし直す
    • 構築中の基盤はOSS化に向けて取り組んでいる

f:id:kskbyt:20180217221335j:plain f:id:kskbyt:20180217221330j:plain f:id:kskbyt:20180217221322j:plain f:id:kskbyt:20180217221317j:plain f:id:kskbyt:20180217221307j:plain

学習モデルのバージョン管理...気になる。 自分もシステムの話は弱いのでふーん、という薄い理解ですが、システム概要図の行間にたくさんの明文化されていないテクニックがある雰囲気

  • 質疑
    • 再学習は実際どれくらいで起こる?
      • 3週間は精度が落ちずに運用できている状況
    • どれくらいの人数で構築した?
      • 機械学習エンジニア1名, 基盤開発に詳しい人2名くらい
    • AIチームは何人いるの?
      • 5人くらい。
        • リーダー(メルカリのAI部の一番偉い人)元mixiNLPの方。こちらの記事の眼鏡のお方
        • MLエンジニア。
        • 新卒1名。
        • tensoflowのプロ。tensorflow user groupの方らしい。
        • あと海外の方1名

Q&Aタイム

  • 1日で100万画像とのことだが、実際どこまでさばける?
    • 1日1億くらいは現実的な時間でレスポンスできそうだと思っている
  • 類似画像検索は過去画像全体にかけるのか?計算できるの?
    • 直近1,2ヶ月以内に投稿された画像は検索できる。過去商品全部は無理。
  • 機械学習モデルのメンテナンスについて
    • 深層学習だからといって別に複雑な仕組みはいらないと思っている。別にクーロンで回してもいいし。
    • 新しい商品画像に対応するため、月に1回は新規出品画像を取り込んで再学習させている
  • 論文そのまま実装以外にメルカリで作った独自アルゴリズムとかもあるの?
    • アルゴリズム開発には現状力をいれていない
    • アルゴリズムの古い新しいは気にしない。むしろ比較的古いものの方が改善方法や問題がいろいろわかってるので使いやすい。実際にメルカリの画像分類はinceptionV3で動いてるし。
  • アカデミアとの連携とかするの?
  • 機械学習システム構築するにあたり、社内的な進め方は?非技術者や偉い人をどうやって説得している?
    • そもそもメルカリはそういった技術に理解がある方だよ(良い会社)
    • 毎回簡単なデモをサクッと作って、それを見せながら説得する。それが良い。
    • 他社の事例集とかを作る。良い説明資料となる。
    • あと、こまめで丁寧なコミュケーションが大切

懇親会での質問

  • 年末くらいにメルカリ研究部門の立ち上げのお披露目してけどあれって何です?
  • 精度が下がったら再学習する、の"精度"とは何をいっている?
    • その時に存在するデータ(画像)をランダムサンプルしてデータセット作って、分割したtestデータでのPrecision・Recallを見ている感じ
  • 月に1回は新規画像を取り込んで再学習させている、といっていたけど、実際どれくらい意味があるの?
    • 再学習によって何がどれくらい当たるようになったか、みたいな評価はしていない。新しい商品に対応するためにとりあえず回しているという感じ。
  • 画像データの前処理的なことって何もしていないの?
    • 何もしてない。入って来る画像が多すぎて個別に前処理することも、一律に同じ処理を行うことも不可能
  • 220Mの画像でinception v3でスクラッチで学習で29%エラーってそんなもの?低くない?
    • 最初にやったときはそれくらいだったけど、今はtop1を8,9割で当てられるようになった。実は画像自体はもっとたくさんある。
  • クラッチではなく転移学習でも良かったのでは?
    • 220Mも画像があるからスクラッチでも出来ると思ったし、スクラッチで当てなければならないというプライドがあった(うんうん、やりたくなるのわかる)
  • 画像識別の機能を導入する前と後で、出品数とかリピート数が増えたから導入に踏み切ったという感じ?
    • 正直ちゃんと測ってない。画像認識による属性の自動入力機能はユーザーにとって確実にプラスとなる機能なはずなので、最初に10%のユーザーを使ってABテストして、そこで何も問題なさそうだったので一気に全ユーザーに導入した。(スピード感)
  • そういうABテストみたいなことをBIチーム(データサイエンティストの部)がしてるの?
    • そう。でもこの画像認識機能に関してはきっと便利なはずという確信で一気に導入した。
  • AIチームに人少なすぎない?BIチームから人をひっぱったりしないの?
    • 実際BIチームも全然人が足りていない。しかもAIチームの必須スキルは"エンジニアリング"でデータサイエンティストとは少しスキルセットが違う。予算がないから人を増やせないのではなく、スキルセットを持っている人が希少なだけ。
  • 事業会社でMLOpsが進んでいるところどこ?

雑感

事業会社が自社サービスに機械学習(深層学習)を持ち込んでやりたいことは、実際はstate of the artな最高精度のDLアルゴリズムを使った機能ではなく、inceptionV3で画像分類するとかちょっとしたNLPアルゴリズム回す、的な比較的チープ目なMLやDL。むしろ、サービス安定稼働のためには複雑で(もしくは精度改善のためのコストが高い)、挙動がやや不明な感じの最新のDLアルゴリズムなんてリスク高くて載せられないですね当然、みたいな感じでした。

機械学習基盤のポイントは、ML/DLを『全自動で』『精度を保ったまま』『動かし続ける』ことのようです。

メルカリも、一定期間でDLのモデルを再学習させるようですが、日頃の精度の監視はもちろん、精度が閾値以下 なると"自動で"再学習を始めて勝手に精度を保つようにしているそうです。

普通にできそうな気もしますが、実際は「再学習する=必ず以前より精度が上がる」わけではないので、精度が下がった時or一向に上がらない時に人が対応するのかそれも自動で何かしら対応させるのか、そもそも良い悪いといっている”精度”は同じ定義を使い続けていいのかなど判断と試行錯誤が難しそうです。

安定稼働させるためのエンジニア力と、学習モデルが意図通り正しく(将来的にも)動き続けるかを判断するMLの知識を併せ持つ人材は実際レアなので、どちらか一方のスキルを持つ人を社内で育ててMLエンジニアにジョブチェンジさせるか、いやそうは言っても難しいよね実際、みたいな話題も懇親会でされていました。(データサイエンティスト獲得競争よりも、いつの間にかMLエンジニア獲得競争の方がニーズが大きくなっている...?)

そんな中でも少人数で既に(改良中であっても)基盤を作り、しかも既にサービスとして実稼働しているのはさすがメルカリさん。次のエンジニアリングのトレンドはこのあたりなんでしょうか。勉強すること多すぎるんやで...