본문으로 건너뛰기

Kubeflow를 이용한 Jupyter Notebook 환경 구성

카카오클라우드 쿠버네티스 환경에서 Kubeflow 서비스를 사용하여 Jupyter Notebook을 구성하는 과정을 설명합니다.

기본 정보

시작하기 전에

카카오클라우드 Kubernetes Engine 서비스와 Kubeflow 서비스를 활용하여 효율적인 MLOps 환경의 기반을 구축할 수 있습니다. 이 문서에서는 Jupyter Notebook을 사용해 데이터 분석 및 모델 학습을 수행하고, Kubeflow의 다양한 기능을 이용해 머신러닝 워크플로우를 최적화하는 방법을 학습합니다.

시나리오 소개

이번 시나리오에서는 카카오클라우드 콘솔에서 Kubeflow를 생성하고, 대시보드에 접속한 뒤 Jupyter Notebook 인스턴스를 생성하는 일련의 과정을 안내합니다. 이 시나리오의 주요 내용은 다음과 같습니다.

  • 쿠버네티스 클러스터 및 파일스토리지 환경 설정
  • Jupyter Notebook 생성 후 데이터 분석과 모델 학습을 수행
  • Kubeflow의 다양한 컴포넌트와 기능을 활용하여 머신러닝 워크플로우를 구성

사전 작업

Kubeflow 환경을 구축하기 위한 사전 작업으로 쿠버네티스 클러스터와 파일 스토리지를 생성하고 설정합니다.

1. 쿠버네티스 클러스터 생성

Kubeflow 환경을 위한 기본적인 쿠버네티스 클러스터를 구성합니다. 이 클러스터는 Kubeflow의 다양한 컴포넌트들이 배포될 기반입니다.

  1. 카카오클라우드 콘솔 > Container Pack > Kubernetes Engine** 메뉴에서 [클러스터 만들기]를 클릭합니다. 이 문서에서 사용하는 클러스터 설정을 참고하여 클러스터를 생성합니다.

    클러스터 설정
    항목내용
    클러스터 이름kc-handson
    kubernetes 버전1.26
    클러스터 네트워크 설정  생성된 VPC와 서브넷 항목에서 외부 통신이 가능한 IP 대역의 네트워크 선택
    노드 풀 설정
    이름개수노드 풀 사양 정보
    pool-ingress 1- 노드 풀 유형 : Virtual Machine
    - 인스턴스 유형 : m2a.large
    - 볼륨 타입/크기 : 50GB
    - 노드 수 : 1대
    - 노드 풀 자동 확장 : 사용 안 함
    pool-worker6  - 노드 풀 유형 : Virtual Machine
    - 인스턴스 유형 : m2a.xlarge
    - 볼륨 타입/크기 : 100GB
    - 노드 수 : 6대
    - 노드 풀 자동 확장 : 사용 안 함
    pool-gpu1- 노드 풀 유형 : GPU
    - 인스턴스 유형 : p2i.6xlarge
    - 볼륨 타입/크기 : 50GB
    - 노드 풀 자동 확장 : 사용 안 함
  2. 생성된 노드 풀의 상태가 Running으로 변경된 것을 확인합니다.

  3. kubectl 제어 설정에 따라, 클러스터의 kubectl 파일을 설정합니다.

2. 파일 스토리지 생성

Kubeflow의 데이터 저장 및 관리를 위해 필요한 파일 스토리지를 생성합니다. 이 스토리지는 노트북 인스턴스의 영구 볼륨(Persistent Volume)으로 사용되어, 데이터와 모델을 안전하게 보관할 수 있습니다. Kubeflow 구성 시 사용할 파일 스토리지 인스턴스는 선택한 클러스터와 동일한 네트워크 및 서브넷으로 설정합니다.

  1. 카카오클라우드 콘솔 > Beyond Storage Service > File Storage** 메뉴에서 [인스턴스 만들기]를 클릭합니다. 아래 표의 파일 스토리지 인스턴스 구성을 참고하여 인스턴스를 생성합니다.
항목설명
인스턴스kc-handson-fs
볼륨 크기 설정1TB
네트워크 설정사용할 쿠버네티스 클러스터와 동일
Subnet 설정사용할 쿠버네티스 클러스터와 동일
접근 제어 설정설정된 네트워크 내 모든 사설 IP에서의 접근을 허용
마운트 정보 설정 handson
  1. 생성한 인스턴스 상태가 Active로 변경된 것을 확인합니다.

작업 순서

본격적인 Jupyter 노트북 환경을 구성하는 작업은 다음과 같습니다.

Step 1. Kubeflow 만들기

준비된 쿠버네티스 클러스터 위에 Kubeflow를 구성하고 배포합니다. 이 과정에서는 Kubeflow의 다양한 기능을 활용할 수 있도록 기본 설정을 진행합니다.

  1. 카카오클라우드 콘솔 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 MIG1g.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
    도메인 연결 (선택)유효한 형식의 도메인 입력
  2. 생성한 Kubeflow 상태가 Active로 변경된 것을 확인합니다.

