온라인 예측에 비공개 엔드포인트 사용

Vertex AI로 온라인 예측을 제공하기 위해 비공개 엔드포인트를 사용하면 Vertex AI 온라인 예측 서비스에 대해 지연 시간이 짧은 안전한 연결을 제공합니다. 이 가이드에서는 VPC 네트워크 피어링을 사용하여 Vertex AI 온라인 예측 서비스와 네트워크를 피어링하도록 Vertex AI에 비공개 엔드포인트를 구성하는 방법을 보여줍니다.

개요

비공개 엔드포인트로 온라인 예측을 제공하기 전에 네트워크와 Vertex AI 간에 피어링 연결을 생성하도록 비공개 서비스 액세스를 구성해야 합니다. 이미 설정한 경우 기존 피어링 연결을 사용할 수 있습니다.

이 가이드에서는 다음 작업을 설명합니다.

  • 기존 피어링 연결 상태 확인
  • 필요한 API가 사용 설정되어 있는지 확인합니다.
  • 비공개 엔드포인트 만들기
  • 비공개 엔드포인트에 모델 배포
    • 비공개 엔드포인트당 하나의 모델만 지원합니다. 하나의 엔드포인트에 배포된 여러 모델 간에 트래픽을 분할할 수 있는 공개 Vertex AI 엔드포인트와는 다릅니다.
    • 비공개 엔드포인트는 AutoML 테이블 형식 및 커스텀 학습 모델을 지원합니다.
  • 비공개 엔드포인트에 예측 보내기
  • 리소스 삭제

기존 피어링 연결 상태를 확인합니다.

Vertex AI와 함께 사용하는 기존 피어링 연결이 있는 경우 이러한 연결을 나열하여 상태를 확인할 수 있습니다.

gcloud compute networks peerings list --network NETWORK_NAME

피어링 연결 상태가 ACTIVE인지 확인합니다. 활성 피어링 연결에 대해 자세히 알아보세요.

필요한 API를 사용 설정합니다.

gcloud services enable aiplatform.googleapis.com
gcloud services enable dns.googleapis.com

비공개 엔드포인트 만들기

비공개 엔드포인트를 만들려면 Google Cloud CLI를 사용하여 엔드포인트를 만들--network 플래그를 추가합니다.

gcloud beta ai endpoints create \
  --display-name=ENDPOINT_DISPLAY_NAME \
  --network=FULLY_QUALIFIED_NETWORK_NAME \
  --region=REGION

NETWORK_NAME을 정규화된 네트워크 이름으로 바꿉니다.

projects/PROJECT_NUMBER/global/networks/NETWORK_NAME

네트워크를 지정하지 않고 엔드포인트를 만드는 경우 공개 엔드포인트를 만듭니다.

비공개 엔드포인트 제한사항

비공개 엔드포인트에 대해 다음과 같은 제한사항에 유의하세요.

  • 비공개 엔드포인트는 현재 트래픽 분할을 지원하지 않습니다. 이 문제를 해결하려면 모델을 여러 비공개 엔드포인트에 배포하고 각 비공개 엔드포인트의 결과 예측 URL 간에 트래픽을 분할하여 수동으로 트래픽 분할을 만들면 됩니다.
  • 비공개 엔드포인트는 SSL/TLS를 지원하지 않습니다.
  • 비공개 엔드포인트에서 액세스 로깅을 사용 설정하려면 vertex-ai-feedback@google.com으로 문의하세요.
  • Google Cloud 프로젝트의 모든 비공개 엔드포인트에 네트워크 하나만 사용할 수 있습니다. 다른 네트워크로 변경하려면 vertex-ai-feedback@google.com으로 문의하세요.
  • 복구 가능한 오류 시 클라이언트 측 재시도가 적극 권장됩니다. 여기에는 다음 오류가 포함될 수 있습니다.
    • 일시적인 연결 중단으로 인한 것일 수 있는 빈 응답(HTTP 오류 코드 0)
    • 일시적으로 서비스를 사용할 수 없음을 나타내는 HTTP 오류 코드 5xx
  • 시스템이 현재 과부하되었음을 나타내는 HTTP 오류 코드 429의 경우 이 문제를 완화하기 위해 재시도하는 대신 트래픽 속도를 줄이는 것이 좋습니다.
  • Vertex AI Python 클라이언트 라이브러리에서 PredictionServiceClient의 예측 요청은 지원되지 않습니다.

