엔드포인트에 모델 배포

모델을 온라인 예측을 제공하는 데 사용하려면 먼저 모델을 엔드포인트에 배포해야 합니다. 모델을 배포하면 물리적 리소스가 모델과 연결되므로 짧은 지연 시간으로 온라인 예측을 제공할 수 있습니다.

엔드포인트 1개에 모델을 2개 이상 배포할 수 있고 2개 이상의 엔드포인트에 모델 1개를 배포할 수 있습니다. 모델 배포 옵션 및 사용 사례에 대한 자세한 내용은 아래의 동일한 엔드포인트에 모델을 2개 이상 배포하는 이유를 참조하세요.

엔드포인트에 모델 배포

다음 방법 중 하나를 사용하여 모델을 배포합니다.

Google Cloud 콘솔

  1. Google Cloud 콘솔의 Vertex AI 섹션에서 모델 페이지로 이동합니다.

    모델 페이지로 이동

  2. 배포할 모델의 이름과 버전 ID를 클릭하여 세부정보 페이지를 엽니다.

  3. 배포 및 테스트 탭을 선택합니다.

    이미 엔드포인트에 배포된 모델은 모델 배포 섹션에 나열됩니다.

  4. 엔드포인트에 배포를 클릭합니다.

  5. 모델을 새 엔드포인트에 배포하려면 새 엔드포인트 만들기를 선택하고 새 엔드포인트의 이름을 지정합니다. 모델을 기존 엔드포인트에 배포하려면 기존 엔드포인트에 추가를 선택하고 드롭다운 목록에서 엔드포인트를 선택합니다.

    엔드포인트 1개에 모델을 2개 이상 추가할 수 있고 2개 이상의 엔드포인트에 모델 1개를 추가할 수 있습니다.

  6. 하나 이상의 모델이 배포된 기존 엔드포인트에 모델을 배포하는 경우 비율을 모두 합하면 100%가 되도록 배포 중인 모델과 이미 배포된 모델의 트래픽 분할 비율을 업데이트해야 합니다.

  7. 모델을 새 엔드포인트에 배포하는 경우 트래픽 분할 값으로 100을 허용합니다. 아니면 모두 합하여 100이 되도록 엔드포인트의 모든 모델에 대한 트래픽 분할 값을 조정합니다.

  8. 모델에 제공할 최소 컴퓨팅 노드 수를 입력합니다.

    이 숫자는 항상 이 모델에 사용할 수 있는 노드 수입니다.

    예측 트래픽이 없어도 예측 로드 처리나 대기(최소) 노드에 사용된 노드에 대한 요금이 청구됩니다. 자세한 내용은 가격 책정 페이지를 참조하세요.

    예측 트래픽을 처리하는 데 필요한 경우 컴퓨팅 노드 수를 늘릴 수 있지만 최대 노드 수 이상은 안 됩니다.

  9. 자동 확장을 사용하려면 Vertex AI에서 수직 확장하려는 최대 컴퓨팅 노드 수를 입력합니다.

  10. 머신 유형을 선택합니다.

    머신 리소스가 클수록 예측 성능이 향상되고 비용이 증가합니다. 사용 가능한 머신 유형을 비교해 보세요.

  11. 가속기 유형가속기 수를 선택합니다.

    모델을 가져오거나 만들 때 가속기를 사용 설정한 경우 이 옵션이 표시됩니다.

    가속기 수의 경우 GPU 테이블을 참조하여 각 CPU 머신 유형에 사용할 수 있는 유효한 GPU 수를 확인하세요. 가속기 수는 배포의 총 가속기 수가 아닌 노드당 가속기 수를 나타냅니다.

  12. 배포에 커스텀 서비스 계정을 사용하려면 서비스 계정 드롭다운 메뉴에서 서비스 계정을 선택합니다.

  13. 예측 로깅의 기본 설정을 변경하는 방법을 알아보세요.

  14. 모델에서 완료를 클릭하고 모든 트래픽 분할 비율이 올바르면 계속을 클릭합니다.

    모델이 배포되는 리전이 표시됩니다. 이 리전은 모델을 만든 리전이어야 합니다.

  15. 배포를 클릭하여 모델을 엔드포인트에 배포합니다.

API

Vertex AI API를 사용하여 모델을 배포하는 경우 다음 단계를 완료합니다.

  1. 필요한 경우 엔드포인트 Create
  2. 엔드포인트 ID Get
  3. 엔드포인트에 모델 Deploy

엔드포인트 만들기

기존 엔드포인트에 모델을 배포하는 경우 이 단계를 건너뛸 수 있습니다.

gcloud

다음 예시에서는 gcloud ai endpoints create 명령어를 사용합니다.

gcloud ai endpoints create \
  --region=LOCATION_ID \
  --display-name=ENDPOINT_NAME

다음을 바꿉니다.

  • LOCATION_ID: Vertex AI를 사용하는 리전
  • ENDPOINT_NAME: 엔드포인트의 표시 이름

