학습 파이프라인 만들기

학습 파이프라인을 사용하면 커스텀 머신러닝(ML) 학습을 수행하고 학습 출력을 기반으로 Model 리소스를 자동으로 만들 수 있습니다.

파이프라인을 만들기 전에

Vertex AI에서 학습 파이프라인을 만들기 전에 Python 학습 애플리케이션 또는 커스텀 컨테이너를 만들어 Vertex AI에서 실행하고자 하는 학습 코드와 종속 항목을 정의해야 합니다. TensorFlow, scikit-learn 또는 XGBoost를 사용하여 Python 학습 애플리케이션을 만드는 경우에는 사전 빌드된 컨테이너를 사용하여 코드를 실행할 수 있습니다. 어떤 옵션을 선택해야 할지 잘 모르겠다면 학습 코드 요구사항을 참조하세요.

학습 파이프라인 옵션

학습 파이프라인은 추가 단계로 학습 작업을 캡슐화합니다. 이 가이드에서는 두 가지 학습 파이프라인에 대해 설명합니다.

  • CustomJob을 실행하고 결과 모델을 Vertex AI에 업로드합니다.
  • 초매개변수 미세 조정 작업을 실행하고 모델 결과를 Vertex AI에 업로드합니다.

또한 학습 파이프라인에서 관리형 데이터 세트를 사용할 수 있습니다. 관리형 데이터 세트를 사용하도록 학습 파이프라인을 구성하는 방법 자세히 알아보기

CustomJob에 포함된 항목

커스텀 작업을 만들 때는 Vertex AI가 다음과 같은 학습 코드를 실행하는 데 필요한 설정을 지정해 주어야 합니다.

작업자 풀 내에서 다음 설정을 지정할 수 있습니다.

Vertex AI Training 파이프라인 외부에서 독립형 커스텀 작업을 만들려면 커스텀 작업 가이드를 참조하세요.

관리형 데이터 세트를 사용하도록 파이프라인 구성

학습 파이프라인 내에서 관리형 데이터 세트를 사용하도록 커스텀 학습 작업 또는 초매개변수 조정 작업을 구성할 수 있습니다. 관리형 데이터 세트를 사용하면 학습 애플리케이션 및 모델로 데이터 세트를 관리할 수 있습니다.

학습 파이프라인에서 관리형 데이터 세트를 사용하려면 다음 안내를 따르세요.

  1. 데이터 세트를 만듭니다.
  2. 관리형 데이터 세트를 사용하도록 학습 애플리케이션을 업데이트합니다. 자세한 내용은 Vertex AI가 데이터 세트를 학습 애플리케이션에 전달하는 방법을 참조하세요.
  3. 학습 파이프라인을 만들 때 관리형 데이터 세트를 지정하세요. 예를 들어 REST API를 사용하여 학습 파이프라인을 만드는 경우 inputDataConfig 섹션에서 데이터 세트 설정을 지정합니다.

    데이터 세트를 만든 리전과 동일한 리전에 학습 파이프라인을 만들어야 합니다.

자세한 내용은 TrainingPipeline의 API 참조를 확인하세요.

분산 학습 구성

학습 파이프라인 내에서 여러 작업자 풀을 지정하여 분산형 학습에 커스텀 학습 작업 또는 초매개변수 조정 작업을 구성할 수 있습니다.

이 페이지의 모든 예시에서는 하나의 작업자 풀이 있는 단일 복제본 학습 작업이 사용됩니다. 분산형 학습을 위해 수정하려면 다음 안내를 따르세요.

  • 첫 번째 작업자 풀을 사용하여 기본 복제본을 구성하고 복제본 카운트를 1로 설정합니다.
  • 머신러닝 프레임워크가 분산형 학습에 이러한 추가 클러스터 작업을 지원하는 경우 작업자 복제본, 매개변수 서버 복제본 또는 평가자 복제본을 구성하는 작업자 풀을 추가합니다.

분산형 학습 사용에 대해 자세히 알아보세요.

CustomJob 및 모델 업로드

이 학습 파이프라인은 학습 후에 모델을 Vertex AI에 더 쉽게 배포할 수 있게 해주는 편리한 단계와 함께 커스텀 작업을 캡슐화합니다. 이 학습 파이프라인은 다음 두 가지 주요 작업을 수행합니다.

  1. 학습 파이프라인에서 CustomJob 리소스를 만듭니다. 커스텀 작업은 개발자가 지정한 컴퓨팅 리소스를 사용하여 학습 애플리케이션을 실행합니다.

  2. 커스텀 작업이 완료되면 학습 파이프라인은 학습 애플리케이션이 Cloud Storage 버킷에 지정한 출력 디렉터리에서 생성한 모델 아티팩트를 찾습니다. 이러한 아티팩트를 사용하여 모델 리소스를 만들고 이 리소스는 모델 배포를 설정합니다.

모델 아티팩트 위치를 설정하는 방법에는 두 가지가 있습니다.

  • 학습 작업에 baseOutputDirectory를 설정한 경우 학습 코드가 Vertex AI에서 설정한 $AIP_MODEL_DIR 환경 변수를 사용하여 해당 위치에 모델 아티팩트를 저장하는지 확인합니다. 학습 작업이 완료되면 Vertex AI가 gs://BASE_OUTPUT_DIRECTORY/model에서 모델 아티팩트 결과를 검색합니다.

  • modelToUpload.artifactUri 필드를 설정한 경우 학습 파이프라인은 해당 URI에서 모델 아티팩트를 업로드합니다. baseOutputDirectory를 설정하지 않았다면 이 필드를 설정해야 합니다.

baseOutputDirectorymodelToUpload.artifactUri를 모두 지정하면 Vertex AI에 modelToUpload.artifactUri가 사용됩니다.

이 유형의 학습 파이프라인을 만들려면 다음 안내를 따르세요.

