ํŒŒ์ดํ”„๋ผ์ธ ํ…œํ”Œ๋ฆฟ ์ƒ์„ฑ, ์—…๋กœ๋“œ, ์‚ฌ์šฉ

ํŒŒ์ดํ”„๋ผ์ธ ํ…œํ”Œ๋ฆฟ์€ ์›Œํฌํ”Œ๋กœ ์ •์˜๋ฅผ ๊ฒŒ์‹œํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•˜๋Š” ๋ฆฌ์†Œ์Šค๋กœ์„œ ๋‹จ์ผ ์‚ฌ์šฉ์ž ๋˜๋Š” ์—ฌ๋Ÿฌ ์‚ฌ์šฉ์ž๊ฐ€ ์—ฌ๋Ÿฌ ๋ฒˆ ์žฌ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ฆฌ์†Œ์Šค์ž…๋‹ˆ๋‹ค.

Kubeflow Pipelines SDK ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ ํด๋ผ์ด์–ธํŠธ๋Š” Artifact Registry์™€ ๊ฐ™์ด ํ˜ธํ™˜๋˜๋Š” ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ ์„œ๋ฒ„์—์„œ Kubeflow Pipelines(KFP) ํ…œํ”Œ๋ฆฟ์˜ ๋ฒ„์ „ ์ œ์–ด์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์ƒˆ ํด๋ผ์ด์–ธํŠธ ์ธํ„ฐํŽ˜์ด์Šค์ž…๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ Kubeflow Pipelines SDK ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ ํด๋ผ์ด์–ธํŠธ์—์„œ ํ…œํ”Œ๋ฆฟ ์‚ฌ์šฉ์„ ์ฐธ์กฐํ•˜์„ธ์š”.

์ด ํŽ˜์ด์ง€์—์„œ๋Š” ๋‹ค์Œ ๋ฐฉ๋ฒ•์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

  • KFP ํŒŒ์ดํ”„๋ผ์ธ ํ…œํ”Œ๋ฆฟ ์ƒ์„ฑ
  • Kubeflow Pipelines SDK ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ ํด๋ผ์ด์–ธํŠธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํŒŒ์ดํ”„๋ผ์ธ ํ…œํ”Œ๋ฆฟ ์ €์žฅ์†Œ์— ํ…œํ”Œ๋ฆฟ ์—…๋กœ๋“œ
  • Kubeflow Pipelines ํด๋ผ์ด์–ธํŠธ์—์„œ ํ…œํ”Œ๋ฆฟ ์‚ฌ์šฉ

์‹œ์ž‘ํ•˜๊ธฐ ์ „์—

ํŒŒ์ดํ”„๋ผ์ธ์„ ๋นŒ๋“œํ•˜๊ณ  ์‹คํ–‰ํ•˜๊ธฐ ์ „์— ๋‹ค์Œ ์•ˆ๋‚ด์— ๋”ฐ๋ผ Google Cloud ์ฝ˜์†”์—์„œ Google Cloud ํ”„๋กœ์ ํŠธ ๋ฐ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์„ ์„ค์ •ํ•˜์„ธ์š”.

  1. Kubeflow Pipelines SDK v2 ์ด์ƒ์„ ์„ค์น˜ํ•ฉ๋‹ˆ๋‹ค.

    pip install --upgrade kfp>=2,<3
    
  1. Vertex AI SDK for Python v1.15.0 ์ด์ƒ์„ ์„ค์น˜ํ•ฉ๋‹ˆ๋‹ค.
    (์„ ํƒ์‚ฌํ•ญ) ์„ค์น˜ํ•˜๊ธฐ ์ „์— ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•˜์—ฌ ํ˜„์žฌ ์„ค์น˜๋œ Python์šฉ Vertex AI SDK ๋ฒ„์ „์„ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

      pip freeze | grep google-cloud-aiplatform
    
  2. (์„ ํƒ์‚ฌํ•ญ) Google Cloud CLI 390.0.0 ์ด์ƒ์„ ์„ค์น˜ํ•ฉ๋‹ˆ๋‹ค.

  3. Artifact Registry API๋ฅผ ์‚ฌ์šฉ ์„ค์ •ํ•˜์„ธ์š”.

๊ถŒํ•œ ๊ตฌ์„ฑ

Vertex AI Pipelines๋ฅผ ์œ„ํ•œ gcloud CLI ํ”„๋กœ์ ํŠธ๋ฅผ ์•„์ง ์„ค์ •ํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ Vertex AI Pipelines์šฉ Google Cloud ํ”„๋กœ์ ํŠธ ๊ตฌ์„ฑ์˜ ์•ˆ๋‚ด๋ฅผ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค.