Google Cloud CLI 도구가 엔드포인트를 만드는 데 몇 초 정도 걸릴 수 있습니다.

REST

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

  • LOCATION_ID: 리전
  • PROJECT_ID: 프로젝트 ID
  • ENDPOINT_NAME: 엔드포인트의 표시 이름

HTTP 메서드 및 URL:

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

JSON 요청 본문:

{
  "display_name": "ENDPOINT_NAME"
}

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

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

{
  "name": "projects/PROJECT_NUMBER/locations/LOCATION_ID/endpoints/ENDPOINT_ID/operations/OPERATION_ID",
  "metadata": {
    "@type": "type.googleapis.com/google.cloud.aiplatform.v1.CreateEndpointOperationMetadata",
    "genericMetadata": {
      "createTime": "2020-11-05T17:45:42.812656Z",
      "updateTime": "2020-11-05T17:45:42.812656Z"
    }
  }
}
응답에 "done": true가 포함될 때까지 작업 상태를 폴링할 수 있습니다.

Terraform

다음 샘플은 google_vertex_ai_endpoint Terraform 리소스를 사용하여 엔드포인트를 만듭니다.

Terraform 구성을 적용하거나 삭제하는 방법은 기본 Terraform 명령어를 참조하세요.

# Endpoint name must be unique for the project
resource "random_id" "endpoint_id" {
  byte_length = 4
}

resource "google_vertex_ai_endpoint" "default" {
  name         = substr(random_id.endpoint_id.dec, 0, 10)
  display_name = "sample-endpoint"
  description  = "A sample Vertex AI endpoint"
  location     = "us-central1"
  labels = {
    label-one = "value-one"
  }
}

Java

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

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


import com.google.api.gax.longrunning.OperationFuture;
import com.google.cloud.aiplatform.v1.CreateEndpointOperationMetadata;
import com.google.cloud.aiplatform.v1.Endpoint;
import com.google.cloud.aiplatform.v1.EndpointServiceClient;
import com.google.cloud.aiplatform.v1.EndpointServiceSettings;
import com.google.cloud.aiplatform.v1.LocationName;
import java.io.IOException;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;

public class CreateEndpointSample {

  public static void main(String[] args)
      throws IOException, InterruptedException, ExecutionException, TimeoutException {
    // TODO(developer): Replace these variables before running the sample.
    String project = "YOUR_PROJECT_ID";
    String endpointDisplayName = "YOUR_ENDPOINT_DISPLAY_NAME";
    createEndpointSample(project, endpointDisplayName);
  }

  static void createEndpointSample(String project, String endpointDisplayName)
      throws IOException, InterruptedException, ExecutionException, TimeoutException {
    EndpointServiceSettings endpointServiceSettings =
        EndpointServiceSettings.newBuilder()
            .setEndpoint("us-central1-aiplatform.googleapis.com:443")
            .build();

    // 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 (EndpointServiceClient endpointServiceClient =
        EndpointServiceClient.create(endpointServiceSettings)) {
      String location = "us-central1";
      LocationName locationName = LocationName.of(project, location);
      Endpoint endpoint = Endpoint.newBuilder().setDisplayName(endpointDisplayName).build();

      OperationFuture<Endpoint, CreateEndpointOperationMetadata> endpointFuture =
          endpointServiceClient.createEndpointAsync(locationName, endpoint);
      System.out.format("Operation name: %s\n", endpointFuture.getInitialFuture().get().getName());
      System.out.println("Waiting for operation to finish...");
      Endpoint endpointResponse = endpointFuture.get(300, TimeUnit.SECONDS);

      System.out.println("Create Endpoint Response");
      System.out.format("Name: %s\n", endpointResponse.getName());
      System.out.format("Display Name: %s\n", endpointResponse.getDisplayName());
      System.out.format("Description: %s\n", endpointResponse.getDescription());
      System.out.format("Labels: %s\n", endpointResponse.getLabelsMap());
      System.out.format("Create Time: %s\n", endpointResponse.getCreateTime());
      System.out.format("Update Time: %s\n", endpointResponse.getUpdateTime());
    }
  }
}

Node.js

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

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

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

// const endpointDisplayName = 'YOUR_ENDPOINT_DISPLAY_NAME';
// const project = 'YOUR_PROJECT_ID';
// const location = 'YOUR_PROJECT_LOCATION';

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

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

// Instantiates a client
const endpointServiceClient = new EndpointServiceClient(clientOptions);

