AWS 기술 블로그

Amazon EKS기반의 Kubeflow와 Amazon EFS를 사용한 기계 학습 구성하기

이 글은 AWS Storage Blog에 게시된 Machine Learning with Kubeflow on Amazon EKS with Amazon EFS by Anjani Reddy, Suman Debnath, Daniel Rubinstein, and Narayana Vemburaj을 한국어로 번역 및 편집하였습니다.

기계 학습 모델의 훈련은 여러 단계가 포함되며, 훈련을 위한 데이터 셋의 크기가 수백 GB 범위에 있으면 더 복잡해지고 많은 시간이 소요됩니다. 데이터 과학자는 다양한 모델의 테스트와 훈련을 포함하는, 수 많은 실험과 연구를 수행합니다. Kubeflow는 훈련 프로세스를 가속화하고, Kubernetes에서 간단하면서 이식과 확장이 가능한 기계 학습 워크로드를 실행할 수 있는, 다양한 ML 기능들을 제공합니다.

모델 병렬 처리는 딥 러닝 모델이 여러 장치, 인스턴스 내부 또는 인스턴스 간에 분할되는 분산 훈련 방법입니다. 데이터 과학자가 모델 병렬 처리를 채택하면 기계 학습 모델 간에 대규모 데이터 셋을 공유해야 합니다.

2부로 구성된 이 블로그 시리즈의 1부에서는 Kubernetes를 위한 영구 스토리지와 Amazon Elastic File System(Amazon EFS)를 영구 스토리지로 사용하는 Amazon Elastic Kubernetes Service(Amazon EKS) 예제 워크로드를 다루었습니다.

이 블로그에서는 Amazon EKS에서 Kubeflow를 사용하여 모델 병렬 처리를 구현하고, Amazon EFS를 영구 스토리지로 사용하여 데이터 셋을 공유하는 방법을 안내합니다. Kubeflow를 사용하여 Amazon EKS를 기반으로 기계 학습 시스템을 구축하고 컴퓨터 비전, 자연어 처리, 음성 번역 및 재무 모델링을 비롯한 다양한 사용 사례에 맞는 기계 학습 모델을 구축, 훈련, 튜닝 및 배포할 수 있습니다. 또한 Amazon EFS를 백엔드 스토리지로 사용하면 모델 훈련 및 추론에 대한 더 나은 성능을 얻을 수 있습니다.

솔루션 개요

이 아키텍처는 Amazon EKS를 컴퓨팅 계층으로 사용합니다. 여기서 우리는 기계학습 훈련 작업을 수행하기 위해 다른 ‘포드’를 생성하고 훈련 데이터 세트를 저장하기 위한 스토리지 계층으로 Amazon EFS를 사용합니다. Amazon ECR은 Amazon EKS가 기계 학습 훈련용 컨테이너 이미지를 저장하는 이미지 리포지터리로 사용됩니다.

그림 1: Amazon EFS 사용한 Amazon EKS기반의 Kubeflow 아키텍처

이 아키텍처의 일부로 다음을 수행합니다.

  1. Amazon EKS에 Kubeflow를 설치하고 구성합니다.
  2. Kubeflow를 사용하여 Amazon EFS를 영구 스토리지로 설정합니다.
  3. Kubeflow에서 Jupyter 노트북을 만듭니다.
  4. Amazon ECR의 ML(TensorFlow) 이미지를 사용하여 기계 학습 훈련을 수행합니다.

사전 준비 사항

다음 단계를 완료하여 EKS 클러스터를 생성하고 필요한 도구를 설치합니다.

  • 여기의 지침에 따라 Amazon EKS를 사용하여 Kubernetes 클러스터를 생성합니다.

(역자 주: 이 블로그 게시물은 독자들이 한눈에 전체적인 과정을 이해할 수 있도록, 전체 실습 과정 GitHub의 일부를 발췌하여서 작성이 되었습니다. 따라서, 전체 과정을 완전하게 실습하기 위해서는 해당 GitHubMachine Learning with Kubeflow on Amazon EKS with Amazon EFS를 바탕으로 실습하시는 것을 권장하여 드립니다.)

다음의 명령을 실행하여 EKS 클러스터를 확인합니다.

$ kubectl get nodes -o=wide

Kubeflow 설치 구성

Kustomize 도구를 사용하여 Kubeflow를 설치합니다. 다음 명령을 사용하여 Kustomize(버전 3.2.0)를 설치합니다.

$ wget -O kustomize https://github.com/kubernetes-sigs/kustomize/releases/download/v3.2.0/kustomize_3.2.0_linux_amd64

