AI Platform Prediction: 커스텀 컨테이너 개념

이 문서에서는 AI Platform Prediction의 커스텀 컨테이너를 사용하여 Google Cloud에서 머신러닝(ML) 모델을 제공하는 방법을 설명합니다.

AI Platform Prediction은 Google Cloud의 관리형 ML 모델 제공 플랫폼입니다. 관리형 서비스로서 이 플랫폼은 인프라 설정, 유지보수, 관리를 처리합니다. AI Platform Prediction은 CPU 및 GPU 추론을 모두 지원하며 Compute Engine에서 n1-standard 노드 모양 옵션을 제공하여, 요구사항에 맞게 확장 단위를 맞춤설정할 수 있게 해줍니다.

AI Platform Prediction 서비스를 사용하면 모델 아티팩트를 저장할 위치만 지정하여 모델 서비스를 간소화할 수 있습니다. 그러나 이러한 간소화로 인해 유연성이 떨어집니다. 예를 들어 서비스로 빌드된 프레임워크만 제공할 수 있습니다. 커스텀 컨테이너를 사용하면 AI Platform Prediction에서 추상화 수준을 낮춰 필요한 프레임워크, 모델 서버, 사전 처리, 사후 처리 중 하나를 선택할 수 있습니다.

이 문서는 Google Cloud에서 높은 성능의 모델 제공 플랫폼을 설계, 빌드, 유지 관리하는 ML 엔지니어 및 설계자를 위한 시리즈의 일부입니다.

이 문서에서는 AI Platform Prediction의 커스텀 컨테이너에 중점을 두고 모델 제공 옵션을 설명합니다. 관련 문서는 Triri 추론 서버를 AI Platform Prediction의 커스텀 컨테이너와 통합하는 방법을 중점적으로 설명합니다.

AI Platform Prediction으로 커스텀 컨테이너를 사용해야 하는 경우

Google Cloud는 ML 모델 제공을 위한 몇 가지 옵션을 제공합니다. 예측 요구에 가장 적합한 플랫폼을 선택할 수 있도록 다음 표에서는 여러 요구사항을 기준으로 하는 일반적인 옵션을 보여줍니다.

예측 요구 AI Platform Prediction 기본 AI Platform Prediction 커스텀 컨테이너 Google Kubernetes Engine(GKE) Dataflow(예측 파이프라인으로 사용)
관리형 모델 예측 서비스 아니요
지연 시간이 짧은 동기식 예측 아니요
비동기 스트리밍 분석 아니요 아니요 아니요
일괄 예측 모델 서버에 따름
프레임워크 기본 지원 TensorFlow, scikit-learn, XGBoost 없음. 사용자 컨테이너화 없음. 사용자 컨테이너화 사용자 로드
타사 모델 서버 지원 아니요 사용자 컨테이너화 사용자 컨테이너화 해당 없음
노드 머신 유형 옵션 mls1n1-standard n1-standard GKE에서 지원하는 모든 항목 Dataflow에서 지원하는 모든 항목
GPU 지원
모델 서버 외부의 커스텀 처리 커스텀 예측 루틴 해당 없음

다음 섹션에서는 옵션 평가에 도움이 되는 추가 세부정보를 제공합니다.

활성화

모델이 제공된 후 소비되는 방법을 고려해야 합니다. 트랜잭션 태스크 및 광고 제공과 같은 애플리케이션은 동기식 온라인 예측이 필요하며, 지연 시간에 민감합니다. 고객 평생 가치(CLV) 예측 및 권장사항은 일반적으로 크고 정기적인 배치에서 더 효과적으로 처리됩니다. 예측 유지보수 사용 사례는 일반적으로 원격 분석을 비동기식으로 스트리밍합니다. 이 경우 실패 조건을 식별하기 위해 모델을 사용합니다. 예측 소비자는 원격 분석 송신자가 아닌 집계 애플리케이션일 수 있습니다. 제공 플랫폼 선택은 모델 소비 방법에 따라 다릅니다.

Compute 지원

AI Platform Prediction Basic은 mls1n1-standard 머신 유형을 모두 지원하고, AI Platform Prediction의 커스텀 컨테이너는 n1-standard 머신 유형을 지원합니다. 최고의 성능을 위해서는 n1-standard 머신 유형만 고려해야 합니다.

