커스텀 학습 작업 만들기

커스텀 학습 작업은 Vertex AI에서 커스텀 머신러닝(ML) 학습 코드를 실행하는 기본적인 방법입니다.

작업을 제출하기 전에

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

커스텀 작업에 포함되는 항목

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

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

분산 학습 구성

여러 작업자 풀을 지정하여 분산형 학습을 위한 커스텀 학습 작업을 구성할 수 있습니다.

이 페이지의 대부분 예시에서는 한 개의 작업자 풀이 있는 단일 복제본 학습 작업을 보여줍니다. 분산형 학습을 위해 수정하려면 다음 안내를 따르세요.

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

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

커스텀 작업 만들기

커스텀 작업을 만들려면 다음 안내를 따르세요.

Console

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

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

  1. 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가 학습 코드 실행을 시작할 때 사용할 인수를 지정할 수 있습니다. 이 인수의 동작은 사용하는 컨테이너 유형에 따라 달라집니다.

    계속을 클릭합니다.

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

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

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

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

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

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

    계속을 클릭합니다.

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

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

gcloud

다음 예시에서는 gcloud beta ai custom-jobs create 명령어를 사용합니다.

사전 빌드된 컨테이너에서 사용할 Python 학습 애플리케이션을 생성했는지 또는 커스텀 컨테이너를 사용하는지에 따라 다음 명령어 중 하나를 실행합니다.

사전 빌드된 컨테이너

gcloud beta ai custom-jobs create \
  --region=LOCATION \
  --display-name=JOB_NAME \
  --python-package-uris=PYTHON_PACKAGE_URIS \
  --worker-pool-spec=machine-type=MACHINE_TYPE,replica-count=REPLICA_COUNT,executor-image-uri=PYTHON_PACKAGE_EXECUTOR_IMAGE_URI,python-module=PYTHON_MODULE

다음을 바꿉니다.

  • LOCATION: 컨테이너 또는 Python 패키지가 실행될 리전입니다.
  • JOB_NAME: 필수. CustomJob의 표시 이름입니다.
  • PYTHON_PACKAGE_URIS: 학습 프로그램 및 종속 패키지인 Python 패키지 파일을 지정하는 쉼표로 구분된 Cloud Storage URI 목록입니다. 패키지 URI의 최대 개수는 100개입니다.
  • MACHINE_TYPE: 머신 유형입니다. 학습에 사용 가능한 머신 유형을 참고하세요.
  • REPLICA_COUNT: 사용할 작업자 복제본의 수입니다. 대부분의 경우 첫 작업자 풀에서 이를 1로 설정합니다.
  • PYTHON_PACKAGE_EXECUTOR_IMAGE_URI: 제공된 Python 패키지를 실행하는 컨테이너 이미지의 URI입니다. 학습에 사용 가능한 사전 빌드된 컨테이너를 참고하세요.
  • PYTHON_MODULE: 패키지를 설치한 후 실행할 Python 모듈 이름입니다.

커스텀 컨테이너

gcloud beta ai custom-jobs create \
  --region=LOCATION \
  --display-name=JOB_NAME \
  --worker-pool-spec=machine-type=MACHINE_TYPE,replica-count=REPLICA_COUNT,container-image-uri=CUSTOM_CONTAINER_IMAGE_URI

다음을 바꿉니다.

  • LOCATION: 컨테이너 또는 Python 패키지가 실행될 리전입니다.
  • JOB_NAME: 필수. CustomJob의 표시 이름입니다.
  • MACHINE_TYPE: 머신 유형입니다. 학습에 사용 가능한 머신 유형을 참고하세요.
  • REPLICA_COUNT: 사용할 작업자 복제본의 수입니다. 대부분의 경우 첫 작업자 풀에서 이를 1로 설정합니다.
  • CUSTOM_CONTAINER_IMAGE_URI: 각 작업자 복제본에서 실행할 Artifact Registry, Container Registry 또는 Docker Hub의 컨테이너 이미지 URI입니다.

로컬 코드를 기반으로 하는 커스텀 컨테이너

로컬 컴퓨터에 학습 코드가 있는 경우 단일 명령어를 사용하여 다음을 수행할 수 있습니다.

  • 코드를 기반으로 커스텀 Docker 이미지를 빌드합니다.
  • 이미지를 Container Registry로 내보내기
  • 이미지를 기반으로 CustomJob을 시작합니다.

