Slide 1

Slide 1 text

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

Slide 2

Slide 2 text

もくじ •自己紹介 •サービス導入へ向けて ‣ 学習フェーズにおけるデータフロー •デプロイ ‣ 推論フェーズにおけるデータ・デプロイフロー •まとめ・参考資料 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

機械学習の実験・検証 •過去スライドを参照 ‣ 具体的な事象も含めて •無理をしない機械学習
 プロジェクト2
 https://speakerdeck.com/ studio_graph/step-or-not2 10

Slide 11

Slide 11 text

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

Slide 12

Slide 12 text

サービス投入に向けて 12

Slide 13

Slide 13 text

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

Slide 14

Slide 14 text

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

Slide 15

Slide 15 text

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

Slide 16

Slide 16 text

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

Slide 17

Slide 17 text

機械学習プロジェクトの概略図 バッチシステム 推論バッチ 学習バッチ データベース 推論モデル 前処理 学習器 サービスの
 データ 特徴量 学習結果 特徴量 推論結果 17 教師
 データ 学習に必要なデータ

Slide 18

Slide 18 text

機械学習プロジェクトの概略図 バッチシステム 推論バッチ 学習バッチ データベース 推論モデル 前処理 学習器 サービスの
 データ 特徴量 学習結果 特徴量 推論結果 18 教師
 データ どう取ってきているか

Slide 19

Slide 19 text

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

Slide 20

Slide 20 text

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

Slide 21

Slide 21 text

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

Slide 22

Slide 22 text

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

Slide 23

Slide 23 text

Redshift S3 Python Queuery ③HTTP リクエスト ④unload文で
 ラップ ⑤並列に結果を転送 ⑥Pythonオブジェクト 23 学習用データ取得フロー Google Sheets Aurora ①HTTP リクエスト ②MySQLとして接続 ⑦モデル
 アップロード Aurora (MySQL) AWS上に展開されたマネージドな RDMBSシステム

Slide 24

Slide 24 text

Redshift S3 Python Queuery ③HTTP リクエスト ④unload文で
 ラップ ⑤並列に結果を転送 ⑥Pythonオブジェクト 24 学習用データ取得フロー Google Sheets Aurora ①HTTP リクエスト ②MySQLとして接続 ⑦モデル
 アップロード GitHubレポジトリで
 開発 差分チェック

Slide 25

Slide 25 text

Redshift S3 Python Queuery ③HTTP リクエスト ④unload文で
 ラップ ⑤並列に結果を転送 ⑥Pythonオブジェクト 25 学習用データ取得フロー Google Sheets Aurora ①HTTP リクエスト ②MySQLとして接続 ⑦モデル
 アップロード 差分あったら
 Auroraに書き込む

Slide 26

Slide 26 text

Redshift S3 Python Queuery ③HTTP リクエスト ④unload文で
 ラップ ⑤並列に結果を転送 ⑥Pythonオブジェクト 26 学習用データ取得フロー Google Sheets Aurora ①HTTP リクエスト ②MySQLとして接続 ⑦モデル
 アップロード 学習ジョブ開始

Slide 27

Slide 27 text

Redshift S3 Python Queuery ③HTTP リクエスト ④unload文で
 ラップ ⑤並列に結果を転送 ⑥Pythonオブジェクト 27 学習用データ取得フロー Google Sheets Aurora ①HTTP リクエスト ②MySQLとして接続 ⑦モデル
 アップロード Queuery Redshiftに安全にクエリを発行する
 社内ツール

Slide 28

Slide 28 text

Redshift S3 Python Queuery ③HTTP リクエスト ④unload文で
 ラップ ⑤並列に結果を転送 ⑥Pythonオブジェクト 28 学習用データ取得フロー Google Sheets Aurora ①HTTP リクエスト ②MySQLとして接続 ⑦モデル
 アップロード Redshift
 大量データを扱える
 データウェアハウス

Slide 29

Slide 29 text

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

Slide 30

Slide 30 text

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

Slide 31

Slide 31 text

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

Slide 32

Slide 32 text

デプロイ 32

Slide 33

Slide 33 text

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

Slide 34

Slide 34 text

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

Slide 35

Slide 35 text

機械学習プロジェクトの概略図 バッチシステム 推論バッチ 学習バッチ データベース 推論モデル 前処理 学習器 サービスの
 データ 特徴量 学習結果 特徴量 推論結果 35 教師
 データ どう動かしているか

Slide 36

Slide 36 text

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

Slide 37

Slide 37 text

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

Slide 38

Slide 38 text

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

Slide 39

Slide 39 text

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への
 パラメータ 秘匿値は
 環境変数で

