일괄 머신러닝 워크로드 배포


이 튜토리얼에서는 Google Kubernetes Engine(GKE)을 사용하여 비용을 낮추면서 내결함성 일괄 워크로드를 관리하는 방법을 보여줍니다. 이 튜토리얼에 따라 작업 및 비용 최적화 Spot 포드를 사용하고 GKE에서 클러스터 내 Redis 작업 큐를 구성하는 방법을 알아봅니다.

배경

일괄 워크로드는 일반적으로 시작 지점과 완료 지점을 갖도록 설계되는 프로세스입니다. 원시 데이터를 사용하는 대신 데이터 수집, 처리, 출력이 아키텍처에 포함된 경우 GKE에서 일괄 워크로드를 고려할 수 있습니다. 머신 러닝, 인공 지능, 고성능 컴퓨팅(HPC)과 같은 영역에는 오프라인 모델 학습, 일괄 예측, 데이터 분석, 물리 시스템 시뮬레이션, 동영상 처리와 같은 여러 종류의 일괄 워크로드가 사용됩니다.

컨테이너화된 일괄 워크로드를 설계함으로써 다음과 같은 GKE 이점을 활용할 수 있습니다.

  • 개방형 표준, 넓은 커뮤니티, 관리형 서비스 이점
  • 효율적인 워크로드와 인프라 조정 및 특별한 컴퓨팅 리소스로 인한 비용 효율성
  • 데이터 보안을 유지하면서도 오버플로 기능으로 클라우드를 사용할 수 있게 해주는 컨테이너화가 갖는 격리 및 이동성
  • GKE 클러스터에 대한 버스트 용량 조정 가능성과 신속한 축소 기능

목표

이 튜토리얼은 다음과 같은 비용 효율적이고 확장 가능한 아키텍처로 GKE에서 일괄 머신러닝 워크로드를 실행하는 방법을 알고 싶어하는 머신러닝 엔지니어 및 데이터 과학자를 대상으로 합니다.

이 가이드는 다음 과정을 다룹니다.

  1. GKE Autopilot 클러스터 만들기 또는 이 튜토리얼에 GKE Standard 클러스터를 사용할 수도 있습니다.
  2. Filestore NFS 볼륨을 만듭니다.
  3. 클러스터 내 Redis 작업 큐 만들기
  4. 데이터 세트를 NFS 볼륨으로 전송하고 워크로드에 사용되도록 큐에 넣습니다.
  5. GKE 클러스터에서 샘플 일괄 머신러닝 워크로드를 실행합니다.

비용

이 문서에서는 비용이 청구될 수 있는 다음과 같은 Google Cloud 구성요소를 사용합니다.

프로젝트 사용량을 기준으로 예상 비용을 산출하려면 가격 계산기를 사용하세요. Google Cloud를 처음 사용하는 사용자는 무료 체험판을 사용할 수 있습니다.


Google Cloud 콘솔에서 이 태스크에 대한 단계별 안내를 직접 수행하려면 둘러보기를 클릭합니다.

둘러보기


시작하기 전에

  1. Google Cloud 계정에 로그인합니다. Google Cloud를 처음 사용하는 경우 계정을 만들고 Google 제품의 실제 성능을 평가해 보세요. 신규 고객에게는 워크로드를 실행, 테스트, 배포하는 데 사용할 수 있는 $300의 무료 크레딧이 제공됩니다.
  2. Google Cloud Console의 프로젝트 선택기 페이지에서 Google Cloud 프로젝트를 선택하거나 만듭니다.

    프로젝트 선택기로 이동

  3. Google Cloud 프로젝트에 결제가 사용 설정되어 있는지 확인합니다.

  4. API Compute Engine, GKE, and Filestore 사용 설정

    API 사용 설정

  5. Google Cloud Console의 프로젝트 선택기 페이지에서 Google Cloud 프로젝트를 선택하거나 만듭니다.

    프로젝트 선택기로 이동

  6. Google Cloud 프로젝트에 결제가 사용 설정되어 있는지 확인합니다.

  7. API Compute Engine, GKE, and Filestore 사용 설정

    API 사용 설정

  8. Google Cloud 콘솔에서 Cloud Shell을 활성화합니다.

    Cloud Shell 활성화

    Google Cloud 콘솔 하단에서 Cloud Shell 세션이 시작되고 명령줄 프롬프트가 표시됩니다. Cloud Shell은 Google Cloud CLI가 사전 설치된 셸 환경으로, 현재 프로젝트의 값이 이미 설정되어 있습니다. 세션이 초기화되는 데 몇 초 정도 걸릴 수 있습니다.

환경 준비

  1. 이 튜토리얼에 사용된 샘플 저장소를 클론합니다.

    git clone https://github.com/GoogleCloudPlatform/kubernetes-engine-samples
    cd kubernetes-engine-samples/batch/aiml-workloads
    
  2. GKE Autopilot 클러스터를 만듭니다.

    gcloud container clusters create-auto batch-aiml \
        --region=us-central1
    

    이 단계가 완료되는 데는 최대 5분이 걸릴 수 있습니다.

네트워크 파일 시스템(NFS)으로 데이터 세트 스토리지 설정

머신러닝 워크로드에는 데이터 세트 및 출력 파일에 대한 스토리지 솔루션이 필요합니다. 이 섹션에서는 Filestore 인스턴스를 만들고 PersistentVolumePersistentVolumeClaim을 사용하여 인스턴스에 대한 액세스 권한을 제공합니다.