인프라 수준에서 예측 플랫폼을 관리하는 것이 편안하고 애플리케이션이 스테이트리스(stateless)이고, 요청이 손실되었을 때 다시 시도하도록 설계된 경우, 선점형 노드에 GKE를 사용할 수 있습니다. 선점형 노드는 컴퓨팅 비용을 줄이는 데 도움이 될 수 있습니다. 하지만 선점형 노드는 최대 24시간까지만 지속됩니다. 프로덕션에서 선점형 노드를 사용하려면 노드가 사라져도 괜찮은 워크로드만 배포해야 합니다. 체크포인트가 있고 다시 시작할 수 있는 오프라인 작업이 선점형 노드에 이상적입니다.

타사 모델 서버

Triton Inference Server 또는 Facebook TorchServe와 같은 커스텀 모델 서버가 필요한 경우 컨테이너에서 직접 제공하거나 커스텀 모델 서버를 로드하는 예측 플랫폼을 선택해야 합니다.

프레임워크 기본 지원

AI Platform Prediction Basic은 TensorFlow, XGBoost, scikit-learn을 직접 지원하는 관리형 예측 서비스입니다. 지원되는 프레임워크 및 프레임워크 버전이 모델을 직접 지원할 수 있으면 AI Platform Prediction Basic이 권장됩니다.

데이터 사전 처리 및 사후 처리

예측을 위해 모델을 배포할 때 데이터 모양은 모델 학습을 위해 사용된 데이터 모양과 같은 경우가 거의 드뭅니다. 학습 제공 편향으로 알려진 이러한 동적 특성에 따라 모델이 예측 요청을 처리하기 전 데이터를 사전 처리해야 합니다. 또한 예측 결과는 일반적으로 일종의 사후 처리에 사용됩니다. 가능한 경우 모델에 처리 작업을 추가하는 것이 좋습니다. TensorFlow와 같은 프레임워크는 제공 그래프에 작업을 추가할 수 있도록 지원합니다. 홉이 감소하기 때문에 환경이 단순화될 뿐만 아니라 성능이 향상됩니다.

일부 경우에는 모델 그래프에 처리를 사용하지 못할 수 있습니다. 예를 들어 XGBoost로 사전 처리를 사용 중이거나 사전 처리가 PyTorch에서 학습된 모델이지만 분류자가 TensorFlow에서 학습된 모델일 수 있습니다. AI Platform Prediction의 커스텀 예측 루틴을 통해 이러한 종류의 사전 처리 코드를 삽입할 수 있지만 성능을 위해서는 커스텀 컨테이너를 사용하는 것이 좋습니다. 커스텀 예측 루틴이 홉을 더 추가할 뿐만 아니라, 이 추가 홉은 성능이 낮은 mls1 유형입니다.

AI Platform Prediction의 커스텀 컨테이너를 위한 아키텍처

다음 다이어그램은 AI Platform Prediction의 커스텀 컨테이너의 핵심 구성요소를 보여줍니다.

핵심 구성요소에는 컨테이너 이미지, 사후 처리 또는 사전 처리 코드, 모델, 모델 저장소가 포함됩니다.

다음 섹션에서는 앞의 다이어그램에 있는 중요한 개념을 설명합니다.

기본 이미지

모델 서버의 기본 이미지 또는 모델 서버의 기본 이미지에서 파생된 이미지인 커스텀 컨테이너 이미지(A)를 제공합니다. AI Platform Prediction: NVIDIA Triton Inference Server의 직접 모델 서버 설정에서 제공된 예시에서 모델 서버는 Triton Inference Server입니다.

사전 처리 및 사후 처리 코드

커스텀 라우팅 또는 처리와 같은 특수 코드(B)가 필요한 경우 새로운 Dockerfile을 사용하여 아티팩트를 컨테이너에 통합합니다. 사전 처리 코드는 들어오는 요청을 리슨하고 사전 처리를 적용한 후 사전 처리된 요청을 모델 서버로 전달합니다. 모든 사후 처리 코드가 실행되고 결과를 클라이언트에 반환해야 합니다.

모델 저장소

모델이 저장되는 위치를 선택할 때는 두 가지 옵션이 있습니다.

  • Cloud Storage에서 모델 아티팩트에 경로를 지정합니다. 모델 서버가 Cloud Storage에서 직접 읽기를 수행할 수 있으면 이 (C) 옵션이 선호됩니다. 새 컨테이너를 만들 필요 없이 새 모델 버전을 배포할 수 있습니다.
  • 모델 아티팩트를 컨테이너에 직접 복사합니다.(D) 옵션은 Cloud Storage에서 직접 읽기를 수행할 수 없는 모델 서버를 위한 것입니다. 이 옵션을 사용하려면 새 모델 버전을 배포할 때마다 새 컨테이너가 필요합니다.

모델