Step 2. Dashboard 접속하기

배포된 Kubeflow 환경에 접속하기 위하여 대시보드에 접속합니다. 사용자는 대시보드를 통해 Kubeflow의 다양한 리소스를 관리하고, Jupyter Notebook 환경을 구성할 수 있습니다.

Kubeflow 대시보드에 접속하는 방법은 크게 두 가지입니다. 로드밸런서 Public IP를 이용하는 방법과 kubectl 포트 포워딩을 이용하는 방법입니다.

  1. 카카오클라우드 콘솔에서 Load Balancing > Load Balancer 메뉴를 선택합니다.

  2. Kubeflow의 Ingress를 위해 생성된 kube_service_{프로젝트 아이디}_{IKE 클러스터명}_ingress-nginx_ingress-nginx-controller 이름의 로드밸런서를 찾아 Public IP를 확인합니다. Public IP가 없는 경우, 더보기 메뉴에서 Public IP를 새로 할당합니다.

    Public IP 할당

  3. 브라우저에서 로드밸런서에 할당된 Public IP 80포트로 접속합니다.

    open http://{LB_PUBLIC_IP}
  1. 대시보드에 접속한 후에는 Kubeflow 생성 단계에서 입력한 소유자 이메일 계정과 소유자 이메일로 전송된 초기 패스워드를 사용하여 로그인합니다.

Step 3. Jupyter Notebook 생성하기

대시보드를 통해 사용자는 Jupyter Notebook 인스턴스를 생성할 수 있습니다. 이 단계에서는 노트북의 스펙을 선택하고, 필요한 설정을 진행합니다.

  1. Kubeflow 대시보드의 좌측 탭에서 Notebooks를 클릭합니다.

    주피터 노트북 생성

  2. Notebooks 페이지로 이동하여, 우측 상단에 위치한 [+ New Notebook] 버튼을 클릭합니다. 아래 정보를 참고하여 확인하여 새로운 노트북을 생성합니다.

  1. GPU 이미지 기반의 노트북을 생성하기 위해 참고할 정보는 다음과 같습니다.

    항목구분설명
    NameNameKubeflow 대시보드에서 노트북 인스턴스 식별에 사용
    Namespace노트북 인스턴스를 생성할 Kubernetes 네임스페이스
    Docker ImageImagemlops-pipelines/jupyter-pyspark-pytorch-cuda:v1.0.1.py36
    - Docker 이미지 지정
    CPU / RAMRequested CPUs2
    - CPU 코어의 수이며, 노트북 인스턴스가 사용할 CPU 자원의 양 지정
    Requested memory in Gi6
    - 메모리 자원의 단위(GiB)이며 노트북 인스턴스가 사용할 메모리 자원의 양 지정
    GPUsNumber of GPUs최소 1개 이상
    - 노트북 인스턴스에서 사용할 GPU 자원
    GPU VendorNVIDIA MIG - 1g.10gb
    - 고유한 GPU 드라이버 및 소프트웨어 툴킷 선택
    Affinity / TolerationsAffinity Config노트북이 생성될 GPU 노드 풀 선택
    - 노트북 인스턴스 실행할 노드 지정
    Tolerations GroupNone
    - 특정 노드의 테인트(taint) 허용 설정
  2. 생성할 노트북의 정보를 입력합니다. 아래 표를 참고하여 예제로 입력할 값을 작성합니다.

    항목내용
    이름 (Name)handson
    이미지 (Image)mlops-pipelines/jupyter-pyspark-pytorch-cuda:v1.0.1.py36
    요청 CPUs (Requested CPUs)2
    요청 메모리 (Requested memory in GiB)6
    GPU 개수 (Number of GPUs)4
    공급 GPU (GPU Vendor)NVIDIA MIG - 1g.10gb
    Affinity Configpool-gpu
  1. [LAUNCH] 버튼을 클릭하여 노트북을 생성합니다.

Step 4. Jupyter Notebook 접속하기

생성된 Jupyter Notebook 인스턴스에 접속하여, 실제 머신러닝 프로젝트를 진행할 수 있습니다.

  1. 생성된 노트북 인스턴스에 대한 [CONNECT] 버튼을 클릭하여 접속합니다.

    Connect 버튼 클릭

  2. Notebook에서 Python3 커널을 선택합니다.

    Python3 버튼 클릭

  3. 간단한 예제 코드를 입력하고 실행 결과를 확인합니다. 아래와 같이 메시지가 출력된다면, 정상 접속됨을 확인할 수 있습니다.

    import torch

    def check_gpu_available():
    if torch.cuda.is_available():
    print("현재 시스템에서 GPU를 사용할 수 있습니다.")
    else:
    print("현재 시스템에서 GPU를 사용할 수 없습니다.")

    check_gpu_available()
  4. GPU 사용 노트북의 경우, (6.2)번에서 Terminal로 접속하여 nvidia-smi 명령어를 통해 nvidia 장치를 확인합니다.

    nvidia 장치 확인