Upgrade to Pro — share decks privately, control downloads, hide ads and more …

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

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

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

開発室Graph

December 02, 2019
Tweet

More Decks by 開発室Graph

Other Decks in Programming

Transcript

  1. DWHを活用した
    クックパッドの機械学習

    プロジェクト
    クックパッド株式会社

    開発室Graph
    stu3dio_graph
    1

    View Slide

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

    View Slide

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

    View Slide

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

    4

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  15. Queuery
    •Redshiftに直接繋がずにHTTP APIでクエリ発行できる

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

    View Slide

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

    View Slide

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

    View Slide

  18. Redshift
    S3
    Python

    Queuery
    ①HTTP リクエスト
    ②unload文でラップ
    ③並列に結果を転送
    ④Pythonオブ
    ジェクト

    として扱う
    18

    View Slide

  19. Redshift
    S3
    Python

    Queuery
    ①HTTP リクエスト
    ②unload文でラップ
    ③並列に結果を転送
    ④Pythonオブ
    ジェクト

    として扱う
    19

    View Slide

  20. Redshift
    S3
    Python

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

    大量データを扱える

    データウェアハウス
    ④Pythonオブ
    ジェクト

    として扱う
    20

    View Slide

  21. Redshift
    S3
    Python

    Queuery
    ①HTTP リクエスト
    ②unload文でラップ
    ③並列に結果を転送
    クエリ実行
    S3 (Simple Storage
    Service)

    拡張性と堅牢性に優れた

    ストレージサービス
    ④Pythonオブ
    ジェクト

    として扱う
    21

    View Slide

  22. Redshift
    S3
    Python

    Queuery
    ①HTTP リクエスト
    ②unload文でラップ
    ③並列に結果を転送
    ④Pythonオブ
    ジェクト

    として扱う
    22

    View Slide

  23. Redshift
    S3
    Python

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

    View Slide

  24. Redshift
    S3
    Python

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

    View Slide

  25. Redshift
    S3
    Python

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

    意味ない

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  29. 機械学習プロジェクトのデータ利用とは
    •推論した結果データを

    他部署のメンバーに使ってもらう
    ‣ 既存テーブルのフィルタリング
    ‣ クラスタリング用など分析用途にも
    •DWHに集約させておくことが大事
    29

    View Slide

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

    View Slide

  31. Dmemo
    •https://github.com/hogelog/dmemo
    •毎晩Redshiftにアクセスして最新の

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

    View Slide

  32. Dmemo
    32

    View Slide

  33. Dmemoの使われ方
    33

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    書き込み
    38
    Pipelined-migrator

    View Slide

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

    書き込み
    39
    Pipelined-migrator
    Aurora (MySQL)
    AWS上に展開されたマネージドな
    RDMBSシステム

    View Slide

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

    書き込み
    40
    Pipelined-migrator

    View Slide

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

    書き込み
    41
    Pipelined-migrator

    View Slide

  42. まとめ
    42

    View Slide

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

    View Slide

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

    View Slide

  45. Redshift
    S3
    Python

    Queuery
    HTTP リクエスト
    unload文でラップ
    並列に結果を転送
    Aurora
    MySQLとして

    書き込み
    並列に書き込み
    45

    View Slide

  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

    View Slide