비공개 엔드포인트 모니터링

측정항목 대시보드를 사용하여 비공개 엔드포인트로 전송된 트래픽의 가용성과 지연 시간을 검사할 수 있습니다.

모니터링을 맞춤설정하려면 Cloud Monitoring에서 다음 두 측정항목을 쿼리합니다.

  • aiplatform.googleapis.com/prediction/online/private/response_count

    예측 응답 수입니다. deployed_model_id 또는 HTTP 응답 코드를 기준으로 이 측정항목을 필터링할 수 있습니다.

  • aiplatform.googleapis.com/prediction/online/private/prediction_latencies

    예측 요청 지연 시간(밀리초)입니다. 성공적인 요청에 대해서만 이 측정항목을 deployed_model_id 기준으로 필터링할 수 있습니다.

측정항목 탐색기에서 이러한 측정항목을 선택, 쿼리, 표시하는 방법을 알아보세요.

모델 배포

새 모델을 가져오거나 이미 업로드한 기존 모델을 배포할 수 있습니다. 새 모델을 업로드하려면 gcloud ai models upload를 사용합니다. 자세한 내용은 Vertex AI로 모델 가져오기를 참조하세요.

  1. 비공개 엔드포인트에 모델을 배포하려면 모델 배포 가이드를 참조하세요. 트래픽 분할과 수동으로 액세스 로깅 사용 설정 외에도 커스텀 학습 모델을 배포하는 데 사용할 수 있는 다른 옵션을 사용할 수 있습니다. 공개 엔드포인트와의 차이점에 대한 자세한 내용은 비공개 엔드포인트 제한사항을 참조하세요.

  2. 엔드포인트를 배포한 후 비공개 엔드포인트의 메타데이터에서 예측 URI를 가져올 수 있습니다.

    1. 비공개 엔드포인트의 표시 이름이 있으면 다음 명령어를 실행하여 엔드포인트 ID를 가져옵니다.

      ENDPOINT_ID=$(gcloud ai endpoints list \
                --region=REGION \
                --filter=displayName:ENDPOINT_DISPLAY_NAME \
                --format="value(ENDPOINT_ID.scope())")
      

      그렇지 않고 모든 엔드포인트의 엔드포인트 ID 및 표시 이름을 보려면 다음 명령어를 실행합니다.

      gcloud ai endpoints list --region=REGION
      
    2. 마지막으로 다음 명령어를 실행하여 예측 URI를 가져옵니다.

      gcloud beta ai endpoints describe ENDPOINT_ID \
        --region=REGION \
        --format="value(deployedModels.privateEndpoints.predictHttpUri)"
      

비공개 예측 URI 형식

예측 URI는 Vertex AI 공개 엔드포인트와 비교하여 비공개 엔드포인트와 다르게 보입니다.

http://ENDPOINT_ID.aiplatform.googleapis.com/v1/models/DEPLOYED_MODEL_ID:predict

현재 모델을 배포 취소하고 새 모델로 다시 배포하기로 선택하면 도메인 이름이 재사용되지만 경로에는 배포된 다른 모델 ID가 포함됩니다.

비공개 엔드포인트로 예측 보내기

  1. VPC 네트워크에 Compute Engine 인스턴스를 만듭니다. Vertex AI와 피어링한 동일한 VPC 네트워크에 인스턴스를 만들어야 합니다.

  2. Compute Engine 인스턴스에 SSH를 통해 연결하고 예측 클라이언트(해당하는 경우)를 설치합니다. 그렇지 않은 경우 curl을 사용할 수 있습니다.

  3. 예측할 때 모델 배포에서 가져온 예측 URL을 사용합니다. 이 예시에서는 같은 VPC 네트워크에 있는 Compute Engine 인스턴스의 예측 클라이언트에서 요청을 보냅니다.

    curl -X POST -d@PATH_TO_JSON_FILE  http://ENDPOINT_ID.aiplatform.googleapis.com/v1/models/DEPLOYED_MODEL_ID:predict
    

    이 샘플 요청에서 PATH_TO_JSON_FILE은 JSON 파일로 저장되는 예측 요청의 경로입니다. 예: example-request.json

