Kubeflow를 이용한 Jupyter Notebook 환경 구성
카카오클라우드 쿠버네티스 환경에서 Kubeflow 서비스를 사용하여 Jupyter Notebook을 구성하는 과정을 설명합니다.
- 예상 소요 시간: 30분
- 사용자 환경
- 권장 운영 체제: MacOS, Ubuntu
- Region: kr-central-2
- 사전 준비 사항
시나리오 소개
카카오클라우드 Kubernetes Engine 서비스와 Kubeflow 서비스를 활용하면 효율적인 MLOps 환경을 구축할 수 있습니다. 이 시나리오에서는 카카오클라우드 콘솔에서 Kubeflow를 생성하고, 대시보드에 접속한 뒤, Jupyter Notebook 인스턴스를 생성하여 데이터 분석과 모델 학습을 수행하는 과정을 단계별로 안내합니다.
주요 내용은 아래와 같습니다.
- 쿠버네티스 클러스터 및 File Storage 환경 설정
- 데이터 분석과 모델 학습을 위한 Jupyter Notebook 생성
시작하기 전에
Kubeflow 환경을 구축하기 위한 사전 작업으로 쿠버네티스 클러스터와 파일 스토리지를 생성하고 설정합니다.
1. 쿠버네티스 클러스터 생성
Kubeflow 환경을 위한 기본적인 쿠버네티스 클러스터를 구성합니다. 이 클러스터는 Kubeflow의 다양한 컴포넌트들이 배포될 기반입니다.
-
카카오클라우드 콘솔 > Container Pack > Kubernetes Engine 메뉴에서 [클러스터 생성]을 클릭합니다. 이 문서에서 사용하는 클러스터 설정을 참고하여 클러스터를 생성합니다.
클러스터 설정
항목 내용 클러스터 이름 kc-handson kubernetes 버전 1.28 클러스터 네트워크 설정 생성된 VPC와 서브넷 항목에서 외부 통신이 가능한 IP 대역의 네트워크 선택 안내클러스터의 네트워크가 프라이빗 서브넷일 경우, 프라이빗 서브넷의 노드는 인터넷 통신이 불가합니다. 프라이빗 서브넷의 노드가 인터넷을 통해 외부 CR과 통신하기 위해서는 NAT 통신이 필요합니다.
NAT 통신은 NAT Instance를 사용할 수 있으며, 자세한 내용은 NAT 인스턴스 사용을 참고하시기 바랍니다.노드 풀 설정
이름 개수 노드 풀 사양 정보 pool-ingress 1 - 노드 풀 유형 : Virtual Machine
- 인스턴스 유형 :m2a.large
- 볼륨 유형/크기 : 50GB
- 노드 수 : 1대
- 오토 스케일 설정 : 미사용pool-worker 6 - 노드 풀 유형 : Virtual Machine
- 인스턴스 유형 :m2a.xlarge
- 볼륨 유형/크기 : 100GB
- 노드 수 : 6대
- 오토 스케일 설정 : 사용 안 함pool-gpu 1 - 노드 풀 유형 : GPU
- 인스턴스 유형 :p2i.6xlarge
- 볼륨 유형/크기 : 100GB
- 오토 스케일 설정 : 미사용 -
생성된 노드 풀의 상태가
Running
으로 변경된 것을 확인합니다. -
kubectl 제어 설정에 따라, 클러스터의 kubectl 파일을 설정합니다.
2. 파일 스토리지 생성
Kubeflow의 데이터 저장 및 관리를 위해 필요한 파일 스토리지를 생성합니다. 이 스토리지는 노트북 인스턴스의 영구 볼륨(Persistent Volume)으로 사용되어, 데이터와 모델을 안전하게 보관할 수 있습니다. Kubeflow 구성 시 사용할 파일 스토리지 인스턴스는 선택한 클러스터와 동일한 네트워크 및 서브넷으로 설정합니다.
- 카카오클라우드 콘솔 > Beyond Storage Service > File Storage 메뉴에서 [인스턴스 생성]를 클릭합니다. 아래 표의 파일 스토리지 인스턴스 구성을 참고하여 인스턴스를 생성합니다.
항목 | 설명 |
---|---|
인스턴스 | kc-handson-fs |
볼륨 크기 설정 | 1TB |
네트워크 설정 | 사용할 쿠버네티스 클러스터와 동일 |
서브넷 설정 | 사용할 쿠버네티스 클러스터와 동일 |
접근 제어 설정 | 설정된 네트워크 내 모든 프라이빗 IP에서의 접근을 허용 |
마운트 정보 설정 | handson |
- 생성한 인스턴스 상태가
Active
로 변경된 것을 확인합니다.
시작하기
본격적인 Jupyter 노트북 환경을 구성하는 작업은 다음과 같습니다.
Step 1. Kubeflow 만들기
준비된 쿠버네티스 클러스터 위에 Kubeflow를 구성하고 배포합니다. 이 과정에서는 Kubeflow의 다양한 기능을 활용할 수 있도록 기본 설정을 진행합니다.
-
카카오클라우드 콘솔 AI Service > Kubeflow 메뉴에서 [Kubeflow 만들기]를 클릭합니다. 아래 표의 설정값을 참고하여 Kubeflow를 생성합니다.
Kubeflow 정보
항목 내용 Kubeflow 이름 kc-handson Kubeflow 버전 1.8 Kubeflow 서비스 유형 Essential+HPT+ServingAPI
클러스터 정보
항목 내용 클러스터 연결 kc-handson Ingress 노드 풀 pool-ingress Worker 노드 풀 pool-worker CPU 노드 풀 pool-worker GPU 노드 풀 pool-gpu GPU MIG 1g.10gb - 7개 디폴트 파일 스토리지 kc-handson-fs
사용자 및 워크로드의 인증 정보 입력
분류 항목 내용 Object Storage 설정 Object Storage 유형 Object Storage
또는MinIO
Kubeflow 소유자 설정 소유자 이메일 계정 $ {ADMIN_EMAIL}
(example@kakaocloud.com)네임스페이스 이름 kubeflow-tutorial 네임스페이스 파일 스토리지 kc-handson-fs DB 설정 DB 유형 Kubeflow Internal DB 포트 3306
비밀번호 $ {DB_PASSWORD}
비밀번호 확인 $ {DB_PASSWORD}
도메인 연결 (선택) 유효한 형식의 도메인 입력 -
생성한 Kubeflow 상태가
Active
로 변경된 것을 확인합니다.
Step 2. Dashboard 접속하기
배포된 Kubeflow 환경에 접속하기 위하여 대시보드에 접속합니다. 사용자는 대시보드를 통해 Kubeflow의 다양한 리소스를 관리하고, Jupyter Notebook 환경을 구성할 수 있습니다.
Kubeflow 대시보드에 접속하는 방법은 크게 두 가지입니다. 로드 밸런서 퍼블릭 IP를 이용하는 방법과 kubectl
포트 포워딩을 이용하는 방법입니다.
- 로드 밸런서 퍼블릭 IP를 이용
- Kubectl 포트 포워딩을 이용
- 카카오클라우드 콘솔에서 Load Balancing > Load Balancer 메뉴를 선택합니다.
- Kubeflow의 Ingress를 위해 생성된
kube_service_{프로젝트 ID}_{IKE 클러스터명}_ingress-nginx_ingress-nginx-controller
이름의 로드 밸런서를 찾아 퍼블릭 IP를 확인합니다. 퍼블릭 IP가 없는 경우, 더 보기 메뉴에서 퍼블릭 IP를 새로 할당합니다.
-
브라우저에서 로드 밸런서에 할당된 퍼블릭 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 Docker 이미지 지정 CPU / RAM Minimum CPU CPU 코어의 수이며, 노트북 인스턴스가 사용할 CPU 리소스의 양 지정 Minimum Memory Gi 메모리 리소스의 단위(GiB)이며 노트북 인스턴스가 사용할 메모리 리소스의 양 지정 GPUs Number of GPUs 노트북 인스턴스에서 사용할 GPU 자원 GPU Vendor 고유한 GPU 드라이버 및 소프트웨어 툴킷 선택 Affinity / Tolerations Affinity Config 노트북이 생성될 GPU 노드 풀 선택
- 노트북 인스턴스 실행할 노드 지정Tolerations Group 특정 노드의 테인트(taint) 허용 설정 -
생성할 노트북의 정보를 입력합니다. 아래 표를 참고하여 예제로 입력할 값을 작성합니다.
항목 내용 이름 (Name) handson 이미지 (Image) kc-kubeflow/jupyter-pyspark-pytorch-cuda:v1.8.0.py311.1a 요청 CPUs (Minimum CPU) 2 요청 메모리 (Minimum Memory Gi) 12 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 Docker 이미지 지정 CPU / RAM Minimum CPU CPU 코어의 수이며, 노트북 인스턴스가 사용할 CPU 리소스의 양 지정 Minimum Memory Gi 메모리 리소스의 단위(GiB)이며 노트북 인스턴스가 사용할 메모리 리소스의 양 지정 GPUs Number of GPUs 노트북 인스턴스에서 사용할 GPU 자원 Affinity / Tolerations Affinity Config 노트북이 생성될 CPU 노드 풀 선택
- 노트북 인스턴스 실행할 노드 지정Tolerations Group 특정 노드의 테인트(taint) 허용 설정 -
생성할 노트북의 정보를 입력합니다. 아래 표를 참고하여 예제로 입력할 값을 작성합니다.
항목 내용 이름 (Name) handson 이미지 (Image) kc-kubeflow/jupyter-pyspark-pytorch:v1.8.0.py311.1a 요청 CPUs (Minimum CPU) 2 요청 메모리 (Minimum Memory Gi) 12 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 Instance를 사용하는 경우, 환경변수 CUDA_VISIBLE_DEVICES를 0으로 설정해 주셔야 합니다.
import torch
import os
def set_cuda_devices():
os.environ["CUDA_VISIBLE_DEVICES"] = "0"
def check_gpu_available():
if torch.cuda.is_available():
print("현재 시스템에서 GPU를 사용할 수 있습니다.")
else:
print("현재 시스템에서 GPU를 사용할 수 없습니다.")
set_cuda_devices()
check_gpu_available() -
GPU 사용 노트북의 경우, Notebook에서 Terminal로 접속하여 nvidia-smi 명령어를 통해 nvidia 장치를 확인합니다.