Slide 40

Slide 40 text

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

Slide 41

Slide 41 text

構成図 41 ECR Jenkins GitHub
 Enterprise Hako (ECS) Redshift S3 Queuery Aurora Codebuild

Slide 42

Slide 42 text

構成図 42 ECR Jenkins GitHub
 Enterprise Hako (ECS) Redshift S3 Queuery Aurora Codebuild GitHubレポジトリで
 開発

Slide 43

Slide 43 text

構成図 43 ECR Jenkins GitHub
 Enterprise Hako (ECS) Redshift S3 Queuery Aurora Codebuild Dockerfileを追加

Slide 44

Slide 44 text

構成図 44 ECR Jenkins GitHub
 Enterprise Hako (ECS) Redshift S3 Queuery Aurora Codebuild Dockerfileを取得 Jenkins: CIのための自動化ツール

Slide 45

Slide 45 text

構成図 45 ECR Jenkins GitHub
 Enterprise Hako (ECS) Redshift S3 Queuery Aurora Codebuild Dockerfileを元に
 ビルド CodeBuild: マネージド型
 ビルドサービス

Slide 46

Slide 46 text

構成図 46 ECR Jenkins GitHub
 Enterprise Hako (ECS) Redshift S3 Queuery Aurora Codebuild ECRにプッシュ EC2 Container Registry
 Dockerコンテナイメージを保存し ているもの

Slide 47

Slide 47 text

構成図 47 ECR Jenkins GitHub
 Enterprise Hako (ECS) Redshift S3 Queuery Aurora Codebuild ジョブ実行命令 Kuroko2
 クックパッド製のジョブ
 スケジューラー・管理ツール

Slide 48

Slide 48 text

構成図 48 ECR Jenkins GitHub
 Enterprise Hako (ECS) Redshift S3 Queuery Aurora Codebuild Dockerイメージ をPull Kuroko2
 クックパッド製のジョブ
 スケジューラー・管理ツール

Slide 49

Slide 49 text

構成図 49 ECR Jenkins GitHub
 Enterprise Hako (ECS) Redshift S3 Queuery Aurora Codebuild 学習済みモデルを Pull Simple Storage Service
 拡張性と堅牢性に優れた
 ストレージサービス

Slide 50

Slide 50 text

構成図 50 ECR Jenkins GitHub
 Enterprise Hako (ECS) Redshift S3 Queuery Aurora Codebuild s3を介して
 データ取得 新しく追加された
 サービスのデータ

Slide 51

Slide 51 text

構成図 51 ECR Jenkins GitHub
 Enterprise Hako (ECS) Redshift S3 Queuery Aurora Codebuild 推論バッチ

Slide 52

Slide 52 text

構成図 52 ECR Jenkins GitHub
 Enterprise Hako (ECS) Redshift S3 Queuery Aurora Codebuild 推論結果の
 書き込み Aurora (MySQL) AWS上に展開されたマネージドな RDMBSシステム

Slide 53

Slide 53 text

構成図 53 ECR Jenkins GitHub
 Enterprise Hako (ECS) Redshift S3 Queuery Aurora Codebuild 日次でS3を介して
 Redshiftへ

Slide 54

Slide 54 text

構成図 54 ECR Jenkins GitHub
 Enterprise Hako (ECS) Redshift S3 Queuery Aurora Codebuild 無事に推論結果を書き込めた

Slide 55

Slide 55 text

構成図 55 ECR Jenkins GitHub
 Enterprise Hako (ECS) Redshift S3 Queuery Aurora Codebuild 使ってもらわないと意味ない

Slide 56

Slide 56 text

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

Slide 57

Slide 57 text

Dmemoの使われ方 57

Slide 58

Slide 58 text

まとめ 58

Slide 59

Slide 59 text

クックパッドの機械学習サイクル •機械学習エンジニアが最後まで面倒を見る ‣ 社内デプロイフローにうまく乗っかる ‣ マイクロサービス化されているので他に迷惑を
 かけない •改善するのが容易 ‣ 改善や別プロジェクトに使い回せる •実際にサービスで使われないと意味がない ‣ きちんとデータベースに投入して,ドキュメントも整備 59

Slide 60

Slide 60 text

We’re hiring❤ cookpad.jobs 60

Slide 61

Slide 61 text

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

Slide 62

Slide 62 text

質問と回答 62

Slide 63

Slide 63 text

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

Slide 64

Slide 64 text

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

Slide 65

Slide 65 text

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

Slide 66

Slide 66 text

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

Slide 67

Slide 67 text

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

Slide 68

Slide 68 text

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

Slide 69

Slide 69 text

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