๋˜ํ•œ Artifact Registry๋ฅผ ํ…œํ”Œ๋ฆฟ ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ๋กœ ์‚ฌ์šฉํ•˜๋„๋ก ๋‹ค์Œ ์‚ฌ์ „ ์ •์˜๋œ Identity and Access Management ๊ถŒํ•œ์„ ํ• ๋‹นํ•ฉ๋‹ˆ๋‹ค.

  • roles/artifactregistry.admin: ์ €์žฅ์†Œ๋ฅผ ๋งŒ๋“ค๊ณ  ๊ด€๋ฆฌํ•˜๋ ค๋ฉด ์ด ์—ญํ• ์„ ํ• ๋‹นํ•ฉ๋‹ˆ๋‹ค.
  • roles/artifactregistry.repoAdmin ๋˜๋Š” roles/artifactregistry.writer: ์ €์žฅ์†Œ ๋‚ด์—์„œ ํ…œํ”Œ๋ฆฟ์„ ๊ด€๋ฆฌํ•˜๋ ค๋ฉด ์ด๋Ÿฌํ•œ ์—ญํ• ์„ ํ• ๋‹นํ•ฉ๋‹ˆ๋‹ค.
  • roles/artifactregistry.reader: ์ €์žฅ์†Œ์—์„œ ํ…œํ”Œ๋ฆฟ์„ ๋‹ค์šด๋กœ๋“œํ•˜๋ ค๋ฉด ์ด ์—ญํ• ์„ ํ• ๋‹นํ•ฉ๋‹ˆ๋‹ค.
  • roles/artifactregistry.reader: ํ…œํ”Œ๋ฆฟ์—์„œ ํŒŒ์ดํ”„๋ผ์ธ ์‹คํ–‰์„ ๋งŒ๋“ค๋ ค๋ฉด Vertex AI Pipelines์™€ ์—ฐ๊ด€๋œ ์„œ๋น„์Šค ๊ณ„์ •์— ์ด ์—ญํ• ์„ ํ• ๋‹นํ•ฉ๋‹ˆ๋‹ค.

Artifact Registry์˜ ์‚ฌ์ „ ์ •์˜๋œ Identity and Access Management ์—ญํ• ์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ ์‚ฌ์ „ ์ •์˜๋œ Artifact Registry ์—ญํ• ์„ ์ฐธ์กฐํ•˜์„ธ์š”.

๋‹ค์Œ ์ƒ˜ํ”Œ์„ ์‚ฌ์šฉํ•˜์—ฌ ์—ญํ• ์„ ํ• ๋‹นํ•ฉ๋‹ˆ๋‹ค.

gcloud projects add-iam-policy-binding PROJECT_ID \
    --member=PRINCIPAL \
    --role=ROLE

๋‹ค์Œ์„ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค.

  • PROJECT_ID: ํŒŒ์ดํ”„๋ผ์ธ์„ ๋งŒ๋“ค ํ”„๋กœ์ ํŠธ์ž…๋‹ˆ๋‹ค.
  • PRINCIPAL: ๊ถŒํ•œ์„ ์ถ”๊ฐ€ํ•  ์ฃผ ๊ตฌ์„ฑ์›์ž…๋‹ˆ๋‹ค.
  • ROLE: ์ฃผ ๊ตฌ์„ฑ์›์—๊ฒŒ ๋ถ€์—ฌํ•˜๋ ค๋Š” Identity and Access Management ์—ญํ• ์ž…๋‹ˆ๋‹ค.

์ž์„ธํ•œ ๋‚ด์šฉ์€ Artifact Registry ๋ฌธ์„œ์—์„œ ์—ญํ•  ๋ฐ ๊ถŒํ•œ์„ ์ฐธ์กฐํ•˜์„ธ์š”.

Artifact Registry์—์„œ ์ €์žฅ์†Œ ๋งŒ๋“ค๊ธฐ

๋‹ค์Œ์œผ๋กœ Artifact Registry์— ํŒŒ์ดํ”„๋ผ์ธ ํ…œํ”Œ๋ฆฟ์„ ์œ„ํ•œ ์ €์žฅ์†Œ๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

์ฝ˜์†”

  1. Google Cloud ์ฝ˜์†”์—์„œ Vertex AI Pipelines๋ฅผ ์—ฝ๋‹ˆ๋‹ค.

    Vertex AI Pipelines๋กœ ์ด๋™

  2. ๋‚ด ํ…œํ”Œ๋ฆฟ ํƒญ์„ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.

  3. ์ €์žฅ์†Œ ์„ ํƒ ์ฐฝ์„ ์—ด๋ ค๋ฉด ์ €์žฅ์†Œ ์„ ํƒ์„ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.

  4. ์ €์žฅ์†Œ ๋งŒ๋“ค๊ธฐ๋ฅผ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.

  5. quickstart-kfp-repo๋ฅผ ์ €์žฅ์†Œ ์ด๋ฆ„์œผ๋กœ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.

  6. ํ˜•์‹์—์„œ Kubeflow Pipelines๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.

  7. ์œ„์น˜ ์œ ํ˜•์—์„œ ๋ฆฌ์ „์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.

  8. ๋ฆฌ์ „ ๋“œ๋กญ๋‹ค์šด ๋ชฉ๋ก์—์„œ us-central1์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.

  9. ๋งŒ๋“ค๊ธฐ๋ฅผ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.

