Slide 1

Slide 1 text

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

Slide 2

Slide 2 text

自己紹介 杉山 阿聖 (@K_Ryuichirou) Software Engineer @ Citadel AI Google Cloud Innovators Champion @ Cloud AI/ML MLSE 機械学習オペレーション WG 機械学習図鑑 共著 決闘者 @ マスターデュエル

Slide 3

Slide 3 text

主旨 KFP SDK v2 がリリースされて推奨されるパイプラインの書き方がだい ぶ変わりました KFP SDK v1 の書き方をしたパイプラインもしばらく使えますが、 Vertex Pipelines では2024年12月に EOF を迎えます Fun-in といった新しい機能も使えるようになったので、リリースを確認 し、マイグレーションを計画するとよいでしょう

Slide 4

Slide 4 text

TOC Basics of Kubeflow Pipelines <- Migration from v1 to v2

Slide 5

Slide 5 text

Basics of Kubeflow Pipelines Vertex AI と TFX Vertex Pipelines 3 つの書き方 Lightweight Python Component Hello, world コンポーネントのつなげかた 複雑なパイプライン

Slide 6

Slide 6 text

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

Slide 7

Slide 7 text

Vertex Pipelines Vertex AI の機械学習パイプ ラインを実行するためのサ ービス コンテナを立ち上げて、バ ッチ処理し、コンテナを終 了するだけ 記述には KFP (Kubeflow Pipelines) SDK を用いる MLOps: 機械学習における継続的デリバリーと自動化のパイプライン https://cloud.google.com/architecture/mlops-continuous-delivery-and- automation-pipelines-in-machine-learning

Slide 8

Slide 8 text

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

Slide 9

Slide 9 text

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

Slide 10

Slide 10 text

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")

Slide 11

Slide 11 text

Hello, world: コンポーネントの定義 @component(base_image="python:3.9") def hello_world(text: str) -> str: print(text) return text コンポーネントを定義 宣言したコンポーネントはパイプラインのなかで呼ぶ

Slide 12

Slide 12 text

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 と呼ばれる パイプラインのデコレーターの引数は保存先の指定だけ必要 (あとでも 良い)

Slide 13

Slide 13 text

Hello, world: パイプラインのコンパイル # コンパイルする compiler.Compiler().compile( pipeline_func=pipeline, package_path="intro_pipeline.yaml" ) Python で定義したパイプラインを、Vertex Pipelines にわたすための設 定ファイル (YAML) にコンパイル 生成される intro_pipeline.yaml は pipeline_spec という中間言語 になっている

Slide 14

Slide 14 text

Hello, world: パイプ ラインの実行 YAML ファイルを アップロード パイプラインの名 前や、実行結果の 保存先を指定

Slide 15

Slide 15 text

Hello, world: 結果 作成したパイプラ インを表示 コンポーネントご とに入出力が表示 される (右下)

Slide 16

Slide 16 text

コンポーネントの繋げ方: パイプラインの定義 @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) コンポーネントの出力を次のコンポーネントにわたすには、そのまま出 力を渡してあげれば良い

Slide 17

Slide 17 text

コンポーネントの繋 げ方: 実行結果 実行順から依存関 係が解析され、パ イプラインが定義 される 条件分岐や fun- out, fun-in も可能

Slide 18

Slide 18 text

複雑なパイプライン 実際の構築に当たってはチュー トリアルを見ておくと良い 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

Slide 19

Slide 19 text

TOC Basics of Kubeflow Pipelines Migration from v1 to v2 <-

Slide 20

Slide 20 text

Migration from v1 to v2 Timeline V1 Component YAML support Container Op Pythonic artifact syntax Fan-out, Fan-in Containerized Python Components

Slide 21

Slide 21 text

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

Slide 22

Slide 22 text

V1 Component YAML support 今までは YAML をコンポー ネントの定義のために書い ていた 既存の YAML ファイルは後 方互換性のためサポートさ れる とはいえ移行を考えたほう が良い Migrate from KFP SDK v1 | Kubeflow https://www.kubeflow.org/docs/components/pipelines/v2/migration/

Slide 23

Slide 23 text

Container Op docker run のような記述ができるコンポーネント Container Components | Kubeflow https://www.kubeflow.org/docs/components/pipelines/v2/components/container-components/

Slide 24

Slide 24 text

Pythonic artifact syntax (1/2) これまでは入出力を関数の引数として定義する必要があった @dsl.component(base_image="python:3.10") def id_func(input: Input[int], metric: Output[Metrics]): Path(metric.path).write_text(str(input)) return metric

Slide 25

Slide 25 text

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

Slide 26

Slide 26 text

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)

Slide 27

Slide 27 text

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))

Slide 28

Slide 28 text

Fan-out, Fan-in (3/4) コンポーネントには Artifact の list が渡される @dsl.component(base_image="python:3.10") def calc_average(models: list[Metrics]) -> float: # 略

Slide 29

Slide 29 text

Fan-out, Fan-in (4/4) パイプラインの実行結果は右の ようになる

Slide 30

Slide 30 text

Containerized Python Components 今回は時間の都合上割愛 解説を書きました Kubeflow Pipelines v2 で Pipeline の書き方がかなり変わる件について https://zenn.dev/asei/articles/introduction-to-kfp-v2

Slide 31

Slide 31 text

Resource Migrate from KFP SDK v1 は必読 LayerX のブログ記事がかな り実践的 Vertex AI Pipelinesを用いて爆速ML開発の仕組みを構築する #LayerXテックア ドカレ - LayerX エンジニアブログ https://tech.layerx.co.jp/entry/2023/11/16/185944

Slide 32

Slide 32 text

まとめ KFP SDK v2 がリリースされて推奨されるパイプラインの書き方がだい ぶ変わりました KFP SDK v1 の書き方をしたパイプラインもしばらく使えますが、 Vertex Pipelines では2024年12月に EOF を迎えます Fun-in といった新しい機能も使えるようになったので、リリースを確認 し、マイグレーションを計画するとよいでしょう