$ chmod +x kustomize

$ sudo mv -v kustomize /usr/local/bin

Kustomize가 제대로 설치되었는지 확인합니다.

$ kustomize version

다음 명령을 사용하여 기계 학습 모델 훈련을 위한 워크플로를 제공하도록 Kubeflow를 설정합니다.

$ git clone https://github.com/aws-samples/amazon-efs-developer-zone.git

$ cd amazon-efs-developer-zone/application-integration/container/eks/kubeflow/manifests

$ while ! kustomize build example | kubectl apply -f -; do echo "Retrying to apply resources"; sleep 10; done

포드가 실행 상태인지 설치를 확인합니다.

(역자 주: kubeflow 네임스페이스의, kfserving-controller-manager-0 포드가 “ErrImagePull, ImagePullBackOff”의 에러를 보이면서, Running 상태가 아닐 수도 있습니다. KFServing은 이 실습에서 사용하지 않기 때문에, 다음 단계로 진행하여 실습을 완료할 수 있습니다.)

$ kubectl get pods -n cert-manager

$ kubectl get pods -n istio-system

$ kubectl get pods -n auth

$ kubectl get pods -n knative-eventing

$ kubectl get pods -n knative-serving

$ kubectl get pods -n kubeflow

$ kubectl get pods -n kubeflow-user-example-com

Kubeflow 사용하여 Amazon EFS 영구 스토리지로 설정

영구 스토리지 설정과 관련된 자세한 단계를 살펴봅니다.

  1. 클러스터에 대한 OIDC 공급자를 생성합니다.
$ export CLUSTER_NAME=efsworkshop-eksctl

$ eksctl utils associate-iam-oidc-provider --cluster   $CLUSTER_NAME --approve
  1. 자동화된 스크립트 auto-efs-setup.py 사용하여 EFS를 설정합니다. 스크립트는 파일 시스템 이름, 성능 모드에 대한 몇 가지 기본값을 적용하고 다음을 실행합니다.
    • EFS CSI 드라이버 설치
    • CSI 드라이버에 대한 IAM 정책 생성
    • EFS 파일 시스템 생성
    • 클러스터에 대한 스토리지 클래스를 생성
  1. auto-efs-setup.py 실행합니다.
$ cd ml/efs
$ pip install -r requirements.txt
$ python auto-efs-setup.py --region $AWS_REGION --cluster $CLUSTER_NAME --efs_file_system_name myEFS1
================================================================
EFS Setup
================================================================
Prerequisites Verification
================================================================
Verifying OIDC provider...
OIDC provider found
Verifying eksctl is installed...
eksctl found!
...
...

Setting up dynamic provisioning...
Editing storage class with appropriate values...
Creating storage class...
storageclass.storage.k8s.io/efs-sc created
Storage class created!
Dynamic provisioning setup done!
================================================================
EFS Setup Complete
================================================================

4. Kubernetes 클러스터에서 스토리지 클래스를 확인합니다.

$ kubectl get sc

NAME            PROVISIONER             RECLAIMPOLICY   VOLUMEBINDINGMODE      ALLOWVOLUMEEXPANSION   AGE
efs-sc          efs.csi.aws.com         Delete          WaitForFirstConsumer   true                   96s
gp2 (default)   kubernetes.io/aws-ebs   Delete          WaitForFirstConsumer   false                  148m

Kubeflow에서 Jupyter 노트북 만들기

  1. 다음을 실행하여 Istio의 Ingress-Gateway를 로컬 포트 8080으로 포트 포워딩 합니다.
$ kubectl port-forward svc/istio-ingressgateway -n istio-system 8080:80
Forwarding from 127.0.0.1:8080 -> 8080
Forwarding from [::1]:8080 -> 8080
...
...
  1. Cloud9 콘솔에서 Tools > Preview > Preview Running Application을 선택하여 대시보드에 액세스합니다. 팝업 창 버튼을 클릭하여 브라우저를 새 탭으로 최대화 할 수 있습니다.

그림 2: AWS Cloud9 클라우드 기반 IDE

    • UI 페이지에 대한 액세스 권한을 잃지 않도록 현재 터미널을 계속 실행합니다.
  1. 기본 사용자 자격 증명으로 Kubeflow 대시보드에 로그인합니다. 기본 이메일 주소는 user@example.com 이고 기본 비밀번호는 12341234입니다.

 

그림 3: Kubeflow 대시보드

  1. Notebooks 선택한 다음 New Server를 선택하여 Jupyter 노트북을 만듭니다.
  2. 노트북의 이름을 “notebook1″으로 지정하고, 나머지 설정은 기본값으로 유지한 다음 아래로 스크롤하여 LAUNCH를 클릭합니다.

