파이프라인 구축

Vertex AI Pipelines를 사용하면 서버리스 방식으로 머신러닝(ML) 워크플로를 조정할 수 있습니다. Vertex AI Pipelines가 ML 워크플로를 조정하기 위해서는 워크플로를 파이프라인으로 기술해야 합니다. ML 파이프라인은 컨테이너 및 Google Cloud 서비스를 기반으로 이동 및 확장이 가능한 ML 워크플로입니다.

이 가이드에서는 ML 파이프라인 빌드를 시작하는 방법을 설명합니다.

어떤 파이프라인 SDK를 사용해야 하나요?

Vertex AI Pipelines는 다음 SDK를 사용해서 빌드된 파이프라인을 실행할 수 있습니다.

  • Kubeflow Pipelines SDK v1.8 이상(v2가 권장됨)

  • TensorFlow Extended v0.30.0 이상

수 테라바이트의 구조화된 데이터 또는 텍스트 데이터를 처리하는 ML 워크플로에서 TensorFlow를 사용하는 경우 TFX를 사용하여 파이프라인을 빌드하는 것이 좋습니다.

다른 사용 사례의 경우 Kubeflow Pipelines SDK를 사용하여 파이프라인을 빌드하는 것이 좋습니다. Kubeflow Pipelines SDK로 파이프라인을 빌드하면 커스텀 구성요소를 빌드하거나 Google Cloud 파이프라인 구성요소와 같은 사전 빌드된 구성요소를 다시 사용하여 워크플로를 구현할 수 있습니다. Google Cloud 파이프라인 구성요소는 파이프라인에서 AutoML과 같은 Vertex AI 서비스를 쉽게 사용할 수 있게 해줍니다.

이 가이드에서는 Kubeflow Pipelines SDK를 사용하여 파이프라인을 빌드하는 방법을 설명합니다.

시작하기 전에

파이프라인을 빌드하고 실행하기 전 다음 안내에 따라 Google Cloud 프로젝트 및 개발 환경을 설정합니다.

  1. ML 파이프라인을 실행하도록 Google Cloud 프로젝트를 준비하려면 Google Cloud 프로젝트 구성 가이드의 안내를 따릅니다.

  2. Kubeflow Pipelines SDK를 사용하여 파이프라인을 빌드하려면 Kubeflow Pipelines SDK v1.8 이상을 설치합니다.

  3. 파이프라인에 Vertex AI Python 클라이언트를 사용하려면 Vertex AI 클라이언트 라이브러리 v1.7 이상을 설치합니다.

  4. 파이프라인에서 Vertex AI 서비스를 사용하려면 Google Cloud 파이프라인 구성요소 SDK를 설치합니다.

파이프라인 빌드 시작하기

Vertex AI Pipelines에서 ML 워크플로를 조정하려면 먼저 워크플로를 파이프라인으로 설명해야 합니다. 다음 샘플에서는 Vertex AI와 함께 Google Cloud 파이프라인 구성요소를 사용하여 데이터 세트를 만들고, AutoML로 모델을 학습시키고, 예측을 위해 학습된 모델을 배포하는 방법을 설명합니다.

다음 코드 샘플을 실행하기 전에 인증을 설정해야 합니다.

인증을 설정하는 방법