Google Cloud CLI

๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•˜์—ฌ ์ €์žฅ์†Œ๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

์•„๋ž˜์˜ ๋ช…๋ น์–ด ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์ „์— ๋‹ค์Œ์„ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค.

  • LOCATION: ์ €์žฅ์†Œ๋ฅผ ๋งŒ๋“ค๋ ค๋Š” ์œ„์น˜๋‚˜ ๋ฆฌ์ „์ž…๋‹ˆ๋‹ค(์˜ˆ: us-central1).

gcloud artifacts repositories create ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

Linux, macOS ๋˜๋Š” Cloud Shell

gcloud artifacts repositories create quickstart-kfp-repo --location=LOCATION_ID --repository-format=KFP

Windows(PowerShell)

gcloud artifacts repositories create quickstart-kfp-repo --location=LOCATION_ID --repository-format=KFP

Windows(cmd.exe)

gcloud artifacts repositories create quickstart-kfp-repo --location=LOCATION_ID --repository-format=KFP
 

ํ…œํ”Œ๋ฆฟ ๋งŒ๋“ค๊ธฐ

๋‹ค์Œ ์ฝ”๋“œ ์ƒ˜ํ”Œ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋‹จ์ผ ๊ตฌ์„ฑ์š”์†Œ๋กœ ํŒŒ์ดํ”„๋ผ์ธ์„ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค. KFP๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํŒŒ์ดํ”„๋ผ์ธ์„ ์ •์˜ํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ํŒŒ์ดํ”„๋ผ์ธ ๋นŒ๋“œ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

from kfp import dsl
from kfp import compiler

@dsl.component()
def hello_world(text: str) -> str:
    print(text)
    return text

@dsl.pipeline(name='hello-world', description='A simple intro pipeline')
def pipeline_hello_world(text: str = 'hi there'):
    """Pipeline that passes small pipeline parameter string to consumer op."""

    consume_task = hello_world(
        text=text)  # Passing pipeline parameter as argument to consumer op

compiler.Compiler().compile(
    pipeline_func=pipeline_hello_world,
    package_path='hello_world_pipeline.yaml')

์ƒ˜ํ”Œ์„ ์‹คํ–‰ํ•˜๋ฉด compiler.Compiler().compile(...) ๋ฌธ์—์„œ 'hello-world' ํŒŒ์ดํ”„๋ผ์ธ์„ hello_world_pipeline.yaml ๋กœ์ปฌ YAML ํŒŒ์ผ๋กœ ์ปดํŒŒ์ผ์ž…๋‹ˆ๋‹ค.

ํ…œํ”Œ๋ฆฟ ์—…๋กœ๋“œ

์ฝ˜์†”

  1. Google Cloud ์ฝ˜์†”์—์„œ Vertex AI Pipelines๋ฅผ ์—ฝ๋‹ˆ๋‹ค.

    Vertex AI Pipelines๋กœ ์ด๋™

  2. ์—…๋กœ๋“œ๋ฅผ ํด๋ฆญํ•˜์—ฌ ํŒŒ์ดํ”„๋ผ์ธ ๋˜๋Š” ๊ตฌ์„ฑ์š”์†Œ ์—…๋กœ๋“œ ์ฐฝ์„ ์—ฝ๋‹ˆ๋‹ค.

  3. ์ €์žฅ์†Œ ๋“œ๋กญ๋‹ค์šด ๋ชฉ๋ก์—์„œ quickstart-kfp-repo ์ €์žฅ์†Œ๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.

  4. ํŒŒ์ดํ”„๋ผ์ธ ํ…œํ”Œ๋ฆฟ์˜ ์ด๋ฆ„์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.

  5. ํŒŒ์ผ ํ•„๋“œ์—์„œ ์„ ํƒ์„ ํด๋ฆญํ•˜์—ฌ ๋กœ์ปฌ ํŒŒ์ผ ์‹œ์Šคํ…œ์—์„œ ์ปดํŒŒ์ผ๋œ ํŒŒ์ดํ”„๋ผ์ธ ํ…œํ”Œ๋ฆฟ YAML์„ ์„ ํƒํ•˜๊ณ  ์—…๋กœ๋“œํ•ฉ๋‹ˆ๋‹ค.

  6. ํŒŒ์ดํ”„๋ผ์ธ ํ…œํ”Œ๋ฆฟ์„ ์—…๋กœ๋“œํ•˜๋ฉด ํŒŒ์ดํ”„๋ผ์ธ ํ…œํ”Œ๋ฆฟ์ด ๋‚ด ํ…œํ”Œ๋ฆฟ ํŽ˜์ด์ง€์— ๋‚˜์—ด๋ฉ๋‹ˆ๋‹ค.

    ๋‚ด ํ…œํ”Œ๋ฆฟ์œผ๋กœ ์ด๋™

