초매개변수 조정 작업 만들기

초매개변수는 배치 크기 또는 심층신경망의 히든 레이어 수와 같이 모델 학습 프로세스를 제어하는 변수입니다. 초매개변수 조정은 일련의 시도에서 측정항목 값을 최적화하여 최적의 초매개변수 값 조합을 검색합니다. 측정항목은 모델 정확성과 같이 트레이너에 추가하는 스칼라 요약입니다.

Vertex AI에서 초매개변수 조정 자세히 알아보기 단계별 예시는 Vertex AI: 초매개변수 조정 Codelab을 참조하세요.

이 페이지에서는 다음 방법을 보여줍니다.

학습 애플리케이션 준비

초매개변수 조정 작업에서 Vertex AI는 여러 초매개변수 집합을 사용하여 학습 작업의 시도를 만들고 지정된 측정항목을 사용하여 시도의 효과를 평가합니다. Vertex AI는 초매개변수 값을 명령줄 인수로 학습 애플리케이션에 전달합니다. Vertex AI가 시도의 효과를 평가하려면 학습 애플리케이션이 측정항목을 Vertex AI에 보고해야 합니다.

다음 섹션에서는 다음을 설명합니다.

  • Vertex AI가 학습 애플리케이션에 초매개변수를 전달하는 방법
  • 학습 애플리케이션의 Vertex AI로 측정항목을 전달하는 옵션

Vertex AI에서 실행되는 커스텀 학습 애플리케이션의 요구사항에 대한 자세한 내용은 학습 코드 요구사항을 참조하세요.

조정할 초매개변수에 대한 명령줄 인수 처리

Vertex AI는 학습 애플리케이션을 호출할 때 명령줄 인수를 설정합니다. 다음의 단계에 따라 코드의 명령줄 인수를 활용하세요.

  1. 각 초매개변수 인수의 이름을 정의하고 argparse와 같이 원하는 인수 파서를 사용하여 파싱합니다. 초매개변수 학습 작업을 구성할 때 동일한 인수 이름을 사용합니다.

    예를 들어 학습 애플리케이션이 my_trainer라는 Python 모듈이고 learning_rate라는 초매개변수를 조정하는 경우 Vertex AI는 각 시도를 다음과 같은 명령어로 시작합니다.

    python3 -m my_trainer --learning_rate learning-rate-in-this-trial
    

    Vertex AI가 learning-rate-in-this-trial을 결정하고 learning_rate 인수를 사용하여 전달합니다.

  2. 명령줄 인수의 값을 학습 코드의 초매개변수에 할당합니다.

명령줄 인수 파싱을 위한 요구사항 자세히 알아보기

Vertex AI에 측정항목 보고

Vertex AI에 측정항목을 보고하려면 cloudml-hypertune Python 패키지를 사용합니다. 이 라이브러리는 Vertex AI에 측정항목을 보고하는 도우미 함수를 제공합니다.

초매개변수 측정항목 보고에 대해 자세히 알아보기

초매개변수 조정 작업 만들기

HyperparameterTuningJob을 만드는 데 사용하려는 도구에 따라 다음 탭 중 하나를 선택합니다.

콘솔

Google Cloud 콘솔에서는 HyperparameterTuningJob 리소스를 직접 만들 수 없습니다. 하지만 HyperparameterTuningJob을 만드는 TrainingPipeline 리소스를 만들 수 있습니다.

다음 안내에서는 HyperparameterTuningJob을 만들고 다른 작업을 수행하지 않는 TrainingPipeline을 만드는 방법을 설명합니다. 관리형 데이터 세트를 사용한 학습과 같은 추가 TrainingPipeline 기능을 사용하려면 학습 파이프라인 만들기를 참조하세요.

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

    학습 파이프라인으로 이동

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

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

    1. 데이터 세트 드롭다운 목록에서 관리형 데이터 세트 없음을 선택합니다.

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

    계속을 클릭합니다.

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

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

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

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

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

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

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

    계속을 클릭합니다.

  6. 초매개변수 조정 단계에서 초매개변수 조정 사용 체크박스를 선택하고 다음 설정을 지정합니다.

    1. 새 초매개변수 섹션에서 조정할 초매개변수의 매개변수 이름유형을 지정합니다. 지정한 유형에 따라 표시되는 초매개변수 설정을 추가로 구성합니다.

      초매개변수 유형 및 구성에 대해 자세히 알아보세요.

    2. 둘 이상의 초매개변수를 조정하려면 새 매개변수 추가를 클릭하고 표시되는 새 섹션에서 이전 단계를 반복합니다.

      조정할 각 초매개변수에 대해 이 과정을 반복합니다.

    3. 최적화할 측정항목 필드와목표 드롭다운 목록에서 최적화하려는 측정항목의 이름과 목표를 지정합니다.

    4. 최대 시도 횟수 필드에 Vertex AI가 초매개변수 조정 작업에 실행할 최대 시도 횟수를 지정합니다.

    5. 최대 동시 시도 횟수 필드에 Vertex AI가 동시에 실행할 수 있는 최대 시도 횟수를 지정합니다.

    6. 검색 알고리즘 드롭다운 목록에서 Vertex AI가 사용할 검색 알고리즘을 지정합니다.

    7. 조기 중단 사용 토글은 아무 영향이 없으므로 무시합니다.

    계속을 클릭합니다.

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

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

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

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

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

    계속을 클릭합니다.

  8. 예측 컨테이너 단계에서 예측 컨테이너 없음을 선택합니다.

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

