이 튜토리얼에서는 Google Kubernetes Engine(GKE)에서 NVIDIA Triton Inference Server 및 TensorFlow Serving을 사용하여 GPU를 사용하는 대규모 언어 모델(LLM)을 배포하고 서빙하는 방법을 보여줍니다. 이를 통해 관리형 Kubernetes 환경에서 추론을 위한 실제 LLM 배포를 이해하고 탐색할 수 있습니다. 사전 빌드된 컨테이너를 단일 L4 Tensor Core GPU가 있는 GKE 클러스터에 배포하고 온라인 추론을 수행하도록 GKE 인프라를 준비합니다.
이 튜토리얼은 GKE 클러스터에서 사전 학습된 머신러닝(ML) 모델을 호스팅하려는 머신러닝(ML) 엔지니어, 플랫폼 관리자 및 운영자, 데이터 및 AI 전문가를 대상으로 합니다. Google Cloud콘텐츠에서 참조하는 일반적인 역할 및 예시 태스크에 대해 자세히 알아보려면 일반 GKE 사용자 역할 및 태스크를 참조하세요.
이 페이지를 읽기 전 다음 내용을 숙지해야 합니다.
목표
- GKE Autopilot 또는 Standard 클러스터를 만듭니다.
- 선행 학습된 모델이 포함되는 Cloud Storage 버킷을 구성합니다.
- 선택한 온라인 추론 프레임워크를 배포합니다.
- 배포된 서비스에 테스트 요청을 수행합니다.
비용
이 튜토리얼에서는 비용이 청구될 수 있는 다음과 같은 Google Cloud구성요소를 사용합니다.- GKE
- Cloud Storage
- L4 GPU 가속기
- 이그레스 트래픽
가격 계산기를 사용하여 예상 사용량을 기준으로 예상 비용을 산출합니다.
이 튜토리얼을 마치면 만든 리소스를 삭제하여 비용이 계속 청구되지 않도록 할 수 있습니다. 자세한 내용은 삭제를 참조하세요.
시작하기 전에
프로젝트 설정
- Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
-
In the Google Cloud console, on the project selector page, click Create project to begin creating a new Google Cloud project.
-
Verify that billing is enabled for your Google Cloud project.
-
Enable the GKE API.
-
In the Google Cloud console, on the project selector page, click Create project to begin creating a new Google Cloud project.
-
Verify that billing is enabled for your Google Cloud project.
-
Enable the GKE API.
Google Cloud 콘솔에서 Cloud Shell 인스턴스를 시작합니다.
Cloud Shell 열기이 샘플 앱의 소스 코드를 다운로드합니다.
git clone https://github.com/GoogleCloudPlatform/kubernetes-engine-samples cd kubernetes-engine-samples/ai-ml/gke-online-serving-single-gpu
기본 환경 변수를 설정합니다.
gcloud config set project PROJECT_ID gcloud config set compute/region COMPUTE_REGION
다음 값을 바꿉니다.
- PROJECT_ID: Google Cloud 프로젝트 ID
- COMPUTE_REGION: 사용하려는 가속기 유형을 지원하는 Compute Engine 리전입니다(예: L4 GPU의 경우
us-central1
).
Cloud Shell에서 다음 변수를 만듭니다.
export PROJECT_ID=$(gcloud config get project) export REGION=$(gcloud config get compute/region) export K8S_SA_NAME=gpu-k8s-sa export GSBUCKET=$PROJECT_ID-gke-bucket export MODEL_NAME=mnist export CLUSTER_NAME=online-serving-cluster
다음 명령어를 실행하여 GKE Standard 클러스터를 만듭니다.
gcloud container clusters create ${CLUSTER_NAME} \ --project=${PROJECT_ID} \ --location=${REGION} \ --workload-pool=${PROJECT_ID}.svc.id.goog \ --addons GcsFuseCsiDriver \ --release-channel=rapid \ --num-nodes=1
클러스터 만들기는 몇 분 정도 걸릴 수 있습니다.
다음 명령어를 실행하여 노드 풀을 만듭니다.
gcloud container node-pools create gpupool \ --accelerator type=nvidia-l4,count=1,gpu-driver-version=latest \ --project=${PROJECT_ID} \ --location=${REGION} \ --node-locations=${REGION}-a \ --cluster=${CLUSTER_NAME} \ --machine-type=g2-standard-8 \ --num-nodes=1
GKE는 노드마다 L4 GPU 하나가 포함된 단일 노드 풀을 만듭니다.
- Google Cloud 서비스 계정을 만듭니다.
- 클러스터에 Kubernetes ServiceAccount를 만듭니다.
- Kubernetes ServiceAccount를 Google Cloud 서비스 계정에 바인딩합니다.
Google Cloud 콘솔에서 서비스 계정 만들기 페이지로 이동합니다.
서비스 계정 ID 필드에
gke-ai-sa
를 입력합니다.만들고 계속하기를 클릭합니다.
역할 목록에서 Cloud Storage > Storage Insights 수집기 서비스 역할을 선택합니다.
다른 역할 추가를 클릭합니다.
역할 선택 목록에서 Cloud Storage > 스토리지 객체 관리자 역할을 선택합니다.
계속을 클릭한 다음 완료를 클릭합니다.
Kubernetes 네임스페이스를 만듭니다.
kubectl create namespace gke-ai-namespace
네임스페이스에 Kubernetes ServiceAccount를 만듭니다.
kubectl create serviceaccount gpu-k8s-sa --namespace=gke-ai-namespace
Google Cloud 서비스 계정에 IAM 바인딩을 추가합니다.
gcloud iam service-accounts add-iam-policy-binding gke-ai-sa@PROJECT_ID.iam.gserviceaccount.com \ --role roles/iam.workloadIdentityUser \ --member "serviceAccount:PROJECT_ID.svc.id.goog[gke-ai-namespace/gpu-k8s-sa]"
--member
플래그는 Google Cloud에서 Kubernetes ServiceAccount의 전체 ID를 제공합니다.Kubernetes ServiceAccount에 주석을 추가합니다.
kubectl annotate serviceaccount gpu-k8s-sa \ --namespace gke-ai-namespace \ iam.gke.io/gcp-service-account=gke-ai-sa@PROJECT_ID.iam.gserviceaccount.com
Cloud Shell에서 사전 학습된 ML 모델을 Cloud Storage 버킷에 복사합니다.
gcloud storage cp src/triton-model-repository gs://$GSBUCKET --recursive
배포를 사용하여 프레임워크를 배포합니다. 배포는 클러스터에서 노드 간에 배포되는 여러 포드 복제본을 실행할 수 있는 Kubernetes API 객체입니다.
envsubst < src/gke-config/deployment-triton.yaml | kubectl --namespace=gke-ai-namespace apply -f -
GKE가 프레임워크를 배포했는지 검증합니다.
kubectl get deployments --namespace=gke-ai-namespace
프레임워크가 준비되었으면 출력이 다음과 비슷합니다.
NAME READY UP-TO-DATE AVAILABLE AGE triton-deployment 1/1 1 1 5m29s
배포에 액세스하도록 서비스를 배포합니다.
kubectl apply --namespace=gke-ai-namespace -f src/gke-config/service-triton.yaml
외부 IP가 할당되었는지 확인합니다.
kubectl get services --namespace=gke-ai-namespace
출력은 다음과 비슷합니다.
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes ClusterIP 34.118.224.1 <none> 443/TCP 60m triton-server LoadBalancer 34.118.227.176 35.239.54.228 8000:30866/TCP,8001:31035/TCP,8002:30516/TCP 5m14s
EXTERNAL-IP 열에서
triton-server
의 IP 주소를 기록해 둡니다.서비스 및 배포가 올바르게 작동하는지 확인합니다.
curl -v EXTERNAL_IP:8000/v2/health/ready
출력은 다음과 비슷합니다.
... < HTTP/1.1 200 OK < Content-Length: 0 < Content-Type: text/plain ...
Cloud Shell에서 사전 학습된 ML 모델을 Cloud Storage 버킷에 복사합니다.
gcloud storage cp src/tfserve-model-repository gs://$GSBUCKET --recursive
배포를 사용하여 프레임워크를 배포합니다. 배포는 클러스터에서 노드 간에 배포되는 여러 포드 복제본을 실행할 수 있는 Kubernetes API 객체입니다.
envsubst < src/gke-config/deployment-tfserve.yaml | kubectl --namespace=gke-ai-namespace apply -f -
GKE가 프레임워크를 배포했는지 검증합니다.
kubectl get deployments --namespace=gke-ai-namespace
프레임워크가 준비되었으면 출력이 다음과 비슷합니다.
NAME READY UP-TO-DATE AVAILABLE AGE tfserve-deployment 1/1 1 1 5m29s
배포에 액세스하도록 서비스를 배포합니다.
kubectl apply --namespace=gke-ai-namespace -f src/gke-config/service-tfserve.yaml
외부 IP가 할당되었는지 확인합니다.
kubectl get services --namespace=gke-ai-namespace
출력은 다음과 비슷합니다.
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes ClusterIP 34.118.224.1 <none> 443/TCP 60m tfserve-server LoadBalancer 34.118.227.176 35.239.54.228 8500:30003/TCP,8000:32194/TCP 5m14s
EXTERNAL-IP 열에서
tfserve-server
의 IP 주소를 기록해 둡니다.서비스 및 배포가 올바르게 작동하는지 확인합니다.
curl -v EXTERNAL_IP:8000/v1/models/mnist
EXTERNAL_IP
를 외부 IP 주소로 바꿉니다.출력은 다음과 비슷합니다.
... < HTTP/1.1 200 OK < Content-Type: application/json < Date: Thu, 12 Oct 2023 19:01:19 GMT < Content-Length: 154 < { "model_version_status": [ { "version": "1", "state": "AVAILABLE", "status": { "error_code": "OK", "error_message": "" } } ] }
Cloud Shell에서 Python 가상 환경을 만듭니다.
python -m venv ./mnist_client source ./mnist_client/bin/activate
필요한 Python 패키지를 설치합니다.
pip install -r src/client/triton-requirements.txt
이미지를 로드하여 Triton 추론 서버를 테스트합니다.
cd src/client python triton_mnist_client.py -i EXTERNAL_IP -m mnist -p ./images/TEST_IMAGE.png
다음을 바꿉니다.
EXTERNAL_IP
: 외부 IP 주소입니다.TEST_IMAGE
: 테스트하려는 이미지에 해당하는 파일의 이름입니다.src/client/images
에 저장된 이미지를 사용할 수 있습니다.
사용하는 이미지에 따라 출력이 다음과 비슷합니다.
Calling Triton HTTP Service -> Prediction result: 7
Cloud Shell에서 Python 가상 환경을 만듭니다.
python -m venv ./mnist_client source ./mnist_client/bin/activate
필요한 Python 패키지를 설치합니다.
pip install -r src/client/tfserve-requirements.txt
몇 가지 이미지로 TensorFlow Serving을 테스트합니다.
cd src/client python tfserve_mnist_client.py -i EXTERNAL_IP -m mnist -p ./images/TEST_IMAGE.png
EXTERNAL_IP
: 외부 IP 주소입니다.TEST_IMAGE
:0
~9
사이의 값입니다.src/client/images
에 저장된 이미지를 사용할 수 있습니다.- GKE 클러스터 유지: 클러스터의 Kubernetes 리소스와 Google Cloud 리소스를 삭제합니다.
- Google Cloud 프로젝트 유지: GKE 클러스터와 Google Cloud 리소스를 삭제합니다.
- 프로젝트 삭제
- 배포한 Kubernetes 네임스페이스와 워크로드를 삭제합니다.
Cloud Storage 버킷을 삭제합니다.
버킷 페이지로 이동합니다.
PROJECT_ID-gke-bucket
의 체크박스를 선택합니다.삭제를 클릭합니다.
삭제를 확인하려면
DELETE
를 입력하고 삭제를 클릭합니다.
Google Cloud 서비스 계정을 삭제합니다.
서비스 계정 페이지로 이동합니다.
프로젝트를 선택합니다.
gke-gpu-sa@PROJECT_ID.iam.gserviceaccount.com
의 체크박스를 선택합니다.삭제를 클릭합니다.
삭제를 확인하려면 삭제를 클릭합니다.
GKE 클러스터를 삭제합니다.
클러스터 페이지로 이동합니다.
online-serving-cluster
의 체크박스를 선택합니다.삭제를 클릭합니다.
삭제를 확인하려면
online-serving-cluster
를 입력하고 삭제를 클릭합니다.
Cloud Storage 버킷을 삭제합니다.
버킷 페이지로 이동합니다.
PROJECT_ID-gke-bucket
의 체크박스를 선택합니다.삭제를 클릭합니다.
삭제를 확인하려면
DELETE
를 입력하고 삭제를 클릭합니다.
Google Cloud 서비스 계정을 삭제합니다.
서비스 계정 페이지로 이동합니다.
프로젝트를 선택합니다.
gke-gpu-sa@PROJECT_ID.iam.gserviceaccount.com
의 체크박스를 선택합니다.삭제를 클릭합니다.
삭제를 확인하려면 삭제를 클릭합니다.
- In the Google Cloud console, go to the Manage resources page.
- In the project list, select the project that you want to delete, and then click Delete.
- In the dialog, type the project ID, and then click Shut down to delete the project.
Google Cloud CLI 기본값 설정
GKE 클러스터 만들기
GKE Autopilot 또는 Standard 클러스터의 단일 GPU에서 모델을 서빙할 수 있습니다. 완전 관리형 Kubernetes 환경을 위해서는 Autopilot 클러스터를 사용하는 것이 좋습니다. GKE Autopilot를 사용해서 리소스가 모델 요청에 따라 자동으로 확장됩니다.
워크로드에 가장 적합한 GKE 작업 모드를 선택하려면 GKE 작업 모드 선택을 참조하세요.
Autopilot
다음 명령어를 실행하여 GKE Autopilot 클러스터를 만듭니다.
gcloud container clusters create-auto ${CLUSTER_NAME} \
--location=${REGION} \
--project=${PROJECT_ID} \
--release-channel=rapid
GKE는 배포된 워크로드의 요청에 따라 CPU 및 GPU 노드를 사용하여 Autopilot 클러스터를 만듭니다.
Standard
Cloud Storage 버킷 만들기
제공되는 선행 학습된 모델을 저장하기 위한 Cloud Storage 버킷을 만듭니다.
Cloud Shell에서 다음을 실행합니다.
gcloud storage buckets create gs://$GSBUCKET
GKE용 워크로드 아이덴티티 제휴를 사용하여 버킷에 액세스하도록 클러스터 구성
클러스터가 Cloud Storage 버킷에 액세스하도록 하려면 다음을 수행합니다.
Google Cloud 서비스 계정을 만듭니다.
클러스터에 Kubernetes ServiceAccount 만들기
Cloud Shell에서 다음을 수행합니다.
Kubernetes ServiceAccount를 Google Cloud 서비스 계정에 바인딩
Cloud Shell에서 다음 명령어를 실행합니다.
온라인 추론 서버 배포
각 온라인 추론 프레임워크는 특정 형식으로 사전 학습된 ML 모델을 찾습니다. 다음 섹션에서는 사용하려는 프레임워크에 따라 추론 서버를 배포하는 방법을 보여줍니다.
Triton
TF 제공
모델 제공
Triton
TF 제공
다음을 바꿉니다.
사용하는 이미지에 따라 다음과 비슷한 출력이 표시됩니다.
Calling TensorFlow Serve HTTP Service -> Prediction result: 5
모델 성능 관찰
Triton
모델 성능을 모니터링하려면 Cloud Monitoring에 통합된 Triton 대시보드를 사용할 수 있습니다. 이 대시보드를 통해 토큰 처리량, 요청 지연 시간, 오류율 등의 주요 성능 측정항목을 확인할 수 있습니다.
Triton 대시보드를 사용하려면 GKE 클러스터에서 Google Cloud Managed Service for Prometheus를 사용 설정해야 합니다. 이 서비스는 GKE 클러스터의 Triton에서 측정항목을 수집합니다. Triton은 기본적으로 Prometheus 형식으로 측정항목을 노출하므로, 별도의 내보내기 도구를 설치할 필요가 없습니다.
이후에는 Triton 대시보드를 통해 측정항목을 확인할 수 있습니다. Google Cloud Managed Service for Prometheus를 사용하여 모델에서 측정항목을 수집하는 방법은 Cloud Monitoring 문서의 Triton 모니터링 가능성 가이드를 참조하세요.TF 제공
모델 성능을 모니터링하려면 Cloud Monitoring에 통합된 TF Serving 대시보드를 사용할 수 있습니다. 이 대시보드를 통해 토큰 처리량, 요청 지연 시간, 오류율 등의 주요 성능 측정항목을 확인할 수 있습니다.
TF Serving 대시보드를 사용하려면 GKE 클러스터에서 Google Cloud Managed Service for Prometheus를 사용 설정해야 합니다. 이 서비스는 GKE 클러스터의 TF Serving에서 측정항목을 수집합니다.
그런 다음 TF Serving 대시보드를 사용하여 측정항목을 볼 수 있습니다. Google Cloud Managed Service for Prometheus를 사용하여 모델에서 측정항목을 수집하는 방법은 Cloud Monitoring 문서의 TF Serving 모니터링 가능성 가이드를 참조하세요.삭제
이 가이드에서 만든 리소스에 대해 Google Cloud 계정에 비용이 청구되지 않도록 하려면 다음 중 하나를 수행합니다.
클러스터의 Kubernetes 리소스 및 Google Cloud 리소스 삭제
Triton
kubectl -n gke-ai-namespace delete -f src/gke-config/service-triton.yaml
kubectl -n gke-ai-namespace delete -f src/gke-config/deployment-triton.yaml
kubectl delete namespace gke-ai-namespace
TF 제공
kubectl -n gke-ai-namespace delete -f src/gke-config/service-tfserve.yaml
kubectl -n gke-ai-namespace delete -f src/gke-config/deployment-tfserve.yaml
kubectl delete namespace gke-ai-namespace