Kubeflow Pipelines SDK ํด๋ผ์ด์–ธํŠธ

  1. Kubeflow Pipelines SDK ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ ํด๋ผ์ด์–ธํŠธ๋ฅผ ๊ตฌ์„ฑํ•˜๋ ค๋ฉด ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

    from kfp.registry import RegistryClient
    
    client = RegistryClient(host=f"https://us-central1-kfp.pkg.dev/PROJECT_ID/quickstart-kfp-repo")
    
  2. ์ปดํŒŒ์ผ๋œ YAML ํŒŒ์ผ์„ Artifact Registry์˜ ์ €์žฅ์†Œ์— ์—…๋กœ๋“œํ•ฉ๋‹ˆ๋‹ค.

    templateName, versionName = client.upload_pipeline(
      file_name="hello_world_pipeline.yaml",
      tags=["v1", "latest"],
      extra_headers={"description":"This is an example pipeline template."})
    
  3. ํ…œํ”Œ๋ฆฟ์ด ์—…๋กœ๋“œ๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•˜๋ ค๋ฉด ๋‹ค์Œ ๋‹จ๊ณ„๋ฅผ ๋”ฐ๋ฅด์„ธ์š”.

    1. Google Cloud ์ฝ˜์†”์—์„œ Vertex AI Pipelines๋ฅผ ์—ฝ๋‹ˆ๋‹ค.

      Vertex AI Pipelines๋กœ ์ด๋™

    2. ๋‚ด ํ…œํ”Œ๋ฆฟ ํƒญ์„ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.

    3. ์ €์žฅ์†Œ ์„ ํƒ์„ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.

    4. ๋ชฉ๋ก์—์„œ quickstart-kfp-repo ์ €์žฅ์†Œ๋ฅผ ์„ ํƒํ•œ ํ›„ ์„ ํƒ์„ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.

    5. ๋ชฉ๋ก์—์„œ ์—…๋กœ๋“œ๋œ ํ…œํ”Œ๋ฆฟ ํŒจํ‚ค์ง€ hello-world๋ฅผ ์ฐพ์Šต๋‹ˆ๋‹ค.

    6. ํŒŒ์ดํ”„๋ผ์ธ ํ…œํ”Œ๋ฆฟ ๋ฒ„์ „ ๋ชฉ๋ก์„ ๋ณด๋ ค๋ฉด hello-world ํ…œํ”Œ๋ฆฟ์„ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.

    7. ํŒŒ์ดํ”„๋ผ์ธ ํ† ํด๋กœ์ง€๋ฅผ ๋ณด๋ ค๋ฉด ๋ฒ„์ „์„ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.

Vertex AI์—์„œ ํ…œํ”Œ๋ฆฟ ์‚ฌ์šฉํ•˜๊ธฐ

Artifact Registry์˜ ์ €์žฅ์†Œ์— ํŒŒ์ดํ”„๋ผ์ธ ํ…œํ”Œ๋ฆฟ์„ ์—…๋กœ๋“œํ•˜๋ฉด Vertex AI Pipelines์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ…œํ”Œ๋ฆฟ์˜ ์Šคํ…Œ์ด์ง• ๋ฒ„ํ‚ท ๋งŒ๋“ค๊ธฐ

ํŒŒ์ดํ”„๋ผ์ธ ํ…œํ”Œ๋ฆฟ์„ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ๋จผ์ € ํŒŒ์ดํ”„๋ผ์ธ ์‹คํ–‰์„ ์Šคํ…Œ์ด์ง•ํ•  Cloud Storage ๋ฒ„ํ‚ท์„ ๋งŒ๋“ค์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋ฒ„ํ‚ท์„ ๋งŒ๋“ค๋ ค๋ฉด ํŒŒ์ดํ”„๋ผ์ธ ์•„ํ‹ฐํŒฉํŠธ๋ฅผ ์œ„ํ•œ Cloud Storage ๋ฒ„ํ‚ท ๊ตฌ์„ฑ์˜ ์•ˆ๋‚ด๋ฅผ ๋”ฐ๋ฅธ ํ›„ ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

STAGING_BUCKET="gs://BUCKET_NAME"

BUCKET_NAME์„ ๋ฐฉ๊ธˆ ๋งŒ๋“  ๋ฒ„ํ‚ท์˜ ์ด๋ฆ„์œผ๋กœ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค.

ํ…œํ”Œ๋ฆฟ์—์„œ ํŒŒ์ดํ”„๋ผ์ธ ์‹คํ–‰ ๋งŒ๋“ค๊ธฐ