자세한 내용은 최적 스토리지 전략 설계 방법GKE 클러스터에서 Filestore 인스턴스에 액세스하는 방법을 참조하세요.

Filestore 인스턴스 만들기

  1. 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: 원하는 볼륨 크기입니다. 리소스 수량에 설명된 지원되는 단위 중 하나로 스토리지 값을 지정합니다.

  2. 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
    
  3. 다음 섹션에서 사용하기 위해 IP_ADDRESS 필드의 값을 기록합니다.

PersistentVolume 만들기

Kubernetes PersistentVolume 사양을 사용하면 GKE 클러스터가 Filestore 인스턴스에 연결할 수 있습니다.

  1. 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 주소로 바꿉니다.

  2. 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.yamlkubernetes-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를 사용하여 다중 계층 웹 애플리케이션 만들기를 참조하세요.

  1. Redis 서버 사양을 배포합니다.

    kubectl apply -f kubernetes-manifests/redis-pod.yaml
    
  2. Pod가 실행 중인지 확인합니다.

    kubectl get pods
    

    출력은 다음과 비슷합니다.

    NAME           READY   STATUS    RESTARTS   AGE
    redis-leader   1/1     Running   0          118s
    

    포드 실행이 시작되는 데 최대 2분이 걸릴 수 있습니다.

  3. 학습 및 테스트 데이터 세트가 포함된 파일을 NFS 볼륨으로 전송합니다.

    sh scripts/transfer-datasets.sh
    

    이 스크립트는 샘플 코드 저장소에서 redis-leader 포드의 /mnt/fileserver/datasets/ 디렉터리에 파일을 복사합니다.

  4. Redis 큐를 채웁니다.

    sh scripts/queue-jobs.sh
    

    이 스크립트는 Redis 데이터베이스에서 datasets라는 목록에 학습 데이터 세트의 파일 경로를 푸시합니다. 이 큐는 워크로드가 처리할 다음 데이터 세트를 찾기 위해 사용됩니다.

  5. GKE 클러스터 내에서 Redis 서버를 검색 가능하도록 서비스를 배포합니다.

    kubectl apply -f ./kubernetes-manifests/redis-service.yaml
    

일괄 워크로드 실행

지금까지 GKE 클러스터, Redis 작업 큐, 파일 공유가 준비되었습니다. 이제 일괄 워크로드를 실행할 수 있습니다.

이 섹션에서는 금융 거래를 위한 일괄 데이터를 사용해서 사기 감지 모델을 학습시키기 위해 샘플 워크로드의 컨테이너 이미지를 사용합니다. 학습 프로세스는 다음과 같이 요약할 수 있습니다.

  1. Redis 클라이언트가 Redis 큐에 작업(데이터 세트 파일 경로)을 신청하고 완료되면 큐에서 작업을 삭제합니다.

  2. 모델 학습 관리자 클래스인 FraudDetectionModelTrainer가 새 일괄 데이터를 로드하고 선택적으로 머신러닝 모델의 저장됨 상태를 로드합니다. 데이터 세트를 사용해서 모델을 세분화합니다('웜 스타트' 학습으로 알려진 프로세스).

  3. 모델의 새 상태와 일괄 세부정보 및 성능 점수에 대한 보고서가 Filestore NFS 볼륨에 저장됩니다. 이 볼륨은 PersistentVolumeClaim을 사용하여 GKE 클러스터에서 액세스할 수 있습니다.

자세한 내용은 소스 코드 탐색을 참조하세요.

작업 정의

다음 매니페스트에서는 일괄 워크로드 이미지의 Kubernetes 작업을 설명합니다.

apiVersion: batch/v1
kind: Job
metadata:
  name: workload
spec:
  parallelism: 1
  template:
    metadata:
      name: workload
    spec:
      nodeSelector:
        cloud.google.com/gke-spot: "true"
      containers:
      - name: workload
        image: "us-docker.pkg.dev/google-samples/containers/gke/batch-ml-workload"
        volumeMounts:
        - mountPath: /mnt/fileserver
          name: workload-pvc
      volumes:
      - name: workload-pvc
        persistentVolumeClaim:
          claimName: fileserver-claim
          readOnly: false
      restartPolicy: OnFailure

워크로드 배포

  1. 작업을 배포합니다.

    kubectl apply -f ./kubernetes-manifests/workload.yaml
    
  2. 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
    
  3. 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 볼륨에 파일을 만듭니다.

  1. 워크로드로 생성된 파일을 나열합니다.

    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 디렉터리에 생성되었습니다.

  2. 모델 성능 보고서를 검사합니다.

    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 계정에 청구되지 않도록 하려면 리소스가 포함된 프로젝트를 삭제하거나 프로젝트를 유지하고 개별 리소스를 삭제하세요.

개별 리소스 삭제

이 튜토리얼에서 만든 개별 리소스를 삭제하려면 다음 명령어를 실행합니다.

  1. 다음과 같이 클러스터를 삭제합니다.

    gcloud container clusters delete batch-aiml \
        --region=us-central1
    
  2. Filestore 인스턴스를 삭제합니다.

    gcloud filestore instances delete batch-aiml-filestore \
        --zone=us-central1-b
    

프로젝트 삭제

  1. Google Cloud 콘솔에서 리소스 관리 페이지로 이동합니다.

    리소스 관리로 이동

  2. 프로젝트 목록에서 삭제할 프로젝트를 선택하고 삭제를 클릭합니다.
  3. 대화상자에서 프로젝트 ID를 입력한 후 종료를 클릭하여 프로젝트를 삭제합니다.

다음 단계