결과는 다른 커스텀 컨테이너를 사용하여 CustomJob을 만드는 것과 비슷합니다. 워크플로상 편리할 경우 이 버전의 명령어를 사용할 수 있습니다.

시작하기 전에

이 버전의 명령어는 Docker 이미지를 빌드하고 푸시하므로 로컬 컴퓨터에서 다음 구성을 수행해야 합니다.

  1. Docker Engine을 설치합니다.

  2. Linux를 사용하는 경우 sudo 없이 실행할 수 있도록 Docker를 구성합니다.

  3. Container Registry API를 사용 설정합니다.

    API 사용 설정

  4. Docker 인증을 구성하면 Docker 이미지를 Container Registry로 푸시할 수 있습니다.

    gcloud auth configure-docker
    

Docker 이미지 빌드 및 푸시, CustomJob 만들기

다음 명령어는 사전 빌드된 학습 컨테이너 이미지 및 로컬 Python 코드를 기반으로 Docker 이미지를 빌드하고 이미지를 Container Registry로 푸시한 후 CustomJob을 만듭니다.

gcloud beta ai custom-jobs create \
  --region=LOCATION \
  --display-name=JOB_NAME \
  --worker-pool-spec=machine-type=MACHINE_TYPE,replica-count=REPLICA_COUNT,executor-image-uri=PYTHON_PACKAGE_EXECUTOR_IMAGE_URI,local-package-path=WORKING_DIRECTORY,script=SCRIPT_PATH

다음을 바꿉니다.

  • LOCATION: 컨테이너 또는 Python 패키지가 실행될 리전입니다.

  • JOB_NAME: 필수. CustomJob의 표시 이름입니다.

  • MACHINE_TYPE: 머신 유형입니다. 학습에 사용 가능한 머신 유형을 참고하세요.

  • REPLICA_COUNT: 사용할 작업자 복제본의 수입니다. 대부분의 경우 첫 작업자 풀에서 이를 1로 설정합니다.

  • PYTHON_PACKAGE_EXECUTOR_IMAGE_URI: 제공된 Python 패키지를 실행하는 컨테이너 이미지의 URI입니다. 학습에 사용 가능한 사전 빌드된 컨테이너를 참고하세요.

    이 이미지는 이 명령어로 빌드 중인 새 Docker 이미지의 기본 이미지 역할을 합니다.

  • WORKING_DIRECTORY: 학습 코드를 실행하는 진입점 스크립트가 포함된 로컬 파일 시스템의 디렉터리(다음 목록 항목 참조)

    스크립트의 상위 디렉터리 또는 상위 수준의 디렉터리를 사용할 수 있습니다. 정규화된 Python 모듈 이름을 지정하기 위해 상위 수준 디렉터리를 사용할 수 있습니다(다음 목록 항목 참조). 컨테이너에 추가 종속 항목을 설치하기 위해 requirements.txt 파일 또는 setup.py 파일이 포함된 경우 상위 수준 디렉터리를 사용할 수도 있습니다. 이 기능은 gcloud beta ai custom-jobs local-run 명령어의 해당 기능과 비슷합니다. 그러나 상위 수준 디렉터리를 지정하더라도 이 명령어는 진입점 스크립트의 상위 디렉터리만 Docker 이미지에 복사합니다.

  • SCRIPT_PATH: 학습 코드의 진입점인 스크립트의 경로입니다(로컬 파일 시스템의 WORKING_DIRECTORY 기준). Python 스크립트(.py로 끝남) 또는 Bash 스크립트일 수 있습니다.

    예를 들어 /hello-world/trainer/task.py를 실행하려고 하고 WORKING_DIRECTORY/hello-world면 이 값에 trainer/task.py를 사용합니다.

    script 대신 python-module 사용

    원하는 경우 script=SCRIPT_PATHpython-module=PYTHON_MODULE로 바꿔 학습의 진입점으로 실행할 WORKING_DIRECTORY의 Python 모듈 이름을 지정할 수 있습니다. 예를 들어 script=trainer/task.py 대신 python-module=trainer.task를 지정할 수 있습니다.

    이 경우 결과 Docker 컨테이너는 스크립트가 아닌 모듈로 코드를 로드합니다. 진입점 스크립트가 WORKING_DIRECTORY에서 다른 Python 모듈을 가져오는 경우 이 옵션을 사용하는 것이 좋습니다.

