DWHを活用した機械学習プロジェクト/ml-with-dwh

 DWHを活用した機械学習プロジェクト/ml-with-dwh

Data Platform Meetup 【vol.2】 https://data-platform-meetup.connpass.com/event/155073/ での発表スライドです。
クックパッドにおける,DWHと密に連携した機械学習プロジェクトの話です。

67d36f3f18a22b190854d0e80754d57f?s=128

開発室Graph

December 02, 2019
Tweet

Transcript

  1. DWHを活用した クックパッドの機械学習
 プロジェクト クックパッド株式会社
 開発室Graph stu3dio_graph 1

  2. もくじ •クックパッドにおける機械学習プロジェクト •DWHを使った機械学習プロジェクト ‣ 学習フェーズにおけるデータ取得編 ‣ 推論フェーズにおけるデータ投入編 •まとめ 2

  3. クックパッドでの 機械学習プロジェクト 3

  4. クックパッド •毎日の料理を楽しみにするサービス •月間 約5,483万人のユーザー (国内) •レシピ数は320万品 ‣ 大量の画像・テキストデータ •ユーザがレシピを書いて投稿 ‣

    かなり自由な投稿が可能 ‣ 気軽に投稿できる
 4
  5. レシピと機械学習 •レシピの検索 •レシピの解析 •同義表現の認識 •材料名の正規化 •手順の分類 •レシピの分類 5

  6. レシピと機械学習 •レシピの検索 •レシピの解析 •同義表現の認識 •材料名の正規化 •手順の分類 •レシピの分類 6 すでにサービスに投入済

  7. レシピと機械学習 •レシピの検索 •レシピの解析 •同義表現の認識 •材料名の正規化 •手順の分類 •レシピの分類 7 たくさんデータが必要

  8. 機械学習プロジェクトの概略図 バッチシステム 推論バッチ 学習バッチ データベース 推論モデル 特徴抽出モデル 学習機 サービスのデータ 特徴量

    学習結果 特徴量 推論結果 8
  9. 機械学習プロジェクトの概略図 バッチシステム 推論バッチ 学習バッチ データベース 特徴抽出モデル 学習機 サービスのデータ 特徴量 学習結果

    特徴量 推論結果 9 推論モデル
  10. DWHを使った機械学習 〜学習フェーズにおけるデータ取得編〜 10

  11. Redshiftから直接データを取ってくる Redshift Python 11

  12. Redshiftから直接データを取ってくる Redshift Python 12

  13. Redshiftから直接データを取ってくる Redshift Python 13 破滅

  14. Redshiftに直接接続してしまうと •クエリが巨大な場合にクライアント側のリソースが枯渇 ‣ カーソルを使うとリーダーノードの具合も悪化 • リーダーノードにデータをマテリアライズする • カーソルがクローズされるまでコネクションを占有し続ける •PostgresSQL として直接接続してしまうと

    ‣ 遠隔地 (別AWSリージョン) からの接続が面倒 ‣ コネクションが不安定 14
  15. Queuery •Redshiftに直接繋がずにHTTP APIでクエリ発行できる
 内製ツール ‣ APIでselect文を受け付けてunload文でラップし問い合わせ実行 ‣ 結果をS3に直接かつ並列にunloadする→安全 •queuery-client (Ruby

    / Python) を使用 ‣ クエリ結果を単純に行単位の Enumerable / iterator で扱える 15
  16. 機械学習プロジェクトの概略図 バッチシステム 推論バッチ 学習バッチ データベース 推論モデル 特徴抽出モデル 学習機 サービスのデータ 特徴量

    学習結果 特徴量 推論結果 16
  17. 機械学習プロジェクトの概略図 バッチシステム 推論バッチ 学習バッチ データベース 推論モデル 特徴抽出モデル 学習機 サービスのデータ 特徴量

    学習結果 特徴量 推論結果 どうやっているか 17
  18. Redshift S3 Python Queuery ①HTTP リクエスト ②unload文でラップ ③並列に結果を転送 ④Pythonオブ ジェクト


    として扱う 18
  19. Redshift S3 Python Queuery ①HTTP リクエスト ②unload文でラップ ③並列に結果を転送 ④Pythonオブ ジェクト


    として扱う 19
  20. Redshift S3 Python Queuery ①HTTP リクエスト ②unload文でラップ ③並列に結果を転送 Redshift
 大量データを扱える


    データウェアハウス ④Pythonオブ ジェクト
 として扱う 20
  21. Redshift S3 Python Queuery ①HTTP リクエスト ②unload文でラップ ③並列に結果を転送 クエリ実行 S3

    (Simple Storage Service)
 拡張性と堅牢性に優れた
 ストレージサービス ④Pythonオブ ジェクト
 として扱う 21
  22. Redshift S3 Python Queuery ①HTTP リクエスト ②unload文でラップ ③並列に結果を転送 ④Pythonオブ ジェクト


    として扱う 22
  23. Redshift S3 Python Queuery ①HTTP リクエスト ②unload文でラップ ③並列に結果を転送 ⑤学習 23

  24. Redshift S3 Python Queuery ①HTTP リクエスト ②unload文でラップ ③並列に結果を転送 ⑤学習 24

    機械学習モデルができた!
  25. Redshift S3 Python Queuery ①HTTP リクエスト ②unload文でラップ ③並列に結果を転送 ⑤学習 25

    投入して使ってもらわないと
 意味ない
  26. 機械学習プロジェクトの概略図 バッチシステム 推論バッチ 学習バッチ データベース 推論モデル 特徴抽出モデル 学習機 サービスのデータ 特徴量

    学習結果 特徴量 推論結果 26
  27. 機械学習プロジェクトの概略図 バッチシステム 推論バッチ 学習バッチ データベース 推論モデル 特徴抽出モデル 学習機 サービスのデータ 特徴量

    学習結果 特徴量 推論結果 27
  28. DWHを使った機械学習 〜推論フェーズにおけるデータ投入編〜 28

  29. 機械学習プロジェクトのデータ利用とは •推論した結果データを
 他部署のメンバーに使ってもらう ‣ 既存テーブルのフィルタリング ‣ クラスタリング用など分析用途にも •DWHに集約させておくことが大事 29

  30. 機械学習プロジェクトのデータ利用の問題 •DWHに置いておくだけで使ってもらえるわけではない ‣ 使い方を書いておかないと使ってもらえない •他部署の人がテーブルの情報を知るのが困難 ‣ 精度とは?スコアとは?ラベルとは? ‣ 機械学習モデルの推論結果は信用できるものか? 30

  31. Dmemo •https://github.com/hogelog/dmemo •毎晩Redshiftにアクセスして最新の
 メタデータを取り込む ‣ DB・スキーマ・テーブル・カラムの各階層ごと に説明が書ける ‣ GoogleAuthと連携し変更履歴も管理される •PullRequest上やSlackでの分析のやりとり

    ‣ dmemoのURLを貼って一言二言伝えるだけで完結 31
  32. Dmemo 32

  33. Dmemoの使われ方 33

  34. 推論フェーズにおけるデータ投入 •既存テーブルとほぼ同じ行数のテーブルが誕生 ‣ たとえばレシピ,手順,材料に対するメタ情報など ‣ 初期は全データに対して推論を行う ‣ その後は日時バッチで追加されたデータに対しても推論 •頻繁な書き換えが発生する用途には向いていない 34

  35. Pipelined-migrator •MySQLテーブルのRedshiftへの取り込みを管理 ‣ GUIで追加するテーブル,DBを管理できる ‣ インフラやDWHチームへの依頼は不要 •s3を介してRedshiftにテーブルを取り込む 35

  36. Pipelined-migrator 36 取り込むテーブル一覧 取り込むデータベースの情報 実際に取り込むかどうか

  37. Pipelined-migrator を使うことによる利点 •PythonからはMySQLに書きに行くだけ ‣ 機械学習エンジニアは後ろ側を意識しなくてもいい •研究開発部が管理しているMySQLサーバー ‣ 実サービスから分離したスタンドアロン構成 •Redshiftへの投入は日時に自動で行われる ‣

    ミニバッチに分割して投入するといった手間は不要 37
  38. Redshift S3 Python 並列に書き込み Aurora MySQLとして
 書き込み 38 Pipelined-migrator

  39. Redshift S3 Python 並列に書き込み Aurora MySQLとして
 書き込み 39 Pipelined-migrator Aurora

    (MySQL) AWS上に展開されたマネージドな RDMBSシステム
  40. Redshift S3 Python 並列に書き込み Aurora MySQLとして
 書き込み 40 Pipelined-migrator

  41. Redshift S3 Python 並列に書き込み Aurora MySQLとして
 書き込み 41 Pipelined-migrator

  42. まとめ 42

  43. クックパッドでのデータフロー •データ取得 ‣ S3をうまく使ってRedshiftに負荷をかけすぎないようにする ‣ 他の分析者のストレスにならないように •データ投入 ‣ S3をうまく使うことでMySQLからの取り込みも簡単に ‣

    じぶん達で作ったデータは使われ先も置き先も面倒を見る •DWHチームに頼り切らずにデータ取得/投入を行うことができた ‣ でも困ったらすぐ頼れるので助かる (実際に私も困ったので頼った) 43
  44. 機械学習プロジェクトの概略図 バッチシステム 推論バッチ 学習バッチ データベース 推論モデル 特徴抽出モデル 学習機 サービスのデータ 特徴量

    学習結果 特徴量 推論結果 44
  45. Redshift S3 Python Queuery HTTP リクエスト unload文でラップ 並列に結果を転送 Aurora MySQLとして


    書き込み 並列に書き込み 45
  46. 参考文献 •無理をしない機械学習プロジェクト2
 https://speakerdeck.com/studio_graph/step-or-not2 •クックパッドのデータ活用基盤
 https://techlife.cookpad.com/entry/2017/10/06/135527 •データベースドキュメント管理システム dmemo のご案内
 https://techlife.cookpad.com/entry/2016/08/08/103906 •データ活用基盤の今

    〜DWH外観図〜
 https://techlife.cookpad.com/entry/2019/10/18/090000 46