Python์šฉ Vertex AI SDK ๋˜๋Š” Google Cloud ์ฝ˜์†”์„ ์‚ฌ์šฉํ•˜์—ฌ Artifact Registry์˜ ํ…œํ”Œ๋ฆฟ์—์„œ ์‹คํ–‰๋˜๋Š” ํŒŒ์ดํ”„๋ผ์ธ์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ฝ˜์†”

  1. Google Cloud ์ฝ˜์†”์—์„œ Vertex AI Pipelines๋ฅผ ์—ฝ๋‹ˆ๋‹ค.

    Vertex AI Pipelines๋กœ ์ด๋™

  2. ๋‚ด ํ…œํ”Œ๋ฆฟ ํƒญ์„ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.

  3. ์ €์žฅ์†Œ ์„ ํƒ ์ฐฝ์„ ์—ด๋ ค๋ฉด ์ €์žฅ์†Œ ์„ ํƒ์„ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.

  4. quickstart-kfp-repo ์ €์žฅ์†Œ๋ฅผ ์„ ํƒํ•œ ํ›„ ์„ ํƒ์„ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.

  5. hello-world ํŒจํ‚ค์ง€๋ฅผ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.

  6. 4f245e8f9605 ๋ฒ„์ „ ์˜†์˜ ์‹คํ–‰ ๋งŒ๋“ค๊ธฐ๋ฅผ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.

  7. ๋Ÿฐํƒ€์ž„ ๊ตฌ์„ฑ์„ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.

  8. Cloud Storage ์œ„์น˜์— ๋‹ค์Œ์„ ์ž…๋ ฅํ•ฉ๋‹ˆ๋‹ค.

    gs://BUCKET_NAME
    

    BUCKET_NAME์„ ํŒŒ์ดํ”„๋ผ์ธ ์‹คํ–‰ ์Šคํ…Œ์ด์ง•์„ ์œ„ํ•ด ๋งŒ๋“  ๋ฒ„ํ‚ท์˜ ์ด๋ฆ„์œผ๋กœ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค.

  9. ์ œ์ถœ์„ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.

Python์šฉ Vertex AI SDK

๋‹ค์Œ ์ƒ˜ํ”Œ์„ ์‚ฌ์šฉํ•˜์—ฌ ํ…œํ”Œ๋ฆฟ์—์„œ ํŒŒ์ดํ”„๋ผ์ธ ์‹คํ–‰์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

from google.cloud import aiplatform

# Initialize the aiplatform package
aiplatform.init(
    project="PROJECT_ID",
    location='us-central1',
    staging_bucket=STAGING_BUCKET)

# Create a pipeline job using a version ID.
job = aiplatform.PipelineJob(
    display_name="hello-world-latest",
    template_path="https://us-central1-kfp.pkg.dev/PROJECT_ID/quickstart-kfp-repo/hello-world@SHA256_TAG" + \
        versionName)

# Alternatively, create a pipeline job using a tag.
job = aiplatform.PipelineJob(
    display_name="hello-world-latest",
    template_path="https://us-central1-kfp.pkg.dev/PROJECT_ID/quickstart-kfp-repo/hello-world/TAG")

job.submit()

๋‹ค์Œ์„ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค.

  • PROJECT_ID: ์ด ํŒŒ์ดํ”„๋ผ์ธ์ด ์‹คํ–‰๋˜๋Š” Google Cloud ํ”„๋กœ์ ํŠธ์ž…๋‹ˆ๋‹ค.

  • SHA256_TAG: ํ…œํ”Œ๋ฆฟ ๋ฒ„์ „์˜ sha256 ํ•ด์‹œ ๊ฐ’์ž…๋‹ˆ๋‹ค.

  • TAG: ํ…œํ”Œ๋ฆฟ์˜ ๋ฒ„์ „ ํƒœ๊ทธ์ž…๋‹ˆ๋‹ค.

์ƒ์„ฑ๋œ ํŒŒ์ดํ”„๋ผ์ธ ์‹คํ–‰ ๋ณด๊ธฐ

Python์šฉ Vertex AI SDK์—์„œ ํŠน์ • ํŒŒ์ดํ”„๋ผ์ธ ๋ฒ„์ „์œผ๋กœ ์ƒ์„ฑ๋œ ์‹คํ–‰์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ฝ˜์†”

  1. Google Cloud ์ฝ˜์†”์—์„œ Vertex AI Pipelines๋ฅผ ์—ฝ๋‹ˆ๋‹ค.

    Vertex AI Pipelines๋กœ ์ด๋™

  2. ๋‚ด ํ…œํ”Œ๋ฆฟ ํƒญ์„ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.

  3. ์ €์žฅ์†Œ ์„ ํƒ์„ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.

  4. ๋ชฉ๋ก์—์„œ quickstart-kfp-repo ์ €์žฅ์†Œ๋ฅผ ์„ ํƒํ•œ ํ›„ ์„ ํƒ์„ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.

  5. hello-world ํŒŒ์ดํ”„๋ผ์ธ ํ…œํ”Œ๋ฆฟ์˜ ๋ฒ„์ „ ๋ชฉ๋ก์„ ๋ณด๋ ค๋ฉด hello world ํ…œํ”Œ๋ฆฟ์„ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.

  6. ํŒŒ์ดํ”„๋ผ์ธ ์‹คํ–‰์„ ๋ณด๋ ค๋Š” ์›ํ•˜๋Š” ๋ฒ„์ „์„ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.

  7. ์„ ํƒํ•œ ๋ฒ„์ „์˜ ํŒŒ์ดํ”„๋ผ์ธ ์‹คํ–‰์„ ๋ณด๋ ค๋ฉด ์‹คํ–‰ ๋ณด๊ธฐ๋ฅผ ํด๋ฆญํ•œ ํ›„ ์‹คํ–‰ ํƒญ์„ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.