분산 학습 구성

분산형 학습을 수행하려면 작업자 풀마다 한 번씩 --worker-pool-spec 플래그를 여러 번 지정하면 됩니다. 예를 들어 다음 예시에서는 이전 예시를 조정하여 두 번째 작업자 풀을 사용합니다.

사전 빌드된 컨테이너

gcloud beta ai custom-jobs create \
  --region=LOCATION \
  --display-name=JOB_NAME \
  --python-package-uris=PYTHON_PACKAGE_URIS \
  --worker-pool-spec=machine-type=MACHINE_TYPE,replica-count=REPLICA_COUNT,executor-image-uri=PYTHON_PACKAGE_EXECUTOR_IMAGE_URI,python-module=PYTHON_MODULE \
  --worker-pool-spec=machine-type=SECOND_POOL_MACHINE_TYPE,replica-count=SECOND_POOL_REPLICA_COUNT,executor-image-uri=SECOND_POOL_PYTHON_PACKAGE_EXECUTOR_IMAGE_URI,python-module=SECOND_POOL_PYTHON_MODULE

커스텀 컨테이너

gcloud beta ai custom-jobs create \
  --region=LOCATION \
  --display-name=JOB_NAME \
  --worker-pool-spec=machine-type=MACHINE_TYPE,replica-count=REPLICA_COUNT,container-image-uri=CUSTOM_CONTAINER_IMAGE_URI \
  --worker-pool-spec=machine-type=SECOND_POOL_MACHINE_TYPE,replica-count=SECOND_POOL_REPLICA_COUNT,container-image-uri=SECOND_POOL_CUSTOM_CONTAINER_IMAGE_URI

로컬 코드를 기반으로 하는 커스텀 컨테이너

명령어에서 local-package-path=WORKING_DIRECTORY를 사용하는 경우 단일 작업자 풀만 구성해야 합니다. 분산 학습은 사용할 수 없습니다.

고급 구성

앞의 예시에서 사용할 수 없는 구성 옵션을 지정하려면--config 플래그를 사용하여 CustomJobSpec 필드를 포함하는 로컬 환경의 config.yaml 파일에 경로를 지정합니다. 예를 들면 다음과 같습니다.

gcloud beta ai custom-jobs create \
  --region=LOCATION \
  --display-name=JOB_NAME \
  --config=config.yaml

config.yaml 파일의 예시를 참조하세요.

REST 및 명령줄

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

  • LOCATION: 컨테이너 또는 Python 패키지가 실행될 리전입니다.
  • PROJECT_ID: 프로젝트 ID 또는 프로젝트 번호입니다.
  • JOB_NAME: 필수. CustomJob의 표시 이름입니다.
  • 커스텀 학습 작업을 다음과 같이 정의합니다.
    • MACHINE_TYPE: 머신 유형입니다. 학습에 사용 가능한 머신 유형을 참고하세요.
    • ACCELERATOR_TYPE: (선택사항) 작업에 연결할 가속기의 유형입니다.
    • ACCELERATOR_COUNT: (선택사항) 작업에 연결할 가속기의 수입니다.
    • DISK_TYPE: (선택사항) 작업에 사용할 부팅 디스크의 유형으로 pd-standard(기본값) 또는 pd-ssd입니다. 디스크 유형에 대해 자세히 알아보세요.
    • DISK_SIZE: (선택사항) 작업에 사용할 부팅 디스크의 크기(GB)입니다. 기본값은 100입니다.
    • REPLICA_COUNT: 사용할 작업자 복제본의 수입니다. 대부분의 경우 첫 작업자 풀에서 이를 1로 설정합니다.
    • 학습 애플리케이션이 커스텀 컨테이너에서 실행되는 경우 다음을 지정합니다.
      • CUSTOM_CONTAINER_IMAGE_URI: 각 작업자 복제본에서 실행할 Artifact Registry, Container 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 목록입니다. 패키지 URI의 최대 개수는 100개입니다.
      • PYTHON_MODULE: 패키지를 설치한 후 실행할 Python 모듈 이름입니다.
      • PYTHON_PACKAGE_ARGS: (선택사항) Python 모듈로 전달할 명령줄 인수입니다.
    • 작업 예약 옵션에 대해 알아보세요.
    • TIMEOUT: (선택사항) 작업의 최대 실행 시간입니다.
  • 이 커스텀 작업에 적용할 모든 라벨의 LABEL_NAMELABEL_VALUE를 지정합니다.

