Slide 1

Slide 1 text

Vertex Pipelinesなどを用いた開発/運用の効率化
 株式会社ZOZO
 データサイエンス部 ML Opsブロック
 平田 拓也 Copyright © ZOZO, Inc.

Slide 2

Slide 2 text

© ZOZO, Inc. 株式会社ZOZO
 データサイエンス部 ML Opsブロック 平田 拓也 (TrsNium)
 2018年中途入社。MLOpsブロックにて機械学習基盤の開発 を行っている。ラーメンが好き。
 2

Slide 3

Slide 3 text

© ZOZO, Inc. https://zozo.jp/
 ● ファッション通販サイト
 ● 1,500以上のショップ、8,400以上のブランドの取り扱い
 ● 常時83万点以上の商品アイテム数と毎日平均2,900点以上の新着 商品 を掲載(2021年9月末時点)
 ● ブランド古着のファッションゾーン「ZOZOUSED」や
 コスメ専門モール「ZOZOCOSME」、靴の専門モール
 「ZOZOSHOES」、ラグジュアリー&デザイナーズゾーン
 「ZOZOVILLA」を展開
 ● 即日配送サービス
 ● ギフトラッピングサービス
 ● ツケ払い など
 3

Slide 4

Slide 4 text

© ZOZO, Inc. https://wear.jp/
 4 ● ファッションコーディネートアプリ
 ● 1,500万ダウンロード突破、コーディネート投稿総数は1,100万件以上 (2021年9月末時点)
 ● ピックアップタグから最新のトレンドをチェック
 ● コーディネート着用アイテムを公式サイトで購入可能
 ● WEAR公認の人気ユーザーをWEARISTAと認定。モデル・タレント・デザ イナー・インフルエンサーといった各界著名人も参加


Slide 5

Slide 5 text

© ZOZO, Inc. 本日のアジェンダ
 ● これまでの機械学習基盤のパイプラインにおける問題点
 ● パイプラインの開発/運用を効率化するために
 ● 今後の展望
 ● まとめ
 5

Slide 6

Slide 6 text

© ZOZO, Inc. 本日のアジェンダ
 ● これまでの機械学習基盤のパイプラインにおける問題点
 ● パイプラインの開発/運用を効率化するために
 ● 今後の展望
 ● まとめ
 6

Slide 7

Slide 7 text

© ZOZO, Inc. これまでの機械学習基盤のパイプラインにおける問題点
 
 
 ● 様々なプラットフォームでパイプラインが動いていた
 ○ 監視やCI/CDの共通化が行われていなかった
 ○ 完全に手放しで運用できるような状態ではなかった
 ○ 開発に利用した便利スクリプトを使い回しづらい
 7

Slide 8

Slide 8 text

© ZOZO, Inc. 様々なプラットフォームでパイプラインが動いていた
 例えば....
 ● Cloud Composer
 ● Kubernetes CronJob
 ● Digdag on GKE
 ● Kubeflow Pipelines on GKE
 
 8

Slide 9

Slide 9 text

© ZOZO, Inc. 監視やCI/CD等の仕組みを共通化できていなかった
 ● プラットフォームごとに監視すべきメトリクスが違う
 ○ CronJobであれば、CrashLoopBackOffになっていないか
 ○ Digdagであれば、PostgreSQLのキューがはけているか
 ○ Kubeflow Pipelinesであれば、MySQL上のステートが正しいか
 ● 成功可否監視やSLO監視をやろうと思った際にプラットフォームで実装の差異がある
 ● デプロイする際の手順が全てのプラットフォームで異なる
 9

Slide 10

Slide 10 text

© ZOZO, Inc. 完全に手放しで運用できるような状態ではない
 
 ● 初期構築が必要
 ○ Kubernetes, PostgreSQL, MySQL
 ● どのプラットフォームでも定期的なインフラのメンテナンスが必要
 ○ Kubernetes Clusterのバージョン
 ○ Cloud Composerのバージョン
 10

