이 가이드에서는 flex-start 프로비저닝 모드를 사용하여 중소규모 학습 워크로드에 맞게 TPU 프로비저닝을 최적화하는 방법을 보여줍니다. 이 가이드에서는 flex-start를 사용하여 TPU 슬라이스 노드 풀로 구성된 워크로드를 배포합니다.
이 가이드는 일괄 워크로드를 실행하기 위해 Kubernetes 컨테이너 조정 기능을 사용하는 데 관심이 있는 머신러닝(ML) 엔지니어, 플랫폼 관리자 및 운영자, 데이터 및 AI 전문가를 대상으로 합니다. Google Cloud 콘텐츠에서 참조하는 일반적인 역할 및 예시 태스크에 대해 자세히 알아보려면 일반 GKE Enterprise 사용자 역할 및 태스크를 참고하세요.
시작하기 전에
시작하기 전에 다음 태스크를 수행했는지 확인합니다.
- Google Kubernetes Engine API를 사용 설정합니다. Google Kubernetes Engine API 사용 설정
- 이 태스크에 Google Cloud CLI를 사용하려면 gcloud CLI를 설치한 후 초기화하세요. 이전에 gcloud CLI를 설치한 경우
gcloud components update
를 실행하여 최신 버전을 가져옵니다.
- 버전 1.33.0-gke.1712000 이상을 실행하는 Autopilot 클러스터 또는 Standard 클러스터가 있는지 확인합니다.
- flex-start의 제한사항을 숙지합니다.
- Standard 클러스터를 사용하는 경우 클러스터가 올바르게 작동하려면 flex-start를 사용 설정하지 않은 상태에서 노드 풀을 하나 이상 유지해야 합니다.
- 노드 위치에 선점형 TPU 할당량이 있는지 확인합니다.
flex-start로 노드 풀 만들기
기존 Standard 클러스터에 flex-start가 사용 설정된 노드 풀을 만들려면 gcloud CLI를 사용하세요.
Autopilot 모드에서 클러스터를 사용하는 경우 이 섹션을 건너뛰고 일괄 워크로드 실행 섹션으로 이동합니다.
flex-start를 사용하여 단일 또는 멀티 호스트 TPU 슬라이스 노드 풀을 만들 수 있습니다.
flex-start를 사용하여 노드 풀을 만듭니다.
단일 호스트
gcloud container node-pools create NODE_POOL_NAME \ --cluster=CLUSTER_NAME \ --location=LOCATION_NAME \ --node-locations=NODE_ZONES \ --machine-type=MACHINE_TYPE \ --reservation-affinity=none \ --enable-autoscaling \ --flex-start \ --num-nodes 0 \ --min-nodes=0 \ --max-nodes=1
다음을 바꿉니다.
멀티 호스트
gcloud container node-pools create NODE_POOL_NAME \ --cluster=CLUSTER_NAME \ --location=LOCATION_NAME \ --node-locations=NODE_ZONES \ --machine-type=MACHINE_TYPE \ --tpu-topology=TPU_TOPOLOGY \ --flex-start \ --enable-autoscaling \ --num-nodes=0 \ --max-nodes=2 \ --reservation-affinity=none \ --no-enable-autorepair
다음을 바꿉니다.
NODE_POOL_NAME
: 노드 풀에 대해 선택한 이름입니다.CLUSTER_NAME
: 클러스터의 이름입니다.LOCATION_NAME
: 클러스터 컨트롤 플레인의 컴퓨팅 리전입니다.NODE_ZONES
: GKE가 노드 풀을 만드는 하나 이상의 영역을 쉼표로 구분한 목록입니다.MACHINE_TYPE
: 노드에 사용할 머신 유형입니다. 예를 들어 TPU Trillium의 경우ct6e-standard-4t
를 사용할 수 있습니다. 사용 가능한 머신 유형에 대해 자세히 알아보려면 TPU 버전 선택을 참고하세요.TPU_TOPOLOGY
: TPU 슬라이스의 물리적 토폴로지입니다. 토폴로지 형식은 TPU 버전에 따라 달라집니다. TPU 토폴로지에 대한 자세한 내용은 토폴로지 선택의 표를 참고하세요.
위의 명령어는 flex-start를 사용하여 노드 풀을 만들 때 다음과 같은 필수 플래그를 사용합니다.
--enable-autoscaling
: flex-start는 워크로드가 실행될 때 필요한 컴퓨팅 리소스만 프로비저닝합니다. 다음 파라미터를 설정해야 합니다.--num-nodes=0
--min-nodes=0
TPU 슬라이스에 필요한 가상 머신 수로 설정된
--max-nodes
예를 들어 노드 풀 생성 명령어에는 다음 파라미터가 포함될 수 있습니다.
... --machine-type=ct6e-standard-4t \ --tpu-topology=4x4 \ --enable-autoscaling \ --num-nodes=0 \ --max-nodes=4 \
4x4
토폴로지는 칩 16개로 구성되고 각ct6e-standard-4t
VM에는 칩 4개가 있으므로 이 명령어는--max-nodes
필드를4
로 설정합니다.
클러스터 자동 확장 처리는 워크로드에 필요한 노드 수까지 확장합니다. 워크로드가 완료되면 클러스터 자동 확장 처리가 노드 수를 0으로 축소합니다.
--reservation-affinity=none
: flex-start는 예약을 사용하거나 필요로 하지 않습니다.
노드 풀에서 flex-start의 상태를 확인합니다.
gcloud container node-pools describe NODE_POOL_NAME \ --cluster CLUSTER_NAME \ --location LOCATION_NAME \ --format="get(config.flexStart)"
노드 풀에서 flex-start가 사용 설정되면
flexStart
필드가True
로 설정됩니다.
일괄 워크로드 실행
이 섹션에서는 flex-start를 사용하여 TPU 노드를 예약하는 작업을 만듭니다. Kubernetes의 작업 컨트롤러는 하나 이상의 포드를 만들고 특정 태스크를 성공적으로 실행하는지 확인합니다.Google Cloud 콘솔에서
Cloud Shell 활성화를 클릭하여 Cloud Shell 세션을 시작합니다. Google Cloud 콘솔 하단 창에서 세션이 열립니다.
dws-flex-start.yaml
이라는 파일을 만듭니다.단일 호스트
dws-flex-start.yaml
파일에 다음 매니페스트를 사용합니다.apiVersion: batch/v1 kind: Job metadata: name: job-1 spec: template: spec: nodeSelector: cloud.google.com/gke-flex-start: "true" cloud.google.com/gke-tpu-accelerator: ACCELERATOR_TYPE cloud.google.com/gke-tpu-topology: TPU_TOPOLOGY containers: - name: container-1 image: gcr.io/k8s-staging-perf-tests/sleep:latest args: ["3600s"] # Sleep for 1hour resources: requests: google.com/tpu: NUM_CHIPS limits: google.com/tpu: NUM_CHIPS restartPolicy: OnFailure
멀티 호스트
dws-flex-start.yaml
파일에 다음 매니페스트를 사용합니다.apiVersion: v1 kind: Service metadata: name: headless-svc spec: clusterIP: None selector: job-name: job-1 --- apiVersion: batch/v1 kind: Job metadata: name: job-1 spec: backoffLimit: 0 completions: 2 parallelism: 2 completionMode: Indexed template: spec: subdomain: headless-svc restartPolicy: Never nodeSelector: cloud.google.com/gke-flex-start: "true" cloud.google.com/gke-tpu-accelerator: ACCELERATOR_TYPE cloud.google.com/gke-tpu-topology: TPU_TOPOLOGY containers: - name: tpu-job image: python:3.10 ports: - containerPort: 8471 # Default port using which TPU VMs communicate - containerPort: 8431 # Port to export TPU runtime metrics, if supported. securityContext: privileged: true command: - bash - -c - | pip install 'jax[tpu]' -f https://storage.googleapis.com/jax-releases/libtpu_releases.html python -c 'import jax; print("TPU cores:", jax.device_count())' resources: requests: google.com/tpu: NUM_CHIPS limits: google.com/tpu: NUM_CHIPS
다음을 바꿉니다.
dws-flex-start.yaml
매니페스트를 적용합니다.kubectl apply -f dws-flex-start.yaml
작업이 동일한 노드에서 실행 중인지 확인합니다.
kubectl get pods
출력은 다음과 비슷합니다.
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES job-1 0/1 Completed 0 19m 10.(...) gke-flex-zonal-a2 <none> <none>
삭제
이 페이지에서 사용한 리소스 비용이 Google Cloud 계정에 청구되지 않도록 하려면 리소스가 포함된 프로젝트를 삭제하거나 프로젝트는 유지하되 개별 리소스를 삭제하세요.
프로젝트 삭제
- 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.
개별 리소스 삭제
작업을 삭제합니다.
kubectl delete job -l "job-name in (job-1,job-2)"
노드 풀을 삭제합니다.
gcloud container node-pools delete NODE_POOL_NAME \ --location LOCATION_NAME
다음과 같이 클러스터를 삭제합니다.
gcloud container clusters delete CLUSTER_NAME
다음 단계
- GKE의 TPU 자세히 알아보기
- 노드 자동 프로비저닝 자세히 알아보기
- GKE에서 일괄 워크로드를 실행하기 위한 권장사항 자세히 알아보기