Pro Yearly is on sale from $80 to $50! »

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

67d36f3f18a22b190854d0e80754d57f?s=47 開発室Graph
December 12, 2019

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

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

67d36f3f18a22b190854d0e80754d57f?s=128

開発室Graph

December 12, 2019
Tweet

Transcript

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

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

  3. 自己紹介 3

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

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

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

  7. 今日する話 7

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

    特徴量 学習結果 特徴量 推論結果 8 教師
 データ
  9. 今日しない話 9

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

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

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

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

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

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

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

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

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

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

    19
  20. アノテーションされたデータの管理 •チームに料理レシピデータのアノテーターが存在 ‣ 管理栄養士の資格を持つ料理のプロフェッショナル ‣ コミュニケーションをしつつアノテーションできる •Google Spread Sheet で管理

    ‣ 権限や変更履歴が簡単に可視化できる ‣ 社内のG Suite基盤にそのまま乗っかれる (認証まわり) 20
  21. Redshift S3 Python Queuery ③HTTP リクエスト ④unload文で
 ラップ ⑤並列に結果を転送 ⑥Pythonオブジェクト

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

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

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

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

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

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

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

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

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

    30 学習用データ取得フロー Google Sheets Aurora ①HTTP リクエスト ②MySQLとして接続 ⑦モデル
 アップロード
  31. Queuery •Redshiftに直接繋がずにHTTP APIでクエリ発行できる
 内製ツール ‣ APIでselect文を受け付けてunload文でラップし問い合わせ実行 ‣ 結果をS3に直接かつ並列にunloadする→安全 •queuery-client (Ruby

    / Python) を使用 ‣ クエリ結果を単純に行単位の Enumerable / iterator で扱える 31
  32. デプロイ 32

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

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

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

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

  37. 効率化されたデプロイ •デプロイ先 ‣ クックパッドの共通コンテナ環境を利用 (Hako) •機械学習エンジニア自身でデプロイまで ‣ 必要なファイルをPull Requestベースで追加するだけ •機械学習プロジェクトの共通化

    ‣ 認証,データ置き場,権限など •設定が必要になる項目をなるべく減らす 37
  38. Hako •https://github.com/eagletmt/hako •クックパッド内製 (OSS) のデプロイツール •Amazon ECS上で動作する ‣ Fargate上で動作する •アプリケーションの定義を書くだけでよい

    ‣ jsonnetを書いてhako_apps という中央レポジトリにPull Request ‣ Dockerイメージ,環境変数といったタスク定義 38
  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への
 パラメータ 秘匿値は
 環境変数で
  40. 機械学習プロジェクトの運用方法 •主に日次,週次バッチとして利用 ‣ レシピ,材料,手順の正規化・分類タスクなど •機械学習エンジニアがバッチジョブの設定も行う ‣ 内製バッチジョブシステムを利用 (kuroko2) ‣ Slackへの通知設定は自動で行われる

    •データベースと通信してジョブを実行 ‣ 即時系の機械学習ジョブは動いていない 40
  41. 構成図 41 ECR Jenkins GitHub
 Enterprise Hako (ECS) Redshift S3

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    ‣ dmemoのURLを貼って一言二言伝えるだけで完結 56
  57. Dmemoの使われ方 57

  58. まとめ 58

  59. クックパッドの機械学習サイクル •機械学習エンジニアが最後まで面倒を見る ‣ 社内デプロイフローにうまく乗っかる ‣ マイクロサービス化されているので他に迷惑を
 かけない •改善するのが容易 ‣ 改善や別プロジェクトに使い回せる

    •実際にサービスで使われないと意味がない ‣ きちんとデータベースに投入して,ドキュメントも整備 59
  60. We’re hiring❤ cookpad.jobs 60

  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
  62. 質問と回答 62

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

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

    しています。
 参考: Encoder-Decoder でレシピの材料名を正規化する
 https://techlife.cookpad.com/entry/2017/10/30/080102 64
  65. 質問 Q: スプレッドシートでどれくらいの量のデータを扱っているのでしょう か? アノテーションのタスクの難易度にもよるのですが,だいたい数百件から数 千件のアノテーションをGoogleスプレッドシートベースで依頼することが多 いです。ときには数万件のアノテーションを依頼することもありますが,い きなり大量にアノテーションしてもうまくいかないことが多いです。まずは 数十件くらいのパイロットタスクを解いてもらって,そのあとコミュニケー ションしつつ大規模なアノテーションをこなしてもらう,という形です。


    データの行数が数万件を超えてもかなり安定して動作し,データの追加も容 易であるため重宝しています。 65
  66. 質問 Q: 機械学習エンジニアがデプロイした機能の運用責任はMLエ ンジニア側と基盤側のどちらが持つのでしょうか? 運用責任ももちろんMLエンジニア側 (研究開発部のエンジニア) が持つことになります。クックパッドでは基盤システムの民主化 が進んでいて,基盤チームはツールを提供してくれるだけで,実 際にそれを使って運用するのは常にサービス開発側や研究開発側 の責務ということになっています。基本的には我々の側で運用し

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

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


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

    てもらっています。 69