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

クックパッドでの機械学習開発フロー/ml-ops-in-cookpad

開発室Graph
December 12, 2019

 クックパッドでの機械学習開発フロー/ml-ops-in-cookpad

クックパッドでの機械学習基盤のお話です。
https://machine-learning-pitch.connpass.com/event/154343/
にて登壇。質問とそれに対する答えを追記しました。

開発室Graph

December 12, 2019
Tweet

More Decks by 開発室Graph

Other Decks in Research

Transcript

  1. クックパッドでの

    機械学習フロー
    クックパッド株式会社
    @studio_graph3
    1

    View Slide

  2. もくじ
    •自己紹介
    •サービス導入へ向けて
    ‣ 学習フェーズにおけるデータフロー
    •デプロイ
    ‣ 推論フェーズにおけるデータ・デプロイフロー
    •まとめ・参考資料
    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. 機械学習の実験・検証
    •過去スライドを参照
    ‣ 具体的な事象も含めて
    •無理をしない機械学習

    プロジェクト2

    https://speakerdeck.com/
    studio_graph/step-or-not2
    10

    View Slide

  11. クックパッドのデータフロー
    •過去スライドを参照
    ‣ DWHとの関わり方
    • DWHを活用した機械学習プロ
    ジェクト

    https://speakerdeck.com/
    studio_graph/ml-with-dwh
    11

    View Slide

  12. サービス投入に向けて
    12

    View Slide

  13. 実験だけでは意味がない
    •スコアはあくまで評価データ
    •データベースに投入
    ‣ サービスや他開発者から参照可能にする
    •実験ではない本番環境のコードへ
    ‣ ペアプロしながらバッチ化
    13

    View Slide

  14. ぐちゃぐちゃ実験コードを整理
    •理解できるコードにする
    ‣ まずはJupyter Notebookをスクリプトにする
    •実験フローの構造化
    ‣ 前処理,学習,参照のコードをそれぞれ関数やクラスに
    •Dockerで動かせるようにする
    •リファクタリング・テストの追加
    ‣ 最低限のテストは書く
    14

    View Slide

  15. 機械学習プロジェクトの概略図
    バッチシステム
    推論バッチ 学習バッチ
    データベース
    推論モデル
    前処理
    学習器
    サービスの

    データ
    特徴量
    学習結果
    特徴量
    推論結果
    15
    教師

    データ

    View Slide

  16. 機械学習プロジェクトの概略図
    バッチシステム
    推論バッチ 学習バッチ
    データベース
    推論モデル
    前処理
    学習器
    サービスの

    データ
    特徴量
    学習結果
    特徴量
    推論結果
    16
    教師

    データ

    View Slide

  17. 機械学習プロジェクトの概略図
    バッチシステム
    推論バッチ 学習バッチ
    データベース
    推論モデル
    前処理
    学習器
    サービスの

    データ
    特徴量
    学習結果
    特徴量
    推論結果
    17
    教師

    データ
    学習に必要なデータ

    View Slide

  18. 機械学習プロジェクトの概略図
    バッチシステム
    推論バッチ 学習バッチ
    データベース
    推論モデル
    前処理
    学習器
    サービスの

    データ
    特徴量
    学習結果
    特徴量
    推論結果
    18
    教師

    データ
    どう取ってきているか

    View Slide

  19. サービス導入へのステップ
    •教師データ (ラベル付きデータ)を継続的に管理する
    ‣ サービスからの都合で教師データやタスクの定義は変わる
    •大量のデータを安全に取得する
    ‣ 学習には大量のデータが必要だがサービスに

    負荷をかけない
    •学習したモデルを保存する
    19

    View Slide

  20. アノテーションされたデータの管理
    •チームに料理レシピデータのアノテーターが存在
    ‣ 管理栄養士の資格を持つ料理のプロフェッショナル
    ‣ コミュニケーションをしつつアノテーションできる
    •Google Spread Sheet で管理
    ‣ 権限や変更履歴が簡単に可視化できる
    ‣ 社内のG Suite基盤にそのまま乗っかれる (認証まわり)
    20

    View Slide

  21. Redshift
    S3
    Python

    Queuery
    ③HTTP リクエスト
    ④unload文で

    ラップ
    ⑤並列に結果を転送
    ⑥Pythonオブジェクト
    21
    学習用データ取得フロー
    Google Sheets
    Aurora
    ①HTTP リクエスト
    ②MySQLとして接続
    ⑦モデル

    アップロード

    View Slide

  22. Redshift
    S3
    Python

    Queuery
    ③HTTP リクエスト
    ④unload文で

    ラップ
    ⑤並列に結果を転送
    ⑥Pythonオブジェクト
    22
    学習用データ取得フロー
    Google Sheets
    Aurora
    ①HTTP リクエスト
    ②MySQLとして接続
    ⑦モデル

    アップロード

    View Slide

  23. Redshift
    S3
    Python

    Queuery
    ③HTTP リクエスト
    ④unload文で

    ラップ
    ⑤並列に結果を転送
    ⑥Pythonオブジェクト
    23
    学習用データ取得フロー
    Google Sheets
    Aurora
    ①HTTP リクエスト
    ②MySQLとして接続
    ⑦モデル

    アップロード
    Aurora (MySQL)
    AWS上に展開されたマネージドな
    RDMBSシステム

    View Slide

  24. Redshift
    S3
    Python

    Queuery
    ③HTTP リクエスト
    ④unload文で

    ラップ
    ⑤並列に結果を転送
    ⑥Pythonオブジェクト
    24
    学習用データ取得フロー
    Google Sheets
    Aurora
    ①HTTP リクエスト
    ②MySQLとして接続
    ⑦モデル

    アップロード
    GitHubレポジトリで

    開発
    差分チェック

    View Slide

  25. Redshift
    S3
    Python

    Queuery
    ③HTTP リクエスト
    ④unload文で

    ラップ
    ⑤並列に結果を転送
    ⑥Pythonオブジェクト
    25
    学習用データ取得フロー
    Google Sheets
    Aurora
    ①HTTP リクエスト
    ②MySQLとして接続
    ⑦モデル

    アップロード
    差分あったら

    Auroraに書き込む

    View Slide

  26. Redshift
    S3
    Python

    Queuery
    ③HTTP リクエスト
    ④unload文で

    ラップ
    ⑤並列に結果を転送
    ⑥Pythonオブジェクト
    26
    学習用データ取得フロー
    Google Sheets
    Aurora
    ①HTTP リクエスト
    ②MySQLとして接続
    ⑦モデル

    アップロード
    学習ジョブ開始

    View Slide

  27. Redshift
    S3
    Python

    Queuery
    ③HTTP リクエスト
    ④unload文で

    ラップ
    ⑤並列に結果を転送
    ⑥Pythonオブジェクト
    27
    学習用データ取得フロー
    Google Sheets
    Aurora
    ①HTTP リクエスト
    ②MySQLとして接続
    ⑦モデル

    アップロード
    Queuery
    Redshiftに安全にクエリを発行する

    社内ツール

    View Slide

  28. Redshift
    S3
    Python

    Queuery
    ③HTTP リクエスト
    ④unload文で

    ラップ
    ⑤並列に結果を転送
    ⑥Pythonオブジェクト
    28
    学習用データ取得フロー
    Google Sheets
    Aurora
    ①HTTP リクエスト
    ②MySQLとして接続
    ⑦モデル

    アップロード
    Redshift

    大量データを扱える

    データウェアハウス

    View Slide

  29. Redshift
    S3
    Python

    Queuery
    ③HTTP リクエスト
    ④unload文で

    ラップ
    ⑤並列に結果を転送
    ⑥Pythonオブジェクト
    29
    学習用データ取得フロー
    Google Sheets
    Aurora
    ①HTTP リクエスト
    ②MySQLとして接続
    ⑦モデル

    アップロード

    View Slide

  30. Redshift
    S3
    Python

    Queuery
    ③HTTP リクエスト
    ④unload文で

    ラップ
    ⑤並列に結果を転送
    ⑥Pythonオブジェクト
    30
    学習用データ取得フロー
    Google Sheets
    Aurora
    ①HTTP リクエスト
    ②MySQLとして接続
    ⑦モデル

    アップロード

    View Slide

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

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

    View Slide

  32. デプロイ
    32

    View Slide

  33. 機械学習プロジェクトの概略図
    バッチシステム
    推論バッチ 学習バッチ
    データベース
    推論モデル
    前処理
    学習器
    サービスの

    データ
    特徴量
    学習結果
    特徴量
    推論結果
    33
    教師

    データ

    View Slide

  34. 機械学習プロジェクトの概略図
    バッチシステム
    推論バッチ 学習バッチ
    データベース
    推論モデル
    前処理
    学習器
    サービスの

    データ
    特徴量
    学習結果
    特徴量
    推論結果
    34
    教師

    データ
    推論バッチ

    View Slide

  35. 機械学習プロジェクトの概略図
    バッチシステム
    推論バッチ 学習バッチ
    データベース
    推論モデル
    前処理
    学習器
    サービスの

    データ
    特徴量
    学習結果
    特徴量
    推論結果
    35
    教師

    データ
    どう動かしているか

    View Slide

  36. デプロイへのステップ
    •コンテナをインフラ基盤の上に載せる
    ‣ テスト,ジョブの設定,コンテナの設定など
    •推論するためのデータを取得する
    ‣ 基本的には学習フェーズと同じ
    •推論結果をデータベースに格納する
    36

    View Slide

  37. 効率化されたデプロイ
    •デプロイ先
    ‣ クックパッドの共通コンテナ環境を利用 (Hako)
    •機械学習エンジニア自身でデプロイまで
    ‣ 必要なファイルをPull Requestベースで追加するだけ
    •機械学習プロジェクトの共通化
    ‣ 認証,データ置き場,権限など
    •設定が必要になる項目をなるべく減らす
    37

    View Slide

  38. Hako
    •https://github.com/eagletmt/hako
    •クックパッド内製 (OSS) のデプロイツール
    •Amazon ECS上で動作する
    ‣ Fargate上で動作する
    •アプリケーションの定義を書くだけでよい
    ‣ jsonnetを書いてhako_apps という中央レポジトリにPull Request
    ‣ Dockerイメージ,環境変数といったタスク定義
    38

    View Slide

  39. jsonnetの例
    39
    {
    app: {
    image: '012345678901.dkr.ecr.ap-northeast-1.amazonaws.com/awesome_app',
    cpu: 4096,
    memory: 8192,
    secrets: [
    secret('AWESOME_TOKEN_SECRET'),
    secret('DB_PASSWORD'),
    ],
    env: {
    QUEUERY_TOKEN: 'thisisatoken',
    },
    },
    scripts: [
    { type: 'ckpdecs' },
    utils.jenkinsTag('awesome-batch'),
    ],
    }
    Dockerイメージ
    Docker/ECSへの

    パラメータ
    秘匿値は

    環境変数で

    View Slide

  40. 機械学習プロジェクトの運用方法
    •主に日次,週次バッチとして利用
    ‣ レシピ,材料,手順の正規化・分類タスクなど
    •機械学習エンジニアがバッチジョブの設定も行う
    ‣ 内製バッチジョブシステムを利用 (kuroko2)
    ‣ Slackへの通知設定は自動で行われる
    •データベースと通信してジョブを実行
    ‣ 即時系の機械学習ジョブは動いていない
    40

    View Slide

  41. 構成図
    41
    ECR
    Jenkins
    GitHub

    Enterprise
    Hako (ECS)
    Redshift
    S3

    Queuery
    Aurora
    Codebuild

    View Slide

  42. 構成図
    42
    ECR
    Jenkins
    GitHub

    Enterprise
    Hako (ECS)
    Redshift
    S3

    Queuery
    Aurora
    Codebuild
    GitHubレポジトリで

    開発

    View Slide

  43. 構成図
    43
    ECR
    Jenkins
    GitHub

    Enterprise
    Hako (ECS)
    Redshift
    S3

    Queuery
    Aurora
    Codebuild Dockerfileを追加

    View Slide

  44. 構成図
    44
    ECR
    Jenkins
    GitHub

    Enterprise
    Hako (ECS)
    Redshift
    S3

    Queuery
    Aurora
    Codebuild Dockerfileを取得
    Jenkins: CIのための自動化ツール

    View Slide

  45. 構成図
    45
    ECR
    Jenkins
    GitHub

    Enterprise
    Hako (ECS)
    Redshift
    S3

    Queuery
    Aurora
    Codebuild
    Dockerfileを元に

    ビルド
    CodeBuild: マネージド型

    ビルドサービス

    View Slide

  46. 構成図
    46
    ECR
    Jenkins
    GitHub

    Enterprise
    Hako (ECS)
    Redshift
    S3

    Queuery
    Aurora
    Codebuild
    ECRにプッシュ
    EC2 Container Registry

    Dockerコンテナイメージを保存し
    ているもの

    View Slide

  47. 構成図
    47
    ECR
    Jenkins
    GitHub

    Enterprise
    Hako (ECS)
    Redshift
    S3

    Queuery
    Aurora
    Codebuild ジョブ実行命令
    Kuroko2

    クックパッド製のジョブ

    スケジューラー・管理ツール

    View Slide

  48. 構成図
    48
    ECR
    Jenkins
    GitHub

    Enterprise
    Hako (ECS)
    Redshift
    S3

    Queuery
    Aurora
    Codebuild
    Dockerイメージ
    をPull
    Kuroko2

    クックパッド製のジョブ

    スケジューラー・管理ツール

    View Slide

  49. 構成図
    49
    ECR
    Jenkins
    GitHub

    Enterprise
    Hako (ECS)
    Redshift
    S3

    Queuery
    Aurora
    Codebuild
    学習済みモデルを
    Pull
    Simple Storage Service

    拡張性と堅牢性に優れた

    ストレージサービス

    View Slide

  50. 構成図
    50
    ECR
    Jenkins
    GitHub

    Enterprise
    Hako (ECS)
    Redshift
    S3

    Queuery
    Aurora
    Codebuild
    s3を介して

    データ取得
    新しく追加された

    サービスのデータ

    View Slide

  51. 構成図
    51
    ECR
    Jenkins
    GitHub

    Enterprise
    Hako (ECS)
    Redshift
    S3

    Queuery
    Aurora
    Codebuild
    推論バッチ

    View Slide

  52. 構成図
    52
    ECR
    Jenkins
    GitHub

    Enterprise
    Hako (ECS)
    Redshift
    S3

    Queuery
    Aurora
    Codebuild
    推論結果の

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

    View Slide

  53. 構成図
    53
    ECR
    Jenkins
    GitHub

    Enterprise
    Hako (ECS)
    Redshift
    S3

    Queuery
    Aurora
    Codebuild
    日次でS3を介して

    Redshiftへ

    View Slide

  54. 構成図
    54
    ECR
    Jenkins
    GitHub

    Enterprise
    Hako (ECS)
    Redshift
    S3

    Queuery
    Aurora
    Codebuild
    無事に推論結果を書き込めた

    View Slide

  55. 構成図
    55
    ECR
    Jenkins
    GitHub

    Enterprise
    Hako (ECS)
    Redshift
    S3

    Queuery
    Aurora
    Codebuild
    使ってもらわないと意味ない

    View Slide

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

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

    View Slide

  57. Dmemoの使われ方
    57

    View Slide

  58. まとめ
    58

    View Slide

  59. クックパッドの機械学習サイクル
    •機械学習エンジニアが最後まで面倒を見る
    ‣ 社内デプロイフローにうまく乗っかる
    ‣ マイクロサービス化されているので他に迷惑を

    かけない
    •改善するのが容易
    ‣ 改善や別プロジェクトに使い回せる
    •実際にサービスで使われないと意味がない
    ‣ きちんとデータベースに投入して,ドキュメントも整備
    59

    View Slide

  60. We’re hiring❤
    cookpad.jobs
    60

    View Slide

  61. 参考文献
    •無理をしない機械学習プロジェクト2

    https://speakerdeck.com/studio_graph/step-or-not2
    •DWHを活用した機械学習プロジェクト

    https://speakerdeck.com/studio_graph/ml-with-dwh
    •クックパッドでの Webアプリケーション開発 2017

    https://speakerdeck.com/eagletmt/web-application-development-in-cookpad-2017
    •クックパッドのデータ活用基盤

    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
    61

    View Slide

  62. 質問と回答
    62

    View Slide

  63. 質問
    Q: 今回の設計で一番大事にしたコンセプトは何でしょう
    か?
    「あまり特別なことをやらないこと」を大切にしました。
    すでにデプロイフローが整っているので,なるべくそこに
    乗っかっていくということにしました。機械学習だからと
    いって特別なことはせず,通常のアプリケーションだと
    思って普通にデプロイするという感じです。
    63

    View Slide

  64. 質問
    Q: 醤油の表記ゆれ100種類はどうやってひとつに統一したので
    しょうか?辞書?
    もちろん同義語の管理ツールは存在するし,これは同義表現とい
    う情報を使うことで検索にもきちんと引っかかるようにしていま
    す。それ以外にも Encoder-Decoder を用いた材料正規化のシス
    テムを利用して,辞書にないような表記ゆれ,同義表現にも対応
    しています。

    参考: Encoder-Decoder でレシピの材料名を正規化する

    https://techlife.cookpad.com/entry/2017/10/30/080102
    64

    View Slide

  65. 質問
    Q: スプレッドシートでどれくらいの量のデータを扱っているのでしょう
    か?
    アノテーションのタスクの難易度にもよるのですが,だいたい数百件から数
    千件のアノテーションをGoogleスプレッドシートベースで依頼することが多
    いです。ときには数万件のアノテーションを依頼することもありますが,い
    きなり大量にアノテーションしてもうまくいかないことが多いです。まずは
    数十件くらいのパイロットタスクを解いてもらって,そのあとコミュニケー
    ションしつつ大規模なアノテーションをこなしてもらう,という形です。

    データの行数が数万件を超えてもかなり安定して動作し,データの追加も容
    易であるため重宝しています。
    65

    View Slide

  66. 質問
    Q: 機械学習エンジニアがデプロイした機能の運用責任はMLエ
    ンジニア側と基盤側のどちらが持つのでしょうか?
    運用責任ももちろんMLエンジニア側 (研究開発部のエンジニア)
    が持つことになります。クックパッドでは基盤システムの民主化
    が進んでいて,基盤チームはツールを提供してくれるだけで,実
    際にそれを使って運用するのは常にサービス開発側や研究開発側
    の責務ということになっています。基本的には我々の側で運用し
    て,システムの構成変更やアラートがあったときに必要ならば基
    盤チームと相談しつつ進める,という感じです。
    66

    View Slide

  67. 質問
    Q: あとRedshiftが本番環境というのはどういうことな
    んだろうか(DBとして使っている?)
    DBとしては使用していますが,リアルタイムなトランザ
    クションを処理するためには使っていません。もちろん
    DWHということで退避環境は用意しておらず,日々たくさ
    んのバッチジョブが走って集計が回っているのに迷惑かけ
    たくない,というところですね。サービスから参照する場
    合はもちろんRedshiftではなくAuroraとかに向きます。
    67

    View Slide

  68. 質問
    Q: 内製したサービスをたくさん作っているように見えますが、そのメリッ
    トデメリットは?
    サービスというより各種ツール・ライブラリというところですかね。メリット
    は自社のサービスに向けたツールを作れるかつ作者が内部にいるので色々と融
    通を効かせやすいところでしょうか。またそういう各種サービスを使うより費
    用が抑えられるということもあります。あとそもそもこれらを作った当初には
    実用に耐えうる外部サービスが存在していなかったという歴史的な理由もあり
    ます。

    デメリットはもちろんメンテナンスコストと学習コストでしょうか。内製ツー
    ルはちゃんと便利なのですが,クックパッド用のツールの勉強をしなければな
    らないことは多いです。
    68

    View Slide

  69. 質問
    Q: 「レシピのアノテーション担当として管理栄養士をフルタイ
    ム雇用している」具体的なアノテーション気になるけど、流石
    に企業秘密だろな。
    具体的なアノテーション内容としては,冒頭や他のスライドで
    述べているようなタスクの教師データ作成が多いです。たとえ
    ばレシピの分類とか手順のタグ付けや同義語認識あたりでしょ
    うか。それ以外にも検索の評価や画像の領域判断など,想像さ
    れるレシピへのメタデータ系のタスクはほとんどすべてを行っ
    てもらっています。
    69

    View Slide