Slide 11

Slide 11 text

© ZOZO, Inc. 開発に利用したスクリプトを使い回しづらい
 
 
● 他のプロジェクトで作成したスクリプトを流用したい時、コピー&ペースト以外方法がない
 ○ コピー&ペーストされたコードはメンテナンスされづらい傾向
 ○ 問題が発生した際に一括でコードを修正する必要がある
 11

Slide 12

Slide 12 text

© ZOZO, Inc. これまでの機械学習基盤のパイプラインにおける問題点
 開発者目線
 ● パイプラインを記述するために、それぞれのプラットフォームに関する学習が必要
 ● 他のプラットフォームで得たノウハウを流用しづらい
 ● 他のパイプラインで作った便利スクリプトを流用できない場合がある
 
 12 開発効率が落ちがち


Slide 13

Slide 13 text

© ZOZO, Inc. これまでの機械学習基盤のパイプラインにおける問題点
 運用者目線
 ● それぞれのプラットフォームに目を配らせてメンテナンスするのは大変
 ● プラットフォームごとにCI/CDや監視の仕組みが異なるためセットアップが手間
 13 複数のプラットフォームをメンテナンスするコストは無視できない
 仕組みを流用しづらいため運用コストが大きい


Slide 14

Slide 14 text

© ZOZO, Inc. 本日のアジェンダ
 ● これまでの機械学習基盤のパイプラインにおける問題点
 ● パイプラインの開発/運用を効率的にするために
 ● 今後の展望
 ● まとめ
 14

Slide 15

Slide 15 text

© ZOZO, Inc. 15 パイプラインの開発/運用を効率化するために
 
 
 ● Vertex Pipelinesを選定 
 ● 新規/既存のパイプラインをVertex Pipelinesへ移行する
 ○ テンプレートリポジトリの作成
 ■ kfpの薄いwrapperライブラリの作成
 ■ Vertex Pipelinesを監視できるように
 ■ Cloud Scheduler + Cloud Functionsでスケジューリングできるように
 ■ CI/CDの整備
 ○ 便利コンポーネントをまとめたリポジトリの作成
 ■ CI/CDの整備


Slide 16

Slide 16 text

© ZOZO, Inc. 16 パイプラインの開発/運用を効率化するために
 
 
 ● Vertex Pipelinesを選定 
 ● 新規/既存のパイプラインをVertex Pipelinesへ移行する
 ○ テンプレートリポジトリの作成
 ■ kfpの薄いwrapperライブラリの作成
 ■ Vertex Pipelinesを監視できるように
 ■ Cloud Scheduler + Cloud Functionsでスケジューリングできるように
 ■ CI/CDの整備
 ○ 便利コンポーネントをまとめたリポジトリの作成
 ■ CI/CDの整備


Slide 17

Slide 17 text

© 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を利用すれば、これまでのパイプラインも移行可能


Slide 18

Slide 18 text

© 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を利用する方針にした


Slide 19

Slide 19 text

© ZOZO, Inc. 19 パイプラインの開発/運用を効率的にするために
 
 ● Vertex Pipelinesを選んだ経緯 
 ● 新規/既存のパイプラインをVertex Pipelinesへ移行する
 ○ テンプレートリポジトリの作成
 ■ kfpの薄いwrapperライブラリの作成
 ■ Cloud Scheduler + Cloud Functionsで定期スケジューリングできるように
 ■ Vertex Pipelinesを監視できるように
 ■ CI/CDの整備
 ○ 便利なコンポーネントをまとめたリポジトリの作成
 ■ CI/CDの整備


Slide 20

Slide 20 text

© ZOZO, Inc. 20 テンプレートリポジトリの作成
 テンプレートリポジトリとは...?
 GitHubの機能の一部で、既存のリポジトリをテンプレートとして新規リポジトリを作成することができる
 このテンプレートリポジトリにパイプラインを動かすために必要な機能を全て入れる