Python์šฉ Vertex AI SDK

ํŒŒ์ดํ”„๋ผ์ธ ์‹คํ–‰์„ ๋‚˜์—ดํ•˜๋ ค๋ฉด ๋‹ค์Œ ์˜ˆ์‹œ ์ค‘ ํ•˜๋‚˜ ์ด์ƒ์— ํ‘œ์‹œ๋œ pipelineJobs.list ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

  from google.cloud import aiplatform

  # To filter all runs created from a specific version
  filter = 'template_uri:"https://us-central1-kfp.pkg.dev/PROJECT_ID/quickstart-kfp-repo/hello-world/*" AND ' + \
           'template_metadata.version="%s"' % versionName
  aiplatform.PipelineJob.list(filter=filter)

  # To filter all runs created from a specific version tag
  filter = 'template_uri="https://us-central1-kfp.pkg.dev/PROJECT_ID/quickstart-kfp-repo/hello-world/latest"'
  aiplatform.PipelineJob.list(filter=filter)

  # To filter all runs created from a package
  filter = 'template_uri:"https://us-central1-kfp.pkg.dev/PROJECT_ID/quickstart-kfp-repo/hello-world/*"'
  aiplatform.PipelineJob.list(filter=filter)

  # To filter all runs created from a repo
  filter = 'template_uri:"https://us-central1-kfp.pkg.dev/PROJECT_ID/quickstart-kfp-repo/*"'
  aiplatform.PipelineJob.list(filter=filter)

Kubeflow Pipelines SDK ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ ํด๋ผ์ด์–ธํŠธ์—์„œ ํ…œํ”Œ๋ฆฟ ์‚ฌ์šฉ

Kubeflow Pipelines SDK ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ ํด๋ผ์ด์–ธํŠธ๋ฅผ Artifact Registry์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜์—ฌ ํŒŒ์ดํ”„๋ผ์ธ ํ…œํ”Œ๋ฆฟ์„ ๋‹ค์šด๋กœ๋“œํ•˜๊ณ  ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ์ €์žฅ์†Œ์˜ ๋ฆฌ์†Œ์Šค๋ฅผ ๋‚˜์—ดํ•˜๋ ค๋ฉด ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

    templatePackages = client.list_packages()
    templatePackage = client.get_package(package_name = "hello-world")
    
    versions = client.list_versions(package_name="hello-world")
    version = client.get_version(package_name="hello-world", version=versionName)
    
    tags = client.list_tags(package_name = "hello-world")
    tag = client.get_tag(package_name = "hello-world", tag="latest")
    

    ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๋ฉ”์„œ๋“œ ๋ฐ ๋ฌธ์„œ์˜ ์ „์ฒด ๋ชฉ๋ก์€ Artifact Registry GitHub ์ €์žฅ์†Œ์˜ proto ํŒŒ์ผ์„ ์ฐธ์กฐํ•˜์„ธ์š”.

  • ํ…œํ”Œ๋ฆฟ์„ ๋กœ์ปฌ ํŒŒ์ผ ์‹œ์Šคํ…œ์— ๋‹ค์šด๋กœ๋“œํ•˜๋ ค๋ฉด ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

    # Sample 1
    filename = client.download_pipeline(
      package_name = "hello-world",
      version = versionName)
    # Sample 2
    filename = client.download_pipeline(
      package_name = "hello-world",
      tag = "v1")
    # Sample 3
    filename = client.download_pipeline(
      package_name = "hello-world",
      tag = "v1",
      file_name = "hello-world-template.yaml")
    

Artifact Registry REST API ์‚ฌ์šฉ

๋‹ค์Œ ์„น์…˜์—์„œ๋Š” Artifact Registry REST API๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Artifact Registry ์ €์žฅ์†Œ์—์„œ ํŒŒ์ดํ”„๋ผ์ธ ํ…œํ”Œ๋ฆฟ์„ ๊ด€๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์š”์•ฝํ•ฉ๋‹ˆ๋‹ค.

Artifact Registry REST API๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํŒŒ์ดํ”„๋ผ์ธ ํ…œํ”Œ๋ฆฟ ์—…๋กœ๋“œ

์ด ์„น์…˜์— ์„ค๋ช…๋œ ๋งค๊ฐœ๋ณ€์ˆ˜ ๊ฐ’์„ ์‚ฌ์šฉํ•˜์—ฌ HTTP ์š”์ฒญ์„ ๋งŒ๋“ค๋ฉด ํŒŒ์ดํ”„๋ผ์ธ ํ…œํ”Œ๋ฆฟ์„ ์—…๋กœ๋“œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • PROJECT_ID: ์ด ํŒŒ์ดํ”„๋ผ์ธ์ด ์‹คํ–‰๋˜๋Š” Google Cloud ํ”„๋กœ์ ํŠธ
  • REPO_ID: Artifact Registry ์ €์žฅ์†Œ์˜ ID