gcloud

다음 단계에서는 Google Cloud CLI를 사용하여 상대적으로 최소한의 구성으로 HyperparameterTuningJob을 만드는 방법을 보여줍니다. 이 태스크에 사용할 수 있는 모든 구성 옵션에 대한 자세한 내용은 gcloud ai hp-tuning-jobs create 명령어HyperparameterTuningJob API 리소스의 참조 문서를 확인하세요.

  1. HyerparameterTuningJob에 지정할 일부 API 필드를 사용하여 config.yaml이라는 YAML 파일을 만듭니다.

    config.yaml
    studySpec:
      metrics:
      - metricId: METRIC_ID
        goal: METRIC_GOAL
      parameters:
      - parameterId: HYPERPARAMETER_ID
        doubleValueSpec:
          minValue: DOUBLE_MIN_VALUE
          maxValue: DOUBLE_MAX_VALUE
    trialJobSpec:
      workerPoolSpecs:
        - machineSpec:
            machineType: MACHINE_TYPE
          replicaCount: 1
          containerSpec:
            imageUri: CUSTOM_CONTAINER_IMAGE_URI
    

    다음을 바꿉니다.

    • METRIC_ID: 최적화할 초매개변수 측정항목의 이름입니다. 학습 코드가 실행되면 이 측정항목을 보고해야 합니다.

    • METRIC_GOAL: 초매개변수 측정항목의 목표(MAXIMIZE 또는 MINIMIZE)입니다.

    • HYPERPARAMETER_ID: 조정할 초매개변수의 이름입니다. 학습 코드는 이 이름으로 명령줄 플래그를 파싱해야 합니다. 이 예시에서 초매개변수는 부동 소수점 값을 사용해야 합니다. 다른 초매개변수 데이터 유형에 대해 알아보세요.

    • DOUBLE_MIN_VALUE: Vertex AI에서 이 초매개변수에 시도할 최솟값(숫자)입니다.

    • DOUBLE_MAX_VALUE: Vertex AI에서 이 초매개변수에 시도할 최댓값(숫자)입니다.

    • MACHINE_TYPE: 학습에 사용할 VM 유형입니다.

    • CUSTOM_CONTAINER_IMAGE_URI: 학습 코드가 포함된 Docker 컨테이너 이미지의 URI입니다. 커스텀 컨테이너 이미지를 만드는 방법을 알아보세요.

      이 예시에서는 커스텀 컨테이너를 사용해야 합니다. 또한 HyperparameterTuningJob 리소스는 커스텀 컨테이너 대신 Python 소스 배포의 학습 코드를 지원합니다.

  2. config.yaml 파일과 같은 디렉터리에서 다음 셸 명령어를 실행합니다.

    gcloud ai hp-tuning-jobs create \
        --region=LOCATION \
        --display-name=DISPLAY_NAME \
        --max-trial-count=MAX_TRIAL_COUNT \
        --parallel-trial-count=PARALLEL_TRIAL_COUNT \
        --config=config.yaml
    

    다음을 바꿉니다.

REST