인증을 설정하려면 서비스 계정 키를 만들고 서비스 계정 키 경로에 대한 환경 변수를 설정해야 합니다.

  1. 서비스 계정을 만듭니다.

    1. Google Cloud Console에서 서비스 계정 만들기 페이지로 이동합니다.

      서비스 계정 만들기로 이동

    2. 서비스 계정 이름 필드에 이름을 입력합니다.
    3. 선택사항: 서비스 계정 설명 필드에 설명을 입력합니다.
    4. 만들기를 클릭합니다.
    5. 역할 선택 필드를 클릭합니다. 모든 역할에서 Vertex AI > Vertex AI 사용자를 선택합니다.
    6. 완료를 클릭하여 서비스 계정을 만듭니다.

      브라우저 창을 닫지 마세요. 다음 단계에서 사용합니다.

  2. 다음과 같이 인증을 위한 서비스 계정 키를 만듭니다.

    1. Google Cloud Console에서 만든 서비스 계정의 이메일 주소를 클릭합니다.
    2. 를 클릭합니다.
    3. 키 추가를 클릭한 후 새 키 만들기를 클릭합니다.
    4. 만들기를 클릭합니다. JSON 키 파일이 컴퓨터에 다운로드됩니다.
    5. 닫기를 클릭합니다.
  3. 파이프라인 실행을 위해 사용하는 서비스 계정에 대한 액세스 권한을 새 서비스 계정에 부여합니다.
    1. 을 클릭하여 서비스 계정 목록으로 돌아갑니다.
    2. 파이프라인 실행을 위해 사용하는 서비스 계정의 이름을 클릭합니다. 서비스 계정 세부정보 페이지가 나타납니다.

      이 가이드의 안내에 따라 Vertex AI Pipelines에 맞게 프로젝트를 구성한 경우 세부 권한으로 서비스 계정 구성 섹션에서 만든 것과 동일한 서비스 계정입니다. 그렇지 않으면 파이프라인 실행을 위해 Vertex AI에서 Compute Engine 기본 서비스 계정이 사용됩니다. Compute Engine 기본 서비스 계정 이름은 PROJECT_NUMBER-compute@developer.gserviceaccount.com과 같이 지정됩니다.

    3. 권한 탭을 클릭합니다.
    4. 액세스 권한 부여를 클릭합니다. 주 구성원 추가 패널이 표시됩니다.
    5. 새 주 구성원 상자에 이전 단계에서 만든 서비스 계정의 이메일 주소를 입력합니다.
    6. 역할 드롭다운 목록에서 서비스 계정 > 서비스 계정 사용자를 선택합니다.
    7. 저장을 클릭합니다.
  4. 환경 변수 GOOGLE_APPLICATION_CREDENTIALS를 서비스 계정 키가 포함된 JSON 파일의 경로로 설정합니다. 이 변수는 현재 셸 세션에만 적용되므로 새 세션을 연 경우 변수를 다시 설정합니다.

    예: Linux 또는 macOS

    [PATH]를 서비스 계정 키가 포함된 JSON 파일의 경로로 바꿉니다.

    export GOOGLE_APPLICATION_CREDENTIALS="[PATH]"

    예를 들면 다음과 같습니다.

    export GOOGLE_APPLICATION_CREDENTIALS="/home/user/Downloads/service-account-file.json"

    예: Windows

    [PATH]를 서비스 계정 키가 포함된 JSON 파일의 경로로 바꾸고, [FILE_NAME]을 파일 이름으로 바꿉니다.

    PowerShell:

    $env:GOOGLE_APPLICATION_CREDENTIALS="[PATH]"

    예를 들면 다음과 같습니다.

    $env:GOOGLE_APPLICATION_CREDENTIALS="C:\Users\username\Downloads\[FILE_NAME].json"

    명령어 프롬프트:

    set GOOGLE_APPLICATION_CREDENTIALS=[PATH]

Kubeflow Pipelines DSL 패키지를 사용하여 워크플로 정의

kfp.dsl 패키지에는 정의하고 파이프라인 및 구성요소와 상호작용하는 데 사용할 수 있는 도메인 특정 언어(DSL)가 포함됩니다.

Kubeflow 파이프라인 구성요소는 파이프라인 단계를 만드는 팩토리 함수입니다. 각 구성요소는 구성요소의 입력, 출력, 구현을 설명합니다. 예를 들어 아래 코드 샘플에서 ds_op는 구성요소입니다.