콘솔

  1. Google Cloud 콘솔의 Vertex AI 섹션에서 학습 파이프라인 페이지로 이동합니다.

    학습 파이프라인으로 이동

  2. 만들기를 클릭하여 새 모델 학습 창을 엽니다.

  3. 학습 방법 단계에서 다음 설정을 지정합니다.

    1. 학습에 관리형 데이터 세트를 사용하려면 데이터 세트주석 세트를 지정합니다.

      그렇지 않으면 데이터 세트 드롭다운 목록에서 관리형 데이터 세트 없음을 선택합니다.

    2. 커스텀 학습(고급)을 선택합니다.

    계속을 클릭합니다.

  4. 모델 세부정보 단계에서 새 모델 학습 또는 새 버전 학습을 선택합니다. 새 모델 학습을 선택한 경우 모델에 사용할 이름(MODEL_NAME)을 입력합니다. 계속을 클릭합니다.

  5. 학습 컨테이너 단계에서 다음 설정을 지정합니다.

    1. 학습에 사전 빌드된 컨테이너를 사용할지 커스텀 컨테이너를 사용할지 선택합니다.

    2. 선택에 따라 다음 중 하나를 실행합니다.

    3. 모델 출력 디렉터리 필드에서 액세스 권한이 있는 버킷에 있는 디렉터리의 Cloud Storage URI를 지정할 수 있습니다. 아직 디렉터리가 존재하지 않아도 됩니다.

      이 값은 baseOutputDirectory API 필드의 Vertex AI로 전달되어 학습 애플리케이션이 실행되면 액세스할 수 있는 여러 환경 변수를 설정합니다.

      학습이 끝나면 Vertex AI는 Model을 만들기 위해 이 URI의 하위 디렉터리에서 모델 아티팩트를 찾습니다. 이 하위 디렉터리를 학습 코드에 AIP_MODEL_DIR 환경 변수로 사용할 수 있습니다.

      초매개변수 미세 조정을 사용하지 않을 경우 Vertex AI는 BASE_OUTPUT_DIRECTORY/model/에서 모델 아티팩트를 찾을 것으로 예상합니다.

    4. 선택사항: 인수 필드에서 학습 코드 실행을 시작할 때 사용할 Vertex AI의 인수를 지정할 수 있습니다. 결합된 모든 인수의 최대 길이는 100,000자입니다. 이 인수의 동작은 사용하는 컨테이너 유형에 따라 달라집니다.

    계속을 클릭합니다.

  6. 초매개변수 미세 조정 단계에서 초매개변수 미세 조정 사용 체크박스가 해제된 것을 확인합니다. 계속을 클릭합니다.

  7. 컴퓨팅 및 가격 책정 단계에서 다음 설정을 지정합니다.

    1. 리전 드롭다운 목록에서 "커스텀 학습을 지원하는 리전"을 선택합니다.

    2. 작업자 풀 0 섹션에서 학습에 사용할 컴퓨팅 리소스를 지정합니다.

      가속기를 지정하는 경우 선택한 가속기를 선택한 리전에서 사용할 수 있는지 확인합니다.

      분산형 학습을 수행하려면 작업자 풀 추가를 클릭하고 원하는 각 추가 작업자 풀에 대해 컴퓨팅 리소스 세트를 추가로 지정합니다.

    계속을 클릭합니다.

  8. 예측 컨테이너 단계에서 다음 설정을 지정합니다.

    1. 학습된 모델에서 예측을 제공하기 위해 사전 빌드된 컨테이너를 사용할지 아니면 커스텀 컨테이너를 사용할지 선택합니다.

    2. 선택에 따라 다음 중 하나를 실행합니다.

    3. 모델 디렉터리 필드에는 이전에 학습 컨테이너 단계의 모델 출력 디렉터리 필드에서 설정한 값이 포함됩니다. 이러한 필드 중 하나를 변경하면 동일한 효과가 적용됩니다. 이 필드에 대한 자세한 내용은 이전 안내를 참조하세요.

    4. 스키마 예측 섹션의 필드는 비워 둡니다.

  9. 학습 시작을 클릭하여 커스텀 학습 파이프라인을 시작합니다.

REST

다음 코드 샘플을 사용하여 trainingPipeline 리소스의 create 메서드를 사용하여 학습 파이프라인을 만듭니다.

참고: 새 모델 버전을 만들도록 이 파이프라인을 설정하려면 선택적으로 trainingPipeline 필드에서 PARENT_MODEL을 추가할 수 있습니다.

자세한 내용은 Vertex AI Model Registry를 사용한 모델 버전 관리를 참조하세요.