hyperparameterTuningJob 리소스의 create 메서드를 사용하여 초매개변수 조정 작업을 만들려면 다음 코드 샘플을 사용하세요.

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

  • LOCATION: HyperparameterTuningJob을 만들려는 리전입니다. 커스텀 학습을 지원하는 리전을 사용합니다.
  • PROJECT: 프로젝트 ID
  • DISPLAY_NAME: 기억하기 쉬운 HyperparameterTuningJob 선택의 표시 이름입니다. 리소스 이름 요구사항에 대해 알아보세요.
  • 측정항목을 지정합니다.
  • 초매개변수를 지정합니다.
    • HYPERPARAMETER_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)을 숫자 배열로 지정합니다.
    • 조건부 초매개변수를 지정합니다. 상위 초매개변수의 값이 지정한 조건과 일치하면 조건부 초매개변수가 시도에 추가됩니다. 조건부 초매개변수에 대해 자세히 알아보세요.
      • CONDITIONAL_PARAMETER: 조건부 매개변수의 ParameterSpec입니다. 이 사양에는 매개변수 이름, 규모, 값 범위, 초매개변수에 따른 조건부 매개변수가 포함됩니다.
      • 상위 초매개변수 유형이 INTEGER인 경우 정수 목록을 INTEGERS_TO_MATCH로 지정합니다. 상위 초매개변수의 값이 지정된 값 중 하나와 일치하면 조건부 매개변수가 시도에 추가됩니다.
      • 상위 초매개변수 유형이 CATEGORICAL인 경우 카테고리 목록을 CATEGORIES_TO_MATCH로 지정합니다. 상위 초매개변수의 값이 지정된 값 중 하나와 일치하면 조건부 매개변수가 시도에 추가됩니다.
      • 상위 초매개변수 유형이 DISCRETE인 경우 정수 목록을 DISCRETE_VALUES_TO_MATCH로 지정합니다. 상위 초매개변수의 값이 지정된 값 중 하나와 일치하면 조건부 매개변수가 시도에 추가됩니다.
  • ALGORITHM: (선택사항) 초매개변수 조정 작업에서 사용할 검색 알고리즘입니다. ALGORITHM_UNSPECIFIED, GRID_SEARCH 또는 RANDOM_SEARCH일 수 있습니다.
  • MAX_TRIAL_COUNT: 실행할 최대 학습 수입니다.
  • PARALLEL_TRIAL_COUNT: 동시에 실행할 최대 학습 수입니다.
  • MAX_FAILED_TRIAL_COUNT: 초매개변수 조정 작업이 실패하기 전에 실패할 수 있는 작업 수입니다.
  • 시도 커스텀 학습 작업을 정의합니다.
    • MACHINE_TYPE: 학습에 사용할 VM 유형입니다.
    • ACCELERATOR_TYPE: (선택사항) 각 시도에 연결할 가속기 유형입니다.
    • ACCELERATOR_COUNT: (선택사항) 각 시도에 연결할 가속기 수입니다.
    • REPLICA_COUNT: 각 시도에서 사용할 작업자 복제본 수입니다.
    • 학습 애플리케이션이 커스텀 컨테이너에서 실행되는 경우 다음을 지정합니다.
      • CUSTOM_CONTAINER_IMAGE_URI: 학습 코드가 포함된 Docker 컨테이너 이미지의 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 모듈로 전달할 명령줄 인수입니다.
    • SERVICE_ACCOUNT: (선택사항) Vertex AI가 코드 실행을 위해 사용할 서비스 계정입니다. 커스텀 서비스 계정 연결에 대해 자세히 알아보세요.
    • TIMEOUT: (선택사항) 각 시도의 최대 실행 시간입니다.
  • 초매개변수 조정 작업에 적용할 모든 라벨에 LABEL_NAMELABEL_VALUE를 지정합니다.

HTTP 메서드 및 URL:

POST https://LOCATION-aiplatform.googleapis.com/v1/projects/PROJECT/locations/LOCATION/hyperparameterTuningJobs

JSON 요청 본문:

{
  "displayName": DISPLAY_NAME,
  "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.

        "conditionalParameterSpecs": [
            "parameterSpec": {
              CONDITIONAL_PARAMETER
            }

            // Union field parent_value_condition can be only one of the following:
            "parentIntValues": {
                "values": [INTEGERS_TO_MATCH]
            }
            "parentCategoricalValues": {
                "values": [CATEGORIES_TO_MATCH]
            }
            "parentDiscreteValues": {
                "values": [DISCRETE_VALUES_TO_MATCH]
            }
            // End of list of possible types for union field parent_value_condition.
        ]
      }
    ],
    "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
      },
      "serviceAccount": SERVICE_ACCOUNT
  },
  "labels": {
    LABEL_NAME_1": LABEL_VALUE_1,
    LABEL_NAME_2": LABEL_VALUE_2
  }
}

요청을 보내려면 다음 옵션 중 하나를 펼칩니다.

다음과 비슷한 JSON 응답이 표시됩니다.