curl ์š”์ฒญ ์˜ˆ์‹œ

curl -X POST \
    -H "Authorization: Bearer $(gcloud auth print-access-token)" \
    -F tags=v1,latest \
    -F content=@pipeline_spec.yaml \
    https://us-central1-kfp.pkg.dev/PROJECT_ID/REPO_ID

์—…๋กœ๋“œ ์š”์ฒญ ๊ตฌ์„ฑ

์š”์ฒญ์ด HTTP ๋˜๋Š” HTTPS ๋ฉ€ํ‹ฐํŒŒํŠธ ์š”์ฒญ์ž…๋‹ˆ๋‹ค. ์š”์ฒญ ํ—ค๋”์— ์ธ์ฆ ํ† ํฐ์ด ํฌํ•จ๋˜์–ด ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ gcloud auth print-access-token์„ ์ฐธ์กฐํ•˜์„ธ์š”.

์š”์ฒญ์˜ ํŽ˜์ด๋กœ๋“œ๋Š” pipeline_spec.yaml ํŒŒ์ผ(๋˜๋Š” .zip ํŒจํ‚ค์ง€)์˜ ์ฝ˜ํ…์ธ ์ž…๋‹ˆ๋‹ค. ๊ถŒ์žฅ ํฌ๊ธฐ ํ•œ๋„๋Š” 10MiB์ž…๋‹ˆ๋‹ค.

ํŒจํ‚ค์ง€ ์ด๋ฆ„์€ pipeline_spec.yaml ํŒŒ์ผ์˜ pipeline_spec.pipeline_info.name ํ•ญ๋ชฉ์—์„œ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค. ํŒจํ‚ค์ง€ ์ด๋ฆ„์€ ํŒจํ‚ค์ง€๋ฅผ ๊ณ ์œ ํ•˜๊ฒŒ ์‹๋ณ„ํ•˜๋ฉฐ ์—ฌ๋Ÿฌ ๋ฒ„์ „์—์„œ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๊ธธ์ด๋Š” 4~128์ž ์‚ฌ์ด์—ฌ์•ผ ํ•˜๋ฉฐ ์ •๊ทœ ํ‘œํ˜„์‹ ^[a-z0-9][a-z0-9-]{3,127}$์™€ ์ผ์น˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

tags ํŒจํ‚ค์ง€๋Š” ์ตœ๋Œ€ ์—ฌ๋Ÿ ๊ฐœ์˜ ์‰ผํ‘œ๋กœ ๊ตฌ๋ถ„๋œ ํƒœ๊ทธ ๋ชฉ๋ก์ž…๋‹ˆ๋‹ค. ๊ฐ ํƒœ๊ทธ๋Š” ^[a-zA-Z0-9\-._~:@+]{1,128}$ ์ •๊ทœ ํ‘œํ˜„์‹๊ณผ ์ผ์น˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

ํƒœ๊ทธ๊ฐ€ ์กด์žฌํ•˜๊ณ  ์ด๋ฏธ ์—…๋กœ๋“œ๋œ ํŒŒ์ดํ”„๋ผ์ธ์„ ๊ฐ€๋ฆฌํ‚ค๋Š” ๊ฒฝ์šฐ ํ˜„์žฌ ์—…๋กœ๋“œ ์ค‘์ธ ํŒŒ์ดํ”„๋ผ์ธ์„ ๊ฐ€๋ฆฌํ‚ค๋„๋ก ํƒœ๊ทธ๊ฐ€ ์—…๋ฐ์ดํŠธ๋ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด latest ํƒœ๊ทธ๊ฐ€ ์ด๋ฏธ ์—…๋กœ๋“œํ•œ ํŒŒ์ดํ”„๋ผ์ธ์„ ๊ฐ€๋ฆฌํ‚ค๊ณ  --tag=latest๋กœ ์ƒˆ ๋ฒ„์ „์„ ์—…๋กœ๋“œํ•˜๋Š” ๊ฒฝ์šฐ latest ํƒœ๊ทธ๊ฐ€ ์ด์ „์— ์—…๋กœ๋“œํ•œ ํŒŒ์ดํ”„๋ผ์ธ์—์„œ ์‚ญ์ œ๋˜๊ณ  ์—…๋กœ๋“œ ์ค‘์ธ ์ƒˆ ํŒŒ์ดํ”„๋ผ์ธ์— ํ• ๋‹น๋ฉ๋‹ˆ๋‹ค.