요청 데이터를 사용하기 전에 다음을 바꿉니다.

  • LOCATION_ID: 학습 코드가 실행되고 Model이 저장된 리전입니다.
  • PROJECT_ID: 프로젝트 ID입니다.
  • TRAINING_PIPELINE_NAME: 필수. trainingPipeline의 표시 이름입니다.
  • 학습 애플리케이션이 Vertex AI 데이터 세트를 사용하는 경우 다음을 지정합니다.
    • DATASET_ID: 데이터 세트 ID입니다.
    • ANNOTATIONS_FILTER: 지정한 주석으로 데이터 세트를 필터링합니다.
    • ANNOTATION_SCHEMA_URI: 지정된 주석 스키마 URI로 데이터 세트를 필터링합니다.
    • 다음 옵션 중 하나를 사용하여 데이터 항목이 학습, 유효성 검사, 테스트 세트로 분할되는 방법을 지정합니다.
      • 각 세트의 크기를 정의하는 비율에 따라 데이터 세트를 분할하려면 다음을 지정합니다.
        • TRAINING_FRACTION: 모델을 학습시키는 데 사용할 데이터 세트의 비율입니다.
        • VALIDATION_FRACTION: 모델 검증에 사용할 데이터 세트의 비율입니다.
        • TEST_FRACTION: 모델을 평가하는 데 사용할 데이터 세트의 비율입니다.
      • 필터를 기반으로 데이터 세트를 분할하려면 다음을 지정합니다.
        • TRAINING_FILTER: 데이터 세트를 학습시키는 데 사용할 데이터 항목으로 데이터 세트를 필터링합니다.
        • VALIDATION_FILTER: 모델 검증에 사용할 데이터 항목을 데이터 세트를 필터링합니다.
        • TEST_FILTER: 데이터 세트를 평가하는 데 사용할 데이터 항목을 데이터 세트를 필터링합니다.
      • 사전 정의된 분할을 사용하려면 다음을 지정합니다.
        • PREDEFINED_SPLIT_KEY: 데이터 세트를 분할하는 데 사용할 열의 이름입니다. 이 열의 값은 'training`, `validation`, `test`입니다.
      • 데이터 항목의 타임스탬프를 기준으로 데이터 세트를 분할하려면 다음을 지정합니다.
        • TIMESTAMP_TRAINING_FRACTION: 모델 학습에 사용할 데이터 세트의 비율입니다.
        • TIMESTAMP_VALIDATION_FRACTION: 모델 검증에 사용할 데이터 세트의 비율입니다.
        • TIMESTAMP_TEST_FRACTION: 모델을 평가하는 데 사용할 데이터 세트의 비율입니다.
        • TIMESTAMP_SPLIT_KEY: 데이터 세트를 분할하는 데 사용할 타임스탬프 열의 이름입니다.
    • OUTPUT_URI_PREFIX: 학습, 검증, 테스트 세트로 분할된 경우 Vertex AI가 학습 데이터 세트를 내보내는 Cloud Storage 위치입니다.
  • 커스텀 학습 작업을 다음과 같이 정의합니다.
    • MACHINE_TYPE: 머신 유형입니다. 학습에 사용 가능한 머신 유형을 참조하세요.
    • ACCELERATOR_TYPE: (선택사항) 각 시도에 연결할 가속기 유형입니다.
    • ACCELERATOR_COUNT: (선택사항) 각 시도에 연결할 가속기 수입니다.
    • REPLICA_COUNT: 각 시도에서 사용할 작업자 복제본 수입니다.
    • 학습 애플리케이션이 커스텀 컨테이너에서 실행되는 경우 다음을 지정합니다.
      • CUSTOM_CONTAINER_IMAGE_URI: 각 작업자 복제본에서 실행될 Artifact Registry 또는 Docker Hub의 컨테이너 이미지 URI입니다.
      • CUSTOM_CONTAINER_COMMAND: (선택사항) 컨테이너가 시작될 때 호출되는 명령어입니다. 이 명령어는 컨테이너의 기본 진입점을 재정의합니다.
      • CUSTOM_CONTAINER_ARGS: (선택사항) 컨테이너 시작 시 전달될 인수입니다. 결합된 모든 인수의 최대 길이는 100,000자입니다.
    • 학습 애플리케이션이 사전 빌드된 컨테이너에서 실행되는 Python 패키지인 경우 다음을 지정합니다.
      • PYTHON_PACKAGE_EXECUTOR_IMAGE_URI: 제공된 Python 패키지를 실행하는 컨테이너 이미지의 URI입니다. 학습에 사용 가능한 사전 빌드된 컨테이너를 참고하세요.
      • PYTHON_PACKAGE_URIS: 학습 프로그램 및 종속 패키지인 Python 패키지 파일의 Cloud Storage 위치입니다. 패키지 URI의 최대 개수는 100개입니다.
      • PYTHON_MODULE: 패키지를 설치한 후 실행할 Python 모듈 이름입니다.
      • PYTHON_PACKAGE_ARGS: (선택사항) Python 모듈로 전달할 명령줄 인수입니다. 결합된 모든 인수의 최대 길이는 100,000자입니다.
    • TIMEOUT: (선택사항) 작업의 최대 실행 시간입니다.
  • MODEL_NAME: TrainingPipeline에서 업로드(생성)한 모델의 표시 이름입니다.
  • MODEL_DESCRIPTION: 모델에 대한 설명입니다.
  • IMAGE_URI: 예측 실행에 사용할 컨테이너 이미지의 URI입니다. 예를 들면 us-docker.pkg.dev/vertex-ai/prediction/tf2-cpu.2-1:latest입니다. 사전 빌드된 컨테이너커스텀 컨테이너를 사용합니다.
  • modelToUpload.labels: 모델을 구성할 모든 키-값 쌍 세트입니다. 예를 들면 다음과 같습니다.
    • "env": "prod"
    • "tier": "backend"
  • 학습 파이프라인에 적용할 라벨의 LABEL_NAMELABEL_VALUE를 지정합니다.

HTTP 메서드 및 URL:

POST https://LOCATION_ID-aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION_ID/trainingPipelines

JSON 요청 본문:

{
  "displayName": "TRAINING_PIPELINE_NAME",
  "inputDataConfig": {
    "datasetId": DATASET_ID,
    "annotationsFilter": ANNOTATIONS_FILTER,
    "annotationSchemaUri": ANNOTATION_SCHEMA_URI,

    // Union field split can be only one of the following:
    "fractionSplit": {
      "trainingFraction": TRAINING_FRACTION,
      "validationFraction": VALIDATION_FRACTION,
      "testFraction": TEST_FRACTION
    },
    "filterSplit": {
      "trainingFilter": TRAINING_FILTER,
      "validationFilter": VALIDATION_FILTER,
      "testFilter": TEST_FILTER
    },
    "predefinedSplit": {
      "key": PREDEFINED_SPLIT_KEY
    },
    "timestampSplit": {
      "trainingFraction": TIMESTAMP_TRAINING_FRACTION,
      "validationFraction": TIMESTAMP_VALIDATION_FRACTION,
      "testFraction": TIMESTAMP_TEST_FRACTION,
      "key": TIMESTAMP_SPLIT_KEY
    }
    // End of list of possible types for union field split.
    "gcsDestination": {
      "outputUriPrefix": OUTPUT_URI_PREFIX
    }
  },
  "trainingTaskDefinition": "gs://google-cloud-aiplatform/schema/trainingjob/definition/custom_task_1.0.0.yaml",
  "trainingTaskInputs": {
    "workerPoolSpecs": [
        {
          "machineSpec": {
            "machineType": MACHINE_TYPE,
            "acceleratorType": ACCELERATOR_TYPE,
            "acceleratorCount": ACCELERATOR_COUNT
          },
          "replicaCount": REPLICA_COUNT,

          // Union field task can be only one of the following:
          "containerSpec": {
            "imageUri": CUSTOM_CONTAINER_IMAGE_URI,
            "command": [
              CUSTOM_CONTAINER_COMMAND
            ],
            "args": [
              CUSTOM_CONTAINER_ARGS
            ]
          },
          "pythonPackageSpec": {
            "executorImageUri": PYTHON_PACKAGE_EXECUTOR_IMAGE_URI,
            "packageUris": [
              PYTHON_PACKAGE_URIS
            ],
            "pythonModule": PYTHON_MODULE,
            "args": [
              PYTHON_PACKAGE_ARGS
            ]
          }
          // End of list of possible types for union field task.
        }
      ],
      "scheduling": {
        "TIMEOUT": TIMEOUT
      }
    }
  },
  "modelToUpload": {
    "displayName": "MODEL_NAME",
    "predictSchemata": {},
    "containerSpec": {
      "imageUri": "IMAGE_URI"
    }
  },
  "labels": {
    LABEL_NAME_1": LABEL_VALUE_1,
    LABEL_NAME_2": LABEL_VALUE_2
  }
}