async function createEndpoint() {
  // Configure the parent resource
  const parent = `projects/${project}/locations/${location}`;
  const endpoint = {
    displayName: endpointDisplayName,
  };
  const request = {
    parent,
    endpoint,
  };

  // Get and print out a list of all the endpoints for this resource
  const [response] = await endpointServiceClient.createEndpoint(request);
  console.log(`Long running operation : ${response.name}`);

  // Wait for operation to complete
  await response.promise();
  const result = response.result;

  console.log('Create endpoint response');
  console.log(`\tName : ${result.name}`);
  console.log(`\tDisplay name : ${result.displayName}`);
  console.log(`\tDescription : ${result.description}`);
  console.log(`\tLabels : ${JSON.stringify(result.labels)}`);
  console.log(`\tCreate time : ${JSON.stringify(result.createTime)}`);
  console.log(`\tUpdate time : ${JSON.stringify(result.updateTime)}`);
}
createEndpoint();

Python

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

def create_endpoint_sample(
    project: str,
    display_name: str,
    location: str,
):
    aiplatform.init(project=project, location=location)

    endpoint = aiplatform.Endpoint.create(
        display_name=display_name,
        project=project,
        location=location,
    )

    print(endpoint.display_name)
    print(endpoint.resource_name)
    return endpoint

엔드포인트 ID 검색

모델을 배포하려면 엔드포인트 ID가 필요합니다.

gcloud

다음 예시에서는 gcloud ai endpoints list 명령어를 사용합니다.

gcloud ai endpoints list \
  --region=LOCATION_ID \
  --filter=display_name=ENDPOINT_NAME

다음을 바꿉니다.

  • LOCATION_ID: Vertex AI를 사용하는 리전
  • ENDPOINT_NAME: 엔드포인트의 표시 이름

ENDPOINT_ID 열에 표시되는 번호를 확인합니다. 다음 단계에서 이 ID를 사용합니다.

REST

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

  • LOCATION_ID: Vertex AI를 사용하는 리전
  • PROJECT_ID: 프로젝트 ID
  • ENDPOINT_NAME: 엔드포인트의 표시 이름

HTTP 메서드 및 URL:

GET https://LOCATION_ID-aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION_ID/endpoints?filter=display_name=ENDPOINT_NAME

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

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

{
  "endpoints": [
    {
      "name": "projects/PROJECT_NUMBER/locations/LOCATION_ID/endpoints/ENDPOINT_ID",
      "displayName": "ENDPOINT_NAME",
      "etag": "AMEw9yPz5pf4PwBHbRWOGh0PcAxUdjbdX2Jm3QO_amguy3DbZGP5Oi_YUKRywIE-BtLx",
      "createTime": "2020-04-17T18:31:11.585169Z",
      "updateTime": "2020-04-17T18:35:08.568959Z"
    }
  ]
}
ENDPOINT_ID를 확인합니다.

모델 배포

아래에서 언어 또는 환경에 대한 탭을 선택하세요.

gcloud

다음 예시에서는 gcloud ai endpoints deploy-model 명령어를 사용합니다.

다음 예시는 GPU를 사용하지 않고 ModelEndpoint에 배포하여 여러 DeployedModel 리소스 간에 트래픽을 분할하지 않고 예측 제공 속도를 높입니다.

아래의 명령어 데이터를 사용하기 전에 다음을 바꿉니다.

  • ENDPOINT_ID: 엔드포인트의 ID
  • LOCATION_ID: Vertex AI를 사용하는 리전
  • MODEL_ID: 배포할 모델의 ID
  • DEPLOYED_MODEL_NAME: DeployedModel의 이름. DeployedModelModel 표시 이름도 사용할 수 있습니다.
  • MIN_REPLICA_COUNT: 이 배포의 최소 노드 수. 예측 로드 시 필요에 따라 최대 노드 수까지 노드 수를 늘리거나 줄일 수 있으며 이 노드 수 미만으로는 줄일 수 없습니다.
  • MAX_REPLICA_COUNT: 이 배포의 최대 노드 수. 예측 로드 시 필요에 따라 이 노드 수까지 노드 수를 늘리거나 줄일 수 있으며 최소 노드 수 미만으로는 줄일 수 없습니다. --max-replica-count 플래그를 생략하면 최대 노드 수가 --min-replica-count 값으로 설정됩니다.

gcloud ai endpoints deploy-model 명령어를 실행합니다.

Linux, macOS 또는 Cloud Shell

gcloud ai endpoints deploy-model ENDPOINT_ID\
  --region=LOCATION_ID \
  --model=MODEL_ID \
  --display-name=DEPLOYED_MODEL_NAME \
  --min-replica-count=MIN_REPLICA_COUNT \
  --max-replica-count=MAX_REPLICA_COUNT \
  --traffic-split=0=100

Windows(PowerShell)

gcloud ai endpoints deploy-model ENDPOINT_ID`
  --region=LOCATION_ID `
  --model=MODEL_ID `
  --display-name=DEPLOYED_MODEL_NAME `
  --min-replica-count=MIN_REPLICA_COUNT `
  --max-replica-count=MAX_REPLICA_COUNT `
  --traffic-split=0=100

Windows(cmd.exe)

gcloud ai endpoints deploy-model ENDPOINT_ID^
  --region=LOCATION_ID ^
  --model=MODEL_ID ^
  --display-name=DEPLOYED_MODEL_NAME ^
  --min-replica-count=MIN_REPLICA_COUNT ^
  --max-replica-count=MAX_REPLICA_COUNT ^
  --traffic-split=0=100
 

