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

mlops16 勉強会

Trs
February 16, 2022

mlops16 勉強会

Trs

February 16, 2022
Tweet

More Decks by Trs

Other Decks in Technology

Transcript

  1. © ZOZO, Inc. 株式会社ZOZO
 データサイエンス部 ML Opsブロック 平田 拓也 (TrsNium)


    2018年中途入社。MLOpsブロックにて機械学習基盤の開発 を行っている。ラーメンが好き。
 2
  2. © ZOZO, Inc. https://zozo.jp/
 • ファッション通販サイト
 • 1,500以上のショップ、8,400以上のブランドの取り扱い
 • 常時83万点以上の商品アイテム数と毎日平均2,900点以上の新着

    商品 を掲載(2021年9月末時点)
 • ブランド古着のファッションゾーン「ZOZOUSED」や
 コスメ専門モール「ZOZOCOSME」、靴の専門モール
 「ZOZOSHOES」、ラグジュアリー&デザイナーズゾーン
 「ZOZOVILLA」を展開
 • 即日配送サービス
 • ギフトラッピングサービス
 • ツケ払い など
 3
  3. © ZOZO, Inc. https://wear.jp/
 4 • ファッションコーディネートアプリ
 • 1,500万ダウンロード突破、コーディネート投稿総数は1,100万件以上 (2021年9月末時点)


    • ピックアップタグから最新のトレンドをチェック
 • コーディネート着用アイテムを公式サイトで購入可能
 • WEAR公認の人気ユーザーをWEARISTAと認定。モデル・タレント・デザ イナー・インフルエンサーといった各界著名人も参加

  4. © ZOZO, Inc. 監視やCI/CD等の仕組みを共通化できていなかった
 • プラットフォームごとに監視すべきメトリクスが違う
 ◦ CronJobであれば、CrashLoopBackOffになっていないか
 ◦ Digdagであれば、PostgreSQLのキューがはけているか


    ◦ Kubeflow Pipelinesであれば、MySQL上のステートが正しいか
 • 成功可否監視やSLO監視をやろうと思った際にプラットフォームで実装の差異がある
 • デプロイする際の手順が全てのプラットフォームで異なる
 9
  5. © ZOZO, Inc. 完全に手放しで運用できるような状態ではない
 
 • 初期構築が必要
 ◦ Kubernetes, PostgreSQL,

    MySQL
 • どのプラットフォームでも定期的なインフラのメンテナンスが必要
 ◦ Kubernetes Clusterのバージョン
 ◦ Cloud Composerのバージョン
 10
  6. © ZOZO, Inc. 15 パイプラインの開発/運用を効率化するために
 
 
 • Vertex Pipelinesを選定

    
 • 新規/既存のパイプラインをVertex Pipelinesへ移行する
 ◦ テンプレートリポジトリの作成
 ▪ kfpの薄いwrapperライブラリの作成
 ▪ Vertex Pipelinesを監視できるように
 ▪ Cloud Scheduler + Cloud Functionsでスケジューリングできるように
 ▪ CI/CDの整備
 ◦ 便利コンポーネントをまとめたリポジトリの作成
 ▪ CI/CDの整備

  7. © ZOZO, Inc. 16 パイプラインの開発/運用を効率化するために
 
 
 • Vertex Pipelinesを選定

    
 • 新規/既存のパイプラインをVertex Pipelinesへ移行する
 ◦ テンプレートリポジトリの作成
 ▪ kfpの薄いwrapperライブラリの作成
 ▪ Vertex Pipelinesを監視できるように
 ▪ Cloud Scheduler + Cloud Functionsでスケジューリングできるように
 ▪ CI/CDの整備
 ◦ 便利コンポーネントをまとめたリポジトリの作成
 ▪ CI/CDの整備

  8. © ZOZO, Inc. 17 Vertex Pipelinesを選んだ経緯
 
 2020/12 MLの学習からサービングを一括で行える点でKubeflow導入に着手
 •

    kfctl内部で生成しているyamlを元に運用できるようなyamlを形成
 • Kubeflowで利用されているIstioのバージョンが低い問題の解決
 • Kubeflowの不要なコンポーネント削除
 → 詳しくは弊社テックブログの「KubeflowによるMLOps基盤構築から得られた知見と課題」を参照 してください
 2021/05/19 Vertex AIの発表
 • フルマネージドのKubeflow Pipelines
 ◦ インフラは何も管理しなくて良い
 ◦ Kubeflow PipelinesのSDK v2を利用すれば、これまでのパイプラインも移行可能

  9. © ZOZO, Inc. 18 Vertex Pipelinesを選んだ経緯
 
 2020/12 MLの学習からサービングを一括で行える点でKubeflow導入の着手
 •

    kfctl内部で生成しているyamlを元に運用できるようなyamlに形成
 • Kubeflowで利用されているistioのバージョンが低い問題の解決
 • Kubeflowの不要なコンポーネント削除
 → 詳しくは弊社テックブログの「KubeflowによるMLOps基盤構築から得られた知見と課題」を参照し てください
 2021/05/19 Vertex AIの発表
 • フルマネージドのKubeflow Pipelines
 ◦ インフラは何も管理しなくて良い
 ◦ Kubeflow PipelinesのSDK v2を利用すれば、これまでのパイプラインも移行可能
 →めっちゃいいじゃんとなり、Vertex Pipelinesを利用する方針にした

  10. © ZOZO, Inc. 19 パイプラインの開発/運用を効率的にするために
 
 • Vertex Pipelinesを選んだ経緯 


    • 新規/既存のパイプラインをVertex Pipelinesへ移行する
 ◦ テンプレートリポジトリの作成
 ▪ kfpの薄いwrapperライブラリの作成
 ▪ Cloud Scheduler + Cloud Functionsで定期スケジューリングできるように
 ▪ Vertex Pipelinesを監視できるように
 ▪ CI/CDの整備
 ◦ 便利なコンポーネントをまとめたリポジトリの作成
 ▪ CI/CDの整備

  11. © ZOZO, Inc. 21 kfpの薄いwrapperライブラリの作成
 • yamlからパイプラインのセットアップをできるように
 ◦ 認証系の自動設定
 ◦

    バックエンドのGCSの設定
 ◦ パイプライン引数の自動セットアップ
 • CLIをサポートする
 
 • Cloud Scheduler + Cloud Functionsでパイプラインを定期ス ケジューリングできるように
 # pipelines/example/__main__.py from pipeline_lib import BasePipeline from typing import Dict from kfp.v2.dsl import component import yaml @component def echoOp(message: str): print(message) class ExamplePipeline(BasePipeline): def __init__(self, config: Dict): super().__init__(config) def pipeline(self): echoOp("hello world") if __name__ == "__main__": with open('config/environment.yaml', encoding="utf-8") as f: config = yaml.load(f, Loader=yaml.SafeLoader) pipeline = ExamplePipeline(config) pipeline.cli() $ poetry run python pipelines/example run-pipeline --pipeline-name example --env dev $ poetry run python pipelines/example schedule-pipeline --pipeline-name example --env dev
  12. © ZOZO, Inc. 22 Cloud Scheduler + Cloud Functionsでパイプラインを定期スケジューリングできるように
 


    実験やプロダクトの要件的にスケジューリングの機能は必須で欲しい!! • 以前までkfp.v2.google.client.AIPlatformClientでVertex Pipelinesをスケジューリングできていた • kfp バージョン1.8.xよりkfp.v2.googleが削除され、google-cloud-aiplatformを利用する必要がある
 ◦ google-cloud-aiplatformにはVertex Pipelinesをスケジューリングする機能がない
  13. © ZOZO, Inc. 23 Cloud Scheduler + Cloud Functionsでパイプラインを定期スケジューリングできるように
 


    kfp.v2.google.client.AIPlatformClientをもとにスケジューリング機能を再実装した • 以前までkfp.v2.google.client.AIPlatformClientでVertex Pipelinesをスケジューリングできていた • kfp バージョン1.8.xよりkfp.v2.googleが削除され、google-cloud-aiplatformを利用する必要がある
 ◦ google-cloud-aiplatformにはVertex Pipelinesをスケジューリングする機能がない
  14. © ZOZO, Inc. Vertex Pipelines 24 Cloud Scheduler + Cloud

    Functionsでパイプラインを定期スケジューリングできるように
 
 # pipelines/example/__main__.py from pipeline_lib import BasePipeline from typing import Dict from kfp.v2.dsl import component import yaml @component def echoOp(message: str): print(message) class ExamplePipeline(BasePipeline): def __init__(self, config: Dict): super().__init__(config) def pipeline(self): echoOp("hello world") Compile Cloud Storage Cloud Functions Cloud Scheduler 開発者 / GitHub Actions $ poetry run python pipelines/example schedule-pipeline … https
  15. © ZOZO, Inc. 25 Vertex Pipelinesを監視できるように
 
 監視したい項目
 • 実行時間(SLO監視)


    • 成功可否
 kfpを使って得られる情報
 • kfpのexit_handlerによるパイプライン終了情報(成功可否を得ることはできない)
 欲しい情報を何も得ることができない...
  16. © ZOZO, Inc. 26 Vertex Pipelinesを監視できるように
 
 監視したい項目
 • 実行時間(SLO監視)


    • 成功可否
 kfpを使って得られる情報
 • kfpのexit_handlerによるパイプライン終了情報(成功可否を得ることはできない)
 Cloud SchedulerとCloud Functionsでいい感じに
  17. © ZOZO, Inc. 27 Vertex Pipelinesを監視できるように
 
 Cloud Functions Cloud

    Scheduler GitHub Actions https Cloud Scheduler • 監視のスケジューリング • 監視のスケジューリング情報(cron format)をCloud Functionsへ渡す Cloud Functions • Cloud Schedulerのスケジューリング情報をもとに前回の監視がいつ行わ れたかを計算 • 前回の監視からステータスが変わったパイプラインを抽出 • SLOを満たせていないパイプラインを抽出 • Slackへ抽出したパイプライン情報を通知
  18. © ZOZO, Inc. 28 CI/CDの整備
 
 