AI Platform Prediction은 모델 및 모델 버전을 기준으로 하는 아키텍처 패러다임을 사용합니다. 여기서 모델은 모델 버전의 논리적 그룹입니다. 이 패러다임의 일반적인 용도는 지속적인 학습입니다. 이 경우 특정 모델을 위해 설계된 애플리케이션에 이 모델이 사용되지만, 모델이 다시 학습될 때는 새로운 모델 버전이 채택됩니다.

모델 버전

AI Platform Prediction에서 모델 버전은 특정 데이터 세트, 구성, 초매개변수로 학습된 모델의 인스턴스입니다. AI Platform Prediction에서 모델 버전은 변경할 수 없는 것으로 처리됩니다. 새 데이터 세트로 모델을 다시 학습시키는 것과 같이 모델을 업데이트해야 할 경우에는 새 모델 버전을 만들고 이를 출시해야 합니다. 모델 버전은 카나리아 출시를 단순화하는 데 도움이 됩니다. 모델 버전이 모델 내에 존재하기 때문에 모델 버전을 만들기 전에 모델을 만들어야 합니다.

커스텀 컨테이너

커스텀 컨테이너(E)는 모델 버전의 인스턴스입니다. 커스텀 컨테이너 이미지에서 커스텀 컨테이너를 만듭니다.

추론 클라이언트

모델 서버를 구성하면 추론 클라이언트(F)가 AI Platform Prediction과 통신합니다.

커스텀 컨테이너 패턴

이 시리즈에서는 커스텀 컨테이너를 위해 두 가지 일반 아키텍처 패턴인 직접 모델 서버 패턴과 리스너 포함 모델 서버 패턴을 다룹니다. 리스너 패턴에는 커스텀 사전 처리 및 사후 처리가 포함될 수 있습니다. 요구에 가장 적합한 모델 제공 패턴을 선택할 수 있도록 다음 표에서는 각 패턴에서 지원되는 몇 가지 사용 사례를 설명합니다.

예측 요구 직접 모델 서버 리스너가 있는 모델 서버
배포 간소화 아니요
가능한 가장 짧은 지연 시간 처리에 따라 다름
단일 모델 지원
다중 모델 스태킹 아니요
모델 서버 외부에 있는 복잡한 사전 처리 및 사후 처리 아니요
맞춤설정 가능 또는 다중 라우팅 옵션 아니요

다음 섹션에서는 두 가지 컨테이너 패턴을 설명합니다.

직접 모델 서버

직접 모델 서버 패턴은 다음 다이어그램에 표시된 것처럼 중간 연결 없이 AI Platform에서 모델 서버로 직접 액세스를 제공합니다.

모델 서버가 커스텀 컨테이너에 저장되고 직접 액세스됩니다.

이 패턴은 다음이 필요할 유용합니다.

  • 하나의 예측 경로. 모델 서버에 따라 둘 이상의 모델을 지원하기 위해서는 여러 경로가 필요할 수 있습니다. 모델을 하나만 제공하거나 예측 경로 하나만 사용하여 모델 서버를 관리할 수 있는 경우, 직접 모델 서버 패턴이 가장 적합한 옵션입니다. 이 패턴은 일반적으로 가장 쉽게 구성할 수 있습니다.
  • 짧은 지연 시간 AI Platform과 모델 서버 간의 직접 커뮤니케이션은 중재로 인한 잠재적인 지연을 제거합니다.
  • 모델에서 사전 처리 및 사후 처리를 캡슐화하는 기능. TensorFlow와 같은 프레임워크를 사용하면 컴퓨팅 그래프에 사전 처리 및 사후 처리 작업을 추가할 수 있습니다. 일반적으로 이 접근 방식은 프로세스 간 메모리 마샬링이 최소화되기 때문에 사전 처리 및 사후 처리를 수행하기에 가장 효과적인 방법입니다. Triton 추론 서버와 같은 일부 모델 서버는 조합 모델링을 제공합니다. 여기에서 한 모델의 출력은 다른 모델의 입력이 될 수 있습니다. 이러한 기능을 통해 모델 서버 내에서 업스트림 사전 처리 및 다운스트림 사후 처리가 허용됩니다.

리스너가 있는 모델 서버

이 패턴에서는 다음 다이어그램에 표시된 것과 같이 AI Platform과 모델 서버 사이의 리스너를 설정합니다.

커스텀 컨테이너는 모든 사전 처리 및 사후 처리 코드를 포함하는 모델 서버와 리스너를 저장합니다.

