NVIDIA NIM을 사용하여 GKE에 AI 모델 배포

1. 소개

이 실습 Codelab에서는 NVIDIA NIM™ 마이크로서비스의 기능을 사용하여 Google Kubernetes Engine (GKE)에 컨테이너화된 AI 모델을 배포하고 관리하는 방법을 안내합니다.

이 튜토리얼은 다음을 원하는 개발자와 데이터 과학자를 대상으로 합니다.

  • AI 추론 배포 간소화: 사전 빌드된 NIM을 사용하여 GKE에서 AI 모델을 프로덕션에 더 빠르고 쉽게 배포하는 방법을 알아봅니다.
  • NVIDIA GPU에서 성능 최적화: GKE 클러스터 내 GPU에서 최적화된 추론을 위해 NVIDIA TensorRT를 사용하는 NIM을 배포하는 실습을 진행합니다.
  • AI 추론 워크로드 확장: Kubernetes를 사용하여 컴퓨팅 리소스를 자동 확장하고 관리하여 수요에 따라 NIM 배포를 확장하는 방법을 알아봅니다.

2. 학습할 내용

이 튜토리얼을 마치면 다음을 경험하게 됩니다.

  1. GKE에 NIM 배포: 다양한 추론 작업을 위해 사전 빌드된 NVIDIA NIM을 GKE 클러스터에 배포합니다.
  2. NIM 배포 관리: kubectl 명령어를 사용하여 배포된 NIM을 관리, 모니터링, 확장합니다.
  3. 추론 워크로드 확장: 트래픽 수요에 따라 NIM 배포를 자동 확장하기 위해 Kubernetes 기능을 활용합니다.

3. 구성요소 알아보기

Google Kubernetes Engine (GKE)의 GPU

GPU를 사용하면 머신러닝 및 데이터 처리와 같이 노드에서 실행되는 특정 워크로드를 가속화할 수 있습니다. GKE는 NVIDIA H100, L4, A100 GPU가 있는 머신 유형을 포함하여 노드 구성에 사용되는 다양한 머신 유형 옵션을 제공합니다.

NVIDIA NIM

NVIDIA NIM은 모든 클라우드 또는 데이터 센터에서 기본 모델의 배포를 가속화하고 데이터를 안전하게 유지하는 데 도움이 되는 사용하기 쉬운 추론 마이크로서비스 세트입니다.

NVIDIA AI Enterprise

NVIDIA AI Enterprise는 데이터 과학 파이프라인을 가속화하고 프로덕션 등급 코파일럿 및 기타 생성형 AI 애플리케이션의 개발 및 배포를 간소화하는 엔드 투 엔드 클라우드 네이티브 소프트웨어 플랫폼입니다. GCP Marketplace를 통해 사용 가능

4. 기본 요건

  • 프로젝트: 결제가 사용 설정된 Google Cloud 프로젝트입니다.
  • 권한: GKE 클러스터 및 기타 관련 리소스를 만들 수 있는 충분한 권한
  • Helm: Helm은 Kubernetes용 패키지 관리자입니다.
  • NVIDIA GPU Operator: GPU를 프로비저닝하는 데 필요한 모든 NVIDIA 소프트웨어 구성요소의 관리를 자동화하는 Kubernetes 부가기능입니다.
  • NVIDIA API 키: 이 링크를 클릭하고 계정을 만들고 API 키를 생성하는 방법에 관한 안내를 따릅니다. NIM 컨테이너를 다운로드하려면 API 키가 필요합니다.
  • NVIDIA GPU: 아래 GPU 중 하나가 작동해야 합니다 (GPU가 충분하지 않은 경우 이 단계에 따라 할당량 상향 조정을 요청하세요).
  • 선택사항 - GCloud SDK:** GCP 포털에서 Cloud Shell을 사용하지 않는 경우 Google Cloud SDK가 설치되고 구성되어 있는지 확인하세요.
  • 선택사항 - kubectl: GCP 포털에서 Cloud Shell을 사용하지 않는 경우 kubectl 명령줄 도구가 설치되고 구성되어 있는지 확인하세요.

5. GPU가 포함된 GKE 클러스터 만들기

  1. Cloud Shell 또는 터미널을 엽니다.
  2. 다음 매개변수를 지정합니다.
    export PROJECT_ID=<YOUR PROJECT ID>
    export REGION=<YOUR REGION>
    export ZONE=<YOUR ZONE>
    export CLUSTER_NAME=nim-demo
    export NODE_POOL_MACHINE_TYPE=g2-standard-16
    export CLUSTER_MACHINE_TYPE=e2-standard-4
    export GPU_TYPE=nvidia-l4
    export GPU_COUNT=1
    

