파이프라인 빌드

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

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

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

Vertex AI Pipelines는 Kubeflow Pipelines SDK v1.8.9 이상 또는 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 파이프라인을 실행하도록 클라우드 프로젝트를 준비하려면 클라우드 프로젝트 구성 가이드의 안내를 따릅니다.

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

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

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

파이프라인 빌드 시작하기

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

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

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

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

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

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

import kfp
from google.cloud import aiplatform
from google_cloud_pipeline_components import aiplatform as gcc_aip

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 = gcc_aip.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 = gcc_aip.AutoMLImageTrainingJobRunOp(
        project=project_id,
        display_name="train-iris-automl-mbsdk-1",
        prediction_type="classification",
        model_type="CLOUD",
        base_model=None,
        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 = gcc_aip.EndpointCreateOp(
        project=project_id,
        display_name = "create-endpoint",
    )

    model_deploy_op = gcc_aip.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을 호출하여 파이프라인 실행을 만들 때 설정할 수 있습니다.

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

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

from kfp.v2 import compiler
compiler.Compiler().compile(pipeline_func=pipeline,
        package_path='image_classif_pipeline.json')

파이프라인 실행 제출

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

import google.cloud.aiplatform as aip

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

job.submit()

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

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

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

Kubeflow Pipelines 빌드

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

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

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

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

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

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

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

    from kfp.v2 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를 사용하여 서비스 계정 만들기서비스 계정에 부여된 액세스 권한 관리에 대해 자세히 알아보기

다음 단계