구성요소는 파이프라인 단계를 만들기 위해 사용됩니다. 파이프라인이 실행되면 필요한 데이터를 사용할 수 있을 때 단계가 실행됩니다. 예를 들어 학습 구성요소는 CSV 파일을 입력으로 사용하고 이를 사용해서 모델을 학습시킬 수 있습니다.

import kfp
from google.cloud import aiplatform
from google_cloud_pipeline_components.v1.dataset import ImageDatasetCreateOp
from google_cloud_pipeline_components.v1.automl.training_job import AutoMLImageTrainingJobRunOp
from google_cloud_pipeline_components.v1.endpoint import EndpointCreateOp, ModelDeployOp

project_id = PROJECT_ID
pipeline_root_path = PIPELINE_ROOT

# Define the workflow of the pipeline.
@kfp.dsl.pipeline(
    name="automl-image-training-v2",
    pipeline_root=pipeline_root_path)
def pipeline(project_id: str):
    # The first step of your workflow is a dataset generator.
    # This step takes a Google Cloud Pipeline Component, providing the necessary
    # input arguments, and uses the Python variable `ds_op` to define its
    # output. Note that here the `ds_op` only stores the definition of the
    # output but not the actual returned object from the execution. The value
    # of the object is not accessible at the dsl.pipeline level, and can only be
    # retrieved by providing it as the input to a downstream component.
    ds_op = ImageDatasetCreateOp(
        project=project_id,
        display_name="flowers",
        gcs_source="gs://cloud-samples-data/vision/automl_classification/flowers/all_data_v2.csv",
        import_schema_uri=aiplatform.schema.dataset.ioformat.image.single_label_classification,
    )

    # The second step is a model training component. It takes the dataset
    # outputted from the first step, supplies it as an input argument to the
    # component (see `dataset=ds_op.outputs["dataset"]`), and will put its
    # outputs into `training_job_run_op`.
    training_job_run_op = AutoMLImageTrainingJobRunOp(
        project=project_id,
        display_name="train-iris-automl-mbsdk-1",
        prediction_type="classification",
        model_type="CLOUD",
        dataset=ds_op.outputs["dataset"],
        model_display_name="iris-classification-model-mbsdk",
        training_fraction_split=0.6,
        validation_fraction_split=0.2,
        test_fraction_split=0.2,
        budget_milli_node_hours=8000,
    )

    # The third and fourth step are for deploying the model.
    create_endpoint_op = EndpointCreateOp(
        project=project_id,
        display_name = "create-endpoint",
    )

    model_deploy_op = ModelDeployOp(
        model=training_job_run_op.outputs["model"],
        endpoint=create_endpoint_op.outputs['endpoint'],
        automatic_resources_min_replica_count=1,
        automatic_resources_max_replica_count=1,
    )

다음을 바꿉니다.

  • PROJECT_ID: 이 파이프라인이 실행되는 Google Cloud 프로젝트입니다.
  • PIPELINE_ROOT_PATH: 파이프라인 서비스 계정이 액세스할 수 있는 Cloud Storage URI를 지정합니다. 파이프라인 실행의 아티팩트는 파이프라인 루트 내에 저장됩니다.

    파이프라인 루트는 파이프라인 함수에서 @kfp.dsl.pipeline 주석의 인수로 설정하거나 create_run_from_job_spec을 호출하여 파이프라인 실행을 만들 때 설정할 수 있습니다.

파이프라인을 YAML 파일로 컴파일

파이프라인 워크플로가 정의된 후 계속해서 파이프라인을 YAML 형식으로 컴파일할 수 있습니다. YAML 파일에는 Vertex AI Pipelines 서비스에서 파이프라인을 실행하기 위한 모든 정보가 포함됩니다.

from kfp import compiler

compiler.Compiler().compile(
    pipeline_func=pipeline,
    package_path='image_classif_pipeline.yaml'
)

파이프라인 실행 제출

파이프라인의 워크플로가 YAML 형식으로 컴파일되면 Vertex AI Python 클라이언트를 사용하여 파이프라인을 제출하고 실행할 수 있습니다.

