Slide 1

Slide 1 text

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

Slide 2

Slide 2 text

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

Slide 3

Slide 3 text

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

Slide 4

Slide 4 text

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

Slide 5

Slide 5 text

レシピと機械学習 •レシピの検索 •レシピの解析 •同義表現の認識 •材料名の正規化 •手順の分類 •レシピの分類 5

Slide 6

Slide 6 text

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

Slide 7

Slide 7 text

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

Slide 8

Slide 8 text

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

Slide 9

Slide 9 text

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

Slide 10

Slide 10 text

DWHを使った機械学習 〜学習フェーズにおけるデータ取得編〜 10

Slide 11

Slide 11 text

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

Slide 12

Slide 12 text

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

Slide 13

Slide 13 text

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

Slide 14

Slide 14 text

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

Slide 15

Slide 15 text

Queuery •Redshiftに直接繋がずにHTTP APIでクエリ発行できる
 内製ツール ‣ APIでselect文を受け付けてunload文でラップし問い合わせ実行 ‣ 結果をS3に直接かつ並列にunloadする→安全 •queuery-client (Ruby / Python) を使用 ‣ クエリ結果を単純に行単位の Enumerable / iterator で扱える 15

Slide 16

Slide 16 text

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

Slide 17

Slide 17 text

機械学習プロジェクトの概略図 バッチシステム 推論バッチ 学習バッチ データベース 推論モデル 特徴抽出モデル 学習機 サービスのデータ 特徴量 学習結果 特徴量 推論結果 どうやっているか 17

Slide 18

Slide 18 text

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

Slide 19

Slide 19 text

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

Slide 20

Slide 20 text

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

Slide 21

Slide 21 text

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

Slide 22

Slide 22 text

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

Slide 23

Slide 23 text

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

Slide 24

Slide 24 text

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

Slide 25

Slide 25 text

Redshift S3 Python Queuery ①HTTP リクエスト ②unload文でラップ ③並列に結果を転送 ⑤学習 25 投入して使ってもらわないと
 意味ない

Slide 26

Slide 26 text

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

Slide 27

Slide 27 text

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

Slide 28

Slide 28 text

DWHを使った機械学習 〜推論フェーズにおけるデータ投入編〜 28

Slide 29

Slide 29 text

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

Slide 30

Slide 30 text

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

Slide 31

Slide 31 text

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

Slide 32

Slide 32 text

Dmemo 32

Slide 33

Slide 33 text

Dmemoの使われ方 33

Slide 34

Slide 34 text

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

Slide 35

Slide 35 text

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

Slide 36

Slide 36 text

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

Slide 37

Slide 37 text

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

Slide 38

Slide 38 text

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

Slide 39

Slide 39 text

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

Slide 40

Slide 40 text

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

Slide 41

Slide 41 text

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

Slide 42

Slide 42 text

まとめ 42

Slide 43

Slide 43 text

クックパッドでのデータフロー •データ取得 ‣ S3をうまく使ってRedshiftに負荷をかけすぎないようにする ‣ 他の分析者のストレスにならないように •データ投入 ‣ S3をうまく使うことでMySQLからの取り込みも簡単に ‣ じぶん達で作ったデータは使われ先も置き先も面倒を見る •DWHチームに頼り切らずにデータ取得/投入を行うことができた ‣ でも困ったらすぐ頼れるので助かる (実際に私も困ったので頼った) 43

Slide 44

Slide 44 text

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

Slide 45

Slide 45 text

Redshift S3 Python Queuery HTTP リクエスト unload文でラップ 並列に結果を転送 Aurora MySQLとして
 書き込み 並列に書き込み 45

Slide 46

Slide 46 text

参考文献 •無理をしない機械学習プロジェクト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