{
  "name": "projects/12345/locations/us-central1/hyperparameterTuningJobs/6789",
  "displayName": "myHyperparameterTuningJob",
  "studySpec": {
    "metrics": [
      {
        "metricId": "myMetric",
        "goal": "MINIMIZE"
      }
    ],
    "parameters": [
      {
        "parameterId": "myParameter1",
        "integerValueSpec": {
          "minValue": "1",
          "maxValue": "128"
        },
        "scaleType": "UNIT_LINEAR_SCALE"
      },
      {
        "parameterId": "myParameter2",
        "doubleValueSpec": {
          "minValue": 1e-07,
          "maxValue": 1
        },
        "scaleType": "UNIT_LINEAR_SCALE"
      }
    ],
    "ALGORITHM": "RANDOM_SEARCH"
  },
  "maxTrialCount": 20,
  "parallelTrialCount": 1,
  "trialJobSpec": {
    "workerPoolSpecs": [
      {
        "machineSpec": {
          "machineType": "n1-standard-4"
        },
        "replicaCount": "1",
        "pythonPackageSpec": {
          "executorImageUri": "us-docker.pkg.dev/vertex-ai/training/training-tf-cpu.2-1:latest",
          "packageUris": [
            "gs://my-bucket/my-training-application/trainer.tar.bz2"
          ],
          "pythonModule": "my-trainer.trainer"
        }
      }
    ]
  }
}

Java

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

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

import com.google.cloud.aiplatform.v1.AcceleratorType;
import com.google.cloud.aiplatform.v1.CustomJobSpec;
import com.google.cloud.aiplatform.v1.HyperparameterTuningJob;
import com.google.cloud.aiplatform.v1.JobServiceClient;
import com.google.cloud.aiplatform.v1.JobServiceSettings;
import com.google.cloud.aiplatform.v1.LocationName;
import com.google.cloud.aiplatform.v1.MachineSpec;
import com.google.cloud.aiplatform.v1.PythonPackageSpec;
import com.google.cloud.aiplatform.v1.StudySpec;
import com.google.cloud.aiplatform.v1.StudySpec.MetricSpec;
import com.google.cloud.aiplatform.v1.StudySpec.MetricSpec.GoalType;
import com.google.cloud.aiplatform.v1.StudySpec.ParameterSpec;
import com.google.cloud.aiplatform.v1.StudySpec.ParameterSpec.ConditionalParameterSpec;
import com.google.cloud.aiplatform.v1.StudySpec.ParameterSpec.ConditionalParameterSpec.DiscreteValueCondition;
import com.google.cloud.aiplatform.v1.StudySpec.ParameterSpec.DiscreteValueSpec;
import com.google.cloud.aiplatform.v1.StudySpec.ParameterSpec.DoubleValueSpec;
import com.google.cloud.aiplatform.v1.StudySpec.ParameterSpec.ScaleType;
import com.google.cloud.aiplatform.v1.WorkerPoolSpec;
import java.io.IOException;
import java.util.Arrays;

