Kubeflow를 이용한 Jupyter Notebook 환경 구성
카카오클라우드 쿠버네티스 환경에서 Kubeflow 서비스를 사용하여 Jupyter Notebook을 구성하는 과정을 설명합니다.
- 예상 소요 시간: 30분
- 권장 운영 체제: MacOS, Ubuntu
- Region: kr-central-2
- 사전 준비 사항
시작하기 전에
카카오클라우드 Kubernetes Engine 서비스와 Kubeflow 서비스를 활용하여 효율적인 MLOps 환경의 기반을 구축할 수 있습니다. 이 문서에서는 Jupyter Notebook을 사용해 데이터 분석 및 모델 학습을 수행하고, Kubeflow의 다양한 기능을 이용해 머신러닝 워크플로우를 최적화하는 방법을 학습합니다.
시나리오 소개
이번 시나리오에서는 카카오클라우드 콘솔에서 Kubeflow를 생성하고, 대시보드에 접속한 뒤 Jupyter Notebook 인스턴스를 생성하는 일련의 과정을 안내 합니다. 이 시나리오의 주요 내용은 다음과 같습니다.
- 쿠버네티스 클러스터 및 파일스토리지 환경 설정
- Jupyter Notebook 생성 후 데이터 분석과 모델 학습을 수행
- Kubeflow의 다양한 컴포넌트와 기능을 활용하여 머신러닝 워크플로우를 구성
사전 작업
Kubeflow 환경을 구축하기 위한 사전 작업으로 쿠버네티스 클러스터와 파일 스토리지를 생성하고 설정합니다.
1. 쿠버네티스 클러스터 생성
Kubeflow 환경을 위한 기본적인 쿠버네티스 클러스터를 구성합니다. 이 클러스터는 Kubeflow의 다양한 컴포넌트들이 배포될 기반입니다.
-
카카오클라우드 콘솔 > Container Pack > Kubernetes Engine 메뉴에서 [클러스터 만들기]를 클릭합니다. 이 문서에서 사용하는 클러스터 설정을 참고하여 클러스터를 생성합니다.
클러스터 설정
항목 내용 클러스터 이름 kc-handson kubernetes 버전 1.26 클러스터 네트워크 설정 생성된 VPC와 서브넷 항목에서 외부 통신이 가능한 IP 대역의 네트워크 선택 노드 풀 설정
이름 개수 노드 풀 사양 정보 pool-ingress 1 - 노드 풀 유형 : Virtual Machine
- 인스턴스 유형 :m2a.large
- 볼륨 타입/크기 : 50GB
- 노드 수 : 1대
- 노드 풀 자동 확장 : 사용 안 함pool-worker 6 - 노드 풀 유형 : Virtual Machine
- 인스턴스 유형 :m2a.xlarge
- 볼륨 타입/크기 : 100GB
- 노드 수 : 6대
- 노드 풀 자동 확장 : 사용 안 함pool-gpu 1 - 노드 풀 유형 : GPU
- 인스턴스 유형 :p2i.6xlarge
- 볼륨 타입/크기 : 50GB
- 노드 풀 자동 확장 : 사용 안 함 -
생성된 노드 풀의 상태가
Running
으로 변경된 것을 확인합니다. -
kubectl 제어 설정에 따라, 클러스터의 kubectl 파일을 설정합니다.
2. 파일 스토리지 생성
Kubeflow의 데이터 저장 및 관리를 위해 필요한 파일 스토리지를 생성합니다. 이 스토리지는 노트북 인스턴스의 영구 볼륨(Persistent Volume)으로 사용되어, 데이터와 모델을 안전하게 보관할 수 있습니다. Kubeflow 구성 시 사용할 파일 스토리지 인스턴스는 선택한 클러스터와 동일한 네트워크 및 서브넷으로 설정합니다.
- 카카오클라우드 콘솔 > Beyond Storage Service > File Storage 메뉴에서 [인스턴스 만들기]를 클릭합니다. 아래 표의 파일 스토리지 인스턴스 구성을 참고하여 인스턴스를 생성합니다.
항목 | 설명 |
---|---|
인스턴스 | kc-handson-fs |
볼륨 크기 설정 | 1TB |
네트워크 설정 | 사용할 쿠버네티스 클러스터와 동일 |
Subnet 설정 | 사용할 쿠버네티스 클러스터와 동일 |
접근 제어 설정 | 설정된 네트워크 내 모든 사설 IP에서의 접근을 허용 |
마운트 정보 설정 | handson |
- 생성한 인스턴스 상태가
Active
로 변경된 것을 확인합니다.
작업 순서
본격적인 Jupyter 노트북 환경을 구성하는 작업은 다음과 같습니다.
Step 1. Kubeflow 만들기
준비된 쿠버네티스 클러스터 위에 Kubeflow를 구성하고 배포합니다. 이 과정에서는 Kubeflow의 다양한 기능을 활용할 수 있도록 기본 설정을 진행합니다.
-
카카오클라우드 콘솔 AI Service > Kubeflow 메뉴에서 [Kubeflow 만들기]를 클릭합니다. 아래 표의 설정 값을 참고하여 Kubeflow를 생성합니다.
Kubeflow 정보
항목 내용 Kubeflow 이름 kc-handson Kubeflow 버전 1.0.0 Kubeflow 서비스 타입 Essential+HPT+ServingAPI 클러스터 정보
항목 내용 클러스터 연결 kc-handson Ingress 노드 풀 pool-ingress Worker 노드 풀 pool-worker CPU 노트북 노드 풀 pool-worker CPU 파이프라인 노드 풀 pool-worker GPU 노트북 노드 풀 pool-gpu GPU MIG 1g.10gb 7 GPU 파이프라인 노드 풀 pool-gpu 파일 스토리지 kc-handson-fs 사용자 및 워크로드의 인증 정보 입력
항목 내용 소유자 이메일 계정 $ {ADMIN_EMAIL}
(example@kakaocloud.com)네임 스페이스 이름 kubeflow-tutorial DB 포트 3306
DB 비밀번호 $ {DB_PASSWORD}
DB 비밀번호 확인 $ {DB_PASSWORD}
Object Storage 타입 KC Object Storage
또는MinIO
도메인 연결 (선택) 유효한 형식의 도메인 입력 -
생성한 Kubeflow 상태가
Active
로 변경된 것을 확인합니다.
Step 2. Dashboard 접속하기
배포된 Kubeflow 환경에 접속하기 위하여 대시보드에 접속합니다. 사용자는 대시보드를 통해 Kubeflow의 다양한 리소스를 관리하고, Jupyter Notebook 환경을 구성할 수 있습니다.
Kubeflow 대시보드에 접속하는 방법은 크게 두 가지입니다. 로드밸런서 Public IP를 이용하는 방법과 kubectl
포트 포워딩을 이용하는 방법입니다.
- 로드밸런서 Public IP를 이용
- Kubectl 포트 포워딩을 이용
- 카카오클라우드 콘솔에서 Load Balancing > Load Balancer 메뉴를 선택합니다.
- Kubeflow의 Ingress를 위해 생성된
kube_service_{프로젝트 아이디}_{IKE 클러스터명}_ingress-nginx_ingress-nginx-controller
이름의 로드밸런서를 찾아 Public IP를 확인합니다. Public IP가 없는 경우, 더보기 메뉴에서 Public IP를 새로 할당합니다.
-
브라우저에서 로드밸런서에 할당된 Public IP
80
포트로 접속합니다.open http://{LB_PUBLIC_IP}
Kubeflow 게이트웨이에 접근하거나 Kubeflow Istio 게이트웨이로 kubectl
CLI를 통한 포트 포워딩 연결이 가능합니다.
-
Kubeflow 설치 시 사용한 쿠버네티스 클러스터에
kubectl
명령어로 접속합니다. -
사용자 로컬 시스템의 특정 포트(예:
8080
)를 Kubeflow 대시보드 포트로 포워딩합니다.kubectl port-forward svc/istio-ingressgateway -n istio-system 8080:80
-
브라우저에서 로컬 호스트
8080
포트로 접속합니다.open http://localhost:8080
- 대시보드에 접속한 후에는 Kubeflow 생성 단계에서 입력한 소유자 이메일 계정과 소유자 이메일로 전송된 초기 패스워드를 사용하여 로그인합니다.
Step 3. Jupyter Notebook 생성하기
대시보드를 통해 사용자는 Jupyter Notebook 인스턴스를 생성할 수 있습니다. 이 단계에서는 노트북의 스펙을 선택하고, 필요한 설정을 진행합니다.
-
Kubeflow 대시보드의 좌측 탭에서 Notebooks를 클릭합니다.
-
Notebooks 페이지로 이동하여, 우측 상단에 위치한 [+ New Notebook] 버튼을 클릭합니다. 아래 정보를 참고하여 확인하여 새로운 노트북을 생성합니다.
- GPU 이미지 기반의 노트북
- CPU 이미지 기반의 노트북
-
GPU 이미지 기반의 노트북을 생성하기 위해 참고할 정보는 다음과 같습니다.
항목 구분 설명 Name Name Kubeflow 대시보드에서 노트북 인스턴스 식별에 사용 Namespace 노트북 인스턴스를 생성할 Kubernetes 네임스페이스 Docker Image Image mlops-pipelines/jupyter-pyspark-pytorch-cuda:v1.0.1.py36
- Docker 이미지 지정CPU / RAM Requested CPUs 2
- CPU 코어의 수이며, 노트북 인스턴스가 사용할 CPU 자원의 양 지정Requested memory in Gi 8
- 메모리 자원의 단위(GiB)이며 노트북 인스턴스가 사용할 메모리 자원의 양 지정GPUs Number of GPUs 최소 1개 이상
- 노트북 인스턴스에서 사용할 GPU 자원GPU Vendor NVIDIA MIG - 1g.10gb
- 고유한 GPU 드라이버 및 소프트웨어 툴킷 선택Affinity / Tolerations Affinity Config 노트북이 생성될 GPU 노드 풀 선택
- 노트북 인스턴스 실행할 노드 지정Tolerations Group None
- 특정 노드의 테인트(taint) 허용 설정 -
생성할 노트북의 정보를 입력합니다. 아래 표를 참고하여 예제로 입력할 값을 작성합니다.
항목 내용 이름 (Name) handson 이미지 (Image) mlops-pipelines/jupyter-pyspark-pytorch-cuda:v1.0.1.py36 요청 CPUs (Requested CPUs) 2 요청 메모리 (Requested memory in GiB) 8 GPU 개수 (Number of GPUs) 4 공급 GPU (GPU Vendor) NVIDIA MIG - 1g.10gb Affinity Config pool-gpu
-
CPU 이미지 기반의 노트북을 생성하기 위해 참고할 정보는 다음과 같습니다.
항목 구분 설명 Name Name Kubeflow 대시보드에서 노트북 인스턴스 식별에 사용 Namespace 노트북 인스턴스를 생성할 Kubernetes 네임스페이스 Docker Image Image mlops-pipelines/jupyter-pyspark-pytorch:v1.0.1.py36
- Docker 이미지 지정CPU / RAM Requested CPUs 2
- CPU 코어의 수이며, 노트북 인스턴스가 사용할 CPU 자원의 양 지정Requested memory in Gi 8
- 메모리 자원의 단위(GiB)이며 노트북 인스턴스가 사용할 메모리 자원의 양 지정GPUs Number of GPUs None
- 노트북 인스턴스에서 사용할 GPU 자원Affinity / Tolerations Affinity Config 노트북이 생성될 CPU 노드 풀 선택
- 노트북 인스턴스 실행할 노드 지정Tolerations Group None
- 특정 노드의 테인트(taint) 허용 설정 -
생성할 노트북의 정보를 입력합니다. 아래 표를 참고하여 예제로 입력할 값을 작성합니다.
항목 내용 이름 (Name) handson 이미지 (Image) mlops-pipelines/jupyter-pyspark-pytorch:v1.0.1.py36 요청 CPUs (Requested CPUs) 2 요청 메모리 (Requested memory in GiB) 8 GPU 개수 (Number of GPUs) None Affinity Config pool-worker
- [LAUNCH] 버튼을 클릭하여 노트북을 생성합니다.
Step 4. Jupyter Notebook 접속하기
생성된 Jupyter Notebook 인스턴스에 접속하여, 실제 머신러닝 프로젝트를 진행할 수 있습니다.
-
생성된 노트북 인스턴스에 대한 [CONNECT] 버튼을 클릭하여 접속합니다.
-
Notebook에서 Python3 커널을 선택합니다.
-
간단한 예제 코드를 입력하고 실행 결과를 확인합니다. 아래와 같이 메시지가 출력된다면, 정상 접속됨을 확인할 수 있습니다.
import torch
def check_gpu_available():
if torch.cuda.is_available():
print("현재 시스템에서 GPU를 사용할 수 있습니다.")
else:
print("현재 시스템에서 GPU를 사용할 수 없습니다.")
check_gpu_available() -
GPU 사용 노트북의 경우, (6.2)번에서 Terminal로 접속하여 nvidia-smi 명령어를 통해 nvidia 장치를 확인합니다.