import google.cloud.aiplatform as aip

# Before initializing, make sure to set the GOOGLE_APPLICATION_CREDENTIALS
# environment variable to the path of your service account.
aip.init(
    project=project_id,
    location=PROJECT_REGION,
)

# Prepare the pipeline job
job = aip.PipelineJob(
    display_name="automl-image-training-v2",
    template_path="image_classif_pipeline.yaml",
    pipeline_root=pipeline_root_path,
    parameter_values={
        'project_id': project_id
    }
)

job.submit()

다음을 바꿉니다.

  • PROJECT_REGION: 이 파이프라인이 실행되는 리전입니다.

앞의 예시를 다시 보겠습니다.

  1. Kubeflow 파이프라인은 Python 함수로 정의됩니다. 이 함수는 파이프라인 이름 및 루트 경로를 지정하는 @kfp.dsl.pipeline 데코레이터로 주석 처리됩니다. 파이프라인 루트 경로는 파이프라인의 아티팩트가 저장되는 위치입니다.
  2. 파이프라인의 워크플로 단계는 Google Cloud 파이프라인 구성요소를 사용하여 생성됩니다. 구성요소 출력을 다른 구성요소의 입력으로 사용하여 파이프라인의 워크플로를 그래프로 정의합니다. 예를 들어 training_job_run_opds_opdataset 출력에 따라 달라집니다.
  3. kfp.compiler.Compiler를 사용하여 파이프라인을 컴파일합니다.
  4. Vertex AI Python 클라이언트를 사용하여 Vertex AI 파이프라인에서 파이프라인 실행을 만듭니다. 파이프라인을 실행할 때 파이프라인 이름 및 파이프라인 루트 경로를 재정의할 수 있습니다. 파이프라인 실행은 파이프라인 이름을 사용하여 그룹화될 수 있습니다. 파이프라인 이름을 재정의하면 제품과 실험용 파이프라인 실행을 구분하는 데 도움이 될 수 있습니다.

파이프라인 빌드에 대해 자세히 알아보려면 Kubeflow Pipelines 빌드 섹션을 읽고 샘플 및 튜토리얼을 따릅니다.

로컬에서 파이프라인 테스트(선택사항)

파이프라인과 구성요소를 정의한 후 로컬 작성 환경에서 코드를 실행하여 구성요소 코드를 테스트할 수 있습니다. 로컬에서 파이프라인이나 구성요소를 실행하면 Vertex AI Pipelines와 같은 원격 환경에서 파이프라인 실행을 만들기 전에 가능한 문제를 식별하고 디버깅할 수 있습니다. 로컬에서 파이프라인과 구성요소를 실행하는 방법에 대한 자세한 내용은 KFP 문서로컬 실행을 참조하세요.

이 페이지에서는 태스크 2개로 구성된 파이프라인을 정의하고 실행하는 방법을 보여줍니다.

로컬 환경 설정

  1. Kubeflow Pipelines(KFP) SDK v2의 최신 부 버전을 설치합니다.

    pip install --upgrade kfp>=2,<3
    
  2. 선택사항: Docker를 설치합니다.

  3. 다음 코드 샘플을 사용하여 간단한 파이프라인을 정의합니다.

    from kfp import dsl
    
    # Define a component to add two numbers.
    @dsl.component
    def add(a: int, b: int) -> int:
        return a + b
    
    # Define a simple pipeline using the component.
    @dsl.pipeline
    def addition_pipeline(x: int, y: int, z: int) -> int:
        task1 = add(a=x, b=y)
        task2 = add(a=task1.output, b=z)
        return task2.output
    

로컬 실행 호출

local.init() 함수를 사용하여 로컬 세션을 초기화합니다. local.init()를 사용하면 KFP SDK는 개발자가 파이프라인과 구성요소를 호출할 때 로컬에서 이들을 실행합니다.