요청을 보내려면 다음 옵션 중 하나를 선택합니다.

curl

요청 본문을 request.json 파일에 저장하고 다음 명령어를 실행합니다.

curl -X POST \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
-H "Content-Type: application/json; charset=utf-8" \
-d @request.json \
"https://LOCATION_ID-aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION_ID/trainingPipelines"

PowerShell

요청 본문을 request.json 파일에 저장하고 다음 명령어를 실행합니다.

$cred = gcloud auth print-access-token
$headers = @{ "Authorization" = "Bearer $cred" }

Invoke-WebRequest `
-Method POST `
-Headers $headers `
-ContentType: "application/json; charset=utf-8" `
-InFile request.json `
-Uri "https://LOCATION_ID-aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION_ID/trainingPipelines" | Select-Object -Expand Content

응답에는 사양 및 TRAININGPIPELINE_ID에 대한 정보가 포함됩니다.

Java

이 샘플을 사용해 보기 전에 Vertex AI 빠른 시작: 클라이언트 라이브러리 사용Java 설정 안내를 따르세요. 자세한 내용은 Vertex AI Java API 참고 문서를 참조하세요.

Vertex AI에 인증하려면 애플리케이션 기본 사용자 인증 정보를 설정합니다. 자세한 내용은 로컬 개발 환경의 인증 설정을 참조하세요.

import com.google.cloud.aiplatform.v1.LocationName;
import com.google.cloud.aiplatform.v1.Model;
import com.google.cloud.aiplatform.v1.ModelContainerSpec;
import com.google.cloud.aiplatform.v1.PipelineServiceClient;
import com.google.cloud.aiplatform.v1.PipelineServiceSettings;
import com.google.cloud.aiplatform.v1.TrainingPipeline;
import com.google.gson.JsonArray;
import com.google.gson.JsonObject;
import com.google.protobuf.Value;
import com.google.protobuf.util.JsonFormat;
import java.io.IOException;

public class CreateTrainingPipelineCustomJobSample {

  public static void main(String[] args) throws IOException {
    // TODO(developer): Replace these variables before running the sample.
    String project = "PROJECT";
    String displayName = "DISPLAY_NAME";
    String modelDisplayName = "MODEL_DISPLAY_NAME";
    String containerImageUri = "CONTAINER_IMAGE_URI";
    String baseOutputDirectoryPrefix = "BASE_OUTPUT_DIRECTORY_PREFIX";
    createTrainingPipelineCustomJobSample(
        project, displayName, modelDisplayName, containerImageUri, baseOutputDirectoryPrefix);
  }

  static void createTrainingPipelineCustomJobSample(
      String project,
      String displayName,
      String modelDisplayName,
      String containerImageUri,
      String baseOutputDirectoryPrefix)
      throws IOException {
    PipelineServiceSettings settings =
        PipelineServiceSettings.newBuilder()
            .setEndpoint("us-central1-aiplatform.googleapis.com:443")
            .build();
    String location = "us-central1";

    // Initialize client that will be used to send requests. This client only needs to be created
    // once, and can be reused for multiple requests. After completing all of your requests, call
    // the "close" method on the client to safely clean up any remaining background resources.
    try (PipelineServiceClient client = PipelineServiceClient.create(settings)) {
      JsonObject jsonMachineSpec = new JsonObject();
      jsonMachineSpec.addProperty("machineType", "n1-standard-4");

      // A working docker image can be found at
      // gs://cloud-samples-data/ai-platform/mnist_tfrecord/custom_job
      // This sample image accepts a set of arguments including model_dir.
      JsonObject jsonContainerSpec = new JsonObject();
      jsonContainerSpec.addProperty("imageUri", containerImageUri);
      JsonArray jsonArgs = new JsonArray();
      jsonArgs.add("--model_dir=$(AIP_MODEL_DIR)");
      jsonContainerSpec.add("args", jsonArgs);

      JsonObject jsonJsonWorkerPoolSpec0 = new JsonObject();
      jsonJsonWorkerPoolSpec0.addProperty("replicaCount", 1);
      jsonJsonWorkerPoolSpec0.add("machineSpec", jsonMachineSpec);
      jsonJsonWorkerPoolSpec0.add("containerSpec", jsonContainerSpec);

      JsonArray jsonWorkerPoolSpecs = new JsonArray();
      jsonWorkerPoolSpecs.add(jsonJsonWorkerPoolSpec0);

      JsonObject jsonBaseOutputDirectory = new JsonObject();
      // The GCS location for outputs must be accessible by the project's AI Platform
      // service account.
      jsonBaseOutputDirectory.addProperty("output_uri_prefix", baseOutputDirectoryPrefix);

      JsonObject jsonTrainingTaskInputs = new JsonObject();
      jsonTrainingTaskInputs.add("workerPoolSpecs", jsonWorkerPoolSpecs);
      jsonTrainingTaskInputs.add("baseOutputDirectory", jsonBaseOutputDirectory);

      Value.Builder trainingTaskInputsBuilder = Value.newBuilder();
      JsonFormat.parser().merge(jsonTrainingTaskInputs.toString(), trainingTaskInputsBuilder);
      Value trainingTaskInputs = trainingTaskInputsBuilder.build();
      String trainingTaskDefinition =
          "gs://google-cloud-aiplatform/schema/trainingjob/definition/custom_task_1.0.0.yaml";
      String imageUri = "gcr.io/cloud-aiplatform/prediction/tf-cpu.1-15:latest";
      ModelContainerSpec containerSpec =
          ModelContainerSpec.newBuilder().setImageUri(imageUri).build();
      Model modelToUpload =
          Model.newBuilder()
              .setDisplayName(modelDisplayName)
              .setContainerSpec(containerSpec)
              .build();
      TrainingPipeline trainingPipeline =
          TrainingPipeline.newBuilder()
              .setDisplayName(displayName)
              .setTrainingTaskDefinition(trainingTaskDefinition)
              .setTrainingTaskInputs(trainingTaskInputs)
              .setModelToUpload(modelToUpload)
              .build();
      LocationName parent = LocationName.of(project, location);
      TrainingPipeline response = client.createTrainingPipeline(parent, trainingPipeline);
      System.out.format("response: %s\n", response);
      System.out.format("Name: %s\n", response.getName());
    }
  }
}

Python

Vertex AI SDK for Python을 설치하거나 업데이트하는 방법은 Vertex AI SDK for Python 설치를 참조하세요. 자세한 내용은 Python API 참고 문서를 확인하세요.

다음 예시에서는 Python용 Vertex AI SDK를 사용하여 커스텀 학습 파이프라인을 만드는 방법을 보여줍니다. 학습에 커스텀 컨테이너 또는 사전 빌드된 컨테이너를 사용할지 선택합니다.

사전 빌드된 컨테이너

Python용 Vertex AI SDK를 사용하여 사전 빌드된 컨테이너에서 Python 코드를 실행하는 학습 파이프라인을 만들면 다음 방법 중 하나로 학습 코드를 제공할 수 있습니다.

  • Cloud Storage에 있는 Python 소스 배포 패키지의 URI를 지정합니다.

    Python용 Vertex AI SDK를 사용하지 않고 학습 파이프라인을 만들 때도 이 옵션을 사용할 수 있습니다.

  • 로컬 머신에서 Python 스크립트의 경로를 지정합니다. Python용 Vertex AI SDK는 학습 파이프라인을 만들기 전에 스크립트를 소스 배포로 패키징하고 원하는 Cloud Storage 버킷에 업로드합니다.

    Python용 Vertex AI SDK를 사용하는 경우에만 이 옵션을 사용할 수 있습니다.

이러한 각 옵션의 코드 샘플을 보려면 해당 탭을 선택합니다.

패키지

다음 샘플에서는 CustomPythonPackageTrainingJob 클래스를 사용합니다.

def create_training_pipeline_custom_package_job_sample(
    project: str,
    location: str,
    staging_bucket: str,
    display_name: str,
    python_package_gcs_uri: str,
    python_module_name: str,
    container_uri: str,
    model_serving_container_image_uri: str,
    dataset_id: Optional[str] = None,
    model_display_name: Optional[str] = None,
    args: Optional[List[Union[str, float, int]]] = None,
    replica_count: int = 1,
    machine_type: str = "n1-standard-4",
    accelerator_type: str = "ACCELERATOR_TYPE_UNSPECIFIED",
    accelerator_count: int = 0,
    training_fraction_split: float = 0.8,
    validation_fraction_split: float = 0.1,
    test_fraction_split: float = 0.1,
    sync: bool = True,
    tensorboard_resource_name: Optional[str] = None,
    service_account: Optional[str] = None,
):
    aiplatform.init(project=project, location=location, staging_bucket=staging_bucket)

    job = aiplatform.CustomPythonPackageTrainingJob(
        display_name=display_name,
        python_package_gcs_uri=python_package_gcs_uri,
        python_module_name=python_module_name,
        container_uri=container_uri,
        model_serving_container_image_uri=model_serving_container_image_uri,
    )

    # This example uses an ImageDataset, but you can use another type
    dataset = aiplatform.ImageDataset(dataset_id) if dataset_id else None

    model = job.run(
        dataset=dataset,
        model_display_name=model_display_name,
        args=args,
        replica_count=replica_count,
        machine_type=machine_type,
        accelerator_type=accelerator_type,
        accelerator_count=accelerator_count,
        training_fraction_split=training_fraction_split,
        validation_fraction_split=validation_fraction_split,
        test_fraction_split=test_fraction_split,
        sync=sync,
        tensorboard=tensorboard_resource_name,
        service_account=service_account,
    )

    model.wait()

    print(model.display_name)
    print(model.resource_name)
    print(model.uri)
    return model

스크립트

다음 샘플에서는 CustomTrainingJob 클래스를 사용합니다.

def create_training_pipeline_custom_job_sample(
    project: str,
    location: str,
    staging_bucket: str,
    display_name: str,
    script_path: str,
    container_uri: str,
    model_serving_container_image_uri: str,
    dataset_id: Optional[str] = None,
    model_display_name: Optional[str] = None,
    args: Optional[List[Union[str, float, int]]] = None,
    replica_count: int = 0,
    machine_type: str = "n1-standard-4",
    accelerator_type: str = "ACCELERATOR_TYPE_UNSPECIFIED",
    accelerator_count: int = 0,
    training_fraction_split: float = 0.8,
    validation_fraction_split: float = 0.1,
    test_fraction_split: float = 0.1,
    sync: bool = True,
    tensorboard_resource_name: Optional[str] = None,
    service_account: Optional[str] = None,
):
    aiplatform.init(project=project, location=location, staging_bucket=staging_bucket)

    job = aiplatform.CustomTrainingJob(
        display_name=display_name,
        script_path=script_path,
        container_uri=container_uri,
        model_serving_container_image_uri=model_serving_container_image_uri,
    )

    # This example uses an ImageDataset, but you can use another type
    dataset = aiplatform.ImageDataset(dataset_id) if dataset_id else None

    model = job.run(
        dataset=dataset,
        model_display_name=model_display_name,
        args=args,
        replica_count=replica_count,
        machine_type=machine_type,
        accelerator_type=accelerator_type,
        accelerator_count=accelerator_count,
        training_fraction_split=training_fraction_split,
        validation_fraction_split=validation_fraction_split,
        test_fraction_split=test_fraction_split,
        sync=sync,
        tensorboard=tensorboard_resource_name,
        service_account=service_account,
    )

    model.wait()

    print(model.display_name)
    print(model.resource_name)
    print(model.uri)
    return model

커스텀 컨테이너

다음 샘플에서는 CustomContainerTrainingJob 클래스를 사용합니다.

def create_training_pipeline_custom_container_job_sample(
    project: str,
    location: str,
    staging_bucket: str,
    display_name: str,
    container_uri: str,
    model_serving_container_image_uri: str,
    dataset_id: Optional[str] = None,
    model_display_name: Optional[str] = None,
    args: Optional[List[Union[str, float, int]]] = None,
    replica_count: int = 1,
    machine_type: str = "n1-standard-4",
    accelerator_type: str = "ACCELERATOR_TYPE_UNSPECIFIED",
    accelerator_count: int = 0,
    training_fraction_split: float = 0.8,
    validation_fraction_split: float = 0.1,
    test_fraction_split: float = 0.1,
    sync: bool = True,
    tensorboard_resource_name: Optional[str] = None,
    service_account: Optional[str] = None,
):
    aiplatform.init(project=project, location=location, staging_bucket=staging_bucket)

    job = aiplatform.CustomContainerTrainingJob(
        display_name=display_name,
        container_uri=container_uri,
        model_serving_container_image_uri=model_serving_container_image_uri,
    )

    # This example uses an ImageDataset, but you can use another type
    dataset = aiplatform.ImageDataset(dataset_id) if dataset_id else None

    model = job.run(
        dataset=dataset,
        model_display_name=model_display_name,
        args=args,
        replica_count=replica_count,
        machine_type=machine_type,
        accelerator_type=accelerator_type,
        accelerator_count=accelerator_count,
        training_fraction_split=training_fraction_split,
        validation_fraction_split=validation_fraction_split,
        test_fraction_split=test_fraction_split,
        sync=sync,
        tensorboard=tensorboard_resource_name,
        service_account=service_account,
    )

    model.wait()

    print(model.display_name)
    print(model.resource_name)
    print(model.uri)
    return model

초매개변수 미세 조정 작업 및 모델 업로드

이 학습 파이프라인은 학습 후에 모델을 Vertex AI에 더 쉽게 배포할 수 있게 해주는 편리한 단계와 함께 초매개변수 미세 조정 작업을 캡슐화합니다. 이 학습 파이프라인은 다음 두 가지 주요 작업을 수행합니다.

  1. 학습 파이프라인은 초매개변수 미세 조정 작업 리소스를 만듭니다. 초매개변수 미세 조정 작업은 여러 시도를 만듭니다. 각 시도에서 커스텀 작업은 개발자가 지정한 컴퓨팅 리소스와 초매개변수를 사용하여 학습 애플리케이션을 실행합니다.

  2. 초매개변수 미세 조정 작업이 완료되면 학습 파이프라인은 Cloud Storage 버킷에 지정한 출력 디렉터리(baseOutputDirectory) 내에서 최적의 시도를 통해 모델 아티팩트를 찾습니다. 학습 파이프라인은 이러한 아티팩트를 사용하여 모델 리소스를 만들고, 이 리소스는 모델 배포를 설정합니다.

이 학습 파이프라인의 경우 Vertex AI가 최적의 시도에서 모델 아티팩트를 검색하는 baseOutputDirectory를 지정해야 합니다.

초매개변수 조정 작업에는 구성할 추가 설정이 있습니다. HyperparameterTuningJob 설정에 대해 자세히 알아보세요.

REST

다음 코드 샘플을 사용하여 trainingPipeline 리소스의 create 메서드를 사용하여 학습 파이프라인을 만듭니다.

요청 데이터를 사용하기 전에 다음을 바꿉니다.

  • LOCATION_ID: 프로젝트의 리전입니다.
  • PROJECT_ID: 프로젝트 ID입니다.
  • TRAINING_PIPELINE_NAME: 필수. trainingPipeline의 표시 이름입니다.
  • 학습 애플리케이션이 Vertex AI 데이터 세트를 사용하는 경우 다음을 지정합니다.
    • DATASET_ID: 데이터 세트 ID입니다.
    • ANNOTATIONS_FILTER: 지정한 주석으로 데이터 세트를 필터링합니다.
    • ANNOTATION_SCHEMA_URI: 지정된 주석 스키마 URI로 데이터 세트를 필터링합니다.
    • 다음 옵션 중 하나를 사용하여 데이터 항목이 학습, 유효성 검사, 테스트 세트로 분할되는 방법을 지정합니다.
      • 각 세트의 크기를 정의하는 비율에 따라 데이터 세트를 분할하려면 다음을 지정합니다.
        • TRAINING_FRACTION: 모델을 학습시키는 데 사용할 데이터 세트의 비율입니다.
        • VALIDATION_FRACTION: 모델 검증에 사용할 데이터 세트의 비율입니다.
        • TEST_FRACTION: 모델을 평가하는 데 사용할 데이터 세트의 비율입니다.
      • 필터를 기반으로 데이터 세트를 분할하려면 다음을 지정합니다.
        • TRAINING_FILTER: 데이터 세트를 학습시키는 데 사용할 데이터 항목으로 데이터 세트를 필터링합니다.
        • VALIDATION_FILTER: 모델 검증에 사용할 데이터 항목을 데이터 세트를 필터링합니다.
        • TEST_FILTER: 데이터 세트를 평가하는 데 사용할 데이터 항목을 데이터 세트를 필터링합니다.
      • 사전 정의된 분할을 사용하려면 다음을 지정합니다.
        • PREDEFINED_SPLIT_KEY: 데이터 세트를 분할하는 데 사용할 열의 이름입니다. 이 열의 값은 'training`, `validation`, `test`입니다.
      • 데이터 항목의 타임스탬프를 기준으로 데이터 세트를 분할하려면 다음을 지정합니다.
        • TIMESTAMP_TRAINING_FRACTION: 모델 학습에 사용할 데이터 세트의 비율입니다.
        • TIMESTAMP_VALIDATION_FRACTION: 모델 검증에 사용할 데이터 세트의 비율입니다.
        • TIMESTAMP_TEST_FRACTION: 모델을 평가하는 데 사용할 데이터 세트의 비율입니다.
        • TIMESTAMP_SPLIT_KEY: 데이터 세트를 분할하는 데 사용할 타임스탬프 열의 이름입니다.
    • OUTPUT_URI_PREFIX: 학습, 검증, 테스트 세트로 분할된 경우 Vertex AI가 학습 데이터 세트를 내보내는 Cloud Storage 위치입니다.
  • 초매개변수 미세 조정 작업을 지정합니다.
    • 측정항목을 지정합니다.
      • METRIC_ID: 측정항목의 이름입니다.
      • METRIC_GOAL: 측정항목의 목표입니다. MAXIMIZE 또는 MINIMIZE일 수 있습니다.
    • 초매개변수를 지정합니다.
      • PARAMETER_ID: 초매개변수의 이름입니다.
      • PARAMETER_SCALE: (선택사항) 매개변수 조정 방법입니다. 범주형 매개변수는 설정하지 않습니다. UNIT_LINEAR_SCALE, UNIT_LOG_SCALE, UNIT_REVERSE_LOG_SCALE, 또는 SCALE_TYPE_UNSPECIFIED일 수 있습니다.
      • 초매개변수의 유형이 DOUBLE이면 초매개변수의 최소값(DOUBLE_MIN_VALUE)과 최대값(DOUBLE_MAX_VALUE)을 지정합니다.
      • 초매개변수 유형이 INTEGER이면 초매개변수의 최소값(INTEGER_MIN_VALUE)과 최대값(INTEGER_MAX_VALUE)을 지정합니다.
      • 초매개변수 유형이 CATEGORICAL이면 허용되는 값(CATEGORICAL_VALUES)을 문자열 배열로 지정합니다.
      • 초매개변수 유형이 DISCRETE이면 허용되는 값(DISCRETE_VALUES)을 숫자 배열로 지정합니다.
    • ALGORITHM: (선택사항) 초매개변수 조정 작업에서 사용할 검색 알고리즘입니다. ALGORITHM_UNSPECIFIED, GRID_SEARCH, 또는 RANDOM_SEARCH일 수 있습니다.
    • MAX_TRIAL_COUNT: 작업에서 실행할 최대 시도 횟수입니다.
    • PARALLEL_TRIAL_COUNT: 동시에 실행할 수 있는 최대 시도 횟수입니다.
    • MAX_FAILED_TRIAL_COUNT: 초매개변수 조정 작업이 실패하기 전에 실패할 수 있는 작업 수입니다.
    • 시도 커스텀 학습 작업을 다음과 같이 정의합니다.
      • MACHINE_TYPE: 머신 유형입니다. 학습에 사용 가능한 머신 유형을 참조하세요.
      • ACCELERATOR_TYPE: (선택사항) 각 시도에 연결할 가속기 유형입니다.
      • ACCELERATOR_COUNT: (선택사항) 각 시도에 연결할 가속기 수입니다.
      • REPLICA_COUNT: 각 시도에서 사용할 작업자 복제본 수입니다.
      • 학습 애플리케이션이 커스텀 컨테이너에서 실행되는 경우 다음을 지정합니다.
        • CUSTOM_CONTAINER_IMAGE_URI: 각 작업자 복제본에서 실행될 Artifact Registry 또는 Docker Hub의 컨테이너 이미지 URI입니다.
        • CUSTOM_CONTAINER_COMMAND: (선택사항) 컨테이너가 시작될 때 호출되는 명령어입니다. 이 명령어는 컨테이너의 기본 진입점을 재정의합니다.
        • CUSTOM_CONTAINER_ARGS: (선택사항) 컨테이너 시작 시 전달되는 인수입니다.
      • 학습 애플리케이션이 사전 빌드된 컨테이너에서 실행되는 Python 패키지인 경우 다음을 지정합니다.
        • PYTHON_PACKAGE_EXECUTOR_IMAGE_URI: 제공된 Python 패키지를 실행하는 컨테이너 이미지의 URI입니다. 학습에 사용 가능한 사전 빌드된 컨테이너를 참고하세요.
        • PYTHON_PACKAGE_URIS: 학습 프로그램 및 종속 패키지인 Python 패키지 파일의 Cloud Storage 위치입니다. 패키지 URI의 최대 개수는 100개입니다.
        • PYTHON_MODULE: 패키지를 설치한 후 실행할 Python 모듈 이름입니다.
        • PYTHON_PACKAGE_ARGS: (선택사항) Python 모듈로 전달할 명령줄 인수입니다.
    • 작업 예약 옵션에 대해 알아보세요.
    • TIMEOUT: (선택사항) 각 시도의 최대 실행 시간입니다.
    • 초매개변수 조정 작업에 적용할 모든 라벨에 LABEL_NAMELABEL_VALUE를 지정합니다.
  • MODEL_NAME: TrainingPipeline에서 업로드(생성)한 모델의 표시 이름입니다.
  • MODEL_DESCRIPTION: 선택사항. 모델에 대한 설명입니다.
  • PREDICTION_IMAGE_URI: 필수. 다음 두 가지 옵션 중 하나를 지정합니다.
  • modelToUpload.labels: 선택사항. 모델을 구성할 모든 키-값 쌍 세트입니다. 예를 들면 다음과 같습니다.
    • "env": "prod"
    • "tier": "backend"
  • 학습 파이프라인에 적용할 라벨의 LABEL_NAMELABEL_VALUE를 지정합니다.