그림 4: Kubeflow 대시보드(노트북 생성)

Kubeflow의 이 새 노트북은 내부적으로 포드를 생성한 다음 스토리지 클래스 efs-sc(이 EKS 클러스터에 대해 선택된 기본 스토리지)에서 스토리지를 호출하는 PVC를 생성하므로, 이 시점에서 EFS CSI 드라이버는 액세스 포인트를 생성해야 합니다. 노트북이 준비 상태가 될 때까지 기다립니다.

그림 5: Kubeflow 대시보드(노트북 서버)

  1. 이제 ‘kubectl‘을 사용하여 내부에서 생성된 PV(영구 볼륨), PVC(영구 볼륨 클레임)를 확인할 수 있습니다.
$ kubectl get pv
NAME                                       CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM                                           STORAGECLASS   REASON   AGE
pvc-3d1806bc-984c-404d-9c2a-489408279bad   20Gi       RWO            Delete           Bound    kubeflow/minio-pvc                              gp2                     52m
pvc-8f638f2c-7493-461c-aee8-984760e233c2   10Gi       RWO            Delete           Bound    kubeflow-user-example-com/workspace-nootbook1   efs-sc                  5m16s
pvc-940c8ebf-5632-4024-a413-284d5d288592   10Gi       RWO            Delete           Bound    kubeflow/katib-mysql                            gp2                     52m
pvc-a8f5e29f-d29d-4d61-90a8-02beeb2c638c   20Gi       RWO            Delete           Bound    kubeflow/mysql-pv-claim                         gp2                     52m
pvc-af81feba-6fd6-43ad-90e4-270727e6113e   10Gi       RWO            Delete           Bound    istio-system/authservice-pvc                    gp2                     52m

$ kubectl get pvc -n kubeflow-user-example-com
NAME                  STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   AGE
workspace-nootbook1   Bound    pvc-8f638f2c-7493-461c-aee8-984760e233c2   10Gi       RWO            efs-sc         5m59s

마지막으로 AWS 콘솔에서 액세스 포인트를 볼 수 있어야 합니다.

그림 6: Amazon EFS 콘솔(액세스 포인트용)

이제 Jupyter 노트북을 사용할 수 있습니다.

기계 학습 훈련 수행

다음으로, 기계 학습 훈련 데이터 셋을 위한 ReadWriteMany 모드의 PVC를 만들어 보겠습니다. Kubeflow Dashboard → Volumes → New Volume 으로 이동하여 efs-sc를 스토리지 클래스로 사용하여 데이터 셋이라는 새 볼륨을 생성할 수 있습니다.

그림 7: Kubeflow 대시보드에서 볼륨 만들기

이제, 이GitHub에 따라 영구 볼륨을 사용하여 훈련 데이터 셋을 저장하고 기계 학습 훈련을 수행할 수 있습니다.

정리

원치 않는 향후 요금이 발생하지 않도록 하려면 이 설명서에서 다루는 단계를 완료하여 Amazon EKS 클러스터를 삭제합니다.

마무리

이 블로그 게시물에서는 Amazon EKS에서 기계 학습 워크플로를 위한 Kubeflow의 구성 방법을 안내했습니다. 또한 Amazon EFS를 공유 영구 파일 시스템으로 사용하여 훈련 데이터 셋을 저장하는 방법도 다루었습니다. AWS 기반의 Kubeflow가, 안전하고 확장 가능하며 엔터프라이즈급 AI 및 기계 학습 워크로드를 위해 제공할 수 있는 가치를, 네이티브 AWS 관리형 서비스들의 통합을 통해서 강조했습니다. AWS에서 Kubeflow를 시작하려면 AWS 기반 Kubeflow 및 아래에 언급된 기타 설명서에서 사용 가능한 AWS 통합 배포 옵션을 참조하십시오.

Kubernetes 및 Kubernetes와의 스토리지 통합을 처음 접하는 경우 2부로 구성된 이 블로그 시리즈의 1부를 참조하세요.

자세한 내용은 다음 리소스를 참조하십시오.

SeungYong Baek

SeungYong Baek

백승용 솔루션즈 아키텍트는 다양한 분야의 IT 인프라 스트럭처와 산업군에 대한 엔지니어 경험을 바탕으로, 고객이 AWS 클라우드를 활용하여 비즈니스 성과를 달성할 수 있도록, 고객과 함께 효율적인 아키텍처를 구성하는 역할을 수행하고 있습니다.