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

Kubeflow Pipelines v2 で変わる機械学習パイプライン開発

Kubeflow Pipelines v2 で変わる機械学習パイプライン開発

第39回 MLOps 勉強会の発表資料です https://mlops.connpass.com/event/312260/

Asei Sugiyama

March 20, 2024
Tweet

More Decks by Asei Sugiyama

Other Decks in Technology

Transcript

  1. 自己紹介 杉山 阿聖 (@K_Ryuichirou) Software Engineer @ Citadel AI Google

    Cloud Innovators Champion @ Cloud AI/ML MLSE 機械学習オペレーション WG 機械学習図鑑 共著 決闘者 @ マスターデュエル
  2. 主旨 KFP SDK v2 がリリースされて推奨されるパイプラインの書き方がだい ぶ変わりました KFP SDK v1 の書き方をしたパイプラインもしばらく使えますが、

    Vertex Pipelines では2024年12月に EOF を迎えます Fun-in といった新しい機能も使えるようになったので、リリースを確認 し、マイグレーションを計画するとよいでしょう
  3. Basics of Kubeflow Pipelines Vertex AI と TFX Vertex Pipelines

    3 つの書き方 Lightweight Python Component Hello, world コンポーネントのつなげかた 複雑なパイプライン
  4. TFX, Kubeflow, Vertex AI 設計思想は同一 TFX は Google の機械学習基盤 Kubeflow

    は TFX の OSS 版 TFX をクラウドサービスとして 提供しているのが Vertex AI MLOps on Vertex AI https://cloud.google.com/vertex-ai/docs/start/introduction- mlops
  5. Vertex Pipelines Vertex AI の機械学習パイプ ラインを実行するためのサ ービス コンテナを立ち上げて、バ ッチ処理し、コンテナを終 了するだけ

    記述には KFP (Kubeflow Pipelines) SDK を用いる MLOps: 機械学習における継続的デリバリーと自動化のパイプライン https://cloud.google.com/architecture/mlops-continuous-delivery-and- automation-pipelines-in-machine-learning
  6. 3 つの書き方 Lightweight Python Components Containerized Python Components Container Components

    第一選択は Lightweight Python Components Kubeflow Pipelines v2 で Pipeline の書き方がかなり変わる件について https://zenn.dev/asei/articles/introduction-to-kfp-v2
  7. Lightweight Python Component 次のような Python の関数を用意 def hello_world(text: str) ->

    str: print(text) return text デコレーターを用いてコンポーネント化 @component(base_image="python:3.9") def hello_world(text: str) -> str: print(text) return text
  8. Hello, world: 全体像 @component(base_image="python:3.9") def hello_world(text: str) -> str: print(text)

    return text @dsl.pipeline( name="intro-pipeline-unique", description="A simple intro pipeline", pipeline_root=PIPELINE_ROOT, ) def pipeline(text: str = "hi there"): hw_task = hello_world(text=text) compiler.Compiler().compile( pipeline_func=pipeline, package_path="intro_pipeline.yaml")
  9. Hello, world: コンポーネントの定義 @component(base_image="python:3.9") def hello_world(text: str) -> str: print(text)

    return text コンポーネントを定義 宣言したコンポーネントはパイプラインのなかで呼ぶ
  10. Hello, world: パイプラインの定義 @dsl.pipeline( name="intro-pipeline-unique", # 名前の指定 description="A simple intro

    pipeline", # 処理内容のコメント pipeline_root="gs://your-ml-bucket", # 結果の保存先 (GCS) ) def pipeline(text: str = "hi there"): # 先程定義したコンポーネント hello_world を呼び出す hw_task = hello_world(text=text) # 返り値は PipelineTask と呼ばれる パイプラインのデコレーターの引数は保存先の指定だけ必要 (あとでも 良い)
  11. Hello, world: パイプラインのコンパイル # コンパイルする compiler.Compiler().compile( pipeline_func=pipeline, package_path="intro_pipeline.yaml" ) Python

    で定義したパイプラインを、Vertex Pipelines にわたすための設 定ファイル (YAML) にコンパイル 生成される intro_pipeline.yaml は pipeline_spec という中間言語 になっている
  12. コンポーネントの繋げ方: パイプラインの定義 @dsl.pipeline( pipeline_root="gs://your-ml-bucket", ) def pipeline(text: str = "hi

    there"): first_task = hello_world(text=text) second_task = hello_world(text=first_task.output) コンポーネントの出力を次のコンポーネントにわたすには、そのまま出 力を渡してあげれば良い
  13. 複雑なパイプライン 実際の構築に当たってはチュー トリアルを見ておくと良い Vertex AI Pipelines: Pipelines introduction for KFP

    Vertex AI Pipelines: Lightweight Python function-based components, and component I/O Vertex AI Pipelines Jupyter notebooks https://cloud.google.com/vertex- ai/docs/pipelines/notebooks
  14. Migration from v1 to v2 Timeline V1 Component YAML support

    Container Op Pythonic artifact syntax Fan-out, Fan-in Containerized Python Components
  15. Timeline Vertex Pipelines における KFP SDK 1.8 のサポートは 2024 年

    12 月 20 日に終了 KFP SDK v2 を用いても v1 と同じ記述はできるもの の、warning が発生する Supported frameworks list | Vertex AI | Google Cloud https://cloud.google.com/vertex-ai/docs/supported-frameworks- list#pipelines
  16. V1 Component YAML support 今までは YAML をコンポー ネントの定義のために書い ていた 既存の

    YAML ファイルは後 方互換性のためサポートさ れる とはいえ移行を考えたほう が良い Migrate from KFP SDK v1 | Kubeflow https://www.kubeflow.org/docs/components/pipelines/v2/migration/
  17. Pythonic artifact syntax (1/2) v2 では通常の Python 関数のように出力を返り値として定義可能 @dsl.component(base_image="python:3.10") def

    id_func(input: int) -> Metrics: from pathlib import Path metric = Metrics( uri=dsl.get_uri(), metadata={'value':input} ) Path(metric.path).write_text(str(input)) return metric
  18. Fan-out, Fan-in (1/4) このようなコンポーネントを用意 @dsl.component(base_image="python:3.10") def id_func(input: int) -> Metrics:

    from pathlib import Path metric = Metrics( uri=dsl.get_uri(), metadata={'value':input} ) Path(metric.path).write_text(str(input)) return metric @dsl.component(base_image="python:3.10") def calc_average(models: list[Metrics]) -> float: return sum([float(model.metadata['value']) for model in models]) / len(models)
  19. Fan-out, Fan-in (2/4) Fan-out のために dsl.ParallelFor を利用 Fan-in のために dsl.Collected

    を利用 @dsl.pipeline def fanin_pipeline(): with dsl.ParallelFor( items=[i for i in range(10)], ) as item: id_func_task = id_func(input=item) calc_average(models=dsl.Collected(id_func_task.output))
  20. Containerized Python Components 今回は時間の都合上割愛 解説を書きました Kubeflow Pipelines v2 で Pipeline

    の書き方がかなり変わる件について https://zenn.dev/asei/articles/introduction-to-kfp-v2
  21. Resource Migrate from KFP SDK v1 は必読 LayerX のブログ記事がかな り実践的

    Vertex AI Pipelinesを用いて爆速ML開発の仕組みを構築する #LayerXテックア ドカレ - LayerX エンジニアブログ https://tech.layerx.co.jp/entry/2023/11/16/185944
  22. まとめ KFP SDK v2 がリリースされて推奨されるパイプラインの書き方がだい ぶ変わりました KFP SDK v1 の書き方をしたパイプラインもしばらく使えますが、

    Vertex Pipelines では2024年12月に EOF を迎えます Fun-in といった新しい機能も使えるようになったので、リリースを確認 し、マイグレーションを計画するとよいでしょう