트래픽 분할

앞의 예시에서 --traffic-split=0=100 플래그는 Endpoint가 수신하는 예측 트래픽의 100%를 새 DeployedModel로 전송하며 임시 ID는 0으로 표현됩니다. Endpoint에 이미 다른 DeployedModel 리소스가 있으면 새 DeployedModel 및 이전 모델 간에 트래픽을 분할할 수 있습니다. 예를 들어 트래픽의 20%를 새 DeployedModel로, 80%를 이전 모델로 전송하려면 다음 명령어를 실행합니다.

아래의 명령어 데이터를 사용하기 전에 다음을 바꿉니다.

  • OLD_DEPLOYED_MODEL_ID: 기존 DeployedModel의 ID입니다.

gcloud ai endpoints deploy-model 명령어를 실행합니다.

Linux, macOS 또는 Cloud Shell

gcloud ai endpoints deploy-model ENDPOINT_ID\
  --region=LOCATION_ID \
  --model=MODEL_ID \
  --display-name=DEPLOYED_MODEL_NAME \
  --min-replica-count=MIN_REPLICA_COUNT \
  --max-replica-count=MAX_REPLICA_COUNT \
  --traffic-split=0=20,OLD_DEPLOYED_MODEL_ID=80

Windows(PowerShell)

gcloud ai endpoints deploy-model ENDPOINT_ID`
  --region=LOCATION_ID `
  --model=MODEL_ID `
  --display-name=DEPLOYED_MODEL_NAME \
  --min-replica-count=MIN_REPLICA_COUNT `
  --max-replica-count=MAX_REPLICA_COUNT `
  --traffic-split=0=20,OLD_DEPLOYED_MODEL_ID=80

Windows(cmd.exe)

gcloud ai endpoints deploy-model ENDPOINT_ID^
  --region=LOCATION_ID ^
  --model=MODEL_ID ^
  --display-name=DEPLOYED_MODEL_NAME \
  --min-replica-count=MIN_REPLICA_COUNT ^
  --max-replica-count=MAX_REPLICA_COUNT ^
  --traffic-split=0=20,OLD_DEPLOYED_MODEL_ID=80
 

REST

모델 배포

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

  • LOCATION_ID: Vertex AI를 사용하는 리전
  • PROJECT_ID: 프로젝트 ID
  • ENDPOINT_ID: 엔드포인트의 ID
  • MODEL_ID: 배포할 모델의 ID
  • DEPLOYED_MODEL_NAME: DeployedModel의 이름. DeployedModelModel 표시 이름도 사용할 수 있습니다.
  • MACHINE_TYPE: 선택사항. 이 배포의 각 노드에 사용되는 머신 리소스입니다. 기본 설정은 n1-standard-2입니다. 머신 유형에 대해 자세히 알아보세요.
  • ACCELERATOR_TYPE: 머신에 연결할 가속기 유형. ACCELERATOR_COUNT가 지정되지 않았거나 0인 경우 선택사항입니다. GPU가 아닌 이미지를 사용하는 AutoML 모델 또는 커스텀 학습 모델에 사용하지 않는 것이 좋습니다. 여기서 자세히 알아보세요.
  • ACCELERATOR_COUNT: 사용할 각 복제본의 가속기 수. 선택사항. GPU가 아닌 이미지를 사용하는 AutoML 모델 또는 커스텀 학습 모델의 경우 0이거나 지정되지 않은 상태여야 합니다.
  • MIN_REPLICA_COUNT: 이 배포의 최소 노드 수. 예측 로드 시 필요에 따라 최대 노드 수까지 노드 수를 늘리거나 줄일 수 있으며 이 노드 수 미만으로는 줄일 수 없습니다. 값은 1 이상이어야 합니다.
  • MAX_REPLICA_COUNT: 이 배포의 최대 노드 수. 예측 로드 시 필요에 따라 이 노드 수까지 노드 수를 늘리거나 줄일 수 있으며 최소 노드 수 미만으로는 줄일 수 없습니다.
  • TRAFFIC_SPLIT_THIS_MODEL: 이 작업과 함께 배포되는 모델로 라우팅될 이 엔드포인트에 대한 예측 트래픽 비율입니다. 기본값은 100입니다. 모든 트래픽 비율의 합은 100이 되어야 합니다. 트래픽 분할에 대해 자세히 알아보기
  • DEPLOYED_MODEL_ID_N: (선택사항) 다른 모델이 이 엔드포인트에 배포된 경우 모든 비율의 합이 100이 되도록 트래픽 분할 비율을 업데이트해야 합니다.
  • TRAFFIC_SPLIT_MODEL_N: 배포된 모델 ID 키의 트래픽 분할 비율 값
  • PROJECT_NUMBER: 프로젝트의 자동으로 생성된 프로젝트 번호

HTTP 메서드 및 URL:

POST https://LOCATION_ID-aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION_ID/endpoints/ENDPOINT_ID:deployModel

JSON 요청 본문:

{
  "deployedModel": {
    "model": "projects/PROJECT/locations/us-central1/models/MODEL_ID",
    "displayName": "DEPLOYED_MODEL_NAME",
    "dedicatedResources": {
       "machineSpec": {
         "machineType": "MACHINE_TYPE",
         "acceleratorType": "ACCELERATOR_TYPE",
         "acceleratorCount": "ACCELERATOR_COUNT"
       },
       "minReplicaCount": MIN_REPLICA_COUNT,
       "maxReplicaCount": MAX_REPLICA_COUNT
     },
  },
  "trafficSplit": {
    "0": TRAFFIC_SPLIT_THIS_MODEL,
    "DEPLOYED_MODEL_ID_1": TRAFFIC_SPLIT_MODEL_1,
    "DEPLOYED_MODEL_ID_2": TRAFFIC_SPLIT_MODEL_2
  },
}

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

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

{
  "name": "projects/PROJECT_ID/locations/LOCATION/endpoints/ENDPOINT_ID/operations/OPERATION_ID",
  "metadata": {
    "@type": "type.googleapis.com/google.cloud.aiplatform.v1.DeployModelOperationMetadata",
    "genericMetadata": {
      "createTime": "2020-10-19T17:53:16.502088Z",
      "updateTime": "2020-10-19T17:53:16.502088Z"
    }
  }
}

Java

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

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

import com.google.api.gax.longrunning.OperationFuture;
import com.google.cloud.aiplatform.v1.DedicatedResources;
import com.google.cloud.aiplatform.v1.DeployModelOperationMetadata;
import com.google.cloud.aiplatform.v1.DeployModelResponse;
import com.google.cloud.aiplatform.v1.DeployedModel;
import com.google.cloud.aiplatform.v1.EndpointName;
import com.google.cloud.aiplatform.v1.EndpointServiceClient;
import com.google.cloud.aiplatform.v1.EndpointServiceSettings;
import com.google.cloud.aiplatform.v1.MachineSpec;
import com.google.cloud.aiplatform.v1.ModelName;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.ExecutionException;

public class DeployModelCustomTrainedModelSample {

  public static void main(String[] args)
      throws IOException, ExecutionException, InterruptedException {
    // TODO(developer): Replace these variables before running the sample.
    String project = "PROJECT";
    String endpointId = "ENDPOINT_ID";
    String modelName = "MODEL_NAME";
    String deployedModelDisplayName = "DEPLOYED_MODEL_DISPLAY_NAME";
    deployModelCustomTrainedModelSample(project, endpointId, modelName, deployedModelDisplayName);
  }

  static void deployModelCustomTrainedModelSample(
      String project, String endpointId, String model, String deployedModelDisplayName)
      throws IOException, ExecutionException, InterruptedException {
    EndpointServiceSettings settings =
        EndpointServiceSettings.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 (EndpointServiceClient client = EndpointServiceClient.create(settings)) {
      MachineSpec machineSpec = MachineSpec.newBuilder().setMachineType("n1-standard-2").build();
      DedicatedResources dedicatedResources =
          DedicatedResources.newBuilder().setMinReplicaCount(1).setMachineSpec(machineSpec).build();

      String modelName = ModelName.of(project, location, model).toString();
      DeployedModel deployedModel =
          DeployedModel.newBuilder()
              .setModel(modelName)
              .setDisplayName(deployedModelDisplayName)
              // `dedicated_resources` must be used for non-AutoML models
              .setDedicatedResources(dedicatedResources)
              .build();
      // key '0' assigns traffic for the newly deployed model
      // Traffic percentage values must add up to 100
      // Leave dictionary empty if endpoint should not accept any traffic
      Map<String, Integer> trafficSplit = new HashMap<>();
      trafficSplit.put("0", 100);
      EndpointName endpoint = EndpointName.of(project, location, endpointId);
      OperationFuture<DeployModelResponse, DeployModelOperationMetadata> response =
          client.deployModelAsync(endpoint, deployedModel, trafficSplit);

      // You can use OperationFuture.getInitialFuture to get a future representing the initial
      // response to the request, which contains information while the operation is in progress.
      System.out.format("Operation name: %s\n", response.getInitialFuture().get().getName());

      // OperationFuture.get() will block until the operation is finished.
      DeployModelResponse deployModelResponse = response.get();
      System.out.format("deployModelResponse: %s\n", deployModelResponse);
    }
  }
}

Python

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

def deploy_model_with_dedicated_resources_sample(
    project,
    location,
    model_name: str,
    machine_type: str,
    endpoint: Optional[aiplatform.Endpoint] = None,
    deployed_model_display_name: Optional[str] = None,
    traffic_percentage: Optional[int] = 0,
    traffic_split: Optional[Dict[str, int]] = None,
    min_replica_count: int = 1,
    max_replica_count: int = 1,
    accelerator_type: Optional[str] = None,
    accelerator_count: Optional[int] = None,
    explanation_metadata: Optional[explain.ExplanationMetadata] = None,
    explanation_parameters: Optional[explain.ExplanationParameters] = None,
    metadata: Optional[Sequence[Tuple[str, str]]] = (),
    sync: bool = True,
):
    """
    model_name: A fully-qualified model resource name or model ID.
          Example: "projects/123/locations/us-central1/models/456" or
          "456" when project and location are initialized or passed.
    """

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

    model = aiplatform.Model(model_name=model_name)

    # The explanation_metadata and explanation_parameters should only be
    # provided for a custom trained model and not an AutoML model.
    model.deploy(
        endpoint=endpoint,
        deployed_model_display_name=deployed_model_display_name,
        traffic_percentage=traffic_percentage,
        traffic_split=traffic_split,
        machine_type=machine_type,
        min_replica_count=min_replica_count,
        max_replica_count=max_replica_count,
        accelerator_type=accelerator_type,
        accelerator_count=accelerator_count,
        explanation_metadata=explanation_metadata,
        explanation_parameters=explanation_parameters,
        metadata=metadata,
        sync=sync,
    )

    model.wait()

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

Node.js

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

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

const automl = require('@google-cloud/automl');
const client = new automl.v1beta1.AutoMlClient();

/**
 * Demonstrates using the AutoML client to create a model.
 * TODO(developer): Uncomment the following lines before running the sample.
 */
// const projectId = '[PROJECT_ID]' e.g., "my-gcloud-project";
// const computeRegion = '[REGION_NAME]' e.g., "us-central1";
// const datasetId = '[DATASET_ID]' e.g., "TBL2246891593778855936";
// const tableId = '[TABLE_ID]' e.g., "1991013247762825216";
// const columnId = '[COLUMN_ID]' e.g., "773141392279994368";
// const modelName = '[MODEL_NAME]' e.g., "testModel";
// const trainBudget = '[TRAIN_BUDGET]' e.g., "1000",
// `Train budget in milli node hours`;

// A resource that represents Google Cloud Platform location.
const projectLocation = client.locationPath(projectId, computeRegion);

// Get the full path of the column.
const columnSpecId = client.columnSpecPath(
  projectId,
  computeRegion,
  datasetId,
  tableId,
  columnId
);

// Set target column to train the model.
const targetColumnSpec = {name: columnSpecId};

// Set tables model metadata.
const tablesModelMetadata = {
  targetColumnSpec: targetColumnSpec,
  trainBudgetMilliNodeHours: trainBudget,
};

// Set datasetId, model name and model metadata for the dataset.
const myModel = {
  datasetId: datasetId,
  displayName: modelName,
  tablesModelMetadata: tablesModelMetadata,
};

// Create a model with the model metadata in the region.
client
  .createModel({parent: projectLocation, model: myModel})
  .then(responses => {
    const initialApiResponse = responses[1];
    console.log(`Training operation name: ${initialApiResponse.name}`);
    console.log('Training started...');
  })
  .catch(err => {
    console.error(err);
  });

예측 로깅의 기본 설정을 변경하는 방법을 알아보세요.

작업 상태 가져오기

일부 요청은 완료하는 데 시간이 걸리는 장기 실행 작업을 시작합니다. 이러한 요청은 작업 상태를 보거나 작업을 취소하는 데 사용할 수 있는 작업 이름을 반환합니다. Vertex AI는 장기 실행 작업을 호출하는 도우미 메서드를 제공합니다. 자세한 내용은 장기 실행 작업 다루기를 참조하세요.

제한사항

  • VPC 서비스 제어가 사용 설정된 경우 배포된 모델의 컨테이너가 인터넷에 액세스할 수 없습니다.

모델 배포 구성

모델 배포 시 온라인 예측을 실행하는 방법에 대해 다음과 같은 중요한 사항을 결정해야 합니다.

생성된 리소스 리소스 생성 시 지정된 설정
엔드포인트 예측을 실행할 위치
모델 사용할 컨테이너(ModelContainerSpec)
DeployedModel 온라인 예측에 사용할 머신

모델 또는 엔드포인트를 처음 생성한 후에는 위의 목록 설정을 업데이트할 수 없으며 온라인 예측 요청에서 이 설정을 재정의할 수 없습니다. 이러한 설정을 변경해야 하는 경우 모델을 다시 배포해야 합니다.

모델을 배포하면 발생하는 일

엔드포인트에 모델을 배포할 때 온라인 예측을 제공할 수 있도록 실제(머신) 리소스를 모델에 연결합니다. 온라인 예측은 지연 시간 요구사항이 낮습니다. 모델에 리소스를 미리 제공하면 지연 시간이 줄어듭니다.

모델의 학습 유형(AutoML 또는 커스텀) 및 (AutoML) 데이터 유형은 모델에 사용할 수 있는 물리적 리소스의 종류를 결정합니다. 모델 배포 후에는 새 배포를 만들지 않고 이러한 리소스 중 일부를 mutate할 수 있습니다.

엔드포인트 리소스는 예측을 요청하는 데 사용하는 서비스 엔드포인트(URL)를 제공합니다. 예를 들면 다음과 같습니다.

https://us-central1-aiplatform.googleapis.com/v1/projects/{project}/locations/{location}/endpoints/{endpoint}:predict

동일한 엔드포인트에 둘 이상의 모델을 배포하는 이유

2개의 모델을 동일한 엔드포인트에 배포하면 한 모델을 다른 모델로 점진적으로 교체할 수 있습니다. 예를 들어 모델을 사용 중이고 새 학습 데이터로 이 모델의 정확도를 늘릴 수 있는 방법을 찾았다고 가정해보세요. 단, 새로운 엔드포인트 URL을 가리키도록 애플리케이션을 업데이트하거나, 애플리케이션에서 갑작스런 변경사항을 적용하기를 원하지 않습니다. 새 모델을 동일한 엔드포인트에 추가하고 소량의 트래픽을 제공하여 새 모델이 트래픽의 100%를 처리할 때까지 점진적으로 트래픽을 분할을 늘릴 수 있습니다.

리소스는 엔드포인트가 아니라 모델과 연결되어 있으므로 여러 유형의 모델을 동일한 엔드포인트에 배포할 수 있습니다. 하지만 특정 유형의 모델(예: AutoML 텍스트, AutoML 테이블 형식, 커스텀 학습)을 엔드포인트에 배포하는 것이 가장 좋습니다. 이 구성은 더 쉽게 관리할 수 있습니다.

둘 이상의 엔드포인트에 하나의 모델을 배포하는 이유

테스트 및 프로덕션과 같은 여러 애플리케이션 환경에 대해 여러 리소스의 모델을 배포할 수 있습니다. 예측 요청에 대해 여러 SLO를 지원할 수도 있습니다. 애플리케이션 중 하나의 성능 요구사항이 다른 애플리케이션보다 훨씬 높을 수 있습니다. 이 경우 더 많은 머신 리소스를 사용하여 고성능 엔드포인트에 모델을 배포할 수 있습니다. 비용을 최적화하기 위해 머신 리소스를 줄여서 성능이 낮은 엔드포인트에 모델을 배포할 수도 있습니다.

확장 동작

온라인 예측을 위해 ModelDeployedModel로 배포할 때 예측 노드가 자동으로 확장되도록 구성할 수 있습니다. dedicatedResources.maxReplicaCountdedicatedResources.minReplicaCount보다 큰 값으로 설정하면 됩니다.

DeployedModel을 구성할 때 dedicatedResources.minReplicaCount1 이상으로 설정해야 합니다. 즉, 사용하지 않을 때 DeployedModel이 예측 노드 0개로 축소되도록 구성할 수 없습니다.

대상 사용률 및 구성

기본적으로 전용 GPU 리소스 없이 모델을 배포하는 경우 Vertex AI는 CPU 사용량이 기본 60% 목표 값과 일치하도록 복제본 수를 자동으로 확장하거나 축소합니다.

기본적으로 전용 GPU 리소스가 있는 모델을 배포하면(machineSpec.accelerator_count가 0보다 큰 경우) Vertex AI가 자동으로 복제본 수를 확장하거나 CPU 또는 GPU 사용량이 기본값인 60% 목표 값과 일치하도록 값을 낮춰줍니다. 따라서 예측 처리량에 따라 높은 GPU 사용량이 발생하지만 CPU 사용량이 높지 않으면 Vertex AI가 수직 확장되며 CPU 사용률은 매우 낮아서 모니터링에 표시됩니다. 반대로, 커스텀 컨테이너의 GPU 사용률이 낮지만 관련 없는 프로세스에서 CPU 사용률이 60%를 초과하는 경우 QPS와 지연 시간 목표를 달성하는 데 필요하지 않더라도 Vertex AI가 수직 확장됩니다.

autoscalingMetricSpecs을 지정하여 기본 기준점 측정항목과 대상을 재정의할 수 있습니다. CPU 사용량만을 기준으로 배포를 배포하도록 구성하면 GPU 사용량이 많아도 수직 확장되지 않습니다.

리소스 사용량 관리

엔드포인트를 모니터링하여 CPU 및 가속기 사용량, 요청 수, 지연 시간, 현재 및 대상 복제본 수와 같은 측정항목을 추적할 수 있습니다. 이 정보는 엔드포인트의 리소스 사용량 및 확장 동작을 이해하는 데 도움이 될 수 있습니다.

각 복제본은 단일 컨테이너만 실행합니다. 즉, 멀티 코어 머신의 단일 스레드 코드 또는 예측 과정에서 다른 서비스를 호출하는 커스텀 모델과 같이 예측 컨테이너에서 선택한 컴퓨팅 리소스를 완전히 활용하지 못하는 경우, 노드가 수직 확장되지 않을 수 있습니다.

예를 들어 FastAPI 또는 작업자 수와 스레드를 구성할 수 있는 모델 서버를 사용하는 경우 작업자가 2명 이상 있어 리소스 사용률이 증가하는 경우가 많은데, 이렇게 되면 서비스가 복제본 수를 자동으로 확장하는 기능이 향상됩니다.

일반적으로 코어당 하나의 작업자 또는 스레드로 시작하는 것이 좋습니다. 특히 부하가 높은 상태에서 CPU 사용률이 낮거나 CPU 사용률이 낮기 때문에 모델이 확장되지 않는 경우 작업자 수를 늘립니다. 반면 사용률이 너무 높고 지연 시간이 예상보다 긴 경우 작업자를 더 적게 사용해 보세요. 이미 단일 작업자만 사용하는 경우 더 작은 머신 유형을 사용해 보세요.

확장 동작 및 지연

Vertex AI는 이전 5분 동안의 데이터를 사용하여 15초마다 복제본 수를 조정합니다. 15초마다 시스템 사용률을 측정하고 다음 수식을 기준으로 대상 복제본 수를 생성합니다.

target # of replicas = Ceil(current # of replicas * (current utilization / target utilization))

예를 들어 현재 100%에서 사용되는 복제본이 2개 있는 경우 대상은 4입니다.

4 = Ceil(3.33) = Ceil(2 * (100% / 60%))

또 다른 예시로, 현재 복제본이 10개 있고 사용률이 1%로 떨어지면 대상은 1입니다.

1 = Ceil(.167) = Ceil(10 * (1% / 60%))

15초 주기가 끝날 때마다 시스템은 이전 5분 동안 가장 높은 목표 값과 일치하도록 복제본 수를 조정합니다. 가장 높은 목표 값을 선택하면 전체 사용률이 매우 낮더라도 이 5분 기간 동안 사용률이 급증하는 경우 엔드포인트가 축소되지 않습니다. 반면 시스템을 확장해야 하는 경우 평균 값이 아닌 가장 높은 목표 값을 선택하므로 15초 이내에 확장이 수행됩니다.

Vertex AI에서 복제본 수를 조정한 후에도 복제본을 시작하거나 해제하는 데 시간이 걸립니다. 따라서 엔드포인트가 트래픽에 맞게 조정되기 전에 추가 지연이 발생합니다. 이 시간에 기여하는 주요 요소는 다음과 같습니다.

  • Compute Engine VM 프로비저닝 및 시작 시간
  • 레지스트리에서 컨테이너를 다운로드할 시간
  • 스토리지에서 모델을 로드하는 데 걸리는 시간

모델의 실제 확장 동작을 이해하는 가장 좋은 방법은 부하 테스트를 실행하고 모델과 사용 사례에 중요한 특성을 최적화하는 것입니다. 자동 확장 처리가 애플리케이션에 충분히 빠르게 확장되지 않으면 예상 기준 트래픽을 처리하기에 충분한 min_replicas를 프로비저닝하세요.

확장 구성 업데이트

모델을 배포할 때 DedicatedResources 또는 AutomaticResources를 지정한 경우 mutateDeployedModel을 호출하여 모델을 다시 배포하지 않고 확장 구성을 업데이트할 수 있습니다.

예를 들어 다음 요청은 max_replica, autoscaling_metric_specs를 업데이트하고 컨테이너 로깅을 사용 중지합니다.

{
  "deployedModel": {
    "id": "2464520679043629056",
    "dedicatedResources": {
      "maxReplicaCount": 9,
      "autoscalingMetricSpecs": [
        {
          "metricName": "aiplatform.googleapis.com/prediction/online/cpu/utilization",
          "target": 50
        }
      ]
    },
    "disableContainerLogging": true
  },
  "update_mask": {
    "paths": [
      "dedicated_resources.max_replica_count",
      "dedicated_resources.autoscaling_metric_specs",
      "disable_container_logging"
    ]
  }
}

사용 참고사항:

  • 머신 유형을 변경하거나 DedicatedResources에서 AutomaticResources로 또는 다른 방법으로 전환할 수 없습니다. 변경할 수 있는 유일한 확장 구성 필드는 min_replica, max_replica, AutoscalingMetricSpec(DedicatedResources만 해당)입니다.
  • updateMask에 업데이트하려는 모든 필드를 나열해야 합니다. 일부 공개 필드는 무시됩니다.
  • DeployedModelDEPLOYED 상태여야 합니다. 배포된 모델당 활성 변형 작업은 최대 하나만 가능합니다.
  • 또한 mutateDeployedModel을 사용하면 컨테이너 로깅을 사용 설정 또는 사용 중지할 수 있습니다. 자세한 내용은 온라인 예측 로깅을 참조하세요.

다음 단계