public class CreateHyperparameterTuningJobPythonPackageSample {

  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 executorImageUri = "EXECUTOR_IMAGE_URI";
    String packageUri = "PACKAGE_URI";
    String pythonModule = "PYTHON_MODULE";
    createHyperparameterTuningJobPythonPackageSample(
        project, displayName, executorImageUri, packageUri, pythonModule);
  }

  static void createHyperparameterTuningJobPythonPackageSample(
      String project,
      String displayName,
      String executorImageUri,
      String packageUri,
      String pythonModule)
      throws IOException {
    JobServiceSettings settings =
        JobServiceSettings.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 (JobServiceClient client = JobServiceClient.create(settings)) {
      // study spec
      MetricSpec metric =
          MetricSpec.newBuilder().setMetricId("val_rmse").setGoal(GoalType.MINIMIZE).build();

      // decay
      DoubleValueSpec doubleValueSpec =
          DoubleValueSpec.newBuilder().setMinValue(1e-07).setMaxValue(1).build();
      ParameterSpec parameterDecaySpec =
          ParameterSpec.newBuilder()
              .setParameterId("decay")
              .setDoubleValueSpec(doubleValueSpec)
              .setScaleType(ScaleType.UNIT_LINEAR_SCALE)
              .build();
      Double[] decayValues = {32.0, 64.0};
      DiscreteValueCondition discreteValueDecay =
          DiscreteValueCondition.newBuilder().addAllValues(Arrays.asList(decayValues)).build();
      ConditionalParameterSpec conditionalParameterDecay =
          ConditionalParameterSpec.newBuilder()
              .setParameterSpec(parameterDecaySpec)
              .setParentDiscreteValues(discreteValueDecay)
              .build();

      // learning rate
      ParameterSpec parameterLearningSpec =
          ParameterSpec.newBuilder()
              .setParameterId("learning_rate")
              .setDoubleValueSpec(doubleValueSpec) // Use the same min/max as for decay
              .setScaleType(ScaleType.UNIT_LINEAR_SCALE)
              .build();

      Double[] learningRateValues = {4.0, 8.0, 16.0};
      DiscreteValueCondition discreteValueLearning =
          DiscreteValueCondition.newBuilder()
              .addAllValues(Arrays.asList(learningRateValues))
              .build();
      ConditionalParameterSpec conditionalParameterLearning =
          ConditionalParameterSpec.newBuilder()
              .setParameterSpec(parameterLearningSpec)
              .setParentDiscreteValues(discreteValueLearning)
              .build();

      // batch size
      Double[] batchSizeValues = {4.0, 8.0, 16.0, 32.0, 64.0, 128.0};

      DiscreteValueSpec discreteValueSpec =
          DiscreteValueSpec.newBuilder().addAllValues(Arrays.asList(batchSizeValues)).build();
      ParameterSpec parameter =
          ParameterSpec.newBuilder()
              .setParameterId("batch_size")
              .setDiscreteValueSpec(discreteValueSpec)
              .setScaleType(ScaleType.UNIT_LINEAR_SCALE)
              .addConditionalParameterSpecs(conditionalParameterDecay)
              .addConditionalParameterSpecs(conditionalParameterLearning)
              .build();

      // trial_job_spec
      MachineSpec machineSpec =
          MachineSpec.newBuilder()
              .setMachineType("n1-standard-4")
              .setAcceleratorType(AcceleratorType.NVIDIA_TESLA_K80)
              .setAcceleratorCount(1)
              .build();

      PythonPackageSpec pythonPackageSpec =
          PythonPackageSpec.newBuilder()
              .setExecutorImageUri(executorImageUri)
              .addPackageUris(packageUri)
              .setPythonModule(pythonModule)
              .build();

      WorkerPoolSpec workerPoolSpec =
          WorkerPoolSpec.newBuilder()
              .setMachineSpec(machineSpec)
              .setReplicaCount(1)
              .setPythonPackageSpec(pythonPackageSpec)
              .build();

      StudySpec studySpec =
          StudySpec.newBuilder()
              .addMetrics(metric)
              .addParameters(parameter)
              .setAlgorithm(StudySpec.Algorithm.RANDOM_SEARCH)
              .build();
      CustomJobSpec trialJobSpec =
          CustomJobSpec.newBuilder().addWorkerPoolSpecs(workerPoolSpec).build();
      // hyperparameter_tuning_job
      HyperparameterTuningJob hyperparameterTuningJob =
          HyperparameterTuningJob.newBuilder()
              .setDisplayName(displayName)
              .setMaxTrialCount(4)
              .setParallelTrialCount(2)
              .setStudySpec(studySpec)
              .setTrialJobSpec(trialJobSpec)
              .build();
      LocationName parent = LocationName.of(project, location);
      HyperparameterTuningJob response =
          client.createHyperparameterTuningJob(parent, hyperparameterTuningJob);
      System.out.format("response: %s\n", response);
      System.out.format("Name: %s\n", response.getName());
    }
  }
}

Python

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

from google.cloud import aiplatform

from google.cloud.aiplatform import hyperparameter_tuning as hpt

def create_hyperparameter_tuning_job_sample(
    project: str,
    location: str,
    staging_bucket: str,
    display_name: str,
    container_uri: str,
):
    aiplatform.init(project=project, location=location, staging_bucket=staging_bucket)

    worker_pool_specs = [
        {
            "machine_spec": {
                "machine_type": "n1-standard-4",
                "accelerator_type": "NVIDIA_TESLA_K80",
                "accelerator_count": 1,
            },
            "replica_count": 1,
            "container_spec": {
                "image_uri": container_uri,
                "command": [],
                "args": [],
            },
        }
    ]

    custom_job = aiplatform.CustomJob(
        display_name='custom_job',
        worker_pool_specs=worker_pool_specs,
    )

    hpt_job = aiplatform.HyperparameterTuningJob(
        display_name=display_name,
        custom_job=custom_job,
        metric_spec={
            'loss': 'minimize',
        },
        parameter_spec={
            'lr': hpt.DoubleParameterSpec(min=0.001, max=0.1, scale='log'),
            'units': hpt.IntegerParameterSpec(min=4, max=128, scale='linear'),
            'activation': hpt.CategoricalParameterSpec(values=['relu', 'selu']),
            'batch_size': hpt.DiscreteParameterSpec(values=[128, 256], scale='linear')
        },
        max_trial_count=128,
        parallel_trial_count=8,
        labels={'my_key': 'my_value'},
    )

    hpt_job.run()

    print(hpt_job.resource_name)
    return hpt_job