리소스 삭제

공개 모델 및 엔드포인트와 동일한 방식으로 모델 배포를 취소하고 비공개 엔드포인트를 삭제할 수 있습니다. 이후에 이러한 리소스를 직접 삭제하더라도 Google Cloud 프로젝트당 네트워크 하나에서만 비공개 엔드포인트를 만들 수 있습니다. 다른 네트워크로 전환해야 하면 vertex-ai-feedback@google.com으로 문의하세요.

예시: 공유 VPC에서 비공개 엔드포인트 테스트

이 예시에서는 공유 VPC 네트워크와 함께 2개의 Google Cloud 프로젝트를 사용합니다.

  • 호스트 프로젝트는 공유 VPC 네트워크를 호스팅합니다.
  • 클라이언트 프로젝트는 예측 요청을 보내기 위해 Compute Engine 인스턴스에서 curl과 같은 예측 클라이언트 또는 자체 REST 클라이언트를 실행하는 Compute Engine 인스턴스를 호스팅합니다.

클라이언트 프로젝트에서 Compute Engine 인스턴스를 만들 때 인스턴스는 호스트 프로젝트의 공유 VPC 네트워크에 있는 커스텀 서브넷 내에 있어야 하며 모델이 배포되는 동일한 리전에 있어야 합니다.

  1. 호스트 프로젝트에서 비공개 서비스 액세스를 위한 피어링 연결을 만듭니다. gcloud services vpc-peerings connect를 실행합니다.

    gcloud services vpc-peerings connect \
      --service=servicenetworking.googleapis.com \
      --network=HOST_SHARED_VPC_NAME \
      --ranges=PREDICTION_RESERVED_RANGE_NAME \
      --project=HOST_PROJECT_ID
    
  2. 호스트 프로젝트의 네트워크 이름을 사용하여 클라이언트 프로젝트에 엔드포인트를 만듭니다. gcloud beta ai endpoints create을 실행합니다.

    gcloud beta ai endpoints create \
      --display-name=ENDPOINT_DISPLAY_NAME \
      --network=HOST_SHARED_VPC_NAME \
      --region=REGION \
      --project=CLIENT_PROJECT_ID
    
  3. 클라이언트 프로젝트 내에서 예측 클라이언트를 사용하여 예측 요청을 보냅니다.

예시: 비RFC 1918 서브넷을 사용하는 비공개 엔드포인트

이 예시에서는 비RFC 1918 주소를 사용하여 비공개 엔드포인트를 만듭니다.

  1. 노드, 포드, 서비스의 IP 범위를 예약합니다. 노드의 IP 범위는 RFC 1918 범위여야 합니다.

  2. 예약된 범위를 사용하여 비공개 서비스 액세스의 피어링 연결을 만듭니다.

    gcloud services vpc-peerings connect \
      --service=servicenetworking.googleapis.com \
      --network=VPC_NAME \
      --ranges=NODES_RANGE_NAME,PODS_RANGE_NAME,SERVICES_RANGE_NAME \
      --project=PROJECT_ID
    
  3. 노드, 포드, 서비스에 예약된 범위를 지정하여 엔드포인트를 만듭니다. RequestedIpRangeConfig는 REST API에서만 지정될 수 있습니다.

    # Sample json request for endpoint creation.
    {
      displayName: "my_endpoint",
      network: "projects/<project_num>/global/networks/<network>",
      requestedIpRangeConfig: {
        nodesIpRange: {
          ipAddress: "xxx.xx.x.x",
          ipPrefixLength: 22
        },
        podsIpRange: {
          ipAddress: "yyy.yy.y.y",
          ipPrefixLength: 17
        },
        servicesIpRange: {
          ipAddress: "zzz.zz.z.z",
          ipPrefixLength: 22
        }
      }
    }
    
  4. 클라이언트 프로젝트 내에서 예측 클라이언트를 사용하여 예측 요청을 보냅니다.