์—…๋กœ๋“œํ•˜๋Š” ํŒŒ์ดํ”„๋ผ์ธ์ด ์ด์ „์— ์—…๋กœ๋“œํ•œ ํŒŒ์ดํ”„๋ผ์ธ๊ณผ ๋™์ผํ•œ ๊ฒฝ์šฐ ์—…๋กœ๋“œ๊ฐ€ ์„ฑ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๋ฒ„์ „ ํƒœ๊ทธ๋ฅผ ํฌํ•จํ•˜์—ฌ ์—…๋กœ๋“œ๋œ ํŒŒ์ดํ”„๋ผ์ธ์˜ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋Š” ์—…๋กœ๋“œ ์š”์ฒญ์˜ ๋งค๊ฐœ๋ณ€์ˆ˜ ๊ฐ’๊ณผ ์ผ์น˜ํ•˜๋„๋ก ์—…๋ฐ์ดํŠธ๋ฉ๋‹ˆ๋‹ค.

์‘๋‹ต ์—…๋กœ๋“œ

์—…๋กœ๋“œ ์š”์ฒญ์ด ์„ฑ๊ณตํ•˜๋ฉด HTTP OK ์ƒํƒœ๊ฐ€ ๋ฐ˜ํ™˜๋ฉ๋‹ˆ๋‹ค. ์‘๋‹ต ๋ณธ๋ฌธ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

{packageName}/{versionName=sha256:abcdef123456...}

์—ฌ๊ธฐ์„œ versionName์€ 16์ง„์ˆ˜ ๋ฌธ์ž์—ด๋กœ ํ˜•์‹์ด ์ง€์ •๋œ pipeline_spec.yaml์˜ sha256 ๋‹ค์ด์ œ์ŠคํŠธ์ž…๋‹ˆ๋‹ค.

Artifact Registry REST API๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํŒŒ์ดํ”„๋ผ์ธ ํ…œํ”Œ๋ฆฟ ๋‹ค์šด๋กœ๋“œ

์ด ์„น์…˜์— ์„ค๋ช…๋œ ๋งค๊ฐœ๋ณ€์ˆ˜ ๊ฐ’์„ ์‚ฌ์šฉํ•˜์—ฌ HTTP ์š”์ฒญ์„ ๋งŒ๋“ค๋ฉด ํŒŒ์ดํ”„๋ผ์ธ ํ…œํ”Œ๋ฆฟ์„ ๋‹ค์šด๋กœ๋“œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • PROJECT_ID: ์ด ํŒŒ์ดํ”„๋ผ์ธ์ด ์‹คํ–‰๋˜๋Š” Google Cloud ํ”„๋กœ์ ํŠธ
  • REPO_ID: Artifact Registry ์ €์žฅ์†Œ์˜ ID
  • PACKAGE_ID: ์—…๋กœ๋“œํ•œ ํ…œํ”Œ๋ฆฟ์˜ ํŒจํ‚ค์ง€ ID
  • TAG: ๋ฒ„์ „ ํƒœ๊ทธ์ž…
  • VERSION: sha256:abcdef123456... ํ˜•์‹์˜ ํ…œํ”Œ๋ฆฟ ๋ฒ„์ „

ํ‘œ์ค€ Artifact Registry ๋‹ค์šด๋กœ๋“œ์˜ ๊ฒฝ์šฐ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋‹ค์šด๋กœ๋“œ ๋งํฌ๋ฅผ ์ž‘์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

url = https://us-central1-kfp.pkg.dev/PROJECT_ID/REPO_ID/PACKAGE_ID/VERSION
url = https://us-central1-kfp.pkg.dev/PROJECT_ID/REPO_ID/PACKAGE_ID/TAG

์—ฌ๋Ÿฌ curl ์š”์ฒญ ์˜ˆ์‹œ

curl -X GET \
    -H "Authorization: Bearer $(gcloud auth print-access-token)" \
    https://us-central1-kfp.pkg.dev/PROJECT_ID/REPO_ID/PACKAGE_ID/VERSION

๋‹ค์Œ ์˜ˆ์‹œ์™€ ๊ฐ™์ด VERSION์„ TAG๋กœ ๋ฐ”๊พธ๊ณ  ๋™์ผํ•œ ํ…œํ”Œ๋ฆฟ์„ ๋‹ค์šด๋กœ๋“œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

curl -X GET \
    -H "Authorization: Bearer $(gcloud auth print-access-token)" \
    https://us-central1-kfp.pkg.dev/PROJECT_ID/REPO_ID/PACKAGE_ID/TAG

์‘๋‹ต ๋‹ค์šด๋กœ๋“œ

๋‹ค์šด๋กœ๋“œ ์š”์ฒญ์ด ์„ฑ๊ณตํ•˜๋ฉด HTTP OK ์ƒํƒœ๊ฐ€ ๋ฐ˜ํ™˜๋ฉ๋‹ˆ๋‹ค. ์‘๋‹ต ๋ณธ๋ฌธ์€ pipeline_spec.yaml ํŒŒ์ผ์˜ ์ฝ˜ํ…์ธ ์ž…๋‹ˆ๋‹ค.