이 패턴은 다음을 처리해야 할 때 유용합니다.

  • 복잡한 라우팅 또는 멀티 모드 스태킹. 일부 모델 서버는 동일한 인스턴스에서 여러 모델을 지원하며 모델에 액세스하기 위해 개별 경로가 필요합니다. 예측 경로를 통해 다중화하기 위해서는 일반적으로 리스너가 필요하며, 대상 경로 정보가 헤더와 같은 다른 장소에 삽입되어야 합니다.
  • 복잡한 사전 처리 및 사후 처리. 사전 처리 및 사후 처리 논리를 포함할 수 없는 일부 프레임워크에서는 추론 프로세스 외부에서의 처리가 필요합니다. 또한 사전 처리 단계에서 다른 서비스에 대해 외부 호출을 수행해야 하는 시나리오도 존재합니다. 이러한 패턴은 그래프에 포함하는 것이 어렵거나 불가능합니다.
  • 추론 형식 변환 리스너를 사용해 형식을 변환하면 여러 모델 서버에서 다양한 형식을 지원할 수 있습니다.

리스너는 모델 서버와 AI Platform 간의 중개자이므로 프로세스에 지연 시간을 더한다는 것을 알아야 합니다. 이러한 지연 시간은 큰 모델보다 가벼운 모델에서 더 큰 영향을 미칩니다. 예를 들어 큰 딥 러닝 모델의 추론 시간이 50밀리초(ms)이고 사전 처리를 20ms로 추가하는 경우 20ms는 40% 증가입니다. 가벼운 XGBoost 모델의 추론 시간 10ms에 동일한 20ms를 추가하면 해당 20ms는 200% 증가입니다.

모델 및 모델 버전 계획

AI Platform Prediction은 모델 아티팩트를 프로젝트 모델 버전 계층으로 구성합니다. 예를 들어 한 회사에 여러 개의 Google Cloud 프로젝트가 있을 수 있습니다. 각 프로젝트에는 여러 개의 모델이 포함될 수 있습니다. 각 모델에는 1개 이상의 모델 버전이 포함될 수 있습니다. 이러한 구조는 다음과 같습니다.

  • 조직 예시
    • SalesOps 프로젝트
      • CustomerPropensity 모델
        • v20201131 모델 버전
        • v20201107 모델 버전
        • v20201009 모델 버전

모델 및 모델 버전에 대한 자세한 내용은 예측 개요를 참조하세요.

모델 버전을 만들기 전 모델을 만들어야 합니다. 다음은 모델을 만들기 위한 REST 요청의 형식입니다.

POST -d "{'name': 'MODEL_NAME'}" \
    ENDPOINT/projects/PROJECT_ID/models/

이 요청에는 다음 값이 포함됩니다.

  • MODEL_NAME: 만들려는 모델의 이름입니다(예시: buyer_recommendation).
  • ENDPOINT: https://ml.googleapis.com/v1의 AI Platform 서비스
  • PROJECT_ID: 이 모델을 만들려는 Google Cloud 프로젝트입니다.

다음 POST 요청으로 이 모델에 후속 모델 버전을 만들 수 있습니다.

POST -d @version_spec.json \
    ENDPOINT/projects/PROJECT_ID/models/MODEL_NAME/versions

자세한 내용은 AI Platform Prediction 참조의 REST 명령어를 참조하세요.

다음은 Triton 추론 서버의 샘플 version_spec.json 파일입니다.

{
  "name": "v3",
  "deployment_uri": "gs://model-artifacts-source-location",
  "container": {
    "image": "gcr.io/my_project/triton:20.06",
    "args": ["tritonserver",
             "--model-repository=$AIP_STORAGE_URI"
    ],
    "env": [
    ],
    "ports": [
      { "containerPort": 8000 }
    ]
  },
  "routes": {
    "predict": "/v2/models/$AIP_MODEL_NAME/infer",
    "health": "/v2/models/$AIP_MODEL_NAME"
  },
  "machine_type": "n1-standard4",
  "acceleratorConfig": {
    "count":1,
    "type":"nvidia-tesla-t4"
  },
  "autoScale": {
    "minNodes":1
  }
}

다음 표에서는 앞의 JSON 사양에 포함된 요소들에 대해 설명합니다.

요소(* = 필수) 설명
name* 모델 버전 이름입니다.
deployment_uri Cloud Storage에서 모델의 위치입니다. 모델 버전이 생성되었으면 AI Platform이 이 위치에서 아티팩트를 복사하고 AIP_STORAGE_URI 환경 변수를 통해 이를 제공합니다.
container:image* 컨테이너 이미지에 대한 경로입니다.
container:args 컨테이너가 시작될 때 사용된 명령어 및 인수입니다.
container:env 환경 변수입니다. 이러한 사용자 제공 환경 변수는 런타임에 컨테이너에 제공됩니다.
container:ports* AI Platform이 컨테이너와 통신하기 위해 사용하는 네트워크 포트입니다. 포트가 지정되지 않은 경우 기본 포트는 8080입니다.
routes:predict