HTTP 메서드 및 URL:

POST https://LOCATION_ID-aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION_ID/trainingPipelines

JSON 요청 본문:

{
  "displayName": "TRAINING_PIPELINE_NAME",
  "inputDataConfig": {
    "datasetId": DATASET_ID,
    "annotationsFilter": ANNOTATIONS_FILTER,
    "annotationSchemaUri": ANNOTATION_SCHEMA_URI,

    // Union field split can be only one of the following:
    "fractionSplit": {
      "trainingFraction": TRAINING_FRACTION,
      "validationFraction": VALIDATION_FRACTION,
      "testFraction": TEST_FRACTION
    },
    "filterSplit": {
      "trainingFilter": TRAINING_FILTER,
      "validationFilter": VALIDATION_FILTER,
      "testFilter": TEST_FILTER
    },
    "predefinedSplit": {
      "key": PREDEFINED_SPLIT_KEY
    },
    "timestampSplit": {
      "trainingFraction": TIMESTAMP_TRAINING_FRACTION,
      "validationFraction": TIMESTAMP_VALIDATION_FRACTION,
      "testFraction": TIMESTAMP_TEST_FRACTION,
      "key": TIMESTAMP_SPLIT_KEY
    }
    // End of list of possible types for union field split.
    "gcsDestination": {
      "outputUriPrefix": OUTPUT_URI_PREFIX
    }
  },
  "trainingTaskDefinition": "gs://google-cloud-aiplatform/schema/trainingjob/definition/hyperparameter_tuning_task_1.0.0.yaml",
  "trainingTaskInputs": {
    "studySpec": {
    "metrics": [
      {
        "metricId": METRIC_ID,
        "goal": METRIC_GOAL
      }
    ],
    "parameters": [
      {
        "parameterId": PARAMETER_ID,
        "scaleType": PARAMETER_SCALE,

        // Union field parameter_value_spec can be only one of the following:
        "doubleValueSpec": {
            "minValue": DOUBLE_MIN_VALUE,
            "maxValue": DOUBLE_MAX_VALUE
        },
        "integerValueSpec": {
            "minValue": INTEGER_MIN_VALUE,
            "maxValue": INTEGER_MAX_VALUE
        },
        "categoricalValueSpec": {
            "values": [
              CATEGORICAL_VALUES
            ]
        },
        "discreteValueSpec": {
            "values": [
              DISCRETE_VALUES
            ]
        }
        // End of list of possible types for union field parameter_value_spec.
      }
    ],
    "ALGORITHM": ALGORITHM
  },
  "maxTrialCount": MAX_TRIAL_COUNT,
  "parallelTrialCount": PARALLEL_TRIAL_COUNT,
  "maxFailedTrialCount": MAX_FAILED_TRIAL_COUNT,
  "trialJobSpec": {
      "workerPoolSpecs": [
        {
          "machineSpec": {
            "machineType": MACHINE_TYPE,
            "acceleratorType": ACCELERATOR_TYPE,
            "acceleratorCount": ACCELERATOR_COUNT
          },
          "replicaCount": REPLICA_COUNT,

          // Union field task can be only one of the following:
          "containerSpec": {
            "imageUri": CUSTOM_CONTAINER_IMAGE_URI,
            "command": [
              CUSTOM_CONTAINER_COMMAND
            ],
            "args": [
              CUSTOM_CONTAINER_ARGS
            ]
          },
          "pythonPackageSpec": {
            "executorImageUri": PYTHON_PACKAGE_EXECUTOR_IMAGE_URI,
            "packageUris": [
              PYTHON_PACKAGE_URIS
            ],
            "pythonModule": PYTHON_MODULE,
            "args": [
              PYTHON_PACKAGE_ARGS
            ]
          }
          // End of list of possible types for union field task.
        }
      ],
      "scheduling": {
        "TIMEOUT": TIMEOUT
      }
    },
    "labels": {
      LABEL_NAME_1": LABEL_VALUE_1,
      LABEL_NAME_2": LABEL_VALUE_2
    }
  },
  "modelToUpload": {
    "displayName": "MODEL_NAME",
    "description": "MODEL_DESCRIPTION",
    "predictSchemata": {},
    "containerSpec": {
      "imageUri": "PREDICTION_IMAGE_URI"
    }
  },
  "labels": {
    LABEL_NAME_1": LABEL_VALUE_1,
    LABEL_NAME_2": LABEL_VALUE_2
  }
}

