이 튜토리얼에서는 단일 Google Kubernetes Engine (GKE) 클러스터 내에서 학습 및 추론 제공 워크로드 간에 액셀러레이터 리소스를 효율적으로 공유하는 방법을 보여줍니다. 혼합 워크로드를 단일 클러스터에 분산하면 리소스 사용률이 개선되고, 클러스터 관리가 간소화되며, 액셀러레이터 수량 제한으로 인한 문제가 줄어들고, 전반적인 비용 효율성이 향상됩니다.
이 튜토리얼에서는 추론을 위해 Gemma 2 대규모 언어 모델 (LLM)과 Hugging Face TGI (텍스트 생성 인터페이스) 서빙 프레임워크를 사용하여 우선순위가 높은 서빙 배포를 만들고 우선순위가 낮은 LLM 미세 조정 작업을 만듭니다. 두 워크로드 모두 NVIDIA L4 GPU를 사용하는 단일 클러스터에서 실행됩니다. 오픈소스 Kubernetes 기반 작업 큐 시스템인 Kueue를 사용하여 워크로드를 관리하고 예약합니다. Kueue를 사용하면 서비스 작업을 우선순위로 지정하고 우선순위가 낮은 학습 작업을 선점하여 리소스 사용률을 최적화할 수 있습니다. 서빙 수요가 감소하면 확보된 가속기를 재할당하여 학습 작업을 재개합니다. Kueue 및 우선순위 클래스를 사용하여 프로세스 전반에서 리소스 할당량을 관리합니다.
이 튜토리얼은 GKE 클러스터에서 머신러닝 (ML) 모델을 학습시키고 호스팅하려는 머신러닝 (ML) 엔지니어, 플랫폼 관리자 및 운영자, 데이터 및 AI 전문가를 대상으로 하며, 특히 제한된 수의 액셀러레이터를 사용할 때 비용과 관리 오버헤드를 줄이려는 사용자를 대상으로 합니다. Google Cloud 콘텐츠에서 참조하는 일반적인 역할 및 예시 태스크에 대해 자세히 알아보려면 일반 GKE Enterprise 사용자 역할 및 태스크를 참조하세요.
이 페이지를 읽기 전 다음 내용을 숙지해야 합니다.
목표
이 가이드를 마치면 다음 단계를 수행할 수 있습니다.
- 우선순위가 높은 서빙 배포를 구성합니다.
- 우선순위가 낮은 학습 작업을 설정합니다.
- 다양한 수요에 대응하기 위해 선점 전략을 구현합니다.
- Kueue를 사용하여 학습 작업과 제공 작업 간의 리소스 할당을 관리합니다.
시작하기 전에
- 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, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the required APIs.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the required APIs.
-
Make sure that you have the following role or roles on the project:
roles/container.admin
,roles/iam.serviceAccountAdmin
Check for the roles
-
In the Google Cloud console, go to the IAM page.
Go to IAM - Select the project.
-
In the Principal column, find all rows that identify you or a group that you're included in. To learn which groups you're included in, contact your administrator.
- For all rows that specify or include you, check the Role column to see whether the list of roles includes the required roles.
Grant the roles
-
In the Google Cloud console, go to the IAM page.
IAM으로 이동 - 프로젝트를 선택합니다.
- 액세스 권한 부여를 클릭합니다.
-
새 주 구성원 필드에 사용자 식별자를 입력합니다. 일반적으로 Google 계정의 이메일 주소입니다.
- 역할 선택 목록에서 역할을 선택합니다.
- 역할을 추가로 부여하려면 다른 역할 추가를 클릭하고 각 역할을 추가합니다.
- 저장을 클릭합니다.
-
- Hugging Face 계정이 없는 경우 만듭니다.
- 프로젝트에 L4 GPU 할당량이 충분한지 확인합니다. 자세한 내용은 GPU 정보 및 배정 할당량을 참조하세요.
환경 준비
이 섹션에서는 추론 및 학습 워크로드에 TGI와 모델을 배포하는 데 필요한 리소스를 프로비저닝합니다.
모델 액세스 권한 얻기
GKE에 배포하기 위해 Gemma 모델에 액세스하려면 먼저 라이선스 동의 계약에 서명한 다음 Hugging Face 액세스 토큰을 생성해야 합니다.
- 라이선스 동의 계약에 서명합니다. 모델 동의 페이지에 액세스하고, Hugging Face 계정을 사용하여 동의를 확인하고, 모델 약관에 동의합니다.
액세스 토큰을 생성합니다. Hugging Face를 통해 모델에 액세스하려면 Hugging Face 토큰이 필요합니다. 아직 토큰이 없으면 다음 단계에 따라 새 토큰을 생성합니다.
- 내 프로필 > 설정 > 액세스 토큰을 클릭합니다.
- 새 토큰을 선택합니다.
- 원하는 이름과
Read
이상의 역할을 지정합니다. - 토큰 생성을 선택합니다.
- 클립보드에 생성된 토큰을 복사합니다.
Cloud Shell 실행
이 튜토리얼에서는 Cloud Shell을 사용하여Google Cloud에서 호스팅되는 리소스를 관리합니다. Cloud Shell에는 kubectl
,
gcloud CLI, Terraform 등 이 튜토리얼에 필요한 소프트웨어가 사전 설치되어 있습니다.
Cloud Shell로 환경을 설정하려면 다음 단계를 따르세요.
Google Cloud 콘솔의 경우 Google Cloud 콘솔에서
Cloud Shell 활성화를 클릭하여 Cloud Shell 세션을 시작합니다. 그러면 Google Cloud 콘솔 하단 창에서 세션이 실행됩니다.
기본 환경 변수를 설정합니다.
gcloud config set project PROJECT_ID export PROJECT_ID=$(gcloud config get project)
PROJECT_ID를 Google Cloud 프로젝트 ID로 바꿉니다.
GitHub에서 샘플 코드를 복제합니다. Cloud Shell에서 다음 명령어를 실행합니다.
git clone https://github.com/GoogleCloudPlatform/kubernetes-engine-samples/ cd kubernetes-engine-samples/ai-ml/mix-train-and-inference export EXAMPLE_HOME=$(pwd)
GKE 클러스터 만들기
혼합 워크로드에 Autopilot 또는 Standard 클러스터를 사용할 수 있습니다. 완전 관리형 Kubernetes 환경을 위해서는 Autopilot 클러스터를 사용하는 것이 좋습니다. 워크로드에 가장 적합한 GKE 작업 모드를 선택하려면 GKE 작업 모드 선택을 참고하세요.
Autopilot
Cloud Shell에서 기본 환경 변수를 설정합니다.
export HF_TOKEN=HF_TOKEN export REGION=REGION export CLUSTER_NAME="llm-cluster" export PROJECT_NUMBER=$(gcloud projects list \ --filter="$(gcloud config get-value project)" \ --format="value(PROJECT_NUMBER)") export MODEL_BUCKET="model-bucket-$PROJECT_ID"
다음 값을 바꿉니다.
- HF_TOKEN: 앞에서 생성한 Hugging Face 토큰입니다.
- REGION: 사용하려는 가속기 유형을 지원하는 리전(예: L4 GPU의 경우
us-central1
)입니다.
MODEL_BUCKET 변수를 조정할 수 있습니다. 이 변수는 학습된 모델 가중치를 저장하는 Cloud Storage 버킷을 나타냅니다.
Autopilot 클러스터를 만듭니다.
gcloud container clusters create-auto ${CLUSTER_NAME} \ --project=${PROJECT_ID} \ --location=${REGION} \ --release-channel=rapid
미세 조정 작업을 위한 Cloud Storage 버킷을 만듭니다.
gcloud storage buckets create gs://${MODEL_BUCKET} \ --location ${REGION} \ --uniform-bucket-level-access
Cloud Storage 버킷에 대한 액세스 권한을 부여하려면 다음 명령어를 실행합니다.
gcloud storage buckets add-iam-policy-binding "gs://$MODEL_BUCKET" \ --role=roles/storage.objectAdmin \ --member=principal://iam.googleapis.com/projects/$PROJECT_NUMBER/locations/global/workloadIdentityPools/$PROJECT_ID.svc.id.goog/subject/ns/llm/sa/default \ --condition=None
클러스터의 인증 사용자 인증 정보를 가져오려면 다음 명령어를 실행합니다.
gcloud container clusters get-credentials llm-cluster \ --location=$REGION \ --project=$PROJECT_ID
배포의 네임스페이스를 만듭니다. Cloud Shell에서 다음 명령어를 실행합니다.
kubectl create ns llm
표준
Cloud Shell에서 기본 환경 변수를 설정합니다.
export HF_TOKEN=HF_TOKEN export REGION=REGION export CLUSTER_NAME="llm-cluster" export GPU_POOL_MACHINE_TYPE="g2-standard-24" export GPU_POOL_ACCELERATOR_TYPE="nvidia-l4" export PROJECT_NUMBER=$(gcloud projects list \ --filter="$(gcloud config get-value project)" \ --format="value(PROJECT_NUMBER)") export MODEL_BUCKET="model-bucket-$PROJECT_ID"
다음 값을 바꿉니다.
- HF_TOKEN: 앞에서 생성한 Hugging Face 토큰입니다.
- REGION: 사용하려는 가속기 유형을 지원하는 리전(예: L4 GPU의 경우
us-central1
)입니다.
다음 변수를 조정할 수 있습니다.
- GPU_POOL_MACHINE_TYPE: 선택한 리전에서 사용하려는 노드 풀 머신 시리즈입니다. 이 값은 선택한 가속기 유형에 따라 달라집니다. 자세한 내용은 GKE에서 GPU를 사용할 때의 제한사항을 참고하세요. 예를 들어 이 튜토리얼에서는 노드당 GPU가 2개 연결된
g2-standard-24
를 사용합니다. 사용 가능한 GPU의 최신 목록은 컴퓨팅 워크로드용 GPU를 참고하세요. - GPU_POOL_ACCELERATOR_TYPE: 선택한 리전에서 지원되는 가속기 유형입니다. 예를 들어 이 튜토리얼에서는
nvidia-l4
을 사용합니다. 사용 가능한 GPU의 최신 목록은 컴퓨팅 워크로드용 GPU를 참고하세요. - MODEL_BUCKET: 학습된 모델 가중치를 저장하는 Cloud Storage 버킷입니다.
표준 클러스터 만들기
gcloud container clusters create ${CLUSTER_NAME} \ --project=${PROJECT_ID} \ --location=${REGION} \ --workload-pool=${PROJECT_ID}.svc.id.goog \ --release-channel=rapid \ --machine-type=e2-standard-4 \ --addons GcsFuseCsiDriver \ --num-nodes=1
추론 및 미세 조정 워크로드용 GPU 노드 풀을 만듭니다.
gcloud container node-pools create gpupool \ --accelerator type=${GPU_POOL_ACCELERATOR_TYPE},count=2,gpu-driver-version=latest \ --project=${PROJECT_ID} \ --location=${REGION} \ --node-locations=${REGION}-a \ --cluster=${CLUSTER_NAME} \ --machine-type=${GPU_POOL_MACHINE_TYPE} \ --num-nodes=3
미세 조정 작업을 위한 Cloud Storage 버킷을 만듭니다.
gcloud storage buckets create gs://${MODEL_BUCKET} \ --location ${REGION} \ --uniform-bucket-level-access
Cloud Storage 버킷에 대한 액세스 권한을 부여하려면 다음 명령어를 실행합니다.
gcloud storage buckets add-iam-policy-binding "gs://$MODEL_BUCKET" \ --role=roles/storage.objectAdmin \ --member=principal://iam.googleapis.com/projects/$PROJECT_NUMBER/locations/global/workloadIdentityPools/$PROJECT_ID.svc.id.goog/subject/ns/llm/sa/default \ --condition=None
클러스터의 인증 사용자 인증 정보를 가져오려면 다음 명령어를 실행합니다.
gcloud container clusters get-credentials llm-cluster \ --location=$REGION \ --project=$PROJECT_ID
배포의 네임스페이스를 만듭니다. Cloud Shell에서 다음 명령어를 실행합니다.
kubectl create ns llm
Hugging Face 사용자 인증 정보용 Kubernetes 보안 비밀 만들기
Hugging Face 토큰이 포함된 Kubernetes 보안 비밀을 만들려면 다음 명령어를 실행합니다.
kubectl create secret generic hf-secret \
--from-literal=hf_api_token=$HF_TOKEN \
--dry-run=client -o yaml | kubectl apply --namespace=llm --filename=-
Kueue 구성
이 튜토리얼에서 Kueue는 중앙 리소스 관리자로, 학습 및 서빙 워크로드 간에 GPU를 효율적으로 공유할 수 있습니다. Kueue는 리소스 요구사항 ('플레이버')을 정의하고, 대기열을 통해 워크로드의 우선순위를 지정하고 (서빙 작업이 학습보다 우선순위가 높음), 수요와 우선순위에 따라 리소스를 동적으로 할당하여 이를 달성합니다. 이 튜토리얼에서는 워크로드 리소스 유형을 사용하여 추론 및 미세 조정 워크로드를 각각 그룹화합니다.
Kueue의 선점 기능은 리소스가 부족할 때 우선순위가 낮은 학습 작업을 일시중지하거나 삭제하여 우선순위가 높은 서비스 워크로드가 항상 필요한 리소스를 확보하도록 합니다.
Kueue로 추론 서버 배포를 제어하려면 pod
통합을 사용 설정하고 kube-system
및 kueue-system
네임스페이스를 제외하도록 managedJobsNamespaceSelector
를 구성합니다.
/kueue
디렉터리에서kustomization.yaml
의 코드를 확인합니다. 이 매니페스트는 맞춤 구성으로 Kueue 리소스 관리자를 설치합니다./kueue
디렉터리에서patch.yaml
의 코드를 확인합니다. 이 ConfigMap은kube-system
및kueue-system
네임스페이스의 포드 관리를 제외하도록 Kueue를 맞춤설정합니다.Cloud Shell에서 다음 명령어를 실행하여 Kueue를 설치합니다.
cd ${EXAMPLE_HOME} kubectl kustomize kueue |kubectl apply --server-side --filename=-
Kueue 포드가 준비될 때까지 기다립니다.
watch kubectl --namespace=kueue-system get pods
출력은 다음과 비슷하게 표시됩니다.
NAME READY STATUS RESTARTS AGE kueue-controller-manager-bdc956fc4-vhcmx 1/1 Running 0 3m15s
/workloads
디렉터리에서flavors.yaml
,cluster-queue.yaml
,local-queue.yaml
파일을 확인합니다. 이러한 매니페스트는 Kueue가 리소스 할당량을 관리하는 방법을 지정합니다.ResourceFlavor
이 매니페스트는 리소스 관리를 위해 Kueue에서 기본 ResourceFlavor를 정의합니다.
ClusterQueue
이 매니페스트는 CPU, 메모리, GPU의 리소스 한도가 있는 Kueue ClusterQueue를 설정합니다.
이 튜토리얼에서는 Nvidia L4 GPU가 2개 연결된 노드를 사용하며, 해당 노드 유형은
g2-standard-24
로 24개의 vCPU와 96GB RAM을 제공합니다. 예시 코드에서는 워크로드의 리소스 사용량을 최대 6개의 GPU로 제한하는 방법을 보여줍니다.ClusterQueue 구성의
preemption
필드는 리소스가 부족할 때 선점할 수 있는 포드를 결정하기 위해 PriorityClasses를 참조합니다.LocalQueue
이 매니페스트는
llm
네임스페이스에lq
라는 Kueue LocalQueue를 만듭니다.default-priorityclass.yaml
,low-priorityclass.yaml
,high-priorityclass.yaml
파일을 확인합니다. 이러한 매니페스트는 Kubernetes 일정 예약의 PriorityClass 객체를 정의합니다.기본 우선순위
낮은 우선순위
높은 우선순위
다음 명령어를 실행하여 해당 매니페스트를 적용하여 Kueue 및 Kubernetes 객체를 만듭니다.
cd ${EXAMPLE_HOME}/workloads kubectl apply --filename=flavors.yaml kubectl apply --filename=default-priorityclass.yaml kubectl apply --filename=high-priorityclass.yaml kubectl apply --filename=low-priorityclass.yaml kubectl apply --filename=cluster-queue.yaml kubectl apply --filename=local-queue.yaml --namespace=llm
TGI 추론 서버 배포
이 섹션에서는 Gemma 2 모델을 제공하기 위해 TGI 컨테이너를 배포합니다.
/workloads
디렉터리에서tgi-gemma-2-9b-it-hp.yaml
파일을 확인합니다. 이 매니페스트는 TGI 서빙 런타임과gemma-2-9B-it
모델을 배포하는 Kubernetes 배포를 정의합니다. 배포는 클러스터에서 노드 간에 배포되는 여러 포드 복제본을 실행할 수 있는 Kubernetes API 객체입니다.배포는 추론 작업을 우선시하고 모델에 두 개의 GPU를 사용합니다.
NUM_SHARD
환경 변수를 설정하여 텐서 동시 로드를 사용하여 모델을 GPU 메모리에 맞춥니다.다음 명령어를 실행하여 매니페스트를 적용합니다.
kubectl apply --filename=tgi-gemma-2-9b-it-hp.yaml --namespace=llm
배포 작업을 완료하는 데 몇 분 정도 걸립니다.
GKE에서 배포를 성공적으로 생성했는지 확인하려면 다음 명령어를 실행합니다.
kubectl --namespace=llm get deployment
출력은 다음과 비슷하게 표시됩니다.
NAME READY UP-TO-DATE AVAILABLE AGE tgi-gemma-deployment 1/1 1 1 5m13s
Kueue 할당량 관리 확인
이 섹션에서는 Kueue가 배포의 GPU 할당량을 올바르게 적용하는지 확인합니다.
Kueue가 Deployment를 인식하는지 확인하려면 다음 명령어를 실행하여 워크로드 객체의 상태를 가져옵니다.
kubectl --namespace=llm get workloads
출력은 다음과 비슷하게 표시됩니다.
NAME QUEUE RESERVED IN ADMITTED FINISHED AGE pod-tgi-gemma-deployment-6bf9ffdc9b-zcfrh-84f19 lq cluster-queue True 8m23s
할당량 한도 재정의를 테스트하려면 배포를 복제본 4개로 확장합니다.
kubectl scale --replicas=4 deployment/tgi-gemma-deployment --namespace=llm
다음 명령어를 실행하여 GKE에서 배포하는 복제본 수를 확인합니다.
kubectl get workloads --namespace=llm
출력은 다음과 비슷하게 표시됩니다.
NAME QUEUE RESERVED IN ADMITTED FINISHED AGE pod-tgi-gemma-deployment-6cb95cc7f5-5thgr-3f7d4 lq cluster-queue True 14s pod-tgi-gemma-deployment-6cb95cc7f5-cbxg2-d9fe7 lq cluster-queue True 5m41s pod-tgi-gemma-deployment-6cb95cc7f5-tznkl-80f6b lq 13s pod-tgi-gemma-deployment-6cb95cc7f5-wd4q9-e4302 lq cluster-queue True 13s
출력은 Kueue가 적용하는 리소스 할당량으로 인해 포드 3개만 허용되었음을 보여줍니다.
다음을 실행하여
llm
네임스페이스의 포드를 표시합니다.kubectl get pod --namespace=llm
출력은 다음과 비슷하게 표시됩니다.
NAME READY STATUS RESTARTS AGE tgi-gemma-deployment-7649884d64-6j256 1/1 Running 0 4m45s tgi-gemma-deployment-7649884d64-drpvc 0/1 SchedulingGated 0 7s tgi-gemma-deployment-7649884d64-thdkq 0/1 Pending 0 7s tgi-gemma-deployment-7649884d64-znvpb 0/1 Pending 0 7s
이제 배포를 다시 1로 축소합니다. 이 단계는 미세 조정 작업을 배포하기 전에 필요합니다. 그렇지 않으면 추론 작업에 우선순위가 있어 허용되지 않습니다.
kubectl scale --replicas=1 deployment/tgi-gemma-deployment --namespace=llm
동작 설명
확장 예시에서는 ClusterQueue 구성에 설정한 GPU 할당량 제한으로 인해 4개로 확장되지만 복제본이 3개만 생성됩니다. ClusterQueue의 spec.resourceGroups
섹션은 nvidia.com/gpu
의 nominalQuota를 '6'으로 정의합니다. Deployment는 각 Pod에 GPU가 '2'개 필요하다고 지정합니다.
따라서 ClusterQueue는 한 번에 최대 3개의 Deployment 복제본만 수용할 수 있습니다 (복제본 3개 * 복제본당 GPU 2개 = 총 할당량인 GPU 6개).
복제본을 4개로 확장하려고 하면 Kueue는 이 작업이 GPU 할당량을 초과한다는 것을 인식하고 네 번째 복제본이 예약되지 않도록 합니다. 이는 네 번째 포드의 SchedulingGated
상태로 표시됩니다. 이 동작은 Kueue의 리소스 할당량 적용을 보여줍니다.
학습 작업 배포
이 섹션에서는 두 개의 포드에 걸쳐 4개의 GPU가 필요한 Gemma 2 모델의 우선순위가 낮은 파인 튜닝 작업을 배포합니다. Kubernetes의 작업 컨트롤러는 하나 이상의 포드를 만들고 특정 태스크를 성공적으로 실행하는지 확인합니다.
이 작업은 ClusterQueue의 나머지 GPU 할당량을 사용합니다. 작업은 사전 빌드된 이미지를 사용하고 중간 결과에서 다시 시작할 수 있도록 체크포인트를 저장합니다.
미세 조정 작업은 b-mc2/sql-create-context
데이터 세트를 사용합니다. 미세 조정 작업의 소스는 저장소에서 확인할 수 있습니다.
fine-tune-l4.yaml
파일을 봅니다. 이 매니페스트는 파인 튜닝 작업을 정의합니다.매니페스트를 적용하여 파인 튜닝 작업을 만듭니다.
cd ${EXAMPLE_HOME}/workloads sed -e "s/<MODEL_BUCKET>/$MODEL_BUCKET/g" \ -e "s/<PROJECT_ID>/$PROJECT_ID/g" \ -e "s/<REGION>/$REGION/g" \ fine-tune-l4.yaml |kubectl apply --filename=- --namespace=llm
배포가 실행 중인지 확인합니다. 워크로드 객체의 상태를 확인하려면 다음 명령어를 실행하세요.
kubectl get workloads --namespace=llm
출력은 다음과 비슷하게 표시됩니다.
NAME QUEUE RESERVED IN ADMITTED FINISHED AGE job-finetune-gemma-l4-3316f lq cluster-queue True 29m pod-tgi-gemma-deployment-6cb95cc7f5-cbxg2-d9fe7 lq cluster-queue True 68m
그런 다음 다음 명령어를 실행하여
llm
네임스페이스의 포드를 확인합니다.kubectl get pod --namespace=llm
출력은 다음과 비슷하게 표시됩니다.
NAME READY STATUS RESTARTS AGE finetune-gemma-l4-0-vcxpz 2/2 Running 0 31m finetune-gemma-l4-1-9ppt9 2/2 Running 0 31m tgi-gemma-deployment-6cb95cc7f5-cbxg2 1/1 Running 0 70m
출력은 Kueue가 미세 조정 작업과 추론 서버 포드를 모두 실행하도록 허용하여 지정된 할당량 한도에 따라 올바른 리소스를 예약했음을 보여줍니다.
출력 로그를 확인하여 미세 조정 작업이 체크포인트를 Cloud Storage 버킷에 저장하는지 확인합니다. 미세 조정 작업은 첫 번째 체크포인트를 저장하기 시작하기까지 약 10분이 걸립니다.
kubectl logs --namespace=llm --follow --selector=app=finetune-job
첫 번째 저장된 체크포인트의 출력은 다음과 유사합니다.
{"name": "finetune", "thread": 133763559483200, "threadName": "MainThread", "processName": "MainProcess", "process": 33, "message": "Fine tuning started", "timestamp": 1731002351.0016131, "level": "INFO", "runtime": 451579.89835739136} … {"name": "accelerate.utils.fsdp_utils", "thread": 136658669348672, "threadName": "MainThread", "processName": "MainProcess", "process": 32, "message": "Saving model to /model-data/model-gemma2/experiment/checkpoint-10/pytorch_model_fsdp_0", "timestamp": 1731002386.1763802, "level": "INFO", "runtime": 486753.8924217224}
혼합 워크로드에서 Kueue 선점 및 동적 할당 테스트
이 섹션에서는 추론 서버의 부하가 증가하여 수직 확장해야 하는 시나리오를 시뮬레이션합니다. 이 시나리오에서는 리소스가 제한될 때 Kueue가 우선순위가 낮은 미세 조정 작업을 일시중지하고 선점하여 우선순위가 높은 추론 서버에 우선순위를 부여하는 방법을 보여줍니다.
다음 명령어를 실행하여 추론 서버의 복제본을 2개로 확장합니다.
kubectl scale --replicas=2 deployment/tgi-gemma-deployment --namespace=llm
워크로드 객체의 상태를 확인합니다.
kubectl get workloads --namespace=llm
결과는 다음과 유사합니다.
NAME QUEUE RESERVED IN ADMITTED FINISHED AGE job-finetune-gemma-l4-3316f lq False 32m pod-tgi-gemma-deployment-6cb95cc7f5-cbxg2-d9fe7 lq cluster-queue True 70m pod-tgi-gemma-deployment-6cb95cc7f5-p49sh-167de lq cluster-queue True 14s
출력은 증가된 추론 서버 복제본이 사용 가능한 GPU 할당량을 사용하고 있어 미세 조정 작업이 더 이상 허용되지 않음을 보여줍니다.
미세 조정 작업의 상태를 확인합니다.
kubectl get job --namespace=llm
출력은 다음과 유사하며, 미세 조정 작업 상태가 이제 일시중지되었음을 나타냅니다.
NAME STATUS COMPLETIONS DURATION AGE finetune-gemma-l4 Suspended 0/2 33m
다음 명령어를 실행하여 포드를 검사합니다.
kubectl get pod --namespace=llm
출력은 다음과 유사하며, Kueue가 우선순위가 더 높은 추론 서버 배포의 리소스를 확보하기 위해 미세 조정 작업 포드를 종료했음을 나타냅니다.
NAME READY STATUS RESTARTS AGE tgi-gemma-deployment-6cb95cc7f5-cbxg2 1/1 Running 0 72m tgi-gemma-deployment-6cb95cc7f5-p49sh 0/1 ContainerCreating 0 91s
다음으로 추론 서버 부하가 감소하고 포드가 축소되는 시나리오를 테스트합니다. 다음 명령어를 실행합니다.
kubectl scale --replicas=1 deployment/tgi-gemma-deployment --namespace=llm
다음 명령어를 실행하여 워크로드 객체를 표시합니다.
kubectl get workloads --namespace=llm
출력은 다음과 비슷하며, 이는 추론 서버 배포 중 하나가 종료되고 미세 조정 작업이 다시 허용되었음을 나타냅니다.
NAME QUEUE RESERVED IN ADMITTED FINISHED AGE job-finetune-gemma-l4-3316f lq cluster-queue True 37m pod-tgi-gemma-deployment-6cb95cc7f5-cbxg2-d9fe7 lq cluster-queue True 75m
다음 명령어를 실행하여 작업을 표시합니다.
kubectl get job --namespace=llm
출력은 다음과 유사하며, 미세 조정 작업이 다시 실행되어 사용 가능한 최신 체크포인트부터 재개되었음을 나타냅니다.
NAME STATUS COMPLETIONS DURATION AGE finetune-gemma-l4 Running 0/2 2m11s 38m
삭제
이 튜토리얼에서 사용된 리소스 비용이 Google Cloud 계정에 청구되지 않도록 하려면 리소스가 포함된 프로젝트를 삭제하거나 프로젝트를 유지하고 개별 리소스를 삭제하세요.
배포된 리소스 삭제
이 가이드에서 만든 리소스에 대해 Google Cloud 계정에 비용이 청구되지 않도록 하려면 다음 명령어를 실행합니다.
gcloud storage rm --recursive gs://${MODEL_BUCKET}
gcloud container clusters delete ${CLUSTER_NAME} --location ${REGION}