AI Platform이 컨테이너로 예측 요청을 전달하기 위해 사용하는 컨테이너 엔드포인트 경로입니다. 이 요소가 없으면 엔드포인트 경로가 기본적으로 다음과 같이 지정됩니다.

/v1/models/$AIP_MODEL_NAME/version/$AIP_VERSION_NAME:predict

routes:health

AI Platform에서 모델 버전 컨테이너의 상태를 확인하기 위해 사용되는 컨테이너 엔드포인트 경로입니다. HTTP GET가 있는 컨테이너의 200 HTTP 상태 코드를 나타내는 성공 응답 이후에만 트래픽이 모델 버전의 이 인스턴스에 전달됩니다. 이 요소를 지정하지 않으면 엔드포인트 경로가 기본적으로 다음과 같이 지정됩니다.

/v1/models/$AIP_MODEL_NAME/version/$AIP_VERSION_NAME

machine_type* 추론 노드의 가상 머신 유형입니다.
acceleratorConfig:Count GPU가 필요한 경우 각 노드의 GPU 수입니다.
acceleratorConfig:Type GPU가 필요한 경우 GPU의 유형입니다.
autoScale:minNodes 자동 확장 모드의 최소 노드입니다. 이 요소는 manualScale 요소와 함께 사용될 수 없습니다.
manualScale:nodes 수동 확장 모드의 노드 수입니다. 이 요소는 autoScale 요소와 함께 사용될 수 없습니다.

spec.jsonAIP_ 프리픽스가 있는 환경 변수는 모델 버전 컨테이너가 생성된 후에만 존재합니다. 이전 샘플 version_spec.json 파일에서 다음을 고려합니다.

  • $AIP_STORAGE_URI. 모델 버전을 만들면 AI Platform이 deployment_uri에서 모델 아티팩트를 복사합니다. 컨테이너가 온라인으로 전환되면 $AIP_STORAGE_URI에서 해당 모델 애셋을 찾습니다. 이 샘플에서는 Triton 추론 서버 모델 저장소의 플래그를 --model-repository=$AIP_STORAGE_URI로 정의합니다.
  • $AIP_MODEL_NAME. Triton Inference Server와 TorchServe와 같은 모델 서버는 둘 이상의 모델을 동시에 지원하며 요청에 대한 추론을 실행할 모델을 지정하는 요청 엔드포인트 경로를 예상합니다. 이 환경 값은 모델 버전을 만들 때 ${MODEL_NAME}에서 파생됩니다.

다음 표에서는 컨테이너에 제공되는 몇 가지 일반적인 AIP_ 환경 변수에 대해 설명합니다.

환경 변수 설명
AIP_PROJECT_NUMBER 모델이 생성된 프로젝트의 프로젝트 번호입니다.
AIP_MODEL_NAME 모델 버전이 생성된 모델의 이름입니다. 이 이름은 모델을 만들기 위해 사용하는 POST 명령어${MODEL_NAME} 값으로부터 가져옵니다.
AIP_VERSION_NAME 모델 버전의 이름입니다. 모델 버전 이름은 모델을 만들기 위해 사용하는 이전 JSON 사양name 값으로부터 가져옵니다.
AIP_HTTP_PORT AI Platform이 통신하는 커스텀 컨테이너에 있는 리스너의 대상 포트입니다. 리스너는 모델 서버 자체 또는 모델 서버에 업스트림되는 데이터 사전 처리와 같은 중간 단계일 수 있습니다. 이 포트는 이전 JSON 사양container:ports에서 가져옵니다.
AIP_PREDICT_ROUTE 커스텀 컨테이너와 통신할 때 AI Platform이 예측 요청을 전달하는 경로입니다. 이 경로는 이전 JSON 사양routes:predict에서 가져옵니다.
AIP_HEALTH_ROUTE AI Platform이 커스텀 컨테이너 상태를 확인하기 위해 사용하는 경로입니다. 이 경로는 이전 JSON 사양routes:health에서 가져옵니다.
AIP_STORAGE_URI 이전 JSON 사양deployment_uri에서 모델 애셋이 복사된 위치입니다. 이 환경 변수는 모델 서버가 모델 아티팩트를 찾는 위치를 정의합니다.

다음 단계