요청을 보내려면 다음 옵션 중 하나를 선택합니다.

curl

요청 본문을 request.json 파일에 저장하고 다음 명령어를 실행합니다.

curl -X POST \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
-H "Content-Type: application/json; charset=utf-8" \
-d @request.json \
"https://LOCATION_ID-aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION_ID/trainingPipelines"

PowerShell

요청 본문을 request.json 파일에 저장하고 다음 명령어를 실행합니다.

$cred = gcloud auth print-access-token
$headers = @{ "Authorization" = "Bearer $cred" }

Invoke-WebRequest `
-Method POST `
-Headers $headers `
-ContentType: "application/json; charset=utf-8" `
-InFile request.json `
-Uri "https://LOCATION_ID-aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION_ID/trainingPipelines" | Select-Object -Expand Content

응답에는 사양 및 TRAININGPIPELINE_ID에 대한 정보가 포함됩니다.

학습 모니터링

로그를 보려면 다음 안내를 따르세요.

  1. Google Cloud Console의 Vertex AI 섹션에서 학습 페이지로 이동합니다.

    학습 페이지로 이동

  2. 작업 이름을 클릭하여 커스텀 작업 페이지로 이동합니다.

  3. 로그 보기를 클릭합니다.

학습 파이프라인이 실행되는 동안 대화형 셸을 사용하여 학습 컨테이너를 검사할 수도 있습니다.

학습된 모델 보기

커스텀 학습 파이프라인이 완료되면 Google Cloud Console의 Vertex AI 섹션에서 모델 페이지로 이동하여 학습된 모델을 찾을 수 있습니다.

모델 페이지로 이동

다음 단계