초매개변수 학습 작업 구성

초매개변수 조정 작업은 측정항목을 최적화하기 위한 최적의 초매개변수 조합을 검색합니다. 초매개변수 조정 작업은 다른 초매개변수 집합을 사용하여 학습 애플리케이션 시도를 여러 번 실행하여 이 작업을 수행합니다.

초매개변수 조정 작업을 구성할 때 다음 세부정보를 지정해야 합니다.

시도 횟수 제한

서비스가 실행되고 HyperparameterTuningJob 객체의 maxTrialCount 값을 설정하도록 허용할 시도 횟수를 결정합니다.

허용할 시도 횟수를 결정할 때 고려해야 할 상충되는 두 가지의 관심 항목이 있습니다.

  • 시간(및 그에 따른 비용)
  • 정확성

일반적으로 시도 횟수를 늘리면 더 나은 결과가 산출되지만 항상 그렇지는 않습니다. 일반적으로 반환이 감소하는 시점이 있으며 그 이후에는 추가 시도가 정확도에 거의 또는 전혀 영향을 미치지 않습니다. 많은 시도 횟수로 작업을 시작하기 전에 선택한 초매개변수가 모델의 정확성에 미치는 영향을 판별하기 위해 시도 횟수를 적게 설정하여 시작하는 것이 좋습니다.

초매개변수 조정을 최대한 활용하려면 최댓값을 사용하는 초매개변수 수의 10배 미만으로 설정해서는 안됩니다.

병렬 시도

HyperparameterTuningJob에서 parallelTrialCount를 설정하여 동시에 실행할 수 있는 시도 횟수를 지정할 수 있습니다.

병렬 시도를 실행하면 학습 작업에 걸리는 시간을 단축할 수 있습니다(실시간 - 필요한 총 처리 시간은 일반적으로 변경되지 않음). 하지만 병렬로 실행하면 조정 작업의 전체 효율성이 떨어질 수 있습니다. 이는 초매개변수 조정이 이전 시도에서 나온 결과를 사용하여 이후 시도의 초매개변수에 할당할 값을 알려주기 때문입니다. 병렬로 실행하는 경우 일부 시도는 여전히 실행 중인 시도의 결과를 활용하는 혜택 없이 시작됩니다.

동시 시도를 사용하는 경우 초매개변수 조정 서비스가 여러 학습 처리 클러스터(또는 단일 프로세스 트레이너의 경우 여러 개별 머신)를 프로비저닝합니다. 작업에 설정한 작업 풀 사양은 각 개별 학습 클러스터에 사용됩니다.

실패한 시도 처리

초매개변수 조정 시도가 오류와 함께 종료된다면 학습 작업을 조기에 끝내야 할 수 있습니다. HyperparameterTuningJobmaxFailedTrialCount 필드를 허용할 실패 시도 횟수로 설정합니다. 시도가 이 횟수만큼 실패하면 Vertex AI가 학습 작업을 종료합니다. maxFailedTrialCount 값은 maxTrialCount보다 작거나 같아야 합니다.

maxFailedTrialCount를 설정하지 않거나 0으로 설정할 경우 Vertex AI가 다음 규칙을 사용하여 실패 시도를 처리합니다.

  • 작업의 첫 시도가 실패하면 Vertex AI에서 작업을 즉시 종료합니다. 첫 시도가 실패했다면 학습 코드에 문제가 있는 것이므로 후속 시도도 실패할 가능성이 높습니다. 작업을 종료하면 더 많은 시도로 인해 추가 비용이 발생하기 전에 문제를 진단할 수 있습니다.
  • 첫 시도가 성공하면 Vertex AI는 다음 기준 중 하나에 따라 후속 시도가 실패하면 작업을 종료할 수 있습니다.
    • 시도 실패 횟수가 너무 많은 경우
    • 시도 성공에 비해 시도 실패가 너무 많은 경우

규칙은 변경될 수 있습니다. 특정한 동작을 적용하려면 maxFailedTrialCount 필드를 설정하세요.

초매개변수 조정 작업 관리

다음 섹션에서는 초매개변수 조정 작업을 관리하는 방법을 설명합니다.

초매개변수 조정 작업에 대한 정보 검색

다음 코드 샘플에서는 초매개변수 조정 작업을 검색하는 방법을 보여줍니다.

gcloud

gcloud ai hp-tuning-jobs describe 명령어를 사용합니다.

gcloud ai hp-tuning-jobs describe ID_OR_NAME \
    --region=LOCATION