local.init()를 사용할 때는 실행기 유형을 지정해야 합니다. 실행기 유형은 KFP에서 각 태스크를 실행하는 방법을 나타냅니다.

다음 샘플을 사용하여 컨테이너에서 각 태스크를 실행할 수 있는 DockerRunner 실행기 유형을 지정합니다. KFP에서 지원하는 로컬 실행기에 대한 자세한 내용은 KFP 문서의 로컬 실행기를 참조하세요.

from kfp import local

local.init(runner=local.DockerRunner())

pipeline_task = addition_pipeline(x=1, y=2, z=3)

다음 코드를 사용하여 로컬 실행 중인 파이프라인 태스크 출력을 봅니다.

print(f'Result: {pipeline_task.output}')

Kubeflow Pipelines 빌드

파이프라인을 빌드하려면 다음 프로세스를 따릅니다.

  1. 파이프라인을 일련의 구성요소로 정의합니다. 재사용 가능성을 높이기 위해서는 각 구성요소에 단일 책임을 지정해야 합니다. 가능한 모든 경우에 Google Cloud 파이프라인 구성요소와 같은 입증된 구성요소를 재사용하도록 파이프라인을 설계합니다.

    파이프라인 설계에 대해 자세히 알아보세요.

  2. Kubeflow Pipelines SDK를 사용하여 ML 워크플로를 구현하는 데 필요한 모든 커스텀 구성요소를 빌드합니다. 구성요소는 ML 워크플로에서 하나의 단계를 수행하는 독립 실행형 코드 집합입니다. 다음 옵션을 사용하여 파이프라인 구성요소를 만듭니다.

  3. 파이프라인을 Python 함수로 빌드합니다.

    파이프라인을 Python 함수로 정의하는 방법을 자세히 알아보세요.

  4. Kubeflow Pipelines SDK 컴파일러를 사용하여 파이프라인을 컴파일합니다.

    from kfp import compiler
    
    compiler.Compiler().compile(
        pipeline_func=PIPELINE_FUNCTION,
        package_path=PIPELINE_PACKAGE_PATH)
    

    다음을 바꿉니다.

    • PIPELINE_FUNCTION: 파이프라인의 함수 이름입니다.
    • PIPELINE_PACKAGE_PATH: 컴파일된 파이프라인을 저장할 경로입니다.
  5. Google Cloud Console 또는 Python을 사용하여 파이프라인을 실행합니다.

파이프라인에서 Google Cloud 리소스에 액세스

파이프라인을 실행할 때 서비스 계정을 지정하지 않으면 Vertex AI Pipelines가 Compute Engine 기본 서비스 계정을 사용하여 파이프라인을 실행합니다. 또한 Vertex AI Pipelines는 파이프라인 실행의 서비스 계정을 사용하여 파이프라인이 Google Cloud 리소스에 액세스하도록 승인합니다. Compute Engine 기본 서비스 계정에는 기본적으로 프로젝트 편집자 역할이 포함됩니다. 이렇게 하면 Google Cloud 프로젝트에서 Google Cloud 리소스에 대해 과도한 액세스 권한이 파이프라인에 부여될 수 있습니다.

파이프라인 실행을 위해 서비스 계정을 만든 후 파이프라인 실행에 필요한 Google Cloud 리소스에 대해 세부적인 권한을 이 계정에 부여하는 것이 좋습니다.

Identity and Access Management를 사용하여 서비스 계정 만들기서비스 계정에 부여된 액세스 권한 관리에 대해 자세히 알아보기

파이프라인을 최신 상태로 유지

파이프라인을 빌드하고 실행하는 데 사용하는 SDK 클라이언트와 컨테이너 이미지는 정기적으로 보안 취약점을 패치하고 새 기능을 추가하기 위해 새 버전으로 업데이트됩니다. 파이프라인을 최신 버전으로 유지하려면 다음을 수행하는 것이 좋습니다.

다음 단계