Slide 21

Slide 21 text

© 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

Slide 22

Slide 22 text

© 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をスケジューリングする機能がない

Slide 23

Slide 23 text

© 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をスケジューリングする機能がない

Slide 24

Slide 24 text

© 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

Slide 25

Slide 25 text

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

Slide 26

Slide 26 text

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

Slide 27

Slide 27 text

© ZOZO, Inc. 27 Vertex Pipelinesを監視できるように
 
 Cloud Functions Cloud Scheduler GitHub Actions https Cloud Scheduler ● 監視のスケジューリング ● 監視のスケジューリング情報(cron format)をCloud Functionsへ渡す Cloud Functions ● Cloud Schedulerのスケジューリング情報をもとに前回の監視がいつ行わ れたかを計算 ● 前回の監視からステータスが変わったパイプラインを抽出 ● SLOを満たせていないパイプラインを抽出 ● Slackへ抽出したパイプライン情報を通知

Slide 28

Slide 28 text

© ZOZO, Inc. 28 CI/CDの整備
 
 
行っていること
 ● Kubeflow Pipelinesのコンポーネントのイメージビルド
 ○ component.yamlのイメージhashを自動更新しgit commit&push
 ● パイプラインの実行(feature branchのみ)
 ● パイプラインのスケジューリング
 ● モニタリングのセットアップ
 ● Release PR等の作成
 ○ ブランチ間のコンフリクトを避けるためrelease->mainのようなリリース後のPRを作成&自動マージ


Slide 29

Slide 29 text

© 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

Slide 30

Slide 30 text

© 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. パイプラインの監 視をセットアップ

Slide 31

Slide 31 text

© ZOZO, Inc. 31 便利コンポーネントをまとめたリポジトリの作成
 
 
 
 目的
 ● 以前に作成したものを再利用できるようにし開発効率を上げるため
 ● 一括でコードを管理しメンテナンスコストを下げるため
 GitHub Actions gcr.io/mlops/kfp-component-something Container Registry mlops-components Cloud Storage hoge-project-pipelines fuga-project-pipelines

Slide 32

Slide 32 text

© ZOZO, Inc. 本日のアジェンダ
 ● これまでの機械学習基盤のパイプラインにおける問題点
 ● パイプラインの開発/運用を効率的にするために
 ● 今後の展望
 ● まとめ
 32

Slide 33

Slide 33 text

© ZOZO, Inc. 今後の展望
 ● 実験用のパイプラインの整備
 ● サービング基盤の構築
 33

Slide 34

Slide 34 text

© ZOZO, Inc. 実験用のパイプラインの整備
 
 34 もっとカジュアルにパイプラインを回せるような環境整備
 ○ コメントベースでのCI/CDの操作
 ■ キャッシュの有効化/無効化
 ■ 利用する設定を選べるように
 ■ [WIP]実験のサマリーを出せるように
 
 


Slide 35

Slide 35 text

© ZOZO, Inc. サービング基盤の構築
 
 
 35 運用負荷を低減できるように
 ● プロジェクト(案件)ごとにあるKubernetesクラスタを単一のクラスタで運用する
 ● サービスメッシュを導入し、より柔軟なトラフィック制御をできるように
 ● Argo CDやSpinnaker等を導入し、モデルやアプリケーションのContinuous Deliveryを強化する


Slide 36

Slide 36 text

© ZOZO, Inc. 本日のアジェンダ
 ● これまでの機械学習基盤のパイプラインにおける問題点
 ● パイプラインの開発/運用を効率的にするために
 ● 今後の展望
 ● まとめ
 36

Slide 37

Slide 37 text

© ZOZO, Inc. まとめ
 ● Vertex Pipelinesを利用しインフラの運用コストを無くした
 ● テンプレートリポジトリを作成し開発を効率化
 ● 共通コンポーネントをまとめたリポジトリを作成し再利用可能な環境を整備した
 37

Slide 38

Slide 38 text

No content