배경
일괄 워크로드는 일반적으로 시작 지점과 완료 지점을 갖도록 설계되는 프로세스입니다. 원시 데이터를 사용하는 대신 데이터 수집, 처리, 출력이 아키텍처에 포함된 경우 GKE에서 일괄 워크로드를 고려할 수 있습니다. 머신 러닝, 인공 지능, 고성능 컴퓨팅(HPC)과 같은 영역에는 오프라인 모델 학습, 일괄 예측, 데이터 분석, 물리 시스템 시뮬레이션, 동영상 처리와 같은 여러 종류의 일괄 워크로드가 사용됩니다.
컨테이너화된 일괄 워크로드를 설계함으로써 다음과 같은 GKE 이점을 활용할 수 있습니다.
- 개방형 표준, 넓은 커뮤니티, 관리형 서비스 이점
- 효율적인 워크로드와 인프라 조정 및 특별한 컴퓨팅 리소스로 인한 비용 효율성
- 데이터 보안을 유지하면서도 오버플로 기능으로 클라우드를 사용할 수 있게 해주는 컨테이너화가 갖는 격리 및 이동성
- GKE 클러스터에 대한 버스트 용량 조정 가능성과 신속한 축소 기능
목표
이 튜토리얼은 다음과 같은 비용 효율적이고 확장 가능한 아키텍처로 GKE에서 일괄 머신러닝 워크로드를 실행하는 방법을 알고 싶어하는 머신러닝 엔지니어 및 데이터 과학자를 대상으로 합니다.
이 가이드는 다음 과정을 다룹니다.
비용
이 문서에서는 비용이 청구될 수 있는 다음과 같은 Google Cloud 구성요소를 사용합니다.
프로젝트 사용량을 기준으로 예상 비용을 산출하려면 가격 계산기를 사용하세요.
Google Cloud 콘솔에서 이 태스크에 대한 단계별 안내를 직접 수행하려면 둘러보기를 클릭합니다.
시작하기 전에
- Google Cloud 계정에 로그인합니다. Google Cloud를 처음 사용하는 경우 계정을 만들고 Google 제품의 실제 성능을 평가해 보세요. 신규 고객에게는 워크로드를 실행, 테스트, 배포하는 데 사용할 수 있는 $300의 무료 크레딧이 제공됩니다.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
API Compute Engine, GKE, and Filestore 사용 설정
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
API Compute Engine, GKE, and Filestore 사용 설정
-
In the Google Cloud console, activate Cloud Shell.
At the bottom of the Google Cloud console, a Cloud Shell session starts and displays a command-line prompt. Cloud Shell is a shell environment with the Google Cloud CLI already installed and with values already set for your current project. It can take a few seconds for the session to initialize.
환경 준비
이 튜토리얼에 사용된 샘플 저장소를 클론합니다.
git clone https://github.com/GoogleCloudPlatform/kubernetes-engine-samples cd kubernetes-engine-samples/batch/aiml-workloads
GKE Autopilot 클러스터를 만듭니다.
gcloud container clusters create-auto batch-aiml \ --region=us-central1
이 단계가 완료되는 데는 최대 5분이 걸릴 수 있습니다.
네트워크 파일 시스템(NFS)으로 데이터 세트 스토리지 설정
머신러닝 워크로드에는 데이터 세트 및 출력 파일에 대한 스토리지 솔루션이 필요합니다. 이 섹션에서는 Filestore 인스턴스를 만들고 PersistentVolume 및 PersistentVolumeClaim을 사용하여 인스턴스에 대한 액세스 권한을 제공합니다.
자세한 내용은 최적 스토리지 전략 설계 방법 및 GKE 클러스터에서 Filestore 인스턴스에 액세스하는 방법을 참조하세요.
Filestore 인스턴스 만들기
Filestore 인스턴스를 만듭니다.
gcloud filestore instances create batch-aiml-filestore \ --zone=us-central1-b \ --tier=BASIC_HDD \ --file-share=name="NFSVol",capacity=1TB \ --network=name="default"
이 명령어는 다음 옵션을 지정합니다.
tier
: Filestore 인스턴스의 서비스 등급입니다. 이 샘플에서는 기본 등급을 사용합니다. 다른 옵션에 대한 자세한 내용은 서비스 등급을 참조하세요.network=name
: Filestore 인스턴스의 Virtual Private Cloud(VPC) 네트워크의 이름입니다. GKE 클러스터는 Filestore 인스턴스와 동일한 VPC 네트워크에 있어야 합니다.capacity
: 원하는 볼륨 크기입니다. 리소스 수량에 설명된 지원되는 단위 중 하나로 스토리지 값을 지정합니다.
Filestore 인스턴스가 배포되었는지 확인합니다.
gcloud filestore instances list \ --project=PROJECT_ID \ --zone=us-central1-b
PROJECT_ID
를 Google Cloud 프로젝트 ID로 바꿉니다.출력은 다음과 비슷합니다.
INSTANCE_NAME: batch-aiml-filestore LOCATION: us-central1-b TIER: BASIC_HDD CAPACITY_GB: 1024 FILE_SHARE_NAME: NFSVol IP_ADDRESS: 203.0.113.54 STATE: READY CREATE_TIME: 2022-03-15T18:23:51
다음 섹션에서 사용하기 위해
IP_ADDRESS
필드의 값을 기록합니다.
PersistentVolume 만들기
Kubernetes PersistentVolume 사양을 사용하면 GKE 클러스터가 Filestore 인스턴스에 연결할 수 있습니다.
kubernetes-manifests/persistent-volume.yaml
파일을 Filestore 인스턴스 IP 주소로 업데이트합니다.sed -i "\ s/<FILESTORE_IP_ADDRESS>/IP_ADDRESS/g" \ kubernetes-manifests/persistent-volume.yaml
IP_ADDRESS
를 이전 섹션에서 Filestore 인스턴스를 만들 때 기록한 IP 주소로 바꿉니다.PersistentVolume을 배포합니다.
kubectl apply -f kubernetes-manifests/persistent-volume.yaml
PersistentVolumeClaim 만들기
Kubernetes PersistentVolumeClaim을 통해 Kubernetes 포드 및 작업이 PersistentVolume의 스토리지 리소스에 액세스할 수 있습니다.
PersistentVolumeClaim을 배포합니다.
kubectl apply -f kubernetes-manifests/persistent-volume-claim.yaml
PersistentVolumeClaim 소비
PersistentVolume 및 PersistentVolumeClaim을 GKE 클러스터에 설정하면 Redis 서버와 일괄 작업이 PersistentVolumeClaim을 사용하도록 구성할 수 있습니다. 이는 마운트 가능한 스토리지 볼륨으로 표시됩니다.
kubernetes-manifests/redis-pod.yaml
및 kubernetes-manifests/workload.yaml
파일을 검사합니다.
매니페스트 구성은 다음과 비슷합니다.
spec:
…
containers:
- name: workload
image: "us-central1-docker.pkg.dev/gke-batch-aiml/batch-aiml-docker-repo/workload"
volumeMounts:
- mountPath: /mnt/fileserver
name: workload-pvc
volumes:
- name: workload-pvc
persistentVolumeClaim:
claimName: fileserver-claim
readOnly: false
이 매니페스트에서 각 항목은 다음을 수행합니다.
spec.volumes
는 사용할 PersistentVolumeClaim을 지정합니다.spec.containers.volumeMounts
는 포드에서 Filestore 파일 공유에 액세스할 수 있는 로컬 파일 경로를 지정합니다.
Redis 작업 큐 설정
워크로드는 데이터를 일괄로 처리하여 사기 감지 모델을 반복적으로 학습시킵니다. 현재 처리 중이거나 아직 큐에 있는 데이터 세트를 관리하려면 GKE 클러스터에 Redis 서버를 배포합니다.
이 튜토리얼에서는 Redis의 단일 인스턴스를 시작합니다. Redis를 확장 가능하고 중복된 방식으로 배포하려면 Redis 및 PHP로 다중 계층 웹 애플리케이션 만들기를 참고하세요.
Redis 서버 사양을 배포합니다.
kubectl apply -f kubernetes-manifests/redis-pod.yaml
Pod가 실행 중인지 확인합니다.
kubectl get pods
출력은 다음과 비슷합니다.
NAME READY STATUS RESTARTS AGE redis-leader 1/1 Running 0 118s
포드 실행이 시작되는 데 최대 2분이 걸릴 수 있습니다.
학습 및 테스트 데이터 세트가 포함된 파일을 NFS 볼륨으로 전송합니다.
sh scripts/transfer-datasets.sh
이 스크립트는 샘플 코드 저장소에서
redis-leader
포드의/mnt/fileserver/datasets/
디렉터리에 파일을 복사합니다.Redis 큐를 채웁니다.
sh scripts/queue-jobs.sh
이 스크립트는 Redis 데이터베이스에서
datasets
라는 목록에 학습 데이터 세트의 파일 경로를 푸시합니다. 이 큐는 워크로드가 처리할 다음 데이터 세트를 찾기 위해 사용됩니다.GKE 클러스터 내에서 Redis 서버를 검색 가능하도록 서비스를 배포합니다.
kubectl apply -f ./kubernetes-manifests/redis-service.yaml
일괄 워크로드 실행
지금까지 GKE 클러스터, Redis 작업 큐, 파일 공유가 준비되었습니다. 이제 일괄 워크로드를 실행할 수 있습니다.
이 섹션에서는 금융 거래를 위한 일괄 데이터를 사용해서 사기 감지 모델을 학습시키기 위해 샘플 워크로드의 컨테이너 이미지를 사용합니다. 학습 프로세스는 다음과 같이 요약할 수 있습니다.
Redis 클라이언트가 Redis 큐에 작업(데이터 세트 파일 경로)을 신청하고 완료되면 큐에서 작업을 삭제합니다.
모델 학습 관리자 클래스인
FraudDetectionModelTrainer
가 새 일괄 데이터를 로드하고 선택적으로 머신러닝 모델의 저장됨 상태를 로드합니다. 데이터 세트를 사용해서 모델을 세분화합니다('웜 스타트' 학습으로 알려진 프로세스).모델의 새 상태와 일괄 세부정보 및 성능 점수에 대한 보고서가 Filestore NFS 볼륨에 저장됩니다. 이 볼륨은 PersistentVolumeClaim을 사용하여 GKE 클러스터에서 액세스할 수 있습니다.
자세한 내용은 소스 코드 탐색을 참조하세요.
작업 정의
다음 매니페스트에서는 일괄 워크로드 이미지의 Kubernetes 작업을 설명합니다.
워크로드 배포
작업을 배포합니다.
kubectl apply -f ./kubernetes-manifests/workload.yaml
workload-XXX
포드 상태가Completed
인지 확인합니다.watch kubectl get pods
이 작업은 몇 초 정도 걸릴 수 있습니다.
Ctrl+C
를 눌러 명령줄로 돌아갈 수 있습니다.출력은 다음과 비슷합니다.
NAME READY STATUS RESTARTS AGE redis-leader 1/1 Running 0 16m workload-4p55d 0/1 Completed 0 83s
workload
작업의 로그를 확인합니다.kubectl logs job/workload
출력은 다음과 비슷합니다.
Worker with sessionID: b50f9459-ce7f-4da8-9f84-0ab5c3233a72 Initial queue state: empty=False Processing dataset: datasets/training/2018-04-04.pkl Processing dataset: datasets/training/2018-04-03.pkl Processing dataset: datasets/training/2018-04-02.pkl Processing dataset: datasets/training/2018-04-01.pkl Queue empty, exiting
.pkl
파일은 유효 또는 사기로 표시된 일괄 신용카드 트랜잭션이 포함된 데이터 세트가 직렬화된 형태입니다.workload
작업은 이러한 파일에 대해 반복적으로 수행되어, 데이터 세트 압축을 풀고 이를 사용해서 머신러닝 모델을 학습시키는 과정을 Redis 큐에서 삭제되기 전까지 수행합니다. 워크로드는 성공으로 종료되기 전에 Redis 큐가 비워질 때까지 배치에 포함된 데이터를 계속 처리합니다.
NFS 볼륨 살펴보기
이 워크로드는 작업을 수행하는 동안 클러스터 간에 다른 일괄 작업 또는 온라인 애플리케이션에서 액세스할 수 있는 마운트된 NFS 볼륨에 파일을 만듭니다.
워크로드로 생성된 파일을 나열합니다.
kubectl exec --stdin --tty redis-leader -- /bin/sh -c "ls -1 /mnt/fileserver/output"
출력이 다음과 같이 표시됩니다.
model_cpt_2018-04-01.pkl model_cpt_2018-04-02.pkl model_cpt_2018-04-03.pkl model_cpt_2018-04-04.pkl report.txt
학습된 모델(
model_cpt_XXX.pkl
과 같은 파일 이름)의 체크포인트 및 모델 성능 보고서(report.txt
)가 NFS 볼륨의/mnt/fileserver/output
디렉터리에 생성되었습니다.모델 성능 보고서를 검사합니다.
kubectl exec --stdin --tty redis-leader -- /bin/sh -c "cat /mnt/fileserver/output/report.txt"
다음은 출력의 스니펫입니다.
Report generated on: 2022-02-09 14:19:42.303619 Training dataset: 2018-04-04.pkl Model checkpoint: model_cpt_2018-04-04.pkl --- Accuracy on training data: 0.9981112277019937 Accuracy on testing data: 0.9977204434773599
이 파일에는 자세한 학습 시간, 사용된 데이터 세트, 달성한 정확도, 학습과 연관된 모델 체크포인트의 파일 이름이 자세하게 설명된 항목들이 포함됩니다.
NFS 볼륨에 대한 자세한 내용은 Filestore 가이드를 참조하세요.
삭제
이 튜토리얼에서 사용된 리소스 비용이 Google Cloud 계정에 청구되지 않도록 하려면 리소스가 포함된 프로젝트를 삭제하거나 프로젝트를 유지하고 개별 리소스를 삭제하세요.
개별 리소스 삭제
이 튜토리얼에서 만든 개별 리소스를 삭제하려면 다음 명령어를 실행합니다.
다음과 같이 클러스터를 삭제합니다.
gcloud container clusters delete batch-aiml \ --region=us-central1
Filestore 인스턴스를 삭제합니다.
gcloud filestore instances delete batch-aiml-filestore \ --zone=us-central1-b
프로젝트 삭제
- Google Cloud 콘솔에서 리소스 관리 페이지로 이동합니다.
- 프로젝트 목록에서 삭제할 프로젝트를 선택하고 삭제를 클릭합니다.
- 대화상자에서 프로젝트 ID를 입력한 후 종료를 클릭하여 프로젝트를 삭제합니다.
다음 단계
GKE 문서 확인
영구 볼륨 자세히 알아보기
GKE의 작업 자세히 알아보기
다른 Kubernetes Engine 튜토리얼 살펴보기
Google Cloud에 대한 참조 아키텍처, 다이어그램, 권장사항 살펴보기 Cloud 아키텍처 센터 살펴보기