行っていること
 • Kubeflow Pipelinesのコンポーネントのイメージビルド


    ◦ component.yamlのイメージhashを自動更新しgit commit&push
 • パイプラインの実行(feature branchのみ)
 • パイプラインのスケジューリング
 • モニタリングのセットアップ
 • Release PR等の作成
 ◦ ブランチ間のコンフリクトを避けるためrelease->mainのようなリリース後のPRを作成&自動マージ

  19. © ZOZO, Inc. gcr.io/something-stg/kfp-component1 Container Registry 29 CI/CDの整備(feature branch)
 1.

    Dockerfileを含む componentのイメー ジをdocker build & push gcr.io/something-dev/kfp-component1 Container Registry 2. パイプラインの実 行 PR Merged 4a. パイプラインの監 視をセットアップ 4b. パイプラインのス ケジューリング 5. releaseブランチに 向けPRを作成 3. component.yaml のイメージハッシュを 書き換えmainブラン チにcommit&push
  20. © ZOZO, Inc. PR Merged 30 CI/CDの整備(release branch)
 
 


    gcr.io/something-prd/kfp-component1 Container Registry 3b. パイプラインのス ケジューリング 4. mainブランチに向 けPRを作成&マージ 1. Dockerfileを含む componentのイメー ジをdocker build & push 2. component.yaml のイメージハッシュを 書き換えreleaseブラ ンチにcommit&push 3a. パイプラインの監 視をセットアップ
  21. © ZOZO, Inc. 31 便利コンポーネントをまとめたリポジトリの作成
 
 
 
 目的
 •

    以前に作成したものを再利用できるようにし開発効率を上げるため
 • 一括でコードを管理しメンテナンスコストを下げるため
 GitHub Actions gcr.io/mlops/kfp-component-something Container Registry mlops-components Cloud Storage hoge-project-pipelines fuga-project-pipelines
  22. © ZOZO, Inc. 実験用のパイプラインの整備
 
 34 もっとカジュアルにパイプラインを回せるような環境整備
 ◦ コメントベースでのCI/CDの操作
 ▪

    キャッシュの有効化/無効化
 ▪ 利用する設定を選べるように
 ▪ [WIP]実験のサマリーを出せるように
 
 

  23. © ZOZO, Inc. サービング基盤の構築
 
 
 35 運用負荷を低減できるように
 • プロジェクト(案件)ごとにあるKubernetesクラスタを単一のクラスタで運用する


    • サービスメッシュを導入し、より柔軟なトラフィック制御をできるように
 • Argo CDやSpinnaker等を導入し、モデルやアプリケーションのContinuous Deliveryを強化する