사용 중인 Compute 인스턴스 및 GPU 유형에 따라 NODE_POOL_MACHINE_TYPE, CLUSTER_MACHINE_TYPE, GPU_TYPE 값을 변경해야 할 수 있습니다.

  1. GKE 클러스터를 만듭니다.
    gcloud container clusters create ${CLUSTER_NAME} \
        --project=${PROJECT_ID} \
        --location=${ZONE} \
        --release-channel=rapid \
        --machine-type=${CLUSTER_MACHINE_TYPE} \
        --num-nodes=1
    
  2. GPU 노드 풀을 만듭니다.
    gcloud container node-pools create gpupool \
        --accelerator type=${GPU_TYPE},count=${GPU_COUNT},gpu-driver-version=latest \
        --project=${PROJECT_ID} \
        --location=${ZONE} \
        --cluster=${CLUSTER_NAME} \
        --machine-type=${NODE_POOL_MACHINE_TYPE} \
        --num-nodes=1
    

6. NVIDIA NGC API 키 구성

NGC API 키를 사용하면 NVIDIA NGC에서 맞춤 이미지를 가져올 수 있습니다. 키를 지정하려면 다음 단계를 따르세요.

export NGC_CLI_API_KEY="<YOUR NGC API KEY>"

기본 요건의 일부로 생성된 키입니다.

7. NVIDIA NIM 배포 및 테스트

  1. NIM LLM Helm 차트를 가져옵니다.
    helm fetch https://helm.ngc.nvidia.com/nim/charts/nim-llm-1.3.0.tgz --username='$oauthtoken' --password=$NGC_CLI_API_KEY
    
  2. NIM 네임스페이스를 만듭니다.
    kubectl create namespace nim
    
  3. 보안 비밀을 구성합니다.
    kubectl create secret docker-registry registry-secret --docker-server=nvcr.io --docker-username='$oauthtoken'     --docker-password=$NGC_CLI_API_KEY -n nim
    
    kubectl create secret generic ngc-api --from-literal=NGC_API_KEY=$NGC_CLI_API_KEY -n nim
    
  4. NIM 구성 설정:
    cat <<EOF > nim_custom_value.yaml
    image:
      repository: "nvcr.io/nim/meta/llama3-8b-instruct" # container location
      tag: 1.0.0 # NIM version you want to deploy
    model:
      ngcAPISecret: ngc-api  # name of a secret in the cluster that includes a key named NGC_CLI_API_KEY and is an NGC API key
    persistence:
      enabled: true
    imagePullSecrets:
      -   name: registry-secret # name of a secret used to pull nvcr.io images, see https://kubernetes.io/docs/tasks/    configure-pod-container/pull-image-private-registry/
    EOF
    
  5. NIM 배포 실행:
    helm install my-nim nim-llm-1.1.2.tgz -f nim_custom_value.yaml --namespace nim
    
    NIM 포드가 실행 중인지 확인합니다.
    kubectl get pods -n nim
    
  6. NIM 배포 테스트:
    NIM 서비스가 성공적으로 배포되었는지 확인한 후 추론 요청을 보내 NIM 서비스에서 어떤 유형의 피드백을 받게 되는지 확인할 수 있습니다. 이를 위해 포트 8000의 localhost에서 NIM에 액세스할 수 있도록 서비스에서 포트 전달을 사용 설정합니다.
    kubectl port-forward service/my-nim-nim-llm 8000:8000 -n nim
    
    다음으로 Cloud Shell에서 다른 터미널이나 탭을 열고 다음 요청을 시도할 수 있습니다.
    curl -X 'POST' \
      'http://localhost:8000/v1/chat/completions' \
      -H 'accept: application/json' \
      -H 'Content-Type: application/json' \
      -d '{
      "messages": [
        {
          "content": "You are a polite and respectful chatbot helping people plan a vacation.",
          "role": "system"
        },
        {
          "content": "What should I do for a 4 day vacation in Spain?",
          "role": "user"
        }
      ],
      "model": "meta/llama3-8b-instruct",
      "max_tokens": 128,
      "top_p": 1,
      "n": 1,
      "stream": false,
      "stop": "\n",
      "frequency_penalty": 0.0
    }'
    
    NIM 서비스에서 채팅 완료를 받았다면 서비스가 예상대로 작동하고 있는 것입니다.

8. 삭제

GKE 클러스터를 삭제합니다.

gcloud container clusters delete $CLUSTER_NAME --zone=$ZONE

9. 다음 단계

자세한 내용은 다음 도움말을 참고하세요.