HTTP 메서드 및 URL:

POST https://LOCATION-aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/customJobs

JSON 요청 본문:

{
  "displayName": "JOB_NAME",
  "jobSpec": {
    "workerPoolSpecs": [
      {
        "machineSpec": {
          "machineType": MACHINE_TYPE,
          "acceleratorType": ACCELERATOR_TYPE,
          "acceleratorCount": ACCELERATOR_COUNT
        },
        "replicaCount": REPLICA_COUNT,
        "diskSpec": {
          "bootDiskType": DISK_TYPE,
          "bootDiskSizeGb": DISK_SIZE
        },

        // 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.
      }
      // Specify one workerPoolSpec for single replica training, or multiple workerPoolSpecs
      // for distributed training.
    ],
    "scheduling": {
      "timeout": TIMEOUT
    }
  },
  "labels": {
    LABEL_NAME_1": LABEL_VALUE_1,
    LABEL_NAME_2": LABEL_VALUE_2
  }
}

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

curl

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

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

PowerShell

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

$cred = gcloud auth application-default 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-aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/customJobs" | Select-Object -Expand Content

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

Node.js

/**
 * TODO(developer): Uncomment these variables before running the sample.\
 * (Not necessary if passing values as arguments)
 */

// const customJobDisplayName = 'YOUR_CUSTOM_JOB_DISPLAY_NAME';
// const containerImageUri = 'YOUR_CONTAINER_IMAGE_URI';
// const project = 'YOUR_PROJECT_ID';
// const location = 'YOUR_PROJECT_LOCATION';

// Imports the Google Cloud Job Service Client library
const {JobServiceClient} = require('@google-cloud/aiplatform');

// Specifies the location of the api endpoint
const clientOptions = {
  apiEndpoint: 'us-central1-aiplatform.googleapis.com',
};

// Instantiates a client
const jobServiceClient = new JobServiceClient(clientOptions);

async function createCustomJob() {
  // Configure the parent resource
  const parent = `projects/${project}/locations/${location}`;
  const customJob = {
    displayName: customJobDisplayName,
    jobSpec: {
      workerPoolSpecs: [
        {
          machineSpec: {
            machineType: 'n1-standard-4',
            acceleratorType: 'NVIDIA_TESLA_K80',
            acceleratorCount: 1,
          },
          replicaCount: 1,
          containerSpec: {
            imageUri: containerImageUri,
            command: [],
            args: [],
          },
        },
      ],
    },
  };
  const request = {parent, customJob};

  // Create custom job request
  const [response] = await jobServiceClient.createCustomJob(request);

  console.log('Create custom job response');
  console.log(`${JSON.stringify(response)}`);
}
createCustomJob();

Python

이 예시에서는 Python용 Vertex SDK를 사용합니다. 다음 코드 샘플을 실행하기 전에 인증을 설정해야 합니다.

from google.cloud import aiplatform

def create_custom_job_sample(
    project: str,
    display_name: str,
    container_image_uri: str,
    location: str = "us-central1",
    api_endpoint: str = "us-central1-aiplatform.googleapis.com",
):
    # The AI Platform services require regional API endpoints.
    client_options = {"api_endpoint": api_endpoint}
    # Initialize client that will be used to create and send requests.
    # This client only needs to be created once, and can be reused for multiple requests.
    client = aiplatform.gapic.JobServiceClient(client_options=client_options)
    custom_job = {
        "display_name": display_name,
        "job_spec": {
            "worker_pool_specs": [
                {
                    "machine_spec": {
                        "machine_type": "n1-standard-4",
                        "accelerator_type": aiplatform.gapic.AcceleratorType.NVIDIA_TESLA_K80,
                        "accelerator_count": 1,
                    },
                    "replica_count": 1,
                    "container_spec": {
                        "image_uri": container_image_uri,
                        "command": [],
                        "args": [],
                    },
                }
            ]
        },
    }
    parent = f"projects/{project}/locations/{location}"
    response = client.create_custom_job(parent=parent, custom_job=custom_job)
    print("response:", response)

다음 단계

  • Vertex AI에서 커스텀 학습 애플리케이션을 실행하기 위한 커스텀 학습 작업을 만드는 방법은 Vertex AI로 모델 가져오기를 참조하세요.