다음을 바꿉니다.

  • ID_OR_NAME: 이름 또는 HyperparameterTuningJob의 숫자 ID입니다. (ID는 이름의 마지막 부분입니다.)

    HyperparameterTuningJob을 만들 때 ID나 이름을 확인했을 수 있습니다. ID나 이름을 모르는 경우 gcloud ai hp-tuning-jobs list 명령어를 실행하고 적절한 리소스를 찾을 수 있습니다.

  • LOCATION: HyperparameterTuningJob이 생성된 리전입니다.

REST

hyperparameterTuningJob 리소스의 get 메서드를 사용하여 초매개변수 조정 작업을 검색하려면 다음 코드 샘플을 사용하세요.

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

  • LOCATION: HyperparameterTuningJob이 생성된 리전입니다.
  • NAME: 초매개변수 조정 작업의 이름입니다. 작업 이름은 다음 형식을 사용합니다. projects/{project}/LOCATIONS/{LOCATION}/hyperparameterTuningJobs/{hyperparameterTuningJob}

HTTP 메서드 및 URL:

GET https://LOCATION-aiplatform.googleapis.com/v1/NAME

요청을 보내려면 다음 옵션 중 하나를 펼칩니다.

다음과 비슷한 JSON 응답이 표시됩니다.

{
  "name": "projects/12345/LOCATIONs/us-central1/hyperparameterTuningJobs/6789",
  "displayName": "my-hyperparameter-tuning-job",
  "studySpec": {
    "metrics": [
      {
        "metricId": "my_metric",
        "goal": "MINIMIZE"
      }
    ],
    "parameters": [
      {
        "parameterId": "my_parameter",
        "doubleValueSpec": {
          "minValue": 1e-05,
          "maxValue": 1
        }
      }
    ]
  },
  "maxTrialCount": 3,
  "parallelTrialCount": 1,
  "trialJobSpec": {
    "workerPoolSpecs": [
      {
        "machineSpec": {
          "machineType": "n1-standard-4"
        },
        "replicaCount": "1",
        "pythonPackageSpec": {
          "executorImageUri": "us-docker.pkg.dev/vertex-ai/training/training-tf-cpu.2-1:latest",
          "packageUris": [
            "gs://my-bucket/my-training-application/trainer.tar.bz2"
          ],
          "pythonModule": "my-trainer.trainer"
        }
      }
    ]
  },
  "trials": [
    {
      "id": "2",
      "state": "SUCCEEDED",
      "parameters": [
        {
          "parameterId": "my_parameter",
          "value": 0.71426874725564571
        }
      ],
      "finalMeasurement": {
        "stepCount": "2",
        "metrics": [
          {
            "metricId": "my_metric",
            "value": 0.30007445812225342
          }
        ]
      },
      "startTime": "2020-09-09T23:39:15.549112551Z",
      "endTime": "2020-09-09T23:47:08Z"
    },
    {
      "id": "3",
      "state": "SUCCEEDED",
      "parameters": [
        {
          "parameterId": "my_parameter",
          "value": 0.3078893356622992
        }
      ],
      "finalMeasurement": {
        "stepCount": "2",
        "metrics": [
          {
            "metricId": "my_metric",
            "value": 0.30000102519989014
          }
        ]
      },
      "startTime": "2020-09-09T23:49:22.451699360Z",
      "endTime": "2020-09-09T23:57:15Z"
    },
    {
      "id": "1",
      "state": "SUCCEEDED",
      "parameters": [
        {
          "parameterId": "my_parameter",
          "value": 0.500005
        }
      ],
      "finalMeasurement": {
        "stepCount": "2",
        "metrics": [
          {
            "metricId": "my_metric",
            "value": 0.30005377531051636
          }
        ]
      },
      "startTime": "2020-09-09T23:23:12.283374629Z",
      "endTime": "2020-09-09T23:36:56Z"
    }
  ],
  "state": "JOB_STATE_SUCCEEDED",
  "createTime": "2020-09-09T23:22:31.777386Z",
  "startTime": "2020-09-09T23:22:34Z",
  "endTime": "2020-09-10T01:31:24.271307Z",
  "updateTime": "2020-09-10T01:31:24.271307Z"
}

Java

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

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

import com.google.cloud.aiplatform.v1.HyperparameterTuningJob;
import com.google.cloud.aiplatform.v1.HyperparameterTuningJobName;
import com.google.cloud.aiplatform.v1.JobServiceClient;
import com.google.cloud.aiplatform.v1.JobServiceSettings;
import java.io.IOException;

public class GetHyperparameterTuningJobSample {

  public static void main(String[] args) throws IOException {
    // TODO(developer): Replace these variables before running the sample.
    String project = "PROJECT";
    String hyperparameterTuningJobId = "HYPERPARAMETER_TUNING_JOB_ID";
    getHyperparameterTuningJobSample(project, hyperparameterTuningJobId);
  }

  static void getHyperparameterTuningJobSample(String project, String hyperparameterTuningJobId)
      throws IOException {
    JobServiceSettings settings =
        JobServiceSettings.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 (JobServiceClient client = JobServiceClient.create(settings)) {
      HyperparameterTuningJobName name =
          HyperparameterTuningJobName.of(project, location, hyperparameterTuningJobId);
      HyperparameterTuningJob response = client.getHyperparameterTuningJob(name);
      System.out.format("response: %s\n", response);
    }
  }
}

Python

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

# Copyright 2022 Google LLC
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     https://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

from google.cloud import aiplatform

def get_hyperparameter_tuning_job_sample(
    project: str,
    hyperparameter_tuning_job_id: str,
    location: str = "us-central1",
):

    aiplatform.init(project=project, location=location)

    hpt_job = aiplatform.HyperparameterTuningJob.get(
        resource_name=hyperparameter_tuning_job_id,
    )

    return hpt_job

초매개변수 조정 작업 취소

다음 코드 샘플에서는 초매개변수 조정 작업을 취소하는 방법을 보여줍니다.

gcloud

gcloud ai hp-tuning-jobs cancel 명령어를 사용합니다.

gcloud ai hp-tuning-jobs cancel ID_OR_NAME \
    --region=LOCATION

다음을 바꿉니다.

  • ID_OR_NAME: 이름 또는 HyperparameterTuningJob의 숫자 ID입니다. (ID는 이름의 마지막 부분입니다.)

    HyperparameterTuningJob을 만들 때 ID나 이름을 확인했을 수 있습니다. ID나 이름을 모르는 경우 gcloud ai hp-tuning-jobs list 명령어를 실행하고 적절한 리소스를 찾을 수 있습니다.

  • LOCATION: HyperparameterTuningJob이 생성된 리전입니다.

REST

hyperparameterTuningJob 리소스의 cancel 메서드를 사용하여 초매개변수 조정 작업을 취소하려면 다음 코드 샘플을 사용하세요.

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

  • LOCATION: HyperparameterTuningJob이 생성된 리전입니다.
  • NAME: 초매개변수 조정 작업의 이름입니다. 작업 이름은 다음 형식을 사용합니다. projects/{project}/locations/{location}/hyperparameterTuningJobs/{hyperparameterTuningJob}

HTTP 메서드 및 URL:

POST https://LOCATION-aiplatform.googleapis.com/v1/NAME:cancel

요청을 보내려면 다음 옵션 중 하나를 펼칩니다.

성공 상태 코드(2xx)와 빈 응답을 받게 됩니다.

Python

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

from google.cloud import aiplatform

def cancel_hyperparameter_tuning_job_sample(
    project: str,
    hyperparameter_tuning_job_id: str,
    location: str = "us-central1",
):

    aiplatform.init(project=project, location=location)

    hpt_job = aiplatform.HyperparameterTuningJob.get(
        resource_name=hyperparameter_tuning_job_id,
    )

    hpt_job.cancel()

초매개변수 조정 작업 삭제

다음 코드 샘플은 Python용 Vertex AI SDK 및 REST API를 사용하여 초매개변수 조정 작업을 삭제하는 방법을 보여줍니다.

REST

hyperparameterTuningJob 리소스의 delete 메서드를 사용하여 초매개변수 조정 작업을 삭제하려면 다음 코드 샘플을 사용하세요.

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

  • LOCATION: 리전입니다.
  • NAME: 초매개변수 조정 작업의 이름입니다. 작업 이름은 다음 형식을 사용합니다. projects/{project}/LOCATIONs/{LOCATION}/hyperparameterTuningJobs/{hyperparameterTuningJob}

HTTP 메서드 및 URL:

DELETE https://LOCATION-aiplatform.googleapis.com/v1/NAME

요청을 보내려면 다음 옵션 중 하나를 펼칩니다.

성공 상태 코드(2xx)와 빈 응답을 받게 됩니다.

Python

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

from google.cloud import aiplatform

def delete_hyperparameter_tuning_job_sample(
    project: str,
    hyperparameter_tuning_job_id: str,
    location: str = "us-central1",
):

    aiplatform.init(project=project, location=location)

    hpt_job = aiplatform.HyperparameterTuningJob.get(
        resource_name=hyperparameter_tuning_job